From a01f80c6a350ce183d1b198403137a812a56236b Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 18 Apr 2026 01:30:32 -0700 Subject: [PATCH 1/9] feat(tables): column selection, keyboard shortcuts, drag reorder, and undo improvements (#4222) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(tables): add column selection, missing keyboard shortcuts, and Sheets-aligned operations Click column headers to select entire columns, shift-click to extend to a column range. Delete, cut, and copy operations work on column selections with full undo/redo support. Adds Home, End, Ctrl+Home, Ctrl+End, PageUp, PageDown, Ctrl+Space, and all Shift variants. Changes Ctrl+A to select all cells instead of checkbox rows. Column header dropdown menu now opens on right-click instead of left-click. Co-Authored-By: Claude Opus 4.6 * fix(tables): chevron opens dropdown, drag header to reorder columns Split column header into label area (click to select, draggable for reorder) and chevron button (click to open dropdown menu). Remove the grip handle — dragging the header itself now reorders columns. Co-Authored-By: Claude Opus 4.6 * fix(tables): full-column highlight during drag reorder Replace the thin 2px line drop indicator with a full-column highlight that spans the entire table height, matching Google Sheets behavior. The insertion line is still shown at the drop edge for precision. Co-Authored-By: Claude Opus 4.6 * fix(tables): handle drag reorder edge cases, dim source column Suppress drop indicator when drag would result in no position change (dragging onto self or adjacent no-op positions). Dim the source column body cells during drag with a background overlay. Skip the API call when the computed order is identical to the current order. Co-Authored-By: Claude Opus 4.6 * feat(tables): add column reorder undo/redo, body drop targets, and escape cancel Column drag-and-drop now supports dropping anywhere in a column (not just headers), pressing Escape to cancel a drag, and full undo/redo integration for column reordering. Co-Authored-By: Claude Opus 4.6 * fix(tables): merge partial updates in updateRow to prevent column data loss When Mothership called updateRow directly (bypassing the PATCH API route), it passed only the changed fields — which were written as the entire row, wiping all other columns. Move the merge logic into updateRow itself so all callers get correct partial-update semantics, and remove the now-redundant pre-merge from both PATCH routes. * test(tables): add updateRow partial merge tests Covers the bug where partial updates wiped unmentioned columns — verifies that fields not in the update payload are preserved, nulling a field works, full-row updates are idempotent, and missing rows throw correctly. * feat(tables): add delete-column undo/redo, rename metadata sync, and comprehensive row ID patching - Delete column now captures column definition, cell data, order, and width for full undo/redo - Column rename undo/redo now properly syncs columnWidths and columnOrder metadata - patchRedoRowId/patchUndoRowId extended to handle all action types containing row IDs Co-Authored-By: Claude Opus 4.6 * fix(tables): remove source column dimming during drag reorder Only show the insertion line at the drop position, matching Google Sheets behavior. Remove dragSourceBounds memo and isDragging prop. Co-Authored-By: Claude Opus 4.6 * fix(tables): preserve selection on right-click, auto-resize on double-click, fix escape during drag - Right-clicking within an existing selection now preserves it instead of resetting to a single cell, so context menu operations apply to the full range - Double-clicking a column border auto-resizes the column to fit its content - Escape during column drag now immediately clears refs before state update, preventing the dragend handler from executing the reorder Co-Authored-By: Claude Opus 4.6 * fix(tables): add aria-hidden value and aria-label for column header accessibility Co-Authored-By: Claude Opus 4.6 * fix(tables): tighten auto-resize padding to match Google Sheets Reduce header padding from +48px to +36px (icon + cell padding) and cell padding from +20px to +17px (cell padding + border) for a snug fit. Co-Authored-By: Claude Opus 4.6 * fix(tables): clean drag ghost and clear selection on drag start - Create a minimal custom drag image showing only the column name instead of the browser's default ghost that includes adjacent columns/checkboxes - Clear any existing cell/column selection when starting a column drag to prevent stale highlights from persisting during reorder Co-Authored-By: Claude Opus 4.6 * feat(tables): add Shift+Space row selection and Ctrl+D fill down Shift+Space now selects the entire row (all columns) instead of toggling a checkbox, matching Google Sheets behavior. Ctrl+D copies the top cell's value down through the selected range with full undo/redo support. Co-Authored-By: Claude Opus 4.6 * fix(tables): show toast on incompatible column type change The server validates type compatibility and returns a clear error message (e.g. "3 row(s) have incompatible values"), but the client was silently swallowing it. Now surfaces the error via toast notification. Also moved the undo push to onSuccess so a failed type change doesn't pollute the undo stack. Co-Authored-By: Claude Opus 4.6 * fix(tables): scroll-into-view for selection focus, Home/End origin, delete-column undo timing - Scroll-into-view now tracks selectionFocus (not just anchor), so Shift+Arrow extending selection off-screen properly auto-scrolls - Shift+Home/End now uses the current focus as origin (matching Shift+Arrow behavior) instead of always using anchor - Delete column undo entry is now pushed in onSuccess, preventing a corrupted undo stack if the server rejects the deletion - Dialog copy updated from "cannot be undone" to "You can undo this action" since undo/redo is supported Co-Authored-By: Claude Opus 4.6 * fix: resolve duplicate declarations from rebase against staging Co-Authored-By: Claude Opus 4.6 * fix file upload * fix(tables): merge column widths on delete-column undo, try/finally for auto-resize - Delete-column undo now reads current column widths via getColumnWidths callback and merges the restored column's width into the full map, preventing other columns' widths from being wiped - Auto-resize measurement span is now wrapped in try/finally to ensure DOM cleanup if an exception occurs during measurement Co-Authored-By: Claude Opus 4.6 * fix: revert accidental home.tsx change from rebase conflict resolution Co-Authored-By: Claude Opus 4.6 * fix(tables): clear isColumnSelection on double-click and right-click, skip scroll for column select - Clear isColumnSelection when double-clicking a cell to edit, preventing the column selection effect from fighting with the editing state - Clear isColumnSelection when right-clicking outside the current selection, preventing stale column selection from re-expanding - Skip scroll-into-view when isColumnSelection is true, preventing the viewport from jumping to the bottom row when clicking a column header Co-Authored-By: Claude Opus 4.6 * fix(tables): remove inline font override in auto-resize, guard undefined columnOrder - Remove `font:inherit` from measurement span inline style so Tailwind classes (font-medium, text-small) control font properties for accurate column width measurement - Only include columnOrder in metadata update when defined, preventing handleColumnRename from clearing a persisted column order when columnOrderRef is null Co-Authored-By: Claude Opus 4.6 * fix(tables): capture columnRequired in delete-column undo for full restoration The delete-column undo action captured columnUnique but not columnRequired, so undoing a delete on a required column would silently drop the constraint. Now captures and restores both constraints. Co-Authored-By: Claude Opus 4.6 * fix(tables): restore width independently of order on delete-column undo, batch fill-down - Column width restoration in delete-column undo no longer requires previousOrder to be non-null — width is restored independently - Ctrl+D fill-down now uses batchUpdateRef (single API call) instead of calling mutateRef per row in a loop Co-Authored-By: Claude Opus 4.6 * fix(tables): multi-column delete, select-all cell model, cut flash, chevron alignment - Multi-select delete: detect column selection range and delete all selected columns sequentially with individual undo entries - Select all (header checkbox): use cell selection model instead of checkbox model for consistent highlighting - Cut flash: batch cell clears into single mutation to prevent stale data flashing from multiple onSettled invalidations - Chevron alignment: adjust right padding from pr-2 to pr-2.5 Co-Authored-By: Claude Opus 4.6 * fix(tables): restore column width locally on delete-column undo Add onColumnWidthsChange callback to undo hook so restored column widths update local component state, not just server metadata. Co-Authored-By: Claude Opus 4.6 * fix(tables): prevent Ctrl+D bookmark dialog, batch Delete/Backspace mutations - Move e.preventDefault() before early returns in Ctrl+D handler so the browser bookmark dialog is always suppressed - Replace per-row mutateRef calls with single batchUpdateRef call in both Delete/Backspace handlers (checked rows and cell selection), consistent with cut and fill-down Co-Authored-By: Claude Opus 4.6 * fix(tables): adjust column positions for multi-column delete undo Capture original schema positions upfront and adjust each by the count of previously-deleted columns with lower positions, so undo restores columns at correct server-side positions in LIFO order. Co-Authored-By: Claude Opus 4.6 * fix(tables): only multi-delete when clicked column is within selection Check that the right-clicked column is within the selected column range before using multi-column delete. If the click is outside the selection, delete only the clicked column. Co-Authored-By: Claude Opus 4.6 * fix(tables): prevent duplicate undo entry on column drag-drop Clear dragColumnNameRef immediately in handleColumnDragEnd so the second invocation (from dragend after drop already fired) is a no-op. Co-Authored-By: Claude Opus 4.6 * fix(tables): clean up width on delete-column redo, suppress click during drag - Redo path for delete-column now removes the column's width from metadata and local state, preventing stale width entries - Add didDragRef to ColumnHeaderMenu to suppress the click event that fires after a drag operation, preventing selection flash Co-Authored-By: Claude Opus 4.6 * fix(tables): remove unstable mutation object from useCallback deps deleteTableMutation is not referentially stable — only .mutateAsync() is. Including the mutation object causes unnecessary callback recreation on every mutation state change. Co-Authored-By: Claude Opus 4.6 * fix(tables): fix auto-resize header padding, deduplicate rename metadata logic Increase header text measurement padding from 36px to 57px to account for the chevron dropdown button (pl-0.5 + 9px icon + pr-2.5) that always occupies layout space. Prevents header text truncation on auto-resize. Deduplicate column rename metadata logic by having columnRename.onSave call handleColumnRename instead of reimplementing the same width/order transfer and metadata persist. Co-Authored-By: Claude Opus 4.6 * fix(tables): log error on cell data restoration failure during undo Add onError handler to the batchUpdateRowsMutation inside delete-column undo so failures are logged instead of silently swallowed. The column schema restores first, and the cell data restoration is a separate async call that the outer try/catch cannot intercept. Co-Authored-By: Claude Opus 4.6 * fix(tables): address audit findings across table, undo hook, and store - Add missing bounds check in handleCopy (c >= cols.length) matching handleCut for defensive consistency - Clear lastCheckboxRowRef in Ctrl+Space and Shift+Space to prevent stale shift-click checkbox range after keyboard selection - Fix stale snapshot race in patchRedoRowId/patchUndoRowId by reading state inside the set() updater instead of via get() outside it - Add metadata cleanup to create-column undo so column width is removed from both local state and server, symmetric with delete-column redo - Remove stale width key from columnWidths on column delete instead of persisting orphaned entries - Normalize undefined vs null in handleInlineSave change detection to prevent unnecessary mutations when oldValue is undefined - Use ghost.parentNode?.removeChild instead of document.body.removeChild in drag ghost cleanup to prevent throw on component unmount Co-Authored-By: Claude Opus 4.6 * fix(tables): reset didDragRef in handleDragEnd to prevent stale flag Co-Authored-By: Claude Opus 4.6 --------- Co-authored-by: Claude Opus 4.6 --- .../api/table/[tableId]/rows/[rowId]/route.ts | 23 +- .../v1/tables/[tableId]/rows/[rowId]/route.ts | 24 +- .../home/components/user-input/user-input.tsx | 5 +- .../[tableId]/components/table/table.tsx | 755 +++++++++++++++--- .../user-input/hooks/use-file-attachments.ts | 124 +-- apps/sim/hooks/queries/tables.ts | 3 + apps/sim/hooks/use-table-undo.ts | 128 ++- .../lib/table/__tests__/update-row.test.ts | 120 +++ apps/sim/lib/table/service.ts | 16 +- apps/sim/stores/table/store.ts | 122 ++- apps/sim/stores/table/types.ts | 12 + 11 files changed, 1045 insertions(+), 287 deletions(-) create mode 100644 apps/sim/lib/table/__tests__/update-row.test.ts diff --git a/apps/sim/app/api/table/[tableId]/rows/[rowId]/route.ts b/apps/sim/app/api/table/[tableId]/rows/[rowId]/route.ts index 63da0c91de0..66790f68af7 100644 --- a/apps/sim/app/api/table/[tableId]/rows/[rowId]/route.ts +++ b/apps/sim/app/api/table/[tableId]/rows/[rowId]/route.ts @@ -135,32 +135,11 @@ export async function PATCH(request: NextRequest, { params }: RowRouteParams) { return NextResponse.json({ error: 'Invalid workspace ID' }, { status: 400 }) } - const [existingRow] = await db - .select({ data: userTableRows.data }) - .from(userTableRows) - .where( - and( - eq(userTableRows.id, rowId), - eq(userTableRows.tableId, tableId), - eq(userTableRows.workspaceId, validated.workspaceId) - ) - ) - .limit(1) - - if (!existingRow) { - return NextResponse.json({ error: 'Row not found' }, { status: 404 }) - } - - const mergedData = { - ...(existingRow.data as RowData), - ...(validated.data as RowData), - } - const updatedRow = await updateRow( { tableId, rowId, - data: mergedData, + data: validated.data as RowData, workspaceId: validated.workspaceId, }, table, diff --git a/apps/sim/app/api/v1/tables/[tableId]/rows/[rowId]/route.ts b/apps/sim/app/api/v1/tables/[tableId]/rows/[rowId]/route.ts index c8712e44de7..af0d8525cc2 100644 --- a/apps/sim/app/api/v1/tables/[tableId]/rows/[rowId]/route.ts +++ b/apps/sim/app/api/v1/tables/[tableId]/rows/[rowId]/route.ts @@ -137,33 +137,11 @@ export async function PATCH(request: NextRequest, { params }: RowRouteParams) { return NextResponse.json({ error: 'Invalid workspace ID' }, { status: 400 }) } - // Fetch existing row to merge partial update - const [existingRow] = await db - .select({ data: userTableRows.data }) - .from(userTableRows) - .where( - and( - eq(userTableRows.id, rowId), - eq(userTableRows.tableId, tableId), - eq(userTableRows.workspaceId, validated.workspaceId) - ) - ) - .limit(1) - - if (!existingRow) { - return NextResponse.json({ error: 'Row not found' }, { status: 404 }) - } - - const mergedData = { - ...(existingRow.data as RowData), - ...(validated.data as RowData), - } - const updatedRow = await updateRow( { tableId, rowId, - data: mergedData, + data: validated.data as RowData, workspaceId: validated.workspaceId, }, table, diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/user-input/user-input.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/user-input/user-input.tsx index ce207f48a29..630c60ef1a7 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/user-input/user-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/home/components/user-input/user-input.tsx @@ -158,6 +158,7 @@ export const UserInput = forwardRef(function Us isLoading: isSending, }) const hasFiles = files.attachedFiles.some((f) => !f.uploading && f.key) + const hasUploadingFiles = files.attachedFiles.some((f) => f.uploading) const contextManagement = useContextManagement({ message: value }) @@ -232,7 +233,7 @@ export const UserInput = forwardRef(function Us setSelectedContexts: contextManagement.setSelectedContexts, }) - const canSubmit = (value.trim().length > 0 || hasFiles) && !isSending + const canSubmit = (value.trim().length > 0 || hasFiles) && !isSending && !hasUploadingFiles const valueRef = useRef(value) valueRef.current = value @@ -507,6 +508,8 @@ export const UserInput = forwardRef(function Us if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) { e.preventDefault() + // Mirror canSubmit's uploading guard; Enter reads refs, not rendered state. + if (filesRef.current.attachedFiles.some((f) => f.uploading)) return const hasSubmitPayload = valueRef.current.trim().length > 0 || filesRef.current.attachedFiles.some((file) => !file.uploading && file.key) diff --git a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table/table.tsx b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table/table.tsx index c24ad9e6b87..9265306abd3 100644 --- a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table/table.tsx +++ b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table/table.tsx @@ -1,7 +1,6 @@ 'use client' import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { GripVertical } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { usePostHog } from 'posthog-js/react' import { @@ -199,9 +198,11 @@ export function Table({ const [selectionAnchor, setSelectionAnchor] = useState(null) const [selectionFocus, setSelectionFocus] = useState(null) const [checkedRows, setCheckedRows] = useState(EMPTY_CHECKED_ROWS) + const [isColumnSelection, setIsColumnSelection] = useState(false) const lastCheckboxRowRef = useRef(null) + const isColumnSelectionRef = useRef(false) const [showDeleteTableConfirm, setShowDeleteTableConfirm] = useState(false) - const [deletingColumn, setDeletingColumn] = useState(null) + const [deletingColumns, setDeletingColumns] = useState(null) const [isImportCsvOpen, setIsImportCsvOpen] = useState(false) const [columnWidths, setColumnWidths] = useState>({}) @@ -250,7 +251,39 @@ export function Table({ const deleteColumnMutation = useDeleteColumn({ workspaceId, tableId }) const updateMetadataMutation = useUpdateTableMetadata({ workspaceId, tableId }) - const { pushUndo, undo, redo } = useTableUndo({ workspaceId, tableId }) + const handleColumnOrderChange = useCallback((order: string[]) => { + setColumnOrder(order) + }, []) + + const handleColumnRename = useCallback((oldName: string, newName: string) => { + let updatedWidths = columnWidthsRef.current + if (oldName in updatedWidths) { + const { [oldName]: width, ...rest } = updatedWidths + updatedWidths = { ...rest, [newName]: width } + setColumnWidths(updatedWidths) + } + const updatedOrder = columnOrderRef.current?.map((n) => (n === oldName ? newName : n)) + if (updatedOrder) setColumnOrder(updatedOrder) + updateMetadataRef.current({ + columnWidths: updatedWidths, + ...(updatedOrder ? { columnOrder: updatedOrder } : {}), + }) + }, []) + + const getColumnWidths = useCallback(() => columnWidthsRef.current, []) + + const handleColumnWidthsChange = useCallback((widths: Record) => { + setColumnWidths(widths) + }, []) + + const { pushUndo, undo, redo } = useTableUndo({ + workspaceId, + tableId, + onColumnOrderChange: handleColumnOrderChange, + onColumnRename: handleColumnRename, + onColumnWidthsChange: handleColumnWidthsChange, + getColumnWidths, + }) const undoRef = useRef(undo) undoRef.current = undo const redoRef = useRef(redo) @@ -317,16 +350,30 @@ export function Table({ return 0 }, [resizingColumn, displayColumns, columnWidths]) - const dropIndicatorLeft = useMemo(() => { - if (!dropTargetColumnName) return null + const dropColumnBounds = useMemo(() => { + if (!dropTargetColumnName || !dragColumnName) return null + if (dropTargetColumnName === dragColumnName) return null + + const dragIndex = displayColumns.findIndex((c) => c.name === dragColumnName) + const targetIndex = displayColumns.findIndex((c) => c.name === dropTargetColumnName) + if (dragIndex === -1 || targetIndex === -1) return null + + const wouldBeNoOp = + (dropSide === 'right' && targetIndex === dragIndex - 1) || + (dropSide === 'left' && targetIndex === dragIndex + 1) + if (wouldBeNoOp) return null + let left = CHECKBOX_COL_WIDTH for (const col of displayColumns) { - if (dropSide === 'left' && col.name === dropTargetColumnName) return left - left += columnWidths[col.name] ?? COL_WIDTH - if (dropSide === 'right' && col.name === dropTargetColumnName) return left + const w = columnWidths[col.name] ?? COL_WIDTH + if (col.name === dropTargetColumnName) { + const lineLeft = dropSide === 'left' ? left : left + w + return { left, width: w, lineLeft } + } + left += w } return null - }, [dropTargetColumnName, dropSide, displayColumns, columnWidths]) + }, [dropTargetColumnName, dragColumnName, dropSide, displayColumns, columnWidths]) const isAllRowsSelected = useMemo(() => { if (checkedRows.size > 0 && rows.length > 0 && checkedRows.size >= rows.length) { @@ -362,6 +409,7 @@ export function Table({ rowsRef.current = rows selectionAnchorRef.current = selectionAnchor selectionFocusRef.current = selectionFocus + isColumnSelectionRef.current = isColumnSelection const deleteTableMutation = useDeleteTable(workspaceId) const renameTableMutation = useRenameTable(workspaceId) @@ -383,18 +431,7 @@ export function Table({ const columnRename = useInlineRename({ onSave: (columnName, newName) => { pushUndoRef.current({ type: 'rename-column', oldName: columnName, newName }) - let updatedWidths = columnWidthsRef.current - if (columnName in updatedWidths) { - const { [columnName]: width, ...rest } = updatedWidths - updatedWidths = { ...rest, [newName]: width } - setColumnWidths(updatedWidths) - } - const updatedOrder = columnOrderRef.current?.map((n) => (n === columnName ? newName : n)) - if (updatedOrder) setColumnOrder(updatedOrder) - updateMetadataRef.current({ - columnWidths: updatedWidths, - columnOrder: updatedOrder, - }) + handleColumnRename(columnName, newName) updateColumnMutation.mutate({ columnName, updates: { name: newName } }) }, }) @@ -411,7 +448,8 @@ export function Table({ } catch { setShowDeleteTableConfirm(false) } - }, [deleteTableMutation, tableId, router, workspaceId]) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [tableId, router, workspaceId]) const toggleBooleanCell = useCallback( (rowId: string, columnName: string, currentValue: unknown) => { @@ -564,10 +602,25 @@ export function Table({ const rowIndex = Number.parseInt(td.getAttribute('data-row') || '-1', 10) const colIndex = Number.parseInt(td.getAttribute('data-col') || '-1', 10) if (rowIndex >= 0 && colIndex >= 0) { - setSelectionAnchor({ rowIndex, colIndex }) - setSelectionFocus(null) columnName = colIndex < columnsRef.current.length ? columnsRef.current[colIndex].name : null + + const sel = computeNormalizedSelection( + selectionAnchorRef.current, + selectionFocusRef.current + ) + const isWithinSelection = + sel !== null && + rowIndex >= sel.startRow && + rowIndex <= sel.endRow && + colIndex >= sel.startCol && + colIndex <= sel.endCol + + if (!isWithinSelection) { + setSelectionAnchor({ rowIndex, colIndex }) + setSelectionFocus(null) + setIsColumnSelection(false) + } } } baseHandleRowContextMenu(e, row, columnName) @@ -578,6 +631,7 @@ export function Table({ const handleCellMouseDown = useCallback( (rowIndex: number, colIndex: number, shiftKey: boolean) => { setCheckedRows((prev) => (prev.size === 0 ? prev : EMPTY_CHECKED_ROWS)) + setIsColumnSelection(false) lastCheckboxRowRef.current = null if (shiftKey && selectionAnchorRef.current) { setSelectionFocus({ rowIndex, colIndex }) @@ -600,6 +654,7 @@ export function Table({ setEditingCell(null) setSelectionAnchor(null) setSelectionFocus(null) + setIsColumnSelection(false) if (shiftKey && lastCheckboxRowRef.current !== null) { const from = Math.min(lastCheckboxRowRef.current, rowIndex) @@ -631,20 +686,41 @@ export function Table({ setSelectionAnchor(null) setSelectionFocus(null) setCheckedRows((prev) => (prev.size === 0 ? prev : EMPTY_CHECKED_ROWS)) + setIsColumnSelection(false) + lastCheckboxRowRef.current = null + }, []) + + const handleColumnSelect = useCallback((colIndex: number, shiftKey: boolean) => { + const lastRow = maxPositionRef.current + if (lastRow < 0) return + + setEditingCell(null) + setCheckedRows((prev) => (prev.size === 0 ? prev : EMPTY_CHECKED_ROWS)) lastCheckboxRowRef.current = null + + if (shiftKey && isColumnSelectionRef.current && selectionAnchorRef.current) { + setSelectionFocus({ rowIndex: lastRow, colIndex }) + } else { + setSelectionAnchor({ rowIndex: 0, colIndex }) + setSelectionFocus({ rowIndex: lastRow, colIndex }) + setIsColumnSelection(true) + } + + scrollRef.current?.focus({ preventScroll: true }) }, []) const handleSelectAllRows = useCallback(() => { const rws = rowsRef.current - if (rws.length === 0) return + const currentCols = columnsRef.current + if (rws.length === 0 || currentCols.length === 0) return setEditingCell(null) - setSelectionAnchor(null) - setSelectionFocus(null) - const all = new Set() - for (const row of rws) { - all.add(row.position) - } - setCheckedRows(all) + setCheckedRows((prev) => (prev.size === 0 ? prev : EMPTY_CHECKED_ROWS)) + setSelectionAnchor({ rowIndex: 0, colIndex: 0 }) + setSelectionFocus({ + rowIndex: maxPositionRef.current, + colIndex: currentCols.length - 1, + }) + setIsColumnSelection(false) scrollRef.current?.focus({ preventScroll: true }) }, []) @@ -669,8 +745,47 @@ export function Table({ updateMetadataRef.current({ columnWidths: columnWidthsRef.current }) }, []) + const handleColumnAutoResize = useCallback((columnName: string) => { + const cols = columnsRef.current + const colIndex = cols.findIndex((c) => c.name === columnName) + if (colIndex === -1) return + + const currentRows = rowsRef.current + let maxWidth = COL_WIDTH_MIN + + const measure = document.createElement('span') + measure.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap' + document.body.appendChild(measure) + + try { + measure.className = 'font-medium text-small' + measure.textContent = columnName + maxWidth = Math.max(maxWidth, measure.offsetWidth + 57) + + measure.className = 'text-small' + for (const row of currentRows) { + const val = row.data[columnName] + if (val == null) continue + measure.textContent = String(val) + maxWidth = Math.max(maxWidth, measure.offsetWidth + 17) + } + } finally { + document.body.removeChild(measure) + } + + const newWidth = Math.min(Math.ceil(maxWidth), 600) + setColumnWidths((prev) => ({ ...prev, [columnName]: newWidth })) + const updated = { ...columnWidthsRef.current, [columnName]: newWidth } + columnWidthsRef.current = updated + updateMetadataRef.current({ columnWidths: updated }) + }, []) + const handleColumnDragStart = useCallback((columnName: string) => { setDragColumnName(columnName) + setSelectionAnchor(null) + setSelectionFocus(null) + setCheckedRows((prev) => (prev.size === 0 ? prev : EMPTY_CHECKED_ROWS)) + setIsColumnSelection(false) }, []) const handleColumnDragOver = useCallback((columnName: string, side: 'left' | 'right') => { @@ -681,7 +796,13 @@ export function Table({ const handleColumnDragEnd = useCallback(() => { const dragged = dragColumnNameRef.current - if (!dragged) return + if (!dragged) { + setDragColumnName(null) + setDropTargetColumnName(null) + setDropSide('left') + return + } + dragColumnNameRef.current = null const target = dropTargetColumnNameRef.current const side = dropSideRef.current if (target && dragged !== target) { @@ -694,11 +815,19 @@ export function Table({ let insertIndex = newOrder.indexOf(target) if (side === 'right') insertIndex += 1 newOrder.splice(insertIndex, 0, dragged) - setColumnOrder(newOrder) - updateMetadataRef.current({ - columnWidths: columnWidthsRef.current, - columnOrder: newOrder, - }) + const orderChanged = newOrder.some((name, i) => currentOrder[i] !== name) + if (orderChanged) { + pushUndoRef.current({ + type: 'reorder-columns', + previousOrder: currentOrder, + newOrder, + }) + setColumnOrder(newOrder) + updateMetadataRef.current({ + columnWidths: columnWidthsRef.current, + columnOrder: newOrder, + }) + } } } setDragColumnName(null) @@ -711,6 +840,37 @@ export function Table({ setDropTargetColumnName(null) }, []) + const handleScrollDragOver = useCallback((e: React.DragEvent) => { + if (!dragColumnNameRef.current) return + e.preventDefault() + e.dataTransfer.dropEffect = 'move' + + const scrollEl = scrollRef.current + if (!scrollEl) return + const scrollRect = scrollEl.getBoundingClientRect() + const cursorX = e.clientX - scrollRect.left + scrollEl.scrollLeft + + const cols = columnsRef.current + let left = CHECKBOX_COL_WIDTH + for (const col of cols) { + const w = columnWidthsRef.current[col.name] ?? COL_WIDTH + if (cursorX < left + w) { + const midX = left + w / 2 + const side = cursorX < midX ? 'left' : 'right' + if (col.name !== dropTargetColumnNameRef.current || side !== dropSideRef.current) { + setDropTargetColumnName(col.name) + setDropSide(side) + } + return + } + left += w + } + }, []) + + const handleScrollDrop = useCallback((e: React.DragEvent) => { + e.preventDefault() + }, []) + useEffect(() => { if (!tableData?.metadata || metadataSeededRef.current) return if (!tableData.metadata.columnWidths && !tableData.metadata.columnOrder) return @@ -723,6 +883,16 @@ export function Table({ } }, [tableData?.metadata]) + useEffect(() => { + if (!isColumnSelection || !selectionAnchor) return + setSelectionFocus((prev) => { + if (!prev || prev.rowIndex !== maxPosition) { + return { rowIndex: maxPosition, colIndex: prev?.colIndex ?? selectionAnchor.colIndex } + } + return prev + }) + }, [isColumnSelection, maxPosition, selectionAnchor]) + useEffect(() => { const handleMouseUp = () => { isDraggingRef.current = false @@ -732,8 +902,10 @@ export function Table({ }, []) useEffect(() => { - if (!selectionAnchor) return - const { rowIndex, colIndex } = selectionAnchor + if (isColumnSelection) return + const target = selectionFocus ?? selectionAnchor + if (!target) return + const { rowIndex, colIndex } = target const rafId = requestAnimationFrame(() => { const cell = document.querySelector( `[data-table-scroll] [data-row="${rowIndex}"][data-col="${colIndex}"]` @@ -741,7 +913,7 @@ export function Table({ cell?.scrollIntoView({ block: 'nearest', inline: 'nearest' }) }) return () => cancelAnimationFrame(rafId) - }, [selectionAnchor]) + }, [selectionAnchor, selectionFocus, isColumnSelection]) const handleCellClick = useCallback((rowId: string, columnName: string) => { const column = columnsRef.current.find((c) => c.name === columnName) @@ -766,6 +938,7 @@ export function Table({ if (!column || column.type === 'boolean') return setSelectionFocus(null) + setIsColumnSelection(false) setEditingCell({ rowId, columnName }) setInitialCharacter(null) }, []) @@ -811,9 +984,19 @@ export function Table({ if (e.key === 'Escape') { e.preventDefault() + if (dragColumnNameRef.current) { + dragColumnNameRef.current = null + dropTargetColumnNameRef.current = null + dropSideRef.current = 'left' + setDragColumnName(null) + setDropTargetColumnName(null) + setDropSide('left') + return + } setSelectionAnchor(null) setSelectionFocus(null) setCheckedRows((prev) => (prev.size === 0 ? prev : EMPTY_CHECKED_ROWS)) + setIsColumnSelection(false) lastCheckboxRowRef.current = null return } @@ -821,34 +1004,45 @@ export function Table({ if ((e.metaKey || e.ctrlKey) && e.key === 'a') { e.preventDefault() const rws = rowsRef.current - if (rws.length > 0) { + const currentCols = columnsRef.current + if (rws.length > 0 && currentCols.length > 0) { setEditingCell(null) - setSelectionAnchor(null) - setSelectionFocus(null) - const all = new Set() - for (const row of rws) { - all.add(row.position) - } - setCheckedRows(all) + setCheckedRows((prev) => (prev.size === 0 ? prev : EMPTY_CHECKED_ROWS)) + setSelectionAnchor({ rowIndex: 0, colIndex: 0 }) + setSelectionFocus({ + rowIndex: maxPositionRef.current, + colIndex: currentCols.length - 1, + }) + setIsColumnSelection(false) } return } + if ((e.metaKey || e.ctrlKey) && e.key === ' ') { + const a = selectionAnchorRef.current + if (!a || editingCellRef.current) return + const lastRow = maxPositionRef.current + if (lastRow < 0) return + e.preventDefault() + setCheckedRows((prev) => (prev.size === 0 ? prev : EMPTY_CHECKED_ROWS)) + lastCheckboxRowRef.current = null + setSelectionAnchor({ rowIndex: 0, colIndex: a.colIndex }) + setSelectionFocus({ rowIndex: lastRow, colIndex: a.colIndex }) + setIsColumnSelection(true) + return + } + if (e.key === ' ' && e.shiftKey) { const a = selectionAnchorRef.current if (!a || editingCellRef.current) return + const currentCols = columnsRef.current + if (currentCols.length === 0) return e.preventDefault() - setSelectionFocus(null) - setCheckedRows((prev) => { - const next = new Set(prev) - if (next.has(a.rowIndex)) { - next.delete(a.rowIndex) - } else { - next.add(a.rowIndex) - } - return next - }) - lastCheckboxRowRef.current = a.rowIndex + setCheckedRows((prev) => (prev.size === 0 ? prev : EMPTY_CHECKED_ROWS)) + lastCheckboxRowRef.current = null + setIsColumnSelection(false) + setSelectionAnchor({ rowIndex: a.rowIndex, colIndex: 0 }) + setSelectionFocus({ rowIndex: a.rowIndex, colIndex: currentCols.length - 1 }) return } @@ -860,6 +1054,7 @@ export function Table({ const pMap = positionMapRef.current const currentCols = columnsRef.current const undoCells: Array<{ rowId: string; data: Record }> = [] + const batchUpdates: Array<{ rowId: string; data: Record }> = [] for (const pos of checked) { const row = pMap.get(pos) if (!row) continue @@ -870,7 +1065,10 @@ export function Table({ updates[col.name] = null } undoCells.push({ rowId: row.id, data: previousData }) - mutateRef.current({ rowId: row.id, data: updates }) + batchUpdates.push({ rowId: row.id, data: updates }) + } + if (batchUpdates.length > 0) { + batchUpdateRef.current({ updates: batchUpdates }) } if (undoCells.length > 0) { pushUndoRef.current({ type: 'clear-cells', cells: undoCells }) @@ -939,6 +1137,7 @@ export function Table({ if (e.key === 'Tab') { e.preventDefault() setCheckedRows((prev) => (prev.size === 0 ? prev : EMPTY_CHECKED_ROWS)) + setIsColumnSelection(false) lastCheckboxRowRef.current = null setSelectionAnchor(moveCell(anchor, cols.length, totalRows, e.shiftKey ? -1 : 1)) setSelectionFocus(null) @@ -948,6 +1147,7 @@ export function Table({ if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key)) { e.preventDefault() setCheckedRows((prev) => (prev.size === 0 ? prev : EMPTY_CHECKED_ROWS)) + setIsColumnSelection(false) lastCheckboxRowRef.current = null const focus = selectionFocusRef.current ?? anchor const origin = e.shiftKey ? focus : anchor @@ -979,6 +1179,97 @@ export function Table({ return } + if (e.key === 'Home') { + e.preventDefault() + setIsColumnSelection(false) + const jump = e.metaKey || e.ctrlKey + if (e.shiftKey) { + const focus = selectionFocusRef.current ?? anchor + setSelectionFocus({ rowIndex: jump ? 0 : focus.rowIndex, colIndex: 0 }) + } else { + setSelectionAnchor({ rowIndex: jump ? 0 : anchor.rowIndex, colIndex: 0 }) + setSelectionFocus(null) + } + return + } + + if (e.key === 'End') { + e.preventDefault() + setIsColumnSelection(false) + const jump = e.metaKey || e.ctrlKey + if (e.shiftKey) { + const focus = selectionFocusRef.current ?? anchor + setSelectionFocus({ + rowIndex: jump ? totalRows - 1 : focus.rowIndex, + colIndex: cols.length - 1, + }) + } else { + setSelectionAnchor({ + rowIndex: jump ? totalRows - 1 : anchor.rowIndex, + colIndex: cols.length - 1, + }) + setSelectionFocus(null) + } + return + } + + if (e.key === 'PageUp' || e.key === 'PageDown') { + e.preventDefault() + setIsColumnSelection(false) + const scrollEl = scrollRef.current + const viewportHeight = scrollEl ? scrollEl.clientHeight : ROW_HEIGHT_ESTIMATE * 10 + const rowsPerPage = Math.max(1, Math.floor(viewportHeight / ROW_HEIGHT_ESTIMATE)) + const direction = e.key === 'PageUp' ? -1 : 1 + const origin = e.shiftKey ? (selectionFocusRef.current ?? anchor) : anchor + const newRow = Math.max( + 0, + Math.min(totalRows - 1, origin.rowIndex + direction * rowsPerPage) + ) + if (e.shiftKey) { + setSelectionFocus({ rowIndex: newRow, colIndex: origin.colIndex }) + } else { + setSelectionAnchor({ rowIndex: newRow, colIndex: anchor.colIndex }) + setSelectionFocus(null) + } + return + } + + if ((e.metaKey || e.ctrlKey) && e.key === 'd') { + e.preventDefault() + if (!canEditRef.current) return + const sel = computeNormalizedSelection(anchor, selectionFocusRef.current) + if (!sel || sel.startRow === sel.endRow) return + const pMap = positionMapRef.current + const sourceRow = pMap.get(sel.startRow) + if (!sourceRow) return + const undoCells: Array<{ + rowId: string + oldData: Record + newData: Record + }> = [] + for (let r = sel.startRow + 1; r <= sel.endRow; r++) { + const row = pMap.get(r) + if (!row) continue + const oldData: Record = {} + const newData: Record = {} + for (let c = sel.startCol; c <= sel.endCol; c++) { + if (c < cols.length) { + const colName = cols[c].name + oldData[colName] = row.data[colName] ?? null + newData[colName] = sourceRow.data[colName] ?? null + } + } + undoCells.push({ rowId: row.id, oldData, newData }) + } + if (undoCells.length > 0) { + batchUpdateRef.current({ + updates: undoCells.map((c) => ({ rowId: c.rowId, data: c.newData })), + }) + pushUndoRef.current({ type: 'update-cells', cells: undoCells }) + } + return + } + if (e.key === 'Delete' || e.key === 'Backspace') { if (!canEditRef.current) return e.preventDefault() @@ -986,6 +1277,7 @@ export function Table({ if (!sel) return const pMap = positionMapRef.current const undoCells: Array<{ rowId: string; data: Record }> = [] + const batchUpdates: Array<{ rowId: string; data: Record }> = [] for (let r = sel.startRow; r <= sel.endRow; r++) { const row = pMap.get(r) if (!row) continue @@ -999,7 +1291,10 @@ export function Table({ } } undoCells.push({ rowId: row.id, data: previousData }) - mutateRef.current({ rowId: row.id, data: updates }) + batchUpdates.push({ rowId: row.id, data: updates }) + } + if (batchUpdates.length > 0) { + batchUpdateRef.current({ updates: batchUpdates }) } if (undoCells.length > 0) { pushUndoRef.current({ type: 'clear-cells', cells: undoCells }) @@ -1061,6 +1356,7 @@ export function Table({ for (let r = sel.startRow; r <= sel.endRow; r++) { const cells: string[] = [] for (let c = sel.startCol; c <= sel.endCol; c++) { + if (c >= cols.length) break const row = pMap.get(r) const value: unknown = row ? row.data[cols[c].name] : null if (value === null || value === undefined) { @@ -1084,6 +1380,7 @@ export function Table({ const cols = columnsRef.current const pMap = positionMapRef.current const undoCells: Array<{ rowId: string; data: Record }> = [] + const batchUpdates: Array<{ rowId: string; data: Record }> = [] if (checked.size > 0) { e.preventDefault() @@ -1105,7 +1402,7 @@ export function Table({ updates[col.name] = null } undoCells.push({ rowId: row.id, data: previousData }) - mutateRef.current({ rowId: row.id, data: updates }) + batchUpdates.push({ rowId: row.id, data: updates }) } e.clipboardData?.setData('text/plain', lines.join('\n')) } else { @@ -1138,11 +1435,14 @@ export function Table({ } lines.push(cells.join('\t')) undoCells.push({ rowId: row.id, data: previousData }) - mutateRef.current({ rowId: row.id, data: updates }) + batchUpdates.push({ rowId: row.id, data: updates }) } e.clipboardData?.setData('text/plain', lines.join('\n')) } + if (batchUpdates.length > 0) { + batchUpdateRef.current({ updates: batchUpdates }) + } if (undoCells.length > 0) { pushUndoRef.current({ type: 'clear-cells', cells: undoCells }) } @@ -1296,15 +1596,16 @@ export function Table({ return } - const oldValue = row.data[columnName] - const changed = !(oldValue === value) && !(oldValue === null && value === null) + const oldValue = row.data[columnName] ?? null + const normalizedValue = value ?? null + const changed = oldValue !== normalizedValue if (changed) { pushUndoRef.current({ type: 'update-cell', rowId, columnName, - previousValue: oldValue ?? null, + previousValue: oldValue, newValue: value, }) mutateRef.current({ rowId, data: { [columnName]: value } }) @@ -1349,15 +1650,22 @@ export function Table({ const handleChangeType = useCallback((columnName: string, newType: string) => { const column = columnsRef.current.find((c) => c.name === columnName) - if (column) { - pushUndoRef.current({ - type: 'update-column-type', - columnName, - previousType: column.type, - newType, - }) - } - updateColumnMutation.mutate({ columnName, updates: { type: newType } }) + const previousType = column?.type + updateColumnMutation.mutate( + { columnName, updates: { type: newType } }, + { + onSuccess: () => { + if (previousType) { + pushUndoRef.current({ + type: 'update-column-type', + columnName, + previousType, + newType, + }) + } + }, + } + ) }, []) const insertColumnInOrder = useCallback( @@ -1437,26 +1745,96 @@ export function Table({ ) const handleDeleteColumn = useCallback((columnName: string) => { - setDeletingColumn(columnName) + const cols = columnsRef.current + if (isColumnSelectionRef.current && selectionAnchorRef.current) { + const sel = computeNormalizedSelection(selectionAnchorRef.current, selectionFocusRef.current) + if (sel && sel.startCol !== sel.endCol) { + const clickedIdx = cols.findIndex((c) => c.name === columnName) + if (clickedIdx >= sel.startCol && clickedIdx <= sel.endCol) { + const names: string[] = [] + for (let c = sel.startCol; c <= sel.endCol; c++) { + if (c < cols.length) names.push(cols[c].name) + } + if (names.length > 0) { + setDeletingColumns(names) + return + } + } + } + } + setDeletingColumns([columnName]) }, []) const handleDeleteColumnConfirm = useCallback(() => { - if (!deletingColumn) return - const columnToDelete = deletingColumn - const orderAtDelete = columnOrderRef.current - setDeletingColumn(null) - deleteColumnMutation.mutate(columnToDelete, { - onSuccess: () => { - if (!orderAtDelete) return - const newOrder = orderAtDelete.filter((n) => n !== columnToDelete) - setColumnOrder(newOrder) - updateMetadataRef.current({ - columnWidths: columnWidthsRef.current, - columnOrder: newOrder, - }) - }, - }) - }, [deletingColumn]) + if (!deletingColumns || deletingColumns.length === 0) return + const columnsToDelete = [...deletingColumns] + setDeletingColumns(null) + + let currentOrder = columnOrderRef.current ? [...columnOrderRef.current] : null + const cols = schemaColumnsRef.current + const originalPositions = new Map< + string, + { position: number; def: (typeof cols)[number] | undefined } + >() + for (const name of columnsToDelete) { + const def = cols.find((c) => c.name === name) + originalPositions.set(name, { position: def ? cols.indexOf(def) : cols.length, def }) + } + const deletedOriginalPositions: number[] = [] + + const deleteNext = (index: number) => { + if (index >= columnsToDelete.length) return + const columnToDelete = columnsToDelete[index] + const entry = originalPositions.get(columnToDelete)! + const adjustedPosition = + entry.position - deletedOriginalPositions.filter((p) => p < entry.position).length + const currentRows = rowsRef.current + const cellData = currentRows + .filter((r) => r.data[columnToDelete] != null) + .map((r) => ({ rowId: r.id, value: r.data[columnToDelete] })) + const previousWidth = columnWidthsRef.current[columnToDelete] ?? null + const orderSnapshot = currentOrder ? [...currentOrder] : null + + deleteColumnMutation.mutate(columnToDelete, { + onSuccess: () => { + deletedOriginalPositions.push(entry.position) + pushUndoRef.current({ + type: 'delete-column', + columnName: columnToDelete, + columnType: entry.def?.type ?? 'string', + columnPosition: adjustedPosition >= 0 ? adjustedPosition : cols.length, + columnUnique: entry.def?.unique ?? false, + columnRequired: entry.def?.required ?? false, + cellData, + previousOrder: orderSnapshot, + previousWidth, + }) + + const { [columnToDelete]: _removedWidth, ...cleanedWidths } = columnWidthsRef.current + setColumnWidths(cleanedWidths) + columnWidthsRef.current = cleanedWidths + + if (currentOrder) { + currentOrder = currentOrder.filter((n) => n !== columnToDelete) + setColumnOrder(currentOrder) + updateMetadataRef.current({ + columnWidths: cleanedWidths, + columnOrder: currentOrder, + }) + } else { + updateMetadataRef.current({ columnWidths: cleanedWidths }) + } + + deleteNext(index + 1) + }, + }) + } + + setSelectionAnchor(null) + setSelectionFocus(null) + setIsColumnSelection(false) + deleteNext(0) + }, [deletingColumns]) const handleSortChange = useCallback((column: string, direction: SortDirection) => { setQueryOptions((prev) => ({ ...prev, sort: { [column]: direction } })) @@ -1668,6 +2046,8 @@ export function Table({ resizingColumn && 'select-none' )} data-table-scroll + onDragOver={handleScrollDragOver} + onDrop={handleScrollDrop} >
- {displayColumns.map((column) => ( + {displayColumns.map((column, idx) => ( = normalizedSelection.startCol && + idx <= normalizedSelection.endCol + } renameValue={ columnRename.editingId === column.name ? columnRename.editValue : '' } @@ -1727,6 +2114,7 @@ export function Table({ onRenameSubmit={columnRename.submitRename} onRenameCancel={columnRename.cancelRename} onRenameColumn={handleRenameColumn} + onColumnSelect={handleColumnSelect} onChangeType={handleChangeType} onInsertLeft={handleInsertColumnLeft} onInsertRight={handleInsertColumnRight} @@ -1735,7 +2123,7 @@ export function Table({ onResizeStart={handleColumnResizeStart} onResize={handleColumnResize} onResizeEnd={handleColumnResizeEnd} - isDragging={dragColumnName === column.name} + onAutoResize={handleColumnAutoResize} onDragStart={handleColumnDragStart} onDragOver={handleColumnDragOver} onDragEnd={handleColumnDragEnd} @@ -1812,11 +2200,17 @@ export function Table({ style={{ left: resizeIndicatorLeft }} /> )} - {dropIndicatorLeft !== null && ( -
+ {dropColumnBounds !== null && ( + <> +
+
+ )}
{!isLoadingTable && !isLoadingRows && userPermissions.canEdit && ( @@ -1908,25 +2302,45 @@ export function Table({ )} { - if (!open) setDeletingColumn(null) + if (!open) setDeletingColumns(null) }} > - Delete Column + + {deletingColumns && deletingColumns.length > 1 + ? `Delete ${deletingColumns.length} Columns` + : 'Delete Column'} +

- Are you sure you want to delete{' '} - {deletingColumn}?{' '} + {deletingColumns && deletingColumns.length > 1 ? ( + <> + Are you sure you want to delete{' '} + + {deletingColumns.length} columns + + ?{' '} + + ) : ( + <> + Are you sure you want to delete{' '} + + {deletingColumns?.[0]} + + ?{' '} + + )} - This will remove all data in this column. + This will remove all data in{' '} + {deletingColumns && deletingColumns.length > 1 ? 'these columns' : 'this column'}. {' '} - This action cannot be undone. + You can undo this action.

-
) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-file-attachments.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-file-attachments.ts index f449413794e..a7ac6ff729e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-file-attachments.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-file-attachments.ts @@ -104,8 +104,8 @@ export function useFileAttachments(props: UseFileAttachmentsProps) { }, []) /** - * Processes and uploads files to S3 - * @param fileList - Files to process + * Uploads files in parallel so a slow file does not block faster ones queued + * behind it. All placeholders insert in a single state update for a stable row. */ const processFiles = useCallback( async (fileList: FileList) => { @@ -114,67 +114,69 @@ export function useFileAttachments(props: UseFileAttachmentsProps) { return } - for (const file of Array.from(fileList)) { - let previewUrl: string | undefined - if (file.type.startsWith('image/')) { - previewUrl = URL.createObjectURL(file) - } - - const resolvedType = resolveFileType(file) - - const tempFile: AttachedFile = { - id: generateId(), - name: file.name, - size: file.size, - type: resolvedType, - path: '', - uploading: true, - previewUrl, - } - - setAttachedFiles((prev) => [...prev, tempFile]) - - try { - const formData = new FormData() - formData.append('file', file) - formData.append('context', 'mothership') - if (workspaceId) { - formData.append('workspaceId', workspaceId) - } - - const uploadResponse = await fetch('/api/files/upload', { - method: 'POST', - body: formData, - }) - - if (!uploadResponse.ok) { - const errorData = await uploadResponse.json().catch(() => ({ - error: `Upload failed: ${uploadResponse.status}`, - })) - throw new Error(errorData.error || `Failed to upload file: ${uploadResponse.status}`) - } - - const uploadData = await uploadResponse.json() - - logger.info(`File uploaded successfully: ${uploadData.fileInfo?.path || uploadData.path}`) + const files = Array.from(fileList) + if (files.length === 0) return + + const placeholders: AttachedFile[] = files.map((file) => ({ + id: generateId(), + name: file.name, + size: file.size, + type: resolveFileType(file), + path: '', + uploading: true, + previewUrl: file.type.startsWith('image/') ? URL.createObjectURL(file) : undefined, + })) + + setAttachedFiles((prev) => [...prev, ...placeholders]) + + await Promise.all( + files.map(async (file, i) => { + const placeholder = placeholders[i] + try { + const formData = new FormData() + formData.append('file', file) + formData.append('context', 'mothership') + if (workspaceId) { + formData.append('workspaceId', workspaceId) + } + + const uploadResponse = await fetch('/api/files/upload', { + method: 'POST', + body: formData, + }) + + if (!uploadResponse.ok) { + const errorData = await uploadResponse.json().catch(() => ({ + error: `Upload failed: ${uploadResponse.status}`, + })) + throw new Error(errorData.error || `Failed to upload file: ${uploadResponse.status}`) + } + + const uploadData = await uploadResponse.json() + + logger.info( + `File uploaded successfully: ${uploadData.fileInfo?.path || uploadData.path}` + ) - setAttachedFiles((prev) => - prev.map((f) => - f.id === tempFile.id - ? { - ...f, - path: uploadData.fileInfo?.path || uploadData.path || uploadData.url, - key: uploadData.fileInfo?.key || uploadData.key, - uploading: false, - } - : f + setAttachedFiles((prev) => + prev.map((f) => + f.id === placeholder.id + ? { + ...f, + path: uploadData.fileInfo?.path || uploadData.path || uploadData.url, + key: uploadData.fileInfo?.key || uploadData.key, + uploading: false, + } + : f + ) ) - ) - } catch (error) { - logger.error(`File upload failed: ${error}`) - setAttachedFiles((prev) => prev.filter((f) => f.id !== tempFile.id)) - } - } + } catch (error) { + logger.error(`File upload failed: ${error}`) + if (placeholder.previewUrl) URL.revokeObjectURL(placeholder.previewUrl) + setAttachedFiles((prev) => prev.filter((f) => f.id !== placeholder.id)) + } + }) + ) }, [userId, workspaceId] ) diff --git a/apps/sim/hooks/queries/tables.ts b/apps/sim/hooks/queries/tables.ts index 282761df980..7b0d233d884 100644 --- a/apps/sim/hooks/queries/tables.ts +++ b/apps/sim/hooks/queries/tables.ts @@ -676,6 +676,9 @@ export function useUpdateColumn({ workspaceId, tableId }: RowMutationContext) { return res.json() }, + onError: (error) => { + toast.error(error.message, { duration: 5000 }) + }, onSettled: () => { invalidateTableSchema(queryClient, workspaceId, tableId) }, diff --git a/apps/sim/hooks/use-table-undo.ts b/apps/sim/hooks/use-table-undo.ts index 6090e84f1d8..accdd79b599 100644 --- a/apps/sim/hooks/use-table-undo.ts +++ b/apps/sim/hooks/use-table-undo.ts @@ -2,7 +2,7 @@ * Hook that connects the table undo/redo store to React Query mutations. */ -import { useCallback, useEffect } from 'react' +import { useCallback, useEffect, useRef } from 'react' import { createLogger } from '@sim/logger' import { useAddTableColumn, @@ -14,6 +14,7 @@ import { useDeleteTableRows, useRenameTable, useUpdateColumn, + useUpdateTableMetadata, useUpdateTableRow, } from '@/hooks/queries/tables' import { runWithoutRecording, useTableUndoStore } from '@/stores/table/store' @@ -33,9 +34,20 @@ export function extractCreatedRowId(response: Record): string | interface UseTableUndoProps { workspaceId: string tableId: string + onColumnOrderChange?: (order: string[]) => void + onColumnRename?: (oldName: string, newName: string) => void + onColumnWidthsChange?: (widths: Record) => void + getColumnWidths?: () => Record } -export function useTableUndo({ workspaceId, tableId }: UseTableUndoProps) { +export function useTableUndo({ + workspaceId, + tableId, + onColumnOrderChange, + onColumnRename, + onColumnWidthsChange, + getColumnWidths, +}: UseTableUndoProps) { const push = useTableUndoStore((s) => s.push) const popUndo = useTableUndoStore((s) => s.popUndo) const popRedo = useTableUndoStore((s) => s.popRedo) @@ -55,6 +67,16 @@ export function useTableUndo({ workspaceId, tableId }: UseTableUndoProps) { const updateColumnMutation = useUpdateColumn({ workspaceId, tableId }) const deleteColumnMutation = useDeleteColumn({ workspaceId, tableId }) const renameTableMutation = useRenameTable(workspaceId) + const updateMetadataMutation = useUpdateTableMetadata({ workspaceId, tableId }) + + const onColumnOrderChangeRef = useRef(onColumnOrderChange) + onColumnOrderChangeRef.current = onColumnOrderChange + const onColumnRenameRef = useRef(onColumnRename) + onColumnRenameRef.current = onColumnRename + const onColumnWidthsChangeRef = useRef(onColumnWidthsChange) + onColumnWidthsChangeRef.current = onColumnWidthsChange + const getColumnWidthsRef = useRef(getColumnWidths) + getColumnWidthsRef.current = getColumnWidths useEffect(() => { return () => clear(tableId) @@ -180,7 +202,16 @@ export function useTableUndo({ workspaceId, tableId }: UseTableUndoProps) { case 'create-column': { if (direction === 'undo') { - deleteColumnMutation.mutate(action.columnName) + deleteColumnMutation.mutate(action.columnName, { + onSuccess: () => { + const currentWidths = getColumnWidthsRef.current?.() ?? {} + if (action.columnName in currentWidths) { + const { [action.columnName]: _, ...rest } = currentWidths + onColumnWidthsChangeRef.current?.(rest) + updateMetadataMutation.mutate({ columnWidths: rest }) + } + }, + }) } else { addColumnMutation.mutate({ name: action.columnName, @@ -191,21 +222,89 @@ export function useTableUndo({ workspaceId, tableId }: UseTableUndoProps) { break } - case 'rename-column': { + case 'delete-column': { if (direction === 'undo') { - updateColumnMutation.mutate({ - columnName: action.newName, - updates: { name: action.oldName }, - }) + addColumnMutation.mutate( + { + name: action.columnName, + type: action.columnType, + required: action.columnRequired, + unique: action.columnUnique, + position: action.columnPosition, + }, + { + onSuccess: () => { + if (action.cellData.length > 0) { + const updates = action.cellData.map((c) => ({ + rowId: c.rowId, + data: { [action.columnName]: c.value }, + })) + batchUpdateRowsMutation.mutate( + { updates }, + { + onError: (error) => { + logger.error('Failed to restore cell data on delete-column undo', { + columnName: action.columnName, + error, + }) + }, + } + ) + } + const metadata: Record = {} + if (action.previousOrder) { + onColumnOrderChangeRef.current?.(action.previousOrder) + metadata.columnOrder = action.previousOrder + } + if (action.previousWidth !== null) { + const merged = { + ...(getColumnWidthsRef.current?.() ?? {}), + [action.columnName]: action.previousWidth, + } + metadata.columnWidths = merged + onColumnWidthsChangeRef.current?.(merged) + } + if (Object.keys(metadata).length > 0) { + updateMetadataMutation.mutate(metadata) + } + }, + } + ) } else { - updateColumnMutation.mutate({ - columnName: action.oldName, - updates: { name: action.newName }, + deleteColumnMutation.mutate(action.columnName, { + onSuccess: () => { + const metadata: Record = {} + if (action.previousOrder) { + const newOrder = action.previousOrder.filter((n) => n !== action.columnName) + onColumnOrderChangeRef.current?.(newOrder) + metadata.columnOrder = newOrder + } + if (action.previousWidth !== null) { + const currentWidths = getColumnWidthsRef.current?.() ?? {} + const { [action.columnName]: _, ...rest } = currentWidths + metadata.columnWidths = rest + onColumnWidthsChangeRef.current?.(rest) + } + if (Object.keys(metadata).length > 0) { + updateMetadataMutation.mutate(metadata) + } + }, }) } break } + case 'rename-column': { + const fromName = direction === 'undo' ? action.newName : action.oldName + const toName = direction === 'undo' ? action.oldName : action.newName + updateColumnMutation.mutate({ + columnName: fromName, + updates: { name: toName }, + }) + onColumnRenameRef.current?.(fromName, toName) + break + } + case 'update-column-type': { const type = direction === 'undo' ? action.previousType : action.newType updateColumnMutation.mutate({ @@ -229,6 +328,13 @@ export function useTableUndo({ workspaceId, tableId }: UseTableUndoProps) { renameTableMutation.mutate({ tableId: action.tableId, name }) break } + + case 'reorder-columns': { + const order = direction === 'undo' ? action.previousOrder : action.newOrder + onColumnOrderChangeRef.current?.(order) + updateMetadataMutation.mutate({ columnOrder: order }) + break + } } } catch (err) { logger.error('Failed to execute undo/redo action', { action, direction, err }) diff --git a/apps/sim/lib/table/__tests__/update-row.test.ts b/apps/sim/lib/table/__tests__/update-row.test.ts new file mode 100644 index 00000000000..ef899da0f9f --- /dev/null +++ b/apps/sim/lib/table/__tests__/update-row.test.ts @@ -0,0 +1,120 @@ +/** + * @vitest-environment node + */ +import { databaseMock } from '@sim/testing' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { updateRow } from '../service' +import type { TableDefinition } from '../types' + +const EXISTING_ROW = { + id: 'row-1', + tableId: 'tbl-1', + workspaceId: 'ws-1', + data: { name: 'Alice', age: 30 }, + position: 1, + createdAt: new Date('2024-01-01'), + updatedAt: new Date('2024-01-01'), +} + +const TABLE: TableDefinition = { + id: 'tbl-1', + name: 'People', + description: null, + schema: { + columns: [ + { name: 'name', type: 'string' }, + { name: 'age', type: 'number' }, + ], + }, + metadata: null, + rowCount: 0, + maxRows: 1000, + workspaceId: 'ws-1', + createdBy: 'user-1', + archivedAt: null, + createdAt: new Date('2024-01-01'), + updatedAt: new Date('2024-01-01'), +} + +describe('updateRow — partial merge', () => { + let mockSet: ReturnType + + beforeEach(() => { + vi.clearAllMocks() + + // db.select() → used by getRowById to fetch the existing row + const mockLimit = vi.fn().mockResolvedValue([EXISTING_ROW]) + const mockSelectWhere = vi.fn().mockReturnValue({ limit: mockLimit }) + const mockFrom = vi.fn().mockReturnValue({ where: mockSelectWhere }) + databaseMock.db.select.mockReturnValue({ from: mockFrom }) + + // db.update() → captures what merged data gets written + const mockUpdateWhere = vi.fn().mockResolvedValue([]) + mockSet = vi.fn().mockReturnValue({ where: mockUpdateWhere }) + databaseMock.db.update.mockReturnValue({ set: mockSet }) + }) + + it('preserves columns not included in the partial update', async () => { + const result = await updateRow( + { tableId: 'tbl-1', rowId: 'row-1', data: { age: 31 }, workspaceId: 'ws-1' }, + TABLE, + 'req-1' + ) + + expect(result.data).toEqual({ name: 'Alice', age: 31 }) + expect(mockSet).toHaveBeenCalledWith( + expect.objectContaining({ data: { name: 'Alice', age: 31 } }) + ) + }) + + it('allows updating a single column without affecting others', async () => { + const result = await updateRow( + { tableId: 'tbl-1', rowId: 'row-1', data: { name: 'Bob' }, workspaceId: 'ws-1' }, + TABLE, + 'req-1' + ) + + expect(result.data).toEqual({ name: 'Bob', age: 30 }) + expect(mockSet).toHaveBeenCalledWith( + expect.objectContaining({ data: { name: 'Bob', age: 30 } }) + ) + }) + + it('allows explicitly nulling a field while preserving others', async () => { + const result = await updateRow( + { tableId: 'tbl-1', rowId: 'row-1', data: { age: null }, workspaceId: 'ws-1' }, + TABLE, + 'req-1' + ) + + expect(result.data).toEqual({ name: 'Alice', age: null }) + expect(mockSet).toHaveBeenCalledWith( + expect.objectContaining({ data: { name: 'Alice', age: null } }) + ) + }) + + it('handles a full-row update correctly (idempotent merge)', async () => { + const result = await updateRow( + { tableId: 'tbl-1', rowId: 'row-1', data: { name: 'Bob', age: 25 }, workspaceId: 'ws-1' }, + TABLE, + 'req-1' + ) + + expect(result.data).toEqual({ name: 'Bob', age: 25 }) + }) + + it('throws when the row does not exist', async () => { + const mockLimit = vi.fn().mockResolvedValue([]) + const mockSelectWhere = vi.fn().mockReturnValue({ limit: mockLimit }) + const mockFrom = vi.fn().mockReturnValue({ where: mockSelectWhere }) + databaseMock.db.select.mockReturnValue({ from: mockFrom }) + + await expect( + updateRow( + { tableId: 'tbl-1', rowId: 'row-missing', data: { age: 31 }, workspaceId: 'ws-1' }, + TABLE, + 'req-1' + ) + ).rejects.toThrow('Row not found') + }) +}) diff --git a/apps/sim/lib/table/service.ts b/apps/sim/lib/table/service.ts index cfa1f5dbecb..a8e0bdecb71 100644 --- a/apps/sim/lib/table/service.ts +++ b/apps/sim/lib/table/service.ts @@ -1207,14 +1207,20 @@ export async function updateRow( throw new Error('Row not found') } + // Merge partial update with existing row data so callers can pass only changed fields + const mergedData = { + ...(existingRow.data as RowData), + ...data.data, + } + // Validate size - const sizeValidation = validateRowSize(data.data) + const sizeValidation = validateRowSize(mergedData) if (!sizeValidation.valid) { throw new Error(sizeValidation.errors.join(', ')) } // Validate against schema - const schemaValidation = validateRowAgainstSchema(data.data, table.schema) + const schemaValidation = validateRowAgainstSchema(mergedData, table.schema) if (!schemaValidation.valid) { throw new Error(`Schema validation failed: ${schemaValidation.errors.join(', ')}`) } @@ -1224,7 +1230,7 @@ export async function updateRow( if (uniqueColumns.length > 0) { const uniqueValidation = await checkUniqueConstraintsDb( data.tableId, - data.data, + mergedData, table.schema, data.rowId // Exclude current row ) @@ -1237,14 +1243,14 @@ export async function updateRow( await db .update(userTableRows) - .set({ data: data.data, updatedAt: now }) + .set({ data: mergedData, updatedAt: now }) .where(eq(userTableRows.id, data.rowId)) logger.info(`[${requestId}] Updated row ${data.rowId} in table ${data.tableId}`) return { id: data.rowId, - data: data.data, + data: mergedData, position: existingRow.position, createdAt: existingRow.createdAt, updatedAt: now, diff --git a/apps/sim/stores/table/store.ts b/apps/sim/stores/table/store.ts index 3b5b1d3de96..6590ba6e6b0 100644 --- a/apps/sim/stores/table/store.ts +++ b/apps/sim/stores/table/store.ts @@ -13,6 +13,73 @@ const EMPTY_STACKS: TableUndoStacks = { undo: [], redo: [] } let undoRedoInProgress = false +function patchRowIdInEntry(entry: UndoEntry, oldRowId: string, newRowId: string): UndoEntry { + const { action } = entry + switch (action.type) { + case 'update-cell': + if (action.rowId === oldRowId) { + return { ...entry, action: { ...action, rowId: newRowId } } + } + break + case 'clear-cells': { + const hasMatch = action.cells.some((c) => c.rowId === oldRowId) + if (hasMatch) { + const patched = action.cells.map((c) => + c.rowId === oldRowId ? { ...c, rowId: newRowId } : c + ) + return { ...entry, action: { ...action, cells: patched } } + } + break + } + case 'update-cells': { + const hasMatch = action.cells.some((c) => c.rowId === oldRowId) + if (hasMatch) { + const patched = action.cells.map((c) => + c.rowId === oldRowId ? { ...c, rowId: newRowId } : c + ) + return { ...entry, action: { ...action, cells: patched } } + } + break + } + case 'create-row': + if (action.rowId === oldRowId) { + return { ...entry, action: { ...action, rowId: newRowId } } + } + break + case 'create-rows': { + const hasMatch = action.rows.some((r) => r.rowId === oldRowId) + if (hasMatch) { + const patched = action.rows.map((r) => + r.rowId === oldRowId ? { ...r, rowId: newRowId } : r + ) + return { ...entry, action: { ...action, rows: patched } } + } + break + } + case 'delete-rows': { + const hasMatch = action.rows.some((r) => r.rowId === oldRowId) + if (hasMatch) { + const patched = action.rows.map((r) => + r.rowId === oldRowId ? { ...r, rowId: newRowId } : r + ) + return { ...entry, action: { ...action, rows: patched } } + } + break + } + case 'delete-column': { + const hasMatch = action.cellData.some((c) => c.rowId === oldRowId) + if (hasMatch) { + const patched = action.cellData.map((c) => + c.rowId === oldRowId ? { ...c, rowId: newRowId } : c + ) + return { ...entry, action: { ...action, cellData: patched } } + } + break + } + } + return entry +} + /** * Run a function without recording undo entries. * Used by the hook when executing undo/redo mutations to prevent recursive recording. @@ -83,46 +150,35 @@ export const useTableUndoStore = create()( }, patchRedoRowId: (tableId: string, oldRowId: string, newRowId: string) => { - const stacks = get().stacks[tableId] - if (!stacks) return - - const patchedRedo = stacks.redo.map((entry) => { - const { action } = entry - if (action.type === 'delete-rows') { - const patchedRows = action.rows.map((r) => - r.rowId === oldRowId ? { ...r, rowId: newRowId } : r - ) - return { ...entry, action: { ...action, rows: patchedRows } } + set((state) => { + const stacks = state.stacks[tableId] + if (!stacks) return state + const patchedRedo = stacks.redo.map((entry) => + patchRowIdInEntry(entry, oldRowId, newRowId) + ) + return { + stacks: { + ...state.stacks, + [tableId]: { ...stacks, redo: patchedRedo }, + }, } - return entry }) - - set((state) => ({ - stacks: { - ...state.stacks, - [tableId]: { ...stacks, redo: patchedRedo }, - }, - })) }, patchUndoRowId: (tableId: string, oldRowId: string, newRowId: string) => { - const stacks = get().stacks[tableId] - if (!stacks) return - - const patchedUndo = stacks.undo.map((entry) => { - const { action } = entry - if (action.type === 'create-row' && action.rowId === oldRowId) { - return { ...entry, action: { ...action, rowId: newRowId } } + set((state) => { + const stacks = state.stacks[tableId] + if (!stacks) return state + const patchedUndo = stacks.undo.map((entry) => + patchRowIdInEntry(entry, oldRowId, newRowId) + ) + return { + stacks: { + ...state.stacks, + [tableId]: { ...stacks, undo: patchedUndo }, + }, } - return entry }) - - set((state) => ({ - stacks: { - ...state.stacks, - [tableId]: { ...stacks, undo: patchedUndo }, - }, - })) }, clear: (tableId: string) => { diff --git a/apps/sim/stores/table/types.ts b/apps/sim/stores/table/types.ts index fbea638f014..8ff515681b0 100644 --- a/apps/sim/stores/table/types.ts +++ b/apps/sim/stores/table/types.ts @@ -32,6 +32,17 @@ export type TableUndoAction = } | { type: 'delete-rows'; rows: DeletedRowSnapshot[] } | { type: 'create-column'; columnName: string; position: number } + | { + type: 'delete-column' + columnName: string + columnType: string + columnPosition: number + columnUnique: boolean + columnRequired: boolean + cellData: Array<{ rowId: string; value: unknown }> + previousOrder: string[] | null + previousWidth: number | null + } | { type: 'rename-column'; oldName: string; newName: string } | { type: 'update-column-type'; columnName: string; previousType: string; newType: string } | { @@ -42,6 +53,7 @@ export type TableUndoAction = newValue: boolean } | { type: 'rename-table'; tableId: string; previousName: string; newName: string } + | { type: 'reorder-columns'; previousOrder: string[]; newOrder: string[] } export interface UndoEntry { id: string From 32541e79d401b1ac44c0431521357db04d5a4e8e Mon Sep 17 00:00:00 2001 From: Vikhyath Mondreti Date: Sat, 18 Apr 2026 10:02:54 -0700 Subject: [PATCH 2/9] chore(readme): update tech stack section (#4227) * chore(readme): update tech stack section * fix --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index de6befd2a8f..57c0192825e 100644 --- a/README.md +++ b/README.md @@ -142,13 +142,15 @@ See the [environment variables reference](https://docs.sim.ai/self-hosting/envir - **Database**: PostgreSQL with [Drizzle ORM](https://orm.drizzle.team) - **Authentication**: [Better Auth](https://better-auth.com) - **UI**: [Shadcn](https://ui.shadcn.com/), [Tailwind CSS](https://tailwindcss.com) -- **State Management**: [Zustand](https://zustand-demo.pmnd.rs/) +- **Streaming Markdown**: [Streamdown](https://github.com/vercel/streamdown) +- **State Management**: [Zustand](https://zustand-demo.pmnd.rs/), [TanStack Query](https://tanstack.com/query) - **Flow Editor**: [ReactFlow](https://reactflow.dev/) - **Docs**: [Fumadocs](https://fumadocs.vercel.app/) - **Monorepo**: [Turborepo](https://turborepo.org/) - **Realtime**: [Socket.io](https://socket.io/) - **Background Jobs**: [Trigger.dev](https://trigger.dev/) - **Remote Code Execution**: [E2B](https://www.e2b.dev/) +- **Isolated Code Execution**: [isolated-vm](https://github.com/laverdet/isolated-vm) ## Contributing From 28b4c4cc67b840e404e6199bc21bdd9530700530 Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 18 Apr 2026 10:26:46 -0700 Subject: [PATCH 3/9] fix(blocks): resolve variable display in mothership resource preview (#4226) * fix(blocks): resolve variable display in mothership resource preview Variables block showed empty assignments in the embedded workflow preview because currentWorkflowId was read from URL params, which don't contain workflowId in the mothership route. Fall back to activeWorkflowId from the workflow registry. * fix(blocks): narrow currentWorkflowId to string to satisfy strict null checks --- .../[workflowId]/components/workflow-block/workflow-block.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx index b9dc27ba82a..96b6c49d578 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx @@ -862,8 +862,6 @@ export const WorkflowBlock = memo(function WorkflowBlock({ const contentRef = useRef(null) const params = useParams() - // In sandbox mode pass empty strings so all workspace-scoped queries are disabled - const currentWorkflowId = isSandbox ? '' : (params.workflowId as string) const workspaceId = isSandbox ? '' : (params.workspaceId as string) const { @@ -877,6 +875,8 @@ export const WorkflowBlock = memo(function WorkflowBlock({ runPathStatus, } = useBlockVisual({ blockId: id, data, isPending, isSelected: selected }) + const currentWorkflowId = isSandbox ? '' : (params.workflowId as string) || activeWorkflowId || '' + const currentBlock = currentWorkflow.getBlockById(id) const { horizontalHandles, blockHeight, blockWidth, displayAdvancedMode, displayTriggerMode } = From c246f5c6608142a6e295a36c7bd8f6bcb45a5a63 Mon Sep 17 00:00:00 2001 From: Vikhyath Mondreti Date: Sat, 18 Apr 2026 10:46:14 -0700 Subject: [PATCH 4/9] improvement(billing): route scope by subscription referenceId, sync plan from Stripe, transfer storage on org join, outbox service (#4219) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(billing): route scope by subscription referenceId, sync plan from Stripe, transfer storage on org join Route every billing decision (usage limits, credits, storage, rate limit, threshold billing, webhooks, UI permissions) through the subscription's `referenceId` instead of plan-name heuristics. Fixes the production state where a `pro_6000` subscription attached to an organization was treated as personal Pro by display/edit code while execution correctly enforced the org cap. Scope - Add `isOrgScopedSubscription(sub, userId)` (pure) and `isSubscriptionOrgScoped(sub)` (async DB-backed) helpers. One is used wherever a user perspective is available; the other in webhook handlers that only have a subscription row. - Replace plan-name scope checks in ~20 files: usage/limit readers, credits balance + purchase, threshold billing, storage limits + tracking, rate limiter, invoice + subscription webhooks, seat management, membership join/leave, `switch-plan` admin gate, admin credits/billing routes, copilot 402 handler, UI subscription settings + permissions + sidebar indicator, React Query types. Plan sync - Add `syncSubscriptionPlan(subscriptionId, currentPlan, planFromStripe)` called from `onSubscriptionComplete` and `onSubscriptionUpdate` so the DB `plan` column heals on every Stripe event. Pro->Team upgrades previously updated price, seats, and referenceId but left `plan` stale — this is what produced the `pro_6000`-on-org row. Priority + grace period - `getHighestPrioritySubscription` now prefers org over personal within each tier (Enterprise > Team > Pro, org > personal at each). A user with a `cancelAtPeriodEnd` personal Pro who joins a paid org routes pooled resources to the org through the grace window. - `calculateSubscriptionOverage` personal-Pro branch reads user_stats directly (bypassing priority) and bills only `proPeriodCostSnapshot` when the user joined a paid org mid-cycle, so post-join org usage isn't double-charged on the personal Pro's final invoice. `resetUsageForSubscription` mirrors this: preserves `currentPeriodCost` / `currentPeriodCopilotCost` when `proPeriodCostSnapshot > 0` so the org's next cycle-close captures post-join usage correctly. Uniform base-price formula - `basePrice × (seats ?? 1)` everywhere: `getOrgUsageLimit`, `updateOrganizationUsageLimit`, `setUsageLimitForCredits`, `calculateSubscriptionOverage`, threshold billing, `syncSubscriptionUsageLimits`, `getOrganizationBillingData`. Admin dashboard math now agrees with enforcement math. Storage transfer on join - Invitation-accept flow moves `user_stats.storageUsedBytes` into `organization.storageUsedBytes` inside the same transaction when the org is paid. - `syncSubscriptionUsageLimits` runs a bulk-backfill version so members who joined before this fix, or orgs that upgraded from free to paid after members joined, get pulled into the org pool on the next subscription event. Idempotent. UX polish - Copilot 402 handler differentiates personal-scoped ("increase your usage limit") from org-scoped ("ask an owner or admin to raise the limit") while keeping the `increase_limit` action code the parser already understands. - Duplicate-subscription error on team upgrade names the existing plan via `getDisplayPlanName`. - Invitation-accept invalidates subscription + organization React Query caches before redirect so settings doesn't flash the user's pre-join personal view. Dead code removal - Remove unused `calculateUserOverage`, and the following fields on `SubscriptionBillingData` / `getSimplifiedBillingSummary` that no consumer in the monorepo read: `basePrice`, `overageAmount`, `totalProjected`, `tierCredits`, `basePriceCredits`, `currentUsageCredits`, `overageAmountCredits`, `totalProjectedCredits`, `usageLimitCredits`, `currentCredits`, `limitCredits`, `lastPeriodCostCredits`, `lastPeriodCopilotCostCredits`, `copilotCostCredits`, and the `organizationData` subobject. Add `metadata: unknown` to match what the server returns. Notes for the triggering customer - The `pro_6000`-on-org row self-heals on the next Stripe event via `syncSubscriptionPlan`. For the one known customer, a direct UPDATE is sufficient: `UPDATE subscription SET plan='team_6000' WHERE id='aq2...' AND plan='pro_6000'`. Made-with: Cursor * fix tests * address more comments * progress * harden further * outbox service * address comments * address comment on check * simplify * cleanup code * minor improvement --- apps/sim/app/api/billing/route.ts | 25 +- apps/sim/app/api/billing/switch-plan/route.ts | 5 +- .../[id]/invitations/[invitationId]/route.ts | 106 +- .../api/organizations/[id]/members/route.ts | 47 +- .../app/api/organizations/[id]/seats/route.ts | 23 +- apps/sim/app/api/v1/admin/credits/route.ts | 6 +- .../admin/organizations/[id]/members/route.ts | 23 - .../api/v1/admin/outbox/[id]/requeue/route.ts | 71 + apps/sim/app/api/v1/admin/outbox/route.ts | 91 + .../api/v1/admin/subscriptions/[id]/route.ts | 58 +- .../api/v1/admin/users/[id]/billing/route.ts | 8 +- .../app/api/webhooks/outbox/process/route.ts | 49 + apps/sim/app/invite/[id]/invite.tsx | 14 + .../subscription/subscription-permissions.ts | 40 +- .../components/subscription/subscription.tsx | 71 +- .../usage-indicator/usage-indicator.tsx | 34 +- apps/sim/hooks/queries/organization.ts | 20 +- apps/sim/hooks/queries/subscription.ts | 34 +- apps/sim/lib/auth/auth.ts | 17 +- apps/sim/lib/billing/authorization.ts | 31 +- .../lib/billing/calculations/usage-monitor.ts | 266 +- apps/sim/lib/billing/client/types.ts | 5 + apps/sim/lib/billing/client/upgrade.ts | 17 +- apps/sim/lib/billing/client/utils.ts | 9 +- apps/sim/lib/billing/core/billing.ts | 577 +- apps/sim/lib/billing/core/organization.ts | 88 +- apps/sim/lib/billing/core/plan.ts | 24 +- apps/sim/lib/billing/core/subscription.ts | 101 +- apps/sim/lib/billing/core/usage.ts | 289 +- apps/sim/lib/billing/credits/balance.ts | 72 +- apps/sim/lib/billing/credits/daily-refresh.ts | 82 +- apps/sim/lib/billing/credits/purchase.ts | 70 +- apps/sim/lib/billing/organization.ts | 77 +- .../lib/billing/organizations/membership.ts | 114 +- apps/sim/lib/billing/plan-helpers.ts | 7 + apps/sim/lib/billing/storage/limits.ts | 35 +- apps/sim/lib/billing/storage/tracking.ts | 11 +- apps/sim/lib/billing/stripe-payment-method.ts | 74 + apps/sim/lib/billing/subscriptions/utils.ts | 31 +- apps/sim/lib/billing/threshold-billing.ts | 321 +- apps/sim/lib/billing/types/index.ts | 9 + .../lib/billing/validation/seat-management.ts | 13 +- apps/sim/lib/billing/webhooks/idempotency.ts | 39 + .../sim/lib/billing/webhooks/invoices.test.ts | 31 + apps/sim/lib/billing/webhooks/invoices.ts | 870 +- .../lib/billing/webhooks/outbox-handlers.ts | 174 + apps/sim/lib/billing/webhooks/subscription.ts | 353 +- apps/sim/lib/copilot/request/tools/billing.ts | 20 +- apps/sim/lib/core/idempotency/service.ts | 57 +- apps/sim/lib/core/outbox/service.test.ts | 385 + apps/sim/lib/core/outbox/service.ts | 366 + .../sim/lib/core/rate-limiter/rate-limiter.ts | 4 +- apps/sim/lib/logs/execution/logger.ts | 7 +- packages/db/migrations/0191_unusual_mongu.sql | 17 + .../db/migrations/meta/0191_snapshot.json | 14785 ++++++++++++++++ packages/db/migrations/meta/_journal.json | 7 + packages/db/schema.ts | 25 + 57 files changed, 18317 insertions(+), 1888 deletions(-) create mode 100644 apps/sim/app/api/v1/admin/outbox/[id]/requeue/route.ts create mode 100644 apps/sim/app/api/v1/admin/outbox/route.ts create mode 100644 apps/sim/app/api/webhooks/outbox/process/route.ts create mode 100644 apps/sim/lib/billing/stripe-payment-method.ts create mode 100644 apps/sim/lib/billing/webhooks/idempotency.ts create mode 100644 apps/sim/lib/billing/webhooks/outbox-handlers.ts create mode 100644 apps/sim/lib/core/outbox/service.test.ts create mode 100644 apps/sim/lib/core/outbox/service.ts create mode 100644 packages/db/migrations/0191_unusual_mongu.sql create mode 100644 packages/db/migrations/meta/0191_snapshot.json diff --git a/apps/sim/app/api/billing/route.ts b/apps/sim/app/api/billing/route.ts index 3fbae3c1df1..2df0d6f2f65 100644 --- a/apps/sim/app/api/billing/route.ts +++ b/apps/sim/app/api/billing/route.ts @@ -7,8 +7,6 @@ import { getSession } from '@/lib/auth' import { getEffectiveBillingStatus } from '@/lib/billing/core/access' import { getSimplifiedBillingSummary } from '@/lib/billing/core/billing' import { getOrganizationBillingData } from '@/lib/billing/core/organization' -import { dollarsToCredits } from '@/lib/billing/credits/conversion' -import { getPlanTierCredits } from '@/lib/billing/plan-helpers' const logger = createLogger('UnifiedBillingAPI') @@ -47,7 +45,20 @@ export async function GET(request: NextRequest) { let billingData if (context === 'user') { - // Get user billing and billing blocked status in parallel + if (contextId) { + const membership = await db + .select({ role: member.role }) + .from(member) + .where(and(eq(member.organizationId, contextId), eq(member.userId, session.user.id))) + .limit(1) + if (membership.length === 0) { + return NextResponse.json( + { error: 'Access denied - not a member of this organization' }, + { status: 403 } + ) + } + } + const [billingResult, billingStatus] = await Promise.all([ getSimplifiedBillingSummary(session.user.id, contextId || undefined), getEffectiveBillingStatus(session.user.id), @@ -107,7 +118,6 @@ export async function GET(request: NextRequest) { ) } - // Transform data to match component expectations billingData = { organizationId: rawBillingData.organizationId, organizationName: rawBillingData.organizationName, @@ -122,17 +132,10 @@ export async function GET(request: NextRequest) { averageUsagePerMember: rawBillingData.averageUsagePerMember, billingPeriodStart: rawBillingData.billingPeriodStart?.toISOString() || null, billingPeriodEnd: rawBillingData.billingPeriodEnd?.toISOString() || null, - tierCredits: getPlanTierCredits(rawBillingData.subscriptionPlan), - totalCurrentUsageCredits: dollarsToCredits(rawBillingData.totalCurrentUsage), - totalUsageLimitCredits: dollarsToCredits(rawBillingData.totalUsageLimit), - minimumBillingAmountCredits: dollarsToCredits(rawBillingData.minimumBillingAmount), - averageUsagePerMemberCredits: dollarsToCredits(rawBillingData.averageUsagePerMember), members: rawBillingData.members.map((m) => ({ ...m, joinedAt: m.joinedAt.toISOString(), lastActive: m.lastActive?.toISOString() || null, - currentUsageCredits: dollarsToCredits(m.currentUsage), - usageLimitCredits: dollarsToCredits(m.usageLimit), })), } diff --git a/apps/sim/app/api/billing/switch-plan/route.ts b/apps/sim/app/api/billing/switch-plan/route.ts index cdc1ca5e65c..4c763caa8c9 100644 --- a/apps/sim/app/api/billing/switch-plan/route.ts +++ b/apps/sim/app/api/billing/switch-plan/route.ts @@ -9,12 +9,13 @@ import { getEffectiveBillingStatus } from '@/lib/billing/core/access' import { isOrganizationOwnerOrAdmin } from '@/lib/billing/core/organization' import { getHighestPrioritySubscription } from '@/lib/billing/core/plan' import { writeBillingInterval } from '@/lib/billing/core/subscription' -import { getPlanType, isEnterprise, isOrgPlan } from '@/lib/billing/plan-helpers' +import { getPlanType, isEnterprise } from '@/lib/billing/plan-helpers' import { getPlanByName } from '@/lib/billing/plans' import { requireStripeClient } from '@/lib/billing/stripe-client' import { hasUsableSubscriptionAccess, hasUsableSubscriptionStatus, + isOrgScopedSubscription, } from '@/lib/billing/subscriptions/utils' import { isBillingEnabled } from '@/lib/core/config/feature-flags' import { toError } from '@/lib/core/utils/helpers' @@ -93,7 +94,7 @@ export async function POST(request: NextRequest) { ) } - if (isOrgPlan(sub.plan)) { + if (isOrgScopedSubscription(sub, userId)) { const hasPermission = await isOrganizationOwnerOrAdmin(userId, sub.referenceId) if (!hasPermission) { return NextResponse.json({ error: 'Only team admins can change the plan' }, { status: 403 }) diff --git a/apps/sim/app/api/organizations/[id]/invitations/[invitationId]/route.ts b/apps/sim/app/api/organizations/[id]/invitations/[invitationId]/route.ts index 7f4f7d8004c..269efb6a32c 100644 --- a/apps/sim/app/api/organizations/[id]/invitations/[invitationId]/route.ts +++ b/apps/sim/app/api/organizations/[id]/invitations/[invitationId]/route.ts @@ -14,7 +14,7 @@ import { workspaceInvitation, } from '@sim/db/schema' import { createLogger } from '@sim/logger' -import { and, eq, inArray } from 'drizzle-orm' +import { and, eq, inArray, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getEmailSubject, renderInvitationEmail } from '@/components/emails' @@ -22,9 +22,10 @@ import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { hasAccessControlAccess } from '@/lib/billing' import { syncUsageLimitsFromSubscription } from '@/lib/billing/core/usage' -import { isOrgPlan, sqlIsPro } from '@/lib/billing/plan-helpers' -import { requireStripeClient } from '@/lib/billing/stripe-client' +import { isPaid, sqlIsPro } from '@/lib/billing/plan-helpers' import { ENTITLED_SUBSCRIPTION_STATUSES } from '@/lib/billing/subscriptions/utils' +import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-handlers' +import { enqueueOutboxEvent } from '@/lib/core/outbox/service' import { getBaseUrl } from '@/lib/core/utils/urls' import { generateId } from '@/lib/core/utils/uuid' import { syncWorkspaceEnvCredentials } from '@/lib/credentials/environment' @@ -328,8 +329,6 @@ export async function PUT( } } - let personalProToCancel: any = null - await db.transaction(async (tx) => { await tx.update(invitation).set({ status }).where(eq(invitation.id, invitationId)) @@ -342,8 +341,7 @@ export async function PUT( createdAt: new Date(), }) - // Snapshot Pro usage and cancel Pro subscription when joining a paid team - try { + { const orgSubs = await tx .select() .from(subscriptionTable) @@ -356,7 +354,7 @@ export async function PUT( .limit(1) const orgSub = orgSubs[0] - const orgIsPaid = orgSub && isOrgPlan(orgSub.plan) + const orgIsPaid = orgSub && isPaid(orgSub.plan) if (orgIsPaid) { const userId = session.user.id @@ -393,8 +391,9 @@ export async function PUT( .update(userStats) .set({ proPeriodCostSnapshot: currentProUsage, - currentPeriodCost: '0', // Reset so new usage is attributed to team - currentPeriodCopilotCost: '0', // Reset copilot cost for new period + proPeriodCostSnapshotAt: new Date(), + currentPeriodCost: '0', + currentPeriodCopilotCost: '0', }) .where(eq(userStats.userId, userId)) @@ -405,19 +404,48 @@ export async function PUT( }) } - // Mark for cancellation after transaction - if (personalPro.cancelAtPeriodEnd !== true) { - personalProToCancel = personalPro + if (personalPro.cancelAtPeriodEnd !== true && personalPro.stripeSubscriptionId) { + await tx + .update(subscriptionTable) + .set({ cancelAtPeriodEnd: true }) + .where(eq(subscriptionTable.id, personalPro.id)) + + await enqueueOutboxEvent(tx, OUTBOX_EVENT_TYPES.STRIPE_SYNC_CANCEL_AT_PERIOD_END, { + stripeSubscriptionId: personalPro.stripeSubscriptionId, + subscriptionId: personalPro.id, + reason: 'member-joined-paid-org', + }) } } + + const storageRows = await tx + .select({ storageUsedBytes: userStats.storageUsedBytes }) + .from(userStats) + .where(eq(userStats.userId, userId)) + .for('update') + .limit(1) + + const bytesToTransfer = storageRows[0]?.storageUsedBytes ?? 0 + if (bytesToTransfer > 0) { + await tx + .update(organization) + .set({ + storageUsedBytes: sql`${organization.storageUsedBytes} + ${bytesToTransfer}`, + }) + .where(eq(organization.id, organizationId)) + + await tx + .update(userStats) + .set({ storageUsedBytes: 0 }) + .where(eq(userStats.userId, userId)) + + logger.info('Transferred personal storage bytes to org pool on join', { + userId, + organizationId, + bytes: bytesToTransfer, + }) + } } - } catch (error) { - logger.error('Failed to handle Pro user joining team', { - userId: session.user.id, - organizationId, - error, - }) - // Don't fail the whole invitation acceptance due to this } // Auto-assign to permission group if one has autoAddNewMembers enabled @@ -557,44 +585,6 @@ export async function PUT( } } - // Handle Pro subscription cancellation after transaction commits - if (personalProToCancel) { - try { - const stripe = requireStripeClient() - if (personalProToCancel.stripeSubscriptionId) { - try { - await stripe.subscriptions.update(personalProToCancel.stripeSubscriptionId, { - cancel_at_period_end: true, - }) - } catch (stripeError) { - logger.error('Failed to set cancel_at_period_end on Stripe for personal Pro', { - userId: session.user.id, - subscriptionId: personalProToCancel.id, - stripeSubscriptionId: personalProToCancel.stripeSubscriptionId, - error: stripeError, - }) - } - } - - await db - .update(subscriptionTable) - .set({ cancelAtPeriodEnd: true }) - .where(eq(subscriptionTable.id, personalProToCancel.id)) - - logger.info('Auto-cancelled personal Pro at period end after joining paid team', { - userId: session.user.id, - personalSubscriptionId: personalProToCancel.id, - organizationId, - }) - } catch (dbError) { - logger.error('Failed to update DB cancelAtPeriodEnd for personal Pro', { - userId: session.user.id, - subscriptionId: personalProToCancel.id, - error: dbError, - }) - } - } - if (status === 'accepted') { try { await syncUsageLimitsFromSubscription(session.user.id) diff --git a/apps/sim/app/api/organizations/[id]/members/route.ts b/apps/sim/app/api/organizations/[id]/members/route.ts index 989d792b6fd..ad4e4001c82 100644 --- a/apps/sim/app/api/organizations/[id]/members/route.ts +++ b/apps/sim/app/api/organizations/[id]/members/route.ts @@ -1,12 +1,19 @@ import { db } from '@sim/db' -import { invitation, member, organization, user, userStats } from '@sim/db/schema' +import { + invitation, + member, + organization, + subscription as subscriptionTable, + user, + userStats, +} from '@sim/db/schema' import { createLogger } from '@sim/logger' -import { and, eq } from 'drizzle-orm' +import { and, eq, inArray } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getEmailSubject, renderInvitationEmail } from '@/components/emails' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' -import { getUserUsageData } from '@/lib/billing/core/usage' +import { ENTITLED_SUBSCRIPTION_STATUSES } from '@/lib/billing/subscriptions/utils' import { validateSeatAvailability } from '@/lib/billing/validation/seat-management' import { getBaseUrl } from '@/lib/core/utils/urls' import { generateId } from '@/lib/core/utils/uuid' @@ -83,16 +90,32 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{ .leftJoin(userStats, eq(user.id, userStats.userId)) .where(eq(member.organizationId, organizationId)) - const membersWithUsage = await Promise.all( - base.map(async (row) => { - const usage = await getUserUsageData(row.userId) - return { - ...row, - billingPeriodStart: usage.billingPeriodStart, - billingPeriodEnd: usage.billingPeriodEnd, - } + // The billing period is the same for every member — it comes from + // whichever subscription covers them. Fetch once and attach to + // every row instead of calling `getUserUsageData` per-member, + // which would run an O(N) pooled query for each of N rows. + const [orgSub] = await db + .select({ + periodStart: subscriptionTable.periodStart, + periodEnd: subscriptionTable.periodEnd, }) - ) + .from(subscriptionTable) + .where( + and( + eq(subscriptionTable.referenceId, organizationId), + inArray(subscriptionTable.status, ENTITLED_SUBSCRIPTION_STATUSES) + ) + ) + .limit(1) + + const billingPeriodStart = orgSub?.periodStart ?? null + const billingPeriodEnd = orgSub?.periodEnd ?? null + + const membersWithUsage = base.map((row) => ({ + ...row, + billingPeriodStart, + billingPeriodEnd, + })) return NextResponse.json({ success: true, diff --git a/apps/sim/app/api/organizations/[id]/seats/route.ts b/apps/sim/app/api/organizations/[id]/seats/route.ts index 6a2be6238c0..3ea2b3f06ed 100644 --- a/apps/sim/app/api/organizations/[id]/seats/route.ts +++ b/apps/sim/app/api/organizations/[id]/seats/route.ts @@ -13,6 +13,8 @@ import { hasUsableSubscriptionStatus, USABLE_SUBSCRIPTION_STATUSES, } from '@/lib/billing/subscriptions/utils' +import { toDecimal, toNumber } from '@/lib/billing/utils/decimal' +import { syncSeatsFromStripeQuantity } from '@/lib/billing/validation/seat-management' import { isBillingEnabled } from '@/lib/core/config/feature-flags' const logger = createLogger('OrganizationSeatsAPI') @@ -164,8 +166,6 @@ export async function PUT(request: NextRequest, { params }: { params: Promise<{ userId: session.user.id, }) - // Update the subscription item quantity using Stripe's recommended approach - // This will automatically prorate the billing const updatedSubscription = await stripe.subscriptions.update( orgSubscription.stripeSubscriptionId, { @@ -176,19 +176,16 @@ export async function PUT(request: NextRequest, { params }: { params: Promise<{ }, ], proration_behavior: 'always_invoice', - } + }, + { idempotencyKey: `seats-update:${orgSubscription.stripeSubscriptionId}:${newSeatCount}` } ) - // Update our local database to reflect the change - // Note: This will also be updated via webhook, but we update immediately for UX - await db - .update(subscription) - .set({ - seats: newSeatCount, - }) - .where(eq(subscription.id, orgSubscription.id)) + await syncSeatsFromStripeQuantity( + orgSubscription.id, + orgSubscription.seats, + updatedSubscription.items.data[0]?.quantity ?? newSeatCount + ) - // Update orgUsageLimit to reflect new seat count (seats × basePrice as minimum) const { basePrice } = getPlanPricing(orgSubscription.plan) const newMinimumLimit = newSeatCount * basePrice @@ -200,7 +197,7 @@ export async function PUT(request: NextRequest, { params }: { params: Promise<{ const currentOrgLimit = orgData.length > 0 && orgData[0].orgUsageLimit - ? Number.parseFloat(orgData[0].orgUsageLimit) + ? toNumber(toDecimal(orgData[0].orgUsageLimit)) : 0 // Update if new minimum is higher than current limit diff --git a/apps/sim/app/api/v1/admin/credits/route.ts b/apps/sim/app/api/v1/admin/credits/route.ts index feaec3b95d9..41bcdefd063 100644 --- a/apps/sim/app/api/v1/admin/credits/route.ts +++ b/apps/sim/app/api/v1/admin/credits/route.ts @@ -30,10 +30,11 @@ import { and, eq, inArray } from 'drizzle-orm' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' import { addCredits } from '@/lib/billing/credits/balance' import { setUsageLimitForCredits } from '@/lib/billing/credits/purchase' -import { isOrgPlan, isPaid } from '@/lib/billing/plan-helpers' +import { isPaid } from '@/lib/billing/plan-helpers' import { ENTITLED_SUBSCRIPTION_STATUSES, getEffectiveSeats, + isOrgScopedSubscription, } from '@/lib/billing/subscriptions/utils' import { generateShortId } from '@/lib/core/utils/uuid' import { withAdminAuth } from '@/app/api/v1/admin/middleware' @@ -110,7 +111,8 @@ export const POST = withAdminAuth(async (request) => { const plan = userSubscription.plan let seats: number | null = null - if (isOrgPlan(plan)) { + // Route admin credits to the subscription's entity (org if org-scoped). + if (isOrgScopedSubscription(userSubscription, resolvedUserId)) { entityType = 'organization' entityId = userSubscription.referenceId diff --git a/apps/sim/app/api/v1/admin/organizations/[id]/members/route.ts b/apps/sim/app/api/v1/admin/organizations/[id]/members/route.ts index cc9cee63206..1da561752ad 100644 --- a/apps/sim/app/api/v1/admin/organizations/[id]/members/route.ts +++ b/apps/sim/app/api/v1/admin/organizations/[id]/members/route.ts @@ -33,7 +33,6 @@ import { member, organization, user, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' import { count, eq } from 'drizzle-orm' import { addUserToOrganization } from '@/lib/billing/organizations/membership' -import { requireStripeClient } from '@/lib/billing/stripe-client' import { isBillingEnabled } from '@/lib/core/config/feature-flags' import { withAdminAuthParams } from '@/app/api/v1/admin/middleware' import { @@ -229,28 +228,6 @@ export const POST = withAdminAuthParams(async (request, context) => return badRequestResponse(result.error || 'Failed to add member') } - if (isBillingEnabled && result.billingActions.proSubscriptionToCancel?.stripeSubscriptionId) { - try { - const stripe = requireStripeClient() - await stripe.subscriptions.update( - result.billingActions.proSubscriptionToCancel.stripeSubscriptionId, - { cancel_at_period_end: true } - ) - logger.info('Admin API: Synced Pro cancellation with Stripe', { - userId: body.userId, - subscriptionId: result.billingActions.proSubscriptionToCancel.subscriptionId, - stripeSubscriptionId: result.billingActions.proSubscriptionToCancel.stripeSubscriptionId, - }) - } catch (stripeError) { - logger.error('Admin API: Failed to sync Pro cancellation with Stripe', { - userId: body.userId, - subscriptionId: result.billingActions.proSubscriptionToCancel.subscriptionId, - stripeSubscriptionId: result.billingActions.proSubscriptionToCancel.stripeSubscriptionId, - error: stripeError, - }) - } - } - const data: AdminMember = { id: result.memberId!, userId: body.userId, diff --git a/apps/sim/app/api/v1/admin/outbox/[id]/requeue/route.ts b/apps/sim/app/api/v1/admin/outbox/[id]/requeue/route.ts new file mode 100644 index 00000000000..9de5c4696be --- /dev/null +++ b/apps/sim/app/api/v1/admin/outbox/[id]/requeue/route.ts @@ -0,0 +1,71 @@ +import { db } from '@sim/db' +import { outboxEvent } from '@sim/db/schema' +import { createLogger } from '@sim/logger' +import { and, eq } from 'drizzle-orm' +import { NextResponse } from 'next/server' +import { withAdminAuthParams } from '@/app/api/v1/admin/middleware' + +const logger = createLogger('AdminOutboxRequeueAPI') + +export const dynamic = 'force-dynamic' + +/** + * POST /api/v1/admin/outbox/[id]/requeue + * + * Move a dead-lettered outbox event back to `pending` so the worker + * will retry it. Resets `attempts`, `lastError`, and `availableAt` so + * the next poll picks it up. Only dead-lettered events can be + * requeued — completed/pending/processing rows are rejected to avoid + * operator errors. + */ +export const POST = withAdminAuthParams<{ id: string }>(async (_request, { params }) => { + const { id } = await params + + try { + const result = await db + .update(outboxEvent) + .set({ + status: 'pending', + attempts: 0, + lastError: null, + availableAt: new Date(), + lockedAt: null, + processedAt: null, + }) + .where(and(eq(outboxEvent.id, id), eq(outboxEvent.status, 'dead_letter'))) + .returning({ id: outboxEvent.id, eventType: outboxEvent.eventType }) + + if (result.length === 0) { + return NextResponse.json( + { + success: false, + error: + 'Event not found or not in dead_letter status. Only dead-lettered events can be requeued.', + }, + { status: 404 } + ) + } + + logger.info('Requeued dead-lettered outbox event', { + eventId: result[0].id, + eventType: result[0].eventType, + }) + + return NextResponse.json({ + success: true, + requeued: result[0], + }) + } catch (error) { + logger.error('Failed to requeue outbox event', { + eventId: id, + error: error instanceof Error ? error.message : error, + }) + return NextResponse.json( + { + success: false, + error: error instanceof Error ? error.message : 'Unknown error', + }, + { status: 500 } + ) + } +}) diff --git a/apps/sim/app/api/v1/admin/outbox/route.ts b/apps/sim/app/api/v1/admin/outbox/route.ts new file mode 100644 index 00000000000..addcb5bbe67 --- /dev/null +++ b/apps/sim/app/api/v1/admin/outbox/route.ts @@ -0,0 +1,91 @@ +import { db } from '@sim/db' +import { outboxEvent } from '@sim/db/schema' +import { createLogger } from '@sim/logger' +import { and, desc, eq, sql } from 'drizzle-orm' +import { type NextRequest, NextResponse } from 'next/server' +import { withAdminAuth } from '@/app/api/v1/admin/middleware' + +const logger = createLogger('AdminOutboxAPI') + +export const dynamic = 'force-dynamic' + +/** + * GET /api/v1/admin/outbox?status=dead_letter&eventType=...&limit=100 + * + * Inspect outbox events for operator triage. Primary use: list + * dead-lettered rows to reconcile Stripe state manually after a + * permanent handler failure (e.g. Stripe account frozen, subscription + * already canceled by another path, etc.). + * + * Filters: + * - `status`: 'pending' | 'processing' | 'completed' | 'dead_letter' (default 'dead_letter') + * - `eventType`: exact match on event_type + * - `limit`: cap rows returned (default 100, max 500) + * + * Response includes aggregate counts by status for quick health read. + */ +export const GET = withAdminAuth(async (request: NextRequest) => { + try { + const { searchParams } = new URL(request.url) + const validStatuses = ['pending', 'processing', 'completed', 'dead_letter'] as const + const status = (searchParams.get('status') ?? 'dead_letter') as (typeof validStatuses)[number] + if (!validStatuses.includes(status)) { + return NextResponse.json( + { + success: false, + error: `Invalid status. Must be one of: ${validStatuses.join(', ')}`, + }, + { status: 400 } + ) + } + + const eventType = searchParams.get('eventType') + + const rawLimit = searchParams.get('limit') + const parsedLimit = rawLimit === null ? 100 : Number.parseInt(rawLimit, 10) + const limit = + Number.isFinite(parsedLimit) && parsedLimit > 0 + ? Math.min(500, Math.max(1, parsedLimit)) + : 100 + + const whereConditions = [eq(outboxEvent.status, status)] + if (eventType) { + whereConditions.push(eq(outboxEvent.eventType, eventType)) + } + + const rows = await db + .select() + .from(outboxEvent) + .where(and(...whereConditions)) + .orderBy(desc(outboxEvent.createdAt)) + .limit(limit) + + // Aggregate counts per (status, eventType) for at-a-glance health. + const counts = await db + .select({ + status: outboxEvent.status, + eventType: outboxEvent.eventType, + count: sql`count(*)::int`, + }) + .from(outboxEvent) + .groupBy(outboxEvent.status, outboxEvent.eventType) + + return NextResponse.json({ + success: true, + filter: { status, eventType, limit }, + rows, + counts, + }) + } catch (error) { + logger.error('Failed to list outbox events', { + error: error instanceof Error ? error.message : error, + }) + return NextResponse.json( + { + success: false, + error: error instanceof Error ? error.message : 'Unknown error', + }, + { status: 500 } + ) + } +}) diff --git a/apps/sim/app/api/v1/admin/subscriptions/[id]/route.ts b/apps/sim/app/api/v1/admin/subscriptions/[id]/route.ts index 50ba40f3338..58d977c7707 100644 --- a/apps/sim/app/api/v1/admin/subscriptions/[id]/route.ts +++ b/apps/sim/app/api/v1/admin/subscriptions/[id]/route.ts @@ -28,6 +28,8 @@ import { subscription } from '@sim/db/schema' import { createLogger } from '@sim/logger' import { eq } from 'drizzle-orm' import { requireStripeClient } from '@/lib/billing/stripe-client' +import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-handlers' +import { enqueueOutboxEvent } from '@/lib/core/outbox/service' import { withAdminAuthParams } from '@/app/api/v1/admin/middleware' import { badRequestResponse, @@ -91,28 +93,31 @@ export const DELETE = withAdminAuthParams(async (request, context) return badRequestResponse('Subscription has no Stripe subscription ID') } - const stripe = requireStripeClient() - if (atPeriodEnd) { - // Schedule cancellation at period end - await stripe.subscriptions.update(existing.stripeSubscriptionId, { - cancel_at_period_end: true, + await db.transaction(async (tx) => { + await tx + .update(subscription) + .set({ cancelAtPeriodEnd: true }) + .where(eq(subscription.id, subscriptionId)) + + await enqueueOutboxEvent(tx, OUTBOX_EVENT_TYPES.STRIPE_SYNC_CANCEL_AT_PERIOD_END, { + stripeSubscriptionId: existing.stripeSubscriptionId, + subscriptionId: existing.id, + reason: reason ?? 'admin-cancel-at-period-end', + }) }) - // Update DB (webhooks don't sync cancelAtPeriodEnd) - await db - .update(subscription) - .set({ cancelAtPeriodEnd: true }) - .where(eq(subscription.id, subscriptionId)) - - logger.info('Admin API: Scheduled subscription cancellation at period end', { - subscriptionId, - stripeSubscriptionId: existing.stripeSubscriptionId, - plan: existing.plan, - referenceId: existing.referenceId, - periodEnd: existing.periodEnd, - reason, - }) + logger.info( + 'Admin API: Scheduled subscription cancellation at period end (DB committed, Stripe queued)', + { + subscriptionId, + stripeSubscriptionId: existing.stripeSubscriptionId, + plan: existing.plan, + referenceId: existing.referenceId, + periodEnd: existing.periodEnd, + reason, + } + ) return singleResponse({ success: true, @@ -124,11 +129,16 @@ export const DELETE = withAdminAuthParams(async (request, context) }) } - // Immediate cancellation - await stripe.subscriptions.cancel(existing.stripeSubscriptionId, { - prorate: true, - invoice_now: true, - }) + // Immediate cancellation — stays synchronous. Stripe's + // `customer.subscription.deleted` webhook triggers full cleanup + // (overage bill, usage reset, Pro restore, org delete) via + // `handleSubscriptionDeleted`, so no outbox needed here. + const stripe = requireStripeClient() + await stripe.subscriptions.cancel( + existing.stripeSubscriptionId, + { prorate: true, invoice_now: true }, + { idempotencyKey: `admin-cancel:${existing.stripeSubscriptionId}` } + ) logger.info('Admin API: Triggered immediate subscription cancellation on Stripe', { subscriptionId, diff --git a/apps/sim/app/api/v1/admin/users/[id]/billing/route.ts b/apps/sim/app/api/v1/admin/users/[id]/billing/route.ts index 1639db0baea..ecc10aab242 100644 --- a/apps/sim/app/api/v1/admin/users/[id]/billing/route.ts +++ b/apps/sim/app/api/v1/admin/users/[id]/billing/route.ts @@ -23,7 +23,7 @@ import { member, organization, subscription, user, userStats } from '@sim/db/sch import { createLogger } from '@sim/logger' import { eq, or } from 'drizzle-orm' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' -import { isOrgPlan } from '@/lib/billing/plan-helpers' +import { isOrgScopedSubscription } from '@/lib/billing/subscriptions/utils' import { generateShortId } from '@/lib/core/utils/uuid' import { withAdminAuthParams } from '@/app/api/v1/admin/middleware' import { @@ -155,7 +155,7 @@ export const PATCH = withAdminAuthParams(async (request, context) = .limit(1) const userSubscription = await getHighestPrioritySubscription(userId) - const isTeamOrEnterpriseMember = userSubscription && isOrgPlan(userSubscription.plan) + const isOrgScopedMember = isOrgScopedSubscription(userSubscription, userId) const [orgMembership] = await db .select({ organizationId: member.organizationId }) @@ -168,9 +168,9 @@ export const PATCH = withAdminAuthParams(async (request, context) = const warnings: string[] = [] if (body.currentUsageLimit !== undefined) { - if (isTeamOrEnterpriseMember && orgMembership) { + if (isOrgScopedMember && orgMembership) { warnings.push( - 'User is a team/enterprise member. Individual limits may be ignored in favor of organization limits.' + 'User is on an org-scoped subscription. Individual limits are ignored in favor of organization limits.' ) } diff --git a/apps/sim/app/api/webhooks/outbox/process/route.ts b/apps/sim/app/api/webhooks/outbox/process/route.ts new file mode 100644 index 00000000000..99b3f02baf6 --- /dev/null +++ b/apps/sim/app/api/webhooks/outbox/process/route.ts @@ -0,0 +1,49 @@ +import { createLogger } from '@sim/logger' +import { type NextRequest, NextResponse } from 'next/server' +import { verifyCronAuth } from '@/lib/auth/internal' +import { billingOutboxHandlers } from '@/lib/billing/webhooks/outbox-handlers' +import { processOutboxEvents } from '@/lib/core/outbox/service' +import { generateRequestId } from '@/lib/core/utils/request' + +const logger = createLogger('OutboxProcessorAPI') + +export const dynamic = 'force-dynamic' +export const maxDuration = 120 + +const handlers = { + ...billingOutboxHandlers, +} as const + +export async function GET(request: NextRequest) { + const requestId = generateRequestId() + + try { + const authError = verifyCronAuth(request, 'Outbox processor') + if (authError) { + return authError + } + + const result = await processOutboxEvents(handlers, { batchSize: 20 }) + + logger.info('Outbox processing completed', { requestId, ...result }) + + return NextResponse.json({ + success: true, + requestId, + result, + }) + } catch (error) { + logger.error('Outbox processing failed', { + requestId, + error: error instanceof Error ? error.message : error, + }) + return NextResponse.json( + { + success: false, + requestId, + error: error instanceof Error ? error.message : 'Unknown error', + }, + { status: 500 } + ) + } +} diff --git a/apps/sim/app/invite/[id]/invite.tsx b/apps/sim/app/invite/[id]/invite.tsx index 10658d8f7f0..ddf458a7dc6 100644 --- a/apps/sim/app/invite/[id]/invite.tsx +++ b/apps/sim/app/invite/[id]/invite.tsx @@ -2,9 +2,12 @@ import { useEffect, useState } from 'react' import { createLogger } from '@sim/logger' +import { useQueryClient } from '@tanstack/react-query' import { useParams, useRouter, useSearchParams } from 'next/navigation' import { client, useSession } from '@/lib/auth/auth-client' import { InviteLayout, InviteStatusCard } from '@/app/invite/components' +import { organizationKeys } from '@/hooks/queries/organization' +import { subscriptionKeys } from '@/hooks/queries/subscription' const logger = createLogger('InviteById') @@ -166,6 +169,7 @@ export default function Invite() { const inviteId = params.id as string const searchParams = useSearchParams() const { data: session, isPending } = useSession() + const queryClient = useQueryClient() const [invitationDetails, setInvitationDetails] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) @@ -345,6 +349,16 @@ export default function Invite() { organizationId: orgId, }) + // Invalidate billing / org caches so `/workspace` doesn't flash the + // user's pre-join personal subscription while the new team-scoped + // data is being refetched. Accept-flow side effects (snapshot, + // storage transfer, plan sync, member insert) have already + // committed by the time we reach here. + await Promise.all([ + queryClient.invalidateQueries({ queryKey: subscriptionKeys.all }), + queryClient.invalidateQueries({ queryKey: organizationKeys.all }), + ]) + setAccepted(true) setTimeout(() => { diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/subscription-permissions.ts b/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/subscription-permissions.ts index 9d901c8e7b9..bf07d457132 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/subscription-permissions.ts +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/subscription-permissions.ts @@ -17,6 +17,12 @@ export interface SubscriptionState { isTeam: boolean isEnterprise: boolean isPaid: boolean + /** + * True when the subscription's `referenceId` is an organization. Source + * of truth for scope-based decisions — `pro_*` plans that have been + * transferred to an org are org-scoped even though `isTeam` is false. + */ + isOrgScoped: boolean plan: string status: string } @@ -30,21 +36,27 @@ export function getSubscriptionPermissions( subscription: SubscriptionState, userRole: UserRole ): SubscriptionPermissions { - const { isFree, isPro, isTeam, isEnterprise, isPaid } = subscription + const { isFree, isPro, isTeam, isEnterprise, isPaid, isOrgScoped } = subscription const { isTeamAdmin } = userRole + // Non-admin org members see the "team member" view: no edit / no cancel + // / no upgrade, pooled usage display. + const orgMemberOnly = isOrgScoped && !isTeamAdmin + const orgAdminOrSolo = !isOrgScoped || isTeamAdmin + const isEnterpriseMember = isEnterprise && !isTeamAdmin const canViewUsageInfo = !isEnterpriseMember return { canUpgradeToPro: isFree, - canUpgradeToTeam: isFree || (isPro && !isTeam), - canViewEnterprise: !isEnterprise && !(isTeam && !isTeamAdmin), // Don't show to enterprise users or team members - canManageTeam: isTeam && isTeamAdmin, - canEditUsageLimit: (isFree || (isPro && !isTeam) || (isTeam && isTeamAdmin)) && !isEnterprise, // Free users see upgrade badge, Pro (non-team) users and team admins see pencil - canCancelSubscription: isPaid && !isEnterprise && !(isTeam && !isTeamAdmin), // Team members can't cancel - showTeamMemberView: isTeam && !isTeamAdmin, - showUpgradePlans: isFree || (isPro && !isTeam) || (isTeam && isTeamAdmin), // Free users, Pro users, Team owners see plans + canUpgradeToTeam: isFree || (isPro && !isOrgScoped), + canViewEnterprise: !isEnterprise && !orgMemberOnly, + canManageTeam: isOrgScoped && isTeamAdmin && !isEnterprise, + canEditUsageLimit: (isFree || (isPaid && !isEnterprise)) && orgAdminOrSolo, + canCancelSubscription: isPaid && !isEnterprise && orgAdminOrSolo, + showTeamMemberView: orgMemberOnly, + showUpgradePlans: + (isFree || (isPro && !isOrgScoped) || (isOrgScoped && isTeamAdmin)) && !isEnterprise, isEnterpriseMember, canViewUsageInfo, } @@ -55,22 +67,16 @@ export function getVisiblePlans( userRole: UserRole ): ('pro' | 'team' | 'enterprise')[] { const plans: ('pro' | 'team' | 'enterprise')[] = [] - const { isFree, isPro, isTeam } = subscription + const { isFree, isPro, isEnterprise, isOrgScoped } = subscription const { isTeamAdmin } = userRole - // Free users see all plans if (isFree) { plans.push('pro', 'team', 'enterprise') - } - // Pro users see team and enterprise - else if (isPro && !isTeam) { + } else if (isPro && !isOrgScoped) { plans.push('team', 'enterprise') - } - // Team owners see only enterprise (no team plan since they already have it) - else if (isTeam && isTeamAdmin) { + } else if (isOrgScoped && isTeamAdmin && !isEnterprise) { plans.push('enterprise') } - // Team members, Enterprise users see no plans return plans } diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/subscription.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/subscription.tsx index d2c6322be92..42581c86ff2 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/subscription.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/subscription.tsx @@ -34,7 +34,6 @@ import { getPlanTierDollars, isEnterprise, isFree, - isOrgPlan, isPaid, isPro, isTeam, @@ -294,12 +293,12 @@ export function Subscription() { const usageLimitRef = useRef(null) const hasInitializedInterval = useRef(false) - const hasOrgPlan = isOrgPlan(subscriptionData?.data?.plan) + const hasOrgScopedSubscription = Boolean(subscriptionData?.data?.isOrgScoped) const isLoading = isSubscriptionLoading || isUsageLimitLoading || isWorkspaceLoading || - (hasOrgPlan && isOrgBillingLoading) + (hasOrgScopedSubscription && isOrgBillingLoading) const isCancelledAtPeriodEnd = subscriptionData?.data?.cancelAtPeriodEnd === true @@ -311,6 +310,12 @@ export function Subscription() { isPaid: isPaid(subscriptionData?.data?.plan) && hasPaidSubscriptionStatus(subscriptionData?.data?.status), + /** + * True when the subscription is attached to an org (regardless of plan + * name). Drives routing of usage-limit edits and whether we show pooled + * or personal usage. + */ + isOrgScoped: Boolean(subscriptionData?.data?.isOrgScoped), plan: subscriptionData?.data?.plan || 'free', status: subscriptionData?.data?.status || 'inactive', seats: getEffectiveSeats(subscriptionData?.data), @@ -364,16 +369,12 @@ export function Subscription() { const isTeamAdmin = ['owner', 'admin'].includes(userRole) const planIncludedAmount = - (subscription.isTeam || subscription.isEnterprise) && - isTeamAdmin && - organizationBillingData?.data + subscription.isOrgScoped && isTeamAdmin && organizationBillingData?.data ? organizationBillingData.data.minimumBillingAmount : getPlanTierCredits(subscription.plan) / CREDIT_MULTIPLIER const effectiveUsageLimit = - (subscription.isTeam || subscription.isEnterprise) && - isTeamAdmin && - organizationBillingData?.data + subscription.isOrgScoped && isTeamAdmin && organizationBillingData?.data ? organizationBillingData.data.totalUsageLimit : usageLimitData.currentLimit || usage.limit @@ -381,8 +382,7 @@ export function Subscription() { subscription.isPaid && planIncludedAmount > 0 && effectiveUsageLimit > planIncludedAmount const effectiveCurrentUsage = - (subscription.isTeam || subscription.isEnterprise) && - organizationBillingData?.data?.totalCurrentUsage != null + subscription.isOrgScoped && organizationBillingData?.data?.totalCurrentUsage != null ? organizationBillingData.data.totalCurrentUsage : usage.current @@ -390,8 +390,7 @@ export function Subscription() { const handleToggleOnDemand = useCallback(async () => { try { - const isOrgContext = - (subscription.isTeam || subscription.isEnterprise) && isTeamAdmin && activeOrgId + const isOrgContext = subscription.isOrgScoped && isTeamAdmin && activeOrgId if (isOnDemandActive) { if (!canDisableOnDemand) return @@ -420,8 +419,7 @@ export function Subscription() { }, [ isOnDemandActive, canDisableOnDemand, - subscription.isTeam, - subscription.isEnterprise, + subscription.isOrgScoped, isTeamAdmin, activeOrgId, planIncludedAmount, @@ -435,6 +433,7 @@ export function Subscription() { isTeam: subscription.isTeam, isEnterprise: subscription.isEnterprise, isPaid: subscription.isPaid, + isOrgScoped: subscription.isOrgScoped, plan: subscription.plan || 'free', status: subscription.status || 'inactive', }, @@ -448,6 +447,7 @@ export function Subscription() { isTeam: subscription.isTeam, isEnterprise: subscription.isEnterprise, isPaid: subscription.isPaid, + isOrgScoped: subscription.isOrgScoped, plan: subscription.plan || 'free', status: subscription.status || 'inactive', }, @@ -502,7 +502,7 @@ export function Subscription() { return } if (isBlocked) { - const context = subscription.isTeam || subscription.isEnterprise ? 'organization' : 'user' + const context = subscription.isOrgScoped ? 'organization' : 'user' openBillingPortal.mutate( { context, @@ -529,8 +529,7 @@ export function Subscription() { isDispute, isBlocked, subscription.isFree, - subscription.isTeam, - subscription.isEnterprise, + subscription.isOrgScoped, activeOrgId, doUpgrade, logger, @@ -591,13 +590,12 @@ export function Subscription() { : undefined } current={ - (subscription.isTeam || subscription.isEnterprise) && - organizationBillingData?.data?.totalCurrentUsage != null + subscription.isOrgScoped && organizationBillingData?.data?.totalCurrentUsage != null ? organizationBillingData.data.totalCurrentUsage : usage.current } limit={ - subscription.isEnterprise || subscription.isTeam + subscription.isOrgScoped ? organizationBillingData?.data?.totalUsageLimit : !subscription.isFree && (permissions.canEditUsageLimit || permissions.showTeamMemberView) @@ -612,31 +610,19 @@ export function Subscription() { logger.info('Usage limit updated')} /> ) : undefined @@ -905,7 +891,7 @@ export function Subscription() { setManagePlanModalOpen(false) if (!betterAuthSubscription.cancel) return try { - const isOrgSub = (subscription.isTeam || subscription.isEnterprise) && activeOrgId + const isOrgSub = subscription.isOrgScoped && activeOrgId const referenceId = isOrgSub ? activeOrgId : session?.user?.id || '' const returnUrl = getBaseUrl() + window.location.pathname await betterAuthSubscription.cancel({ returnUrl, referenceId }) @@ -917,7 +903,7 @@ export function Subscription() { onRestore={async () => { if (!betterAuthSubscription.restore) return try { - const isOrgSub = (subscription.isTeam || subscription.isEnterprise) && activeOrgId + const isOrgSub = subscription.isOrgScoped && activeOrgId const referenceId = isOrgSub ? activeOrgId : session?.user?.id || '' await betterAuthSubscription.restore({ referenceId }) await refetchSubscription() @@ -937,9 +923,7 @@ export function Subscription() { refetchSubscription()} /> @@ -974,8 +958,7 @@ export function Subscription() { disabled={openBillingPortal.isPending} onClick={() => { const portalWindow = window.open('', '_blank') - const context = - subscription.isTeam || subscription.isEnterprise ? 'organization' : 'user' + const context = subscription.isOrgScoped ? 'organization' : 'user' openBillingPortal.mutate( { context, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/usage-indicator/usage-indicator.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/usage-indicator/usage-indicator.tsx index 8f65e9b0283..ae72152a8ad 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/usage-indicator/usage-indicator.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/usage-indicator/usage-indicator.tsx @@ -86,17 +86,28 @@ interface StatusTextConfig { } /** - * Determines if user can manage billing based on plan type and org role. + * Determines if user can manage billing based on plan type, subscription + * scope, and org role. * - * @param planType - The user's current plan type + * When the subscription is org-scoped (any subscription whose referenceId + * points at an organization — includes `pro_*` plans transferred to an + * org, not just team/enterprise), only owners/admins can manage billing. + * Otherwise any free/pro user can manage their own. + * + * @param planType - The user's current plan type (for display category) * @param orgRole - The user's role in the organization, if applicable + * @param isOrgScoped - Whether the subscription is attached to an org * @returns True if the user has billing management permissions */ -function canManageBilling(planType: PlanType, orgRole: OrgRole | null): boolean { - if (planType === 'free' || planType === 'pro') return true - if (planType === 'team' || planType === 'enterprise') { +function canManageBilling( + planType: PlanType, + orgRole: OrgRole | null, + isOrgScoped: boolean +): boolean { + if (isOrgScoped || planType === 'team' || planType === 'enterprise') { return orgRole === 'owner' || orgRole === 'admin' } + if (planType === 'free' || planType === 'pro') return true return false } @@ -247,7 +258,8 @@ export function UsageIndicator({ onClick }: UsageIndicatorProps) { const isCritical = isBlocked || progressPercentage >= USAGE_THRESHOLDS.CRITICAL const isWarning = !isCritical && progressPercentage >= USAGE_THRESHOLDS.WARNING - const userCanManageBilling = canManageBilling(planType, orgRole) + const isOrgScoped = Boolean(subscriptionData?.data?.isOrgScoped) + const userCanManageBilling = canManageBilling(planType, orgRole, isOrgScoped) const displayState: DisplayState = { planType, @@ -323,17 +335,11 @@ export function UsageIndicator({ onClick }: UsageIndicatorProps) { const contextMenuItems = useMemo( () => ({ - // Set limit: Only for Pro and Team admins (not free, not enterprise) - showSetLimit: (isPro || (isTeam && userCanManageBilling)) && !isEnterprise, - // Upgrade to Pro: Only for free users + showSetLimit: userCanManageBilling && !isFree && !isEnterprise, showUpgradeToPro: isFree, - // Upgrade to Team: Free users and Pro users with billing permission showUpgradeToTeam: isFree || (isPro && userCanManageBilling), - // Manage seats: Only for Team admins showManageSeats: isTeam && userCanManageBilling, - // Upgrade to Enterprise: Only for Team admins (not free, not pro, not enterprise) showUpgradeToEnterprise: isTeam && userCanManageBilling, - // Contact support: Only for Enterprise admins showContactSupport: isEnterprise && userCanManageBilling, onSetLimit: handleSetLimit, onUpgradeToPro: handleUpgradeToPro, @@ -435,7 +441,7 @@ export function UsageIndicator({ onClick }: UsageIndicatorProps) { if (isBlocked && userCanManageBilling) { try { - const context = subscription.isTeam || subscription.isEnterprise ? 'organization' : 'user' + const context = isOrgScoped ? 'organization' : 'user' const organizationId = subscriptionData?.data?.organization?.id const response = await fetch('/api/billing/portal', { diff --git a/apps/sim/hooks/queries/organization.ts b/apps/sim/hooks/queries/organization.ts index b5f634cf06a..3d3a65b8df6 100644 --- a/apps/sim/hooks/queries/organization.ts +++ b/apps/sim/hooks/queries/organization.ts @@ -1,8 +1,9 @@ import { createLogger } from '@sim/logger' import { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { client } from '@/lib/auth/auth-client' -import { isEnterprise, isTeam } from '@/lib/billing/plan-helpers' +import { isEnterprise, isPaid, isTeam } from '@/lib/billing/plan-helpers' import { hasPaidSubscriptionStatus } from '@/lib/billing/subscriptions/utils' +import { subscriptionKeys } from '@/hooks/queries/subscription' const logger = createLogger('OrganizationQueries') @@ -87,13 +88,17 @@ async function fetchOrganizationSubscription(orgId: string, _signal?: AbortSigna return null } - const teamSubscription = response.data?.find( - (sub: any) => hasPaidSubscriptionStatus(sub.status) && isTeam(sub.plan) + // Any paid subscription attached to the org counts as its active sub. + // Priority: Enterprise > Team > Pro (matches `getHighestPrioritySubscription`). + // This intentionally includes `pro_*` plans that have been transferred + // to the org — they are pooled org-scoped subscriptions. + const entitled = (response.data || []).filter( + (sub: any) => hasPaidSubscriptionStatus(sub.status) && isPaid(sub.plan) ) - const enterpriseSubscription = response.data?.find( - (sub: any) => hasPaidSubscriptionStatus(sub.status) && isEnterprise(sub.plan) - ) - const activeSubscription = enterpriseSubscription || teamSubscription + const enterpriseSubscription = entitled.find((sub: any) => isEnterprise(sub.plan)) + const teamSubscription = entitled.find((sub: any) => isTeam(sub.plan)) + const proSubscription = entitled.find((sub: any) => !isEnterprise(sub.plan) && !isTeam(sub.plan)) + const activeSubscription = enterpriseSubscription || teamSubscription || proSubscription return activeSubscription || null } @@ -326,6 +331,7 @@ export function useRemoveMember() { queryClient.invalidateQueries({ queryKey: organizationKeys.memberUsage(variables.orgId) }) queryClient.invalidateQueries({ queryKey: organizationKeys.subscription(variables.orgId) }) queryClient.invalidateQueries({ queryKey: organizationKeys.lists() }) + queryClient.invalidateQueries({ queryKey: subscriptionKeys.all }) }, }) } diff --git a/apps/sim/hooks/queries/subscription.ts b/apps/sim/hooks/queries/subscription.ts index 3900bb9d383..a7f98d033ba 100644 --- a/apps/sim/hooks/queries/subscription.ts +++ b/apps/sim/hooks/queries/subscription.ts @@ -17,11 +17,6 @@ export interface BillingUsageData { lastPeriodCopilotCost: number daysRemaining: number copilotCost: number - currentCredits: number - limitCredits: number - lastPeriodCostCredits: number - lastPeriodCopilotCostCredits: number - copilotCostCredits: number } /** @@ -30,10 +25,7 @@ export interface BillingUsageData { export interface SubscriptionBillingData { type: 'individual' | 'organization' plan: string - basePrice: number currentUsage: number - overageAmount: number - totalProjected: number usageLimit: number percentUsed: number isWarning: boolean @@ -41,18 +33,22 @@ export interface SubscriptionBillingData { daysRemaining: number creditBalance: number billingInterval: 'month' | 'year' - tierCredits: number - basePriceCredits: number - currentUsageCredits: number - overageAmountCredits: number - totalProjectedCredits: number - usageLimitCredits: number isPaid: boolean isPro: boolean isTeam: boolean isEnterprise: boolean + /** + * Whether the subscription is attached to an organization. Includes + * `pro_*` plans that have been transferred to an org; use this for + * scope-based decisions instead of `isTeam` / `isEnterprise`. + */ + isOrgScoped: boolean + /** Present when `isOrgScoped` is true. */ + organizationId: string | null status: string | null seats: number | null + /** Raw subscription metadata JSON from Stripe (e.g. billingInterval). */ + metadata: unknown stripeSubscriptionId: string | null periodEnd: string | null cancelAtPeriodEnd?: boolean @@ -61,16 +57,6 @@ export interface SubscriptionBillingData { billingBlockedReason?: 'payment_failed' | 'dispute' | null blockedByOrgOwner?: boolean organization?: { id: string; role: 'owner' | 'admin' | 'member' } - organizationData?: { - seatCount: number - memberCount: number - totalBasePrice: number - totalCurrentUsage: number - totalOverage: number - totalBasePriceCredits: number - totalCurrentUsageCredits: number - totalOverageCredits: number - } } /** diff --git a/apps/sim/lib/auth/auth.ts b/apps/sim/lib/auth/auth.ts index 461c02f8460..32237b4119a 100644 --- a/apps/sim/lib/auth/auth.ts +++ b/apps/sim/lib/auth/auth.ts @@ -37,7 +37,7 @@ import { } from '@/lib/auth/cimd' import { sendPlanWelcomeEmail } from '@/lib/billing' import { authorizeSubscriptionReference } from '@/lib/billing/authorization' -import { writeBillingInterval } from '@/lib/billing/core/subscription' +import { syncSubscriptionPlan, writeBillingInterval } from '@/lib/billing/core/subscription' import { handleNewUser } from '@/lib/billing/core/usage' import { ensureOrganizationForTeamSubscription, @@ -2904,6 +2904,9 @@ export const auth = betterAuth({ { subscriptionId: subscription.id, dbPlan: subscription.plan, priceId } ) } + + await syncSubscriptionPlan(subscription.id, subscription.plan, planFromStripe) + const subscriptionForOrg = { ...subscription, plan: planFromStripe ?? subscription.plan, @@ -2981,6 +2984,9 @@ export const auth = betterAuth({ { subscriptionId: subscription.id, dbPlan: subscription.plan } ) } + + await syncSubscriptionPlan(subscription.id, subscription.plan, planFromStripe) + const subscriptionForOrg = { ...subscription, plan: planFromStripe ?? subscription.plan, @@ -3058,6 +3064,7 @@ export const auth = betterAuth({ await writeBillingInterval(resolvedSubscription.id, isAnnual ? 'year' : 'month') }, onSubscriptionDeleted: async ({ + event, subscription, }: { event: Stripe.Event @@ -3065,18 +3072,24 @@ export const auth = betterAuth({ subscription: any }) => { logger.info('[onSubscriptionDeleted] Subscription deleted', { + eventId: event.id, subscriptionId: subscription.id, referenceId: subscription.referenceId, }) try { - await handleSubscriptionDeleted(subscription) + await handleSubscriptionDeleted(subscription, event.id) } catch (error) { logger.error('[onSubscriptionDeleted] Failed to handle subscription deletion', { + eventId: event.id, subscriptionId: subscription.id, referenceId: subscription.referenceId, error, }) + // Rethrow so the Stripe webhook retries — otherwise + // the final overage invoice, usage reset, org cleanup, + // and personal Pro restore can be permanently skipped. + throw error } }, }, diff --git a/apps/sim/lib/billing/authorization.ts b/apps/sim/lib/billing/authorization.ts index c84353cc76a..ccabddaa0ec 100644 --- a/apps/sim/lib/billing/authorization.ts +++ b/apps/sim/lib/billing/authorization.ts @@ -1,29 +1,31 @@ -import { db } from '@sim/db' -import * as schema from '@sim/db/schema' import { createLogger } from '@sim/logger' -import { and, eq } from 'drizzle-orm' import { hasPaidSubscription } from '@/lib/billing' +import { isOrganizationOwnerOrAdmin } from '@/lib/billing/core/organization' +import { isOrgScopedSubscription } from '@/lib/billing/subscriptions/utils' const logger = createLogger('BillingAuthorization') /** - * Check if a user is authorized to manage billing for a given reference ID - * Reference ID can be either a user ID (individual subscription) or organization ID (team subscription) + * Check if a user is authorized to manage billing for a given reference ID. + * Reference ID can be either a user ID (personal subscription) or an + * organization ID (org-scoped subscription — team, enterprise, or a + * `pro_*` plan transferred to an org). * - * This function also performs duplicate subscription validation for organizations: - * - Rejects if an organization already has an active subscription (prevents duplicates) - * - Personal subscriptions (referenceId === userId) skip this check to allow upgrades + * This function also performs duplicate subscription validation for + * organizations: + * - Rejects if an organization already has an active subscription (prevents + * duplicates). + * - Personal subscriptions skip this check to allow upgrades. */ export async function authorizeSubscriptionReference( userId: string, referenceId: string, action?: string ): Promise { - if (referenceId === userId) { + if (!isOrgScopedSubscription({ referenceId }, userId)) { return true } - // Only block duplicate subscriptions during upgrade/checkout, not cancel/restore/list if (action === 'upgrade-subscription' && (await hasPaidSubscription(referenceId))) { logger.warn('Blocking checkout - active subscription already exists for organization', { userId, @@ -32,12 +34,5 @@ export async function authorizeSubscriptionReference( return false } - const members = await db - .select() - .from(schema.member) - .where(and(eq(schema.member.userId, userId), eq(schema.member.organizationId, referenceId))) - - const member = members[0] - - return member?.role === 'owner' || member?.role === 'admin' + return isOrganizationOwnerOrAdmin(userId, referenceId) } diff --git a/apps/sim/lib/billing/calculations/usage-monitor.ts b/apps/sim/lib/billing/calculations/usage-monitor.ts index 71a294ba1de..c57fdcc7cd6 100644 --- a/apps/sim/lib/billing/calculations/usage-monitor.ts +++ b/apps/sim/lib/billing/calculations/usage-monitor.ts @@ -1,11 +1,19 @@ import { db } from '@sim/db' -import { member, organization, userStats } from '@sim/db/schema' +import { member, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' -import { and, eq, inArray } from 'drizzle-orm' -import type { HighestPrioritySubscription } from '@/lib/billing/core/plan' -import { getUserUsageLimit } from '@/lib/billing/core/usage' -import { computeDailyRefreshConsumed } from '@/lib/billing/credits/daily-refresh' -import { getPlanTierDollars, isOrgPlan, isPaid } from '@/lib/billing/plan-helpers' +import { and, eq } from 'drizzle-orm' +import { + getHighestPrioritySubscription, + type HighestPrioritySubscription, +} from '@/lib/billing/core/plan' +import { getPooledOrgCurrentPeriodCost, getUserUsageLimit } from '@/lib/billing/core/usage' +import { + computeDailyRefreshConsumed, + getOrgMemberRefreshBounds, +} from '@/lib/billing/credits/daily-refresh' +import { getPlanTierDollars, isPaid } from '@/lib/billing/plan-helpers' +import { isOrgScopedSubscription } from '@/lib/billing/subscriptions/utils' +import { toDecimal, toNumber } from '@/lib/billing/utils/decimal' import { isBillingEnabled } from '@/lib/core/config/feature-flags' import { toError } from '@/lib/core/utils/helpers' @@ -19,6 +27,52 @@ interface UsageData { isExceeded: boolean currentUsage: number limit: number + /** + * Whether the returned values are this user's individual slice or the + * organization's pooled total/cap. When an org pool is the blocker, + * the pooled values are surfaced here so error messages reflect it. + */ + scope: 'user' | 'organization' + /** Present only when `scope === 'organization'`. */ + organizationId: string | null +} + +/** + * Sum `currentPeriodCost` across all members of an org, then subtract + * daily-refresh credits (with per-user window bounds for mid-cycle + * joiners). + */ +async function computePooledOrgUsage( + organizationId: string, + sub: { + plan: string | null + seats: number | null + periodStart: Date | null + periodEnd: Date | null + } +): Promise { + const { memberIds, currentPeriodCost } = await getPooledOrgCurrentPeriodCost(organizationId) + if (memberIds.length === 0) return 0 + + let pooled = currentPeriodCost + + if (isPaid(sub.plan) && sub.periodStart) { + const planDollars = getPlanTierDollars(sub.plan) + if (planDollars > 0) { + const userBounds = await getOrgMemberRefreshBounds(organizationId, sub.periodStart) + const refresh = await computeDailyRefreshConsumed({ + userIds: memberIds, + periodStart: sub.periodStart, + periodEnd: sub.periodEnd ?? null, + planDollars, + seats: sub.seats || 1, + userBounds: Object.keys(userBounds).length > 0 ? userBounds : undefined, + }) + pooled = Math.max(0, pooled - refresh) + } + } + + return pooled } /** @@ -30,14 +84,10 @@ export async function checkUsageStatus( preloadedSubscription?: HighestPrioritySubscription ): Promise { try { - // If billing is disabled, always return permissive limits if (!isBillingEnabled) { - // Get actual usage from the database for display purposes const statsRecords = await db.select().from(userStats).where(eq(userStats.userId, userId)) const currentUsage = - statsRecords.length > 0 - ? Number.parseFloat(statsRecords[0].currentPeriodCost?.toString()) - : 0 + statsRecords.length > 0 ? toNumber(toDecimal(statsRecords[0].currentPeriodCost)) : 0 return { percentUsed: Math.min((currentUsage / 1000) * 100, 100), @@ -45,127 +95,68 @@ export async function checkUsageStatus( isExceeded: false, currentUsage, limit: 1000, + scope: 'user', + organizationId: null, } } - // Get usage limit from user_stats (per-user cap) - const limit = await getUserUsageLimit(userId, preloadedSubscription) + const sub = + preloadedSubscription !== undefined + ? preloadedSubscription + : await getHighestPrioritySubscription(userId) + + const limit = await getUserUsageLimit(userId, sub) logger.info('Using stored usage limit', { userId, limit }) - // Get actual usage from the database - const statsRecords = await db.select().from(userStats).where(eq(userStats.userId, userId)) + const subIsOrgScoped = isOrgScopedSubscription(sub, userId) + const scope: 'user' | 'organization' = subIsOrgScoped ? 'organization' : 'user' + const organizationId: string | null = subIsOrgScoped && sub ? sub.referenceId : null - // If no stats record exists, create a default one - if (statsRecords.length === 0) { - logger.info('No usage stats found for user', { userId, limit }) + let currentUsage = 0 - return { - percentUsed: 0, - isWarning: false, - isExceeded: false, - currentUsage: 0, - limit, - } - } + if (subIsOrgScoped && sub) { + currentUsage = await computePooledOrgUsage(sub.referenceId, sub) + } else { + const statsRecords = await db + .select() + .from(userStats) + .where(eq(userStats.userId, userId)) + .limit(1) - const rawUsage = Number.parseFloat( - statsRecords[0].currentPeriodCost?.toString() || statsRecords[0].totalCost.toString() - ) - - // Deduct daily refresh credits for individual paid plans only. - // Org plans apply refresh at the pooled level in the org usage check below. - let dailyRefreshDeduction = 0 - if ( - preloadedSubscription && - isPaid(preloadedSubscription.plan) && - !isOrgPlan(preloadedSubscription.plan) && - preloadedSubscription.periodStart - ) { - const planDollars = getPlanTierDollars(preloadedSubscription.plan) - if (planDollars > 0) { - dailyRefreshDeduction = await computeDailyRefreshConsumed({ - userIds: [userId], - periodStart: preloadedSubscription.periodStart, - periodEnd: preloadedSubscription.periodEnd ?? null, - planDollars, - }) + if (statsRecords.length === 0) { + logger.info('No usage stats found for user', { userId, limit }) + return { + percentUsed: 0, + isWarning: false, + isExceeded: false, + currentUsage: 0, + limit, + scope: 'user', + organizationId: null, + } } - } - - const currentUsage = Math.max(0, rawUsage - dailyRefreshDeduction) - const percentUsed = Math.min((currentUsage / limit) * 100, 100) - - let isExceeded = currentUsage >= limit - let isWarning = percentUsed >= WARNING_THRESHOLD && percentUsed < 100 - try { - const memberships = await db - .select({ organizationId: member.organizationId }) - .from(member) - .where(eq(member.userId, userId)) - if (memberships.length > 0) { - for (const m of memberships) { - const orgRows = await db - .select({ id: organization.id, orgUsageLimit: organization.orgUsageLimit }) - .from(organization) - .where(eq(organization.id, m.organizationId)) - .limit(1) - if (orgRows.length) { - const org = orgRows[0] - const teamMembers = await db - .select({ userId: member.userId }) - .from(member) - .where(eq(member.organizationId, org.id)) - - let pooledUsage = 0 - if (teamMembers.length > 0) { - const memberIds = teamMembers.map((tm) => tm.userId) - const allMemberStats = await db - .select({ current: userStats.currentPeriodCost, total: userStats.totalCost }) - .from(userStats) - .where(inArray(userStats.userId, memberIds)) - - for (const stats of allMemberStats) { - pooledUsage += Number.parseFloat( - stats.current?.toString() || stats.total.toString() - ) - } - } - if ( - preloadedSubscription && - isPaid(preloadedSubscription.plan) && - preloadedSubscription.periodStart - ) { - const planDollars = getPlanTierDollars(preloadedSubscription.plan) - if (planDollars > 0) { - const memberIds = teamMembers.map((tm) => tm.userId) - const orgRefreshDeduction = await computeDailyRefreshConsumed({ - userIds: memberIds, - periodStart: preloadedSubscription.periodStart, - periodEnd: preloadedSubscription.periodEnd ?? null, - planDollars, - seats: preloadedSubscription.seats ?? 1, - }) - pooledUsage = Math.max(0, pooledUsage - orgRefreshDeduction) - } - } - - const orgCap = org.orgUsageLimit ? Number.parseFloat(String(org.orgUsageLimit)) : 0 - if (!orgCap || Number.isNaN(orgCap)) { - logger.warn('Organization missing usage limit', { orgId: org.id }) - } - if (pooledUsage >= orgCap) { - isExceeded = true - isWarning = false - break - } - } + const rawUsage = toNumber(toDecimal(statsRecords[0].currentPeriodCost)) + + let refresh = 0 + if (sub && isPaid(sub.plan) && sub.periodStart) { + const planDollars = getPlanTierDollars(sub.plan) + if (planDollars > 0) { + refresh = await computeDailyRefreshConsumed({ + userIds: [userId], + periodStart: sub.periodStart, + periodEnd: sub.periodEnd ?? null, + planDollars, + }) } } - } catch (error) { - logger.warn('Error checking organization usage limits', { error, userId }) + currentUsage = Math.max(0, rawUsage - refresh) } + const percentUsed = limit > 0 ? Math.min((currentUsage / limit) * 100, 100) : 100 + const isExceeded = currentUsage >= limit + const isWarning = !isExceeded && percentUsed >= WARNING_THRESHOLD + logger.info('Final usage statistics', { userId, currentUsage, @@ -173,6 +164,8 @@ export async function checkUsageStatus( percentUsed, isWarning, isExceeded, + scope, + organizationId, }) return { @@ -181,6 +174,8 @@ export async function checkUsageStatus( isExceeded, currentUsage, limit, + scope, + organizationId, } } catch (error) { logger.error('Error checking usage status', { @@ -197,9 +192,11 @@ export async function checkUsageStatus( return { percentUsed: 100, isWarning: false, - isExceeded: true, // Block execution when we can't determine status + isExceeded: true, currentUsage: 0, - limit: 0, // Zero limit forces blocking + limit: 0, + scope: 'user', + organizationId: null, } } } @@ -210,7 +207,6 @@ export async function checkUsageStatus( */ export async function checkAndNotifyUsage(userId: string): Promise { try { - // Skip usage notifications if billing is disabled if (!isBillingEnabled) { return } @@ -218,14 +214,12 @@ export async function checkAndNotifyUsage(userId: string): Promise { const usageData = await checkUsageStatus(userId) if (usageData.isExceeded) { - // User has exceeded their limit logger.warn('User has exceeded usage limits', { userId, usage: usageData.currentUsage, limit: usageData.limit, }) - // Dispatch event to show a UI notification if (typeof window !== 'undefined') { window.dispatchEvent( new CustomEvent('usage-exceeded', { @@ -234,7 +228,6 @@ export async function checkAndNotifyUsage(userId: string): Promise { ) } } else if (usageData.isWarning) { - // User is approaching their limit logger.info('User approaching usage limits', { userId, usage: usageData.currentUsage, @@ -242,7 +235,6 @@ export async function checkAndNotifyUsage(userId: string): Promise { percent: usageData.percentUsed, }) - // Dispatch event to show a UI notification if (typeof window !== 'undefined') { window.dispatchEvent( new CustomEvent('usage-warning', { @@ -283,22 +275,17 @@ export async function checkServerSideUsageLimits( logger.info('Server-side checking usage limits for user', { userId }) - // Check user's own blocked status const stats = await db .select({ blocked: userStats.billingBlocked, blockedReason: userStats.billingBlockedReason, current: userStats.currentPeriodCost, - total: userStats.totalCost, }) .from(userStats) .where(eq(userStats.userId, userId)) .limit(1) - const currentUsage = - stats.length > 0 - ? Number.parseFloat(stats[0].current?.toString() || stats[0].total.toString()) - : 0 + const currentUsage = stats.length > 0 ? toNumber(toDecimal(stats[0].current)) : 0 if (stats.length > 0 && stats[0].blocked) { const message = @@ -313,14 +300,12 @@ export async function checkServerSideUsageLimits( } } - // Check if user is in an org where the owner is blocked const memberships = await db .select({ organizationId: member.organizationId }) .from(member) .where(eq(member.userId, userId)) for (const m of memberships) { - // Find the owner of this org const owners = await db .select({ userId: member.userId }) .from(member) @@ -354,13 +339,18 @@ export async function checkServerSideUsageLimits( const usageData = await checkUsageStatus(userId, preloadedSubscription) + const formattedUsage = (usageData.currentUsage ?? 0).toFixed(2) + const formattedLimit = (usageData.limit ?? 0).toFixed(2) + const exceededMessage = + usageData.scope === 'organization' + ? `Organization usage limit exceeded: $${formattedUsage} pooled of $${formattedLimit} organization limit. Ask a team admin to raise the organization usage limit to continue.` + : `Usage limit exceeded: $${formattedUsage} used of $${formattedLimit} limit. Please upgrade your plan or raise your usage limit to continue.` + return { isExceeded: usageData.isExceeded, currentUsage: usageData.currentUsage, limit: usageData.limit, - message: usageData.isExceeded - ? `Usage limit exceeded: ${usageData.currentUsage?.toFixed(2) || 0}$ used of ${usageData.limit?.toFixed(2) || 0}$ limit. Please upgrade your plan to continue.` - : undefined, + message: usageData.isExceeded ? exceededMessage : undefined, } } catch (error) { logger.error('Error in server-side usage limit check', { @@ -374,9 +364,9 @@ export async function checkServerSideUsageLimits( }) return { - isExceeded: true, // Block execution when we can't determine limits + isExceeded: true, currentUsage: 0, - limit: 0, // Zero limit forces blocking + limit: 0, message: error instanceof Error && error.message.includes('No user stats record found') ? 'User account not properly initialized. Please contact support.' diff --git a/apps/sim/lib/billing/client/types.ts b/apps/sim/lib/billing/client/types.ts index 6122b190026..c59c287a072 100644 --- a/apps/sim/lib/billing/client/types.ts +++ b/apps/sim/lib/billing/client/types.ts @@ -25,6 +25,9 @@ export interface SubscriptionData { isPro: boolean isTeam: boolean isEnterprise: boolean + /** True when the subscription's `referenceId` is an organization. */ + isOrgScoped: boolean + organizationId: string | null plan: string status: string | null seats: number | null @@ -59,6 +62,8 @@ export interface SubscriptionStore { isPro: boolean isTeam: boolean isEnterprise: boolean + isOrgScoped: boolean + organizationId: string | null isFree: boolean plan: string status: string | null diff --git a/apps/sim/lib/billing/client/upgrade.ts b/apps/sim/lib/billing/client/upgrade.ts index 08d58f52772..8baa555b0f5 100644 --- a/apps/sim/lib/billing/client/upgrade.ts +++ b/apps/sim/lib/billing/client/upgrade.ts @@ -2,7 +2,7 @@ import { useCallback } from 'react' import { createLogger } from '@sim/logger' import { useQueryClient } from '@tanstack/react-query' import { client, useSession, useSubscription } from '@/lib/auth/auth-client' -import { buildPlanName, isOrgPlan } from '@/lib/billing/plan-helpers' +import { buildPlanName, getDisplayPlanName, isPaid } from '@/lib/billing/plan-helpers' import { hasPaidSubscriptionStatus } from '@/lib/billing/subscriptions/utils' import { organizationKeys } from '@/hooks/queries/organization' @@ -65,22 +65,23 @@ export function useSubscriptionUpgrade() { ) if (existingOrg) { - // Check if this org already has an active team subscription - const existingTeamSub = allSubscriptions.find( + const existingOrgSub = allSubscriptions.find( (sub: any) => hasPaidSubscriptionStatus(sub.status) && sub.referenceId === existingOrg.id && - isOrgPlan(sub.plan) + isPaid(sub.plan) ) - if (existingTeamSub) { - logger.warn('Organization already has an active team subscription', { + if (existingOrgSub) { + logger.warn('Organization already has an active subscription', { userId, organizationId: existingOrg.id, - existingSubscriptionId: existingTeamSub.id, + existingSubscriptionId: existingOrgSub.id, + plan: existingOrgSub.plan, }) + const existingPlanName = getDisplayPlanName(existingOrgSub.plan) throw new Error( - 'This organization already has an active team subscription. Please manage it from the billing settings.' + `This organization is already on the ${existingPlanName} plan. Manage it from the billing settings.` ) } diff --git a/apps/sim/lib/billing/client/utils.ts b/apps/sim/lib/billing/client/utils.ts index 206af4d5bdf..91211902e71 100644 --- a/apps/sim/lib/billing/client/utils.ts +++ b/apps/sim/lib/billing/client/utils.ts @@ -31,6 +31,8 @@ export function getSubscriptionStatus( isPro: subscriptionData?.isPro ?? false, isTeam: subscriptionData?.isTeam ?? false, isEnterprise: subscriptionData?.isEnterprise ?? false, + isOrgScoped: subscriptionData?.isOrgScoped ?? false, + organizationId: subscriptionData?.organizationId ?? null, isFree: !(subscriptionData?.isPaid ?? false), plan: subscriptionData?.plan ?? 'free', status: subscriptionData?.status ?? null, @@ -45,7 +47,12 @@ export function getSubscriptionAccessState( const status = getSubscriptionStatus(subscriptionData) const billingBlocked = Boolean(subscriptionData?.billingBlocked) const hasUsablePaidAccess = hasUsableSubscriptionAccess(status.status, billingBlocked) - const hasUsableTeamAccess = hasUsablePaidAccess && (status.isTeam || status.isEnterprise) + // Team-management features (invitations, seats, roles) are available on + // any paid subscription attached to an organization — including `pro_*` + // plans that have been transferred to an org. Plan-name gating would + // miss those. + const hasUsableTeamAccess = + hasUsablePaidAccess && (status.isOrgScoped || status.isTeam || status.isEnterprise) const hasUsableEnterpriseAccess = hasUsablePaidAccess && status.isEnterprise const hasUsableMaxAccess = hasUsablePaidAccess && (getPlanTierCredits(status.plan) >= 25000 || isEnterprise(status.plan)) diff --git a/apps/sim/lib/billing/core/billing.ts b/apps/sim/lib/billing/core/billing.ts index 2edb18f4af9..df9a31eb7c9 100644 --- a/apps/sim/lib/billing/core/billing.ts +++ b/apps/sim/lib/billing/core/billing.ts @@ -1,29 +1,24 @@ import { db } from '@sim/db' -import { member, organization, subscription, user, userStats } from '@sim/db/schema' +import { member, organization, subscription, userStats } from '@sim/db/schema' import { and, eq, inArray } from 'drizzle-orm' import { getBillingInterval, getHighestPrioritySubscription, type SubscriptionMetadata, } from '@/lib/billing/core/subscription' -import { getUserUsageData } from '@/lib/billing/core/usage' +import { getOrgUsageLimit, getUserUsageData } from '@/lib/billing/core/usage' import { getCreditBalance } from '@/lib/billing/credits/balance' -import { dollarsToCredits } from '@/lib/billing/credits/conversion' -import { computeDailyRefreshConsumed } from '@/lib/billing/credits/daily-refresh' import { - getPlanTierCredits, - getPlanTierDollars, - isEnterprise, - isOrgPlan, - isPaid, - isPro, - isTeam, -} from '@/lib/billing/plan-helpers' + computeDailyRefreshConsumed, + getOrgMemberRefreshBounds, +} from '@/lib/billing/credits/daily-refresh' +import { getPlanTierDollars, isEnterprise, isPaid, isPro, isTeam } from '@/lib/billing/plan-helpers' import { ENTITLED_SUBSCRIPTION_STATUSES, getFreeTierLimit, getPlanPricing, hasPaidSubscriptionStatus, + isOrgScopedSubscription, } from '@/lib/billing/subscriptions/utils' import { Decimal, toDecimal, toNumber } from '@/lib/billing/utils/decimal' @@ -34,7 +29,13 @@ import { createLogger } from '@sim/logger' const logger = createLogger('Billing') /** - * Get organization subscription directly by organization ID + * Get the organization's subscription row when its status is one of + * `ENTITLED_SUBSCRIPTION_STATUSES` (includes `past_due`). Use this + * when making billing-side decisions (overage math, limit reads, + * webhooks) where `past_due` still counts as an active paid tenant. + * For product-access gating use `getOrganizationSubscriptionUsable` + * (from `core/subscription.ts`), which excludes `past_due`. + * Returns `null` when there is no entitled sub. */ export async function getOrganizationSubscription(organizationId: string) { try { @@ -65,45 +66,122 @@ export async function getOrganizationSubscription(organizationId: string) { */ /** - * Calculate overage billing for a user - * Returns only the amount that exceeds their subscription base price + * Check if a subscription is scoped to an organization by looking up its + * `referenceId` in the organization table. This is the authoritative + * answer — the plan name alone is unreliable because `pro_*` plans can be + * attached to organizations (and we should treat them as org-scoped). + * + * Use this in server contexts (webhooks, jobs) where we only have the + * subscription row, not a user perspective. If you do have a user id, + * `isOrgScopedSubscription(sub, userId)` is cheaper and equally correct. */ -export async function calculateUserOverage(userId: string): Promise<{ - basePrice: number - actualUsage: number - overageAmount: number - plan: string -} | null> { - try { - // Get user's subscription and usage data - const [subscription, usageData, userRecord] = await Promise.all([ - getHighestPrioritySubscription(userId), - getUserUsageData(userId), - db.select().from(user).where(eq(user.id, userId)).limit(1), - ]) - - if (userRecord.length === 0) { - logger.warn('User not found for overage calculation', { userId }) - return null - } +export async function isSubscriptionOrgScoped(sub: { referenceId: string }): Promise { + const rows = await db + .select({ id: organization.id }) + .from(organization) + .where(eq(organization.id, sub.referenceId)) + .limit(1) + return rows.length > 0 +} - const plan = subscription?.plan || 'free' - const { basePrice } = getPlanPricing(plan) - const actualUsage = usageData.currentUsage +/** + * Aggregate raw pooled stats for all members of an organization in a single + * query. Used by org-scoped summary and overage calculations so we don't + * call `getUserUsageData` per-member — that helper now returns the entire + * pool for org-scoped subs, which would N-times-count the usage. + * + * The `currentPeriodCost` sum here is semantically identical to + * `getPooledOrgCurrentPeriodCost` (same `LEFT JOIN` + `toDecimal` + * null handling); this helper bundles the copilot fields in the same + * round-trip. Never fall back to lifetime `totalCost` on nulls — the + * column is `NOT NULL DEFAULT '0'` and mixing scopes would break + * current-period billing math. + */ +async function aggregateOrgMemberStats(organizationId: string): Promise<{ + memberIds: string[] + currentPeriodCost: number + currentPeriodCopilotCost: number + lastPeriodCopilotCost: number +}> { + const rows = await db + .select({ + userId: member.userId, + currentPeriodCost: userStats.currentPeriodCost, + currentPeriodCopilotCost: userStats.currentPeriodCopilotCost, + lastPeriodCopilotCost: userStats.lastPeriodCopilotCost, + }) + .from(member) + .leftJoin(userStats, eq(member.userId, userStats.userId)) + .where(eq(member.organizationId, organizationId)) + + let currentPeriodCost = new Decimal(0) + let currentPeriodCopilotCost = new Decimal(0) + let lastPeriodCopilotCost = new Decimal(0) + const memberIds: string[] = [] + + for (const row of rows) { + memberIds.push(row.userId) + currentPeriodCost = currentPeriodCost.plus(toDecimal(row.currentPeriodCost)) + currentPeriodCopilotCost = currentPeriodCopilotCost.plus( + toDecimal(row.currentPeriodCopilotCost) + ) + lastPeriodCopilotCost = lastPeriodCopilotCost.plus(toDecimal(row.lastPeriodCopilotCost)) + } - // Calculate overage: any usage beyond what they already paid for - const overageAmount = Math.max(0, actualUsage - basePrice) + return { + memberIds, + currentPeriodCost: toNumber(currentPeriodCost), + currentPeriodCopilotCost: toNumber(currentPeriodCopilotCost), + lastPeriodCopilotCost: toNumber(lastPeriodCopilotCost), + } +} - return { - basePrice, - actualUsage, - overageAmount, - plan, - } - } catch (error) { - logger.error('Failed to calculate user overage', { userId, error }) - return null +/** + * Compute an org's overage amount from already-fetched pool/departed + * inputs. Internally performs one daily-refresh DB read to subtract + * refresh credits; callers are expected to have already loaded the + * pooled `currentPeriodCost` and `departedMemberUsage` (threshold + * billing passes lock-held values; `calculateSubscriptionOverage` + * passes lockless values from `aggregateOrgMemberStats`). Both + * callers route through this to keep the overage math in one place. + */ +export async function computeOrgOverageAmount(params: { + plan: string | null + seats: number | null + periodStart: Date | null + periodEnd: Date | null + organizationId: string + pooledCurrentPeriodCost: number + departedMemberUsage: number + memberIds: string[] +}): Promise<{ + effectiveUsage: number + baseSubscriptionAmount: number + dailyRefreshDeduction: number + totalOverage: number +}> { + const totalUsage = params.pooledCurrentPeriodCost + params.departedMemberUsage + + let dailyRefreshDeduction = 0 + const planDollars = getPlanTierDollars(params.plan) + if (planDollars > 0 && params.periodStart && params.memberIds.length > 0) { + const userBounds = await getOrgMemberRefreshBounds(params.organizationId, params.periodStart) + dailyRefreshDeduction = await computeDailyRefreshConsumed({ + userIds: params.memberIds, + periodStart: params.periodStart, + periodEnd: params.periodEnd ?? null, + planDollars, + seats: params.seats || 1, + userBounds: Object.keys(userBounds).length > 0 ? userBounds : undefined, + }) } + + const effectiveUsage = Math.max(0, totalUsage - dailyRefreshDeduction) + const { basePrice } = getPlanPricing(params.plan ?? '') + const baseSubscriptionAmount = (params.seats || 1) * basePrice + const totalOverage = Math.max(0, effectiveUsage - baseSubscriptionAmount) + + return { effectiveUsage, baseSubscriptionAmount, dailyRefreshDeduction, totalOverage } } /** @@ -129,17 +207,10 @@ export async function calculateSubscriptionOverage(sub: { let totalOverageDecimal = new Decimal(0) - if (isTeam(sub.plan)) { - const members = await db - .select({ userId: member.userId }) - .from(member) - .where(eq(member.organizationId, sub.referenceId)) + const isOrgScoped = await isSubscriptionOrgScoped(sub) - let totalTeamUsageDecimal = new Decimal(0) - for (const m of members) { - const usage = await getUserUsageData(m.userId) - totalTeamUsageDecimal = totalTeamUsageDecimal.plus(toDecimal(usage.currentUsage)) - } + if (isOrgScoped) { + const pooled = await aggregateOrgMemberStats(sub.referenceId) const orgData = await db .select({ departedMemberUsage: organization.departedMemberUsage }) @@ -147,82 +218,115 @@ export async function calculateSubscriptionOverage(sub: { .where(eq(organization.id, sub.referenceId)) .limit(1) - const departedUsageDecimal = - orgData.length > 0 ? toDecimal(orgData[0].departedMemberUsage) : new Decimal(0) + const departedMemberUsage = + orgData.length > 0 ? toNumber(toDecimal(orgData[0].departedMemberUsage)) : 0 - const totalUsageWithDepartedDecimal = totalTeamUsageDecimal.plus(departedUsageDecimal) - - let dailyRefreshDeduction = 0 - const planDollars = getPlanTierDollars(sub.plan) - if (planDollars > 0 && sub.periodStart) { - const memberIds = members.map((m) => m.userId) - dailyRefreshDeduction = await computeDailyRefreshConsumed({ - userIds: memberIds, - periodStart: sub.periodStart, - periodEnd: sub.periodEnd ?? null, - planDollars, - seats: sub.seats ?? 1, - }) - } + const { totalOverage, effectiveUsage, baseSubscriptionAmount } = await computeOrgOverageAmount({ + plan: sub.plan, + seats: sub.seats ?? null, + periodStart: sub.periodStart ?? null, + periodEnd: sub.periodEnd ?? null, + organizationId: sub.referenceId, + pooledCurrentPeriodCost: pooled.currentPeriodCost, + departedMemberUsage, + memberIds: pooled.memberIds, + }) - const effectiveUsageDecimal = Decimal.max( - 0, - totalUsageWithDepartedDecimal.minus(toDecimal(dailyRefreshDeduction)) - ) - const { basePrice } = getPlanPricing(sub.plan ?? '') - const baseSubscriptionAmount = (sub.seats ?? 0) * basePrice - totalOverageDecimal = Decimal.max(0, effectiveUsageDecimal.minus(baseSubscriptionAmount)) + totalOverageDecimal = toDecimal(totalOverage) - logger.info('Calculated team overage', { + logger.info('Calculated org-scoped overage', { subscriptionId: sub.id, - currentMemberUsage: toNumber(totalTeamUsageDecimal), - departedMemberUsage: toNumber(departedUsageDecimal), - totalUsage: toNumber(totalUsageWithDepartedDecimal), + plan: sub.plan, + currentMemberUsage: pooled.currentPeriodCost, + departedMemberUsage, + totalUsage: pooled.currentPeriodCost + departedMemberUsage, + effectiveUsage, baseSubscriptionAmount, - totalOverage: toNumber(totalOverageDecimal), + totalOverage, }) } else if (isPro(sub.plan)) { - // Pro plan: include snapshot if user joined a team - const usage = await getUserUsageData(sub.referenceId) - let totalProUsageDecimal = toDecimal(usage.currentUsage) - - // Add any snapshotted Pro usage (from when they joined a team) - const userStatsRows = await db - .select({ proPeriodCostSnapshot: userStats.proPeriodCostSnapshot }) + // Read user_stats directly (not via `getUserUsageData`). Priority + // lookup prefers org over personal within tier, so during a + // cancel-at-period-end grace window it would return pooled org usage + // instead of this user's personal period — overbilling the final + // personal Pro invoice. + const [statsRow] = await db + .select({ + currentPeriodCost: userStats.currentPeriodCost, + proPeriodCostSnapshot: userStats.proPeriodCostSnapshot, + proPeriodCostSnapshotAt: userStats.proPeriodCostSnapshotAt, + }) .from(userStats) .where(eq(userStats.userId, sub.referenceId)) .limit(1) - if (userStatsRows.length > 0 && userStatsRows[0].proPeriodCostSnapshot) { - const snapshotUsageDecimal = toDecimal(userStatsRows[0].proPeriodCostSnapshot) - totalProUsageDecimal = totalProUsageDecimal.plus(snapshotUsageDecimal) - logger.info('Including snapshotted Pro usage in overage calculation', { + const personalCurrentUsage = statsRow ? toNumber(toDecimal(statsRow.currentPeriodCost)) : 0 + const snapshotUsage = statsRow ? toNumber(toDecimal(statsRow.proPeriodCostSnapshot)) : 0 + const snapshotAt = statsRow?.proPeriodCostSnapshotAt ?? null + + const joinedOrgMidCycle = snapshotAt !== null || snapshotUsage > 0 + const totalProUsageDecimal = joinedOrgMidCycle + ? toDecimal(snapshotUsage) + : toDecimal(personalCurrentUsage) + + if (joinedOrgMidCycle) { + logger.info('Billing personal Pro only for pre-join usage (user joined org mid-cycle)', { userId: sub.referenceId, - currentUsage: usage.currentUsage, - snapshotUsage: toNumber(snapshotUsageDecimal), - totalProUsage: toNumber(totalProUsageDecimal), + preJoinUsage: snapshotUsage, + postJoinUsageOnMemberRow: personalCurrentUsage, + snapshotAt: snapshotAt?.toISOString() ?? null, + subscriptionId: sub.id, }) } + let dailyRefreshDeduction = 0 + const planDollars = getPlanTierDollars(sub.plan) + if (planDollars > 0 && sub.periodStart) { + // If the user joined an org mid-cycle, their usageLog rows after + // `snapshotAt` belong to the org's pooled refresh. Cap refresh + // to [periodStart, snapshotAt) so post-join refresh isn't + // deducted from pre-join personal Pro usage. + const refreshCap = joinedOrgMidCycle && snapshotAt ? snapshotAt : (sub.periodEnd ?? null) + dailyRefreshDeduction = await computeDailyRefreshConsumed({ + userIds: [sub.referenceId], + periodStart: sub.periodStart, + periodEnd: refreshCap, + planDollars, + }) + } + + const effectiveUsageDecimal = Decimal.max( + 0, + totalProUsageDecimal.minus(toDecimal(dailyRefreshDeduction)) + ) const { basePrice } = getPlanPricing(sub.plan ?? '') - totalOverageDecimal = Decimal.max(0, totalProUsageDecimal.minus(basePrice)) + totalOverageDecimal = Decimal.max(0, effectiveUsageDecimal.minus(basePrice)) - logger.info('Calculated pro overage', { + logger.info('Calculated personal pro overage', { subscriptionId: sub.id, - totalProUsage: toNumber(totalProUsageDecimal), + joinedOrgMidCycle, + personalCurrentUsage, + snapshot: snapshotUsage, + billedUsage: toNumber(totalProUsageDecimal), + dailyRefreshDeduction, basePrice, totalOverage: toNumber(totalOverageDecimal), }) } else { - // Free plan or unknown plan type - const usage = await getUserUsageData(sub.referenceId) + // Free or unknown plan. Same direct-read rationale as the Pro branch. + const [statsRow] = await db + .select({ currentPeriodCost: userStats.currentPeriodCost }) + .from(userStats) + .where(eq(userStats.userId, sub.referenceId)) + .limit(1) + const personalCurrentUsage = statsRow ? toNumber(toDecimal(statsRow.currentPeriodCost)) : 0 const { basePrice } = getPlanPricing(sub.plan || 'free') - totalOverageDecimal = Decimal.max(0, toDecimal(usage.currentUsage).minus(basePrice)) + totalOverageDecimal = Decimal.max(0, toDecimal(personalCurrentUsage).minus(basePrice)) logger.info('Calculated overage for plan', { subscriptionId: sub.id, plan: sub.plan || 'free', - usage: usage.currentUsage, + usage: personalCurrentUsage, basePrice, totalOverage: toNumber(totalOverageDecimal), }) @@ -240,10 +344,7 @@ export async function getSimplifiedBillingSummary( ): Promise<{ type: 'individual' | 'organization' plan: string - basePrice: number currentUsage: number - overageAmount: number - totalProjected: number usageLimit: number percentUsed: number isWarning: boolean @@ -251,17 +352,15 @@ export async function getSimplifiedBillingSummary( daysRemaining: number creditBalance: number billingInterval: 'month' | 'year' - tierCredits: number - basePriceCredits: number - currentUsageCredits: number - overageAmountCredits: number - totalProjectedCredits: number - usageLimitCredits: number // Subscription details isPaid: boolean isPro: boolean isTeam: boolean isEnterprise: boolean + /** True when the subscription's `referenceId` is an organization id. */ + isOrgScoped: boolean + /** Present when `isOrgScoped` is true. */ + organizationId: string | null status: string | null seats: number | null metadata: any @@ -281,21 +380,6 @@ export async function getSimplifiedBillingSummary( lastPeriodCopilotCost: number daysRemaining: number copilotCost: number - currentCredits: number - limitCredits: number - lastPeriodCostCredits: number - lastPeriodCopilotCostCredits: number - copilotCostCredits: number - } - organizationData?: { - seatCount: number - memberCount: number - totalBasePrice: number - totalCurrentUsage: number - totalOverage: number - totalBasePriceCredits: number - totalCurrentUsageCredits: number - totalOverageCredits: number } }> { try { @@ -307,13 +391,14 @@ export async function getSimplifiedBillingSummary( getUserUsageData(userId), ]) - // Determine subscription type flags const plan = subscription?.plan || 'free' const hasPaidEntitlement = hasPaidSubscriptionStatus(subscription?.status) const planIsPaid = hasPaidEntitlement && isPaid(plan) const planIsPro = hasPaidEntitlement && isPro(plan) const planIsTeam = hasPaidEntitlement && isTeam(plan) const planIsEnterprise = hasPaidEntitlement && isEnterprise(plan) + const orgScoped = isOrgScopedSubscription(subscription, userId) + const subscriptionOrgId = orgScoped && subscription ? subscription.referenceId : null if (organizationId) { // Organization billing summary @@ -321,96 +406,79 @@ export async function getSimplifiedBillingSummary( return getDefaultBillingSummary('organization') } - // Get all organization members - const members = await db - .select({ userId: member.userId }) - .from(member) - .where(eq(member.organizationId, organizationId)) - - const { basePrice: basePricePerSeat } = getPlanPricing(subscription.plan) - // Use licensed seats from Stripe as source of truth - const licensedSeats = subscription.seats ?? 0 - const totalBasePrice = basePricePerSeat * licensedSeats // Based on Stripe subscription - - let totalCurrentUsageDecimal = new Decimal(0) - let totalCopilotCostDecimal = new Decimal(0) - let totalLastPeriodCopilotCostDecimal = new Decimal(0) - - // Calculate total team usage across all members - for (const memberInfo of members) { - const memberUsageData = await getUserUsageData(memberInfo.userId) - totalCurrentUsageDecimal = totalCurrentUsageDecimal.plus( - toDecimal(memberUsageData.currentUsage) - ) - - // Fetch copilot cost for this member - const memberStats = await db - .select({ - currentPeriodCopilotCost: userStats.currentPeriodCopilotCost, - lastPeriodCopilotCost: userStats.lastPeriodCopilotCost, - }) - .from(userStats) - .where(eq(userStats.userId, memberInfo.userId)) - .limit(1) - - if (memberStats.length > 0) { - totalCopilotCostDecimal = totalCopilotCostDecimal.plus( - toDecimal(memberStats[0].currentPeriodCopilotCost) - ) - totalLastPeriodCopilotCostDecimal = totalLastPeriodCopilotCostDecimal.plus( - toDecimal(memberStats[0].lastPeriodCopilotCost) + // Pool usage/copilot across all members in one query. Must not use + // `getUserUsageData` per-member — it now returns the pool itself + // for org-scoped subs, which would N-times-count. + const pooled = await aggregateOrgMemberStats(organizationId) + + const rawCurrentUsage = pooled.currentPeriodCost + const totalCopilotCost = pooled.currentPeriodCopilotCost + const totalLastPeriodCopilotCost = pooled.lastPeriodCopilotCost + + // Deduct daily-refresh credits against this specific org's pool. + // `usageData` is derived from the caller's priority subscription + // and may not match the requested org (multi-org admins, personal + // priority sub, etc.), so it cannot be reused here. + let refreshDeduction = 0 + if (isPaid(plan) && subscription.periodStart) { + const planDollars = getPlanTierDollars(plan) + if (planDollars > 0) { + const userBounds = await getOrgMemberRefreshBounds( + organizationId, + subscription.periodStart ) + refreshDeduction = await computeDailyRefreshConsumed({ + userIds: pooled.memberIds, + periodStart: subscription.periodStart, + periodEnd: subscription.periodEnd ?? null, + planDollars, + seats: subscription.seats || 1, + userBounds: Object.keys(userBounds).length > 0 ? userBounds : undefined, + }) } } + const effectiveCurrentUsage = Math.max(0, rawCurrentUsage - refreshDeduction) - const totalCurrentUsage = toNumber(totalCurrentUsageDecimal) - const totalCopilotCost = toNumber(totalCopilotCostDecimal) - const totalLastPeriodCopilotCost = toNumber(totalLastPeriodCopilotCostDecimal) - - // Calculate team-level overage: total usage beyond what was already paid to Stripe - const totalOverage = toNumber(Decimal.max(0, totalCurrentUsageDecimal.minus(totalBasePrice))) + const { limit: orgUsageLimit } = await getOrgUsageLimit( + organizationId, + plan, + subscription.seats ?? null + ) - // Get user's personal limits for warnings const percentUsed = - usageData.limit > 0 ? Math.round((usageData.currentUsage / usageData.limit) * 100) : 0 + orgUsageLimit > 0 ? Math.round((effectiveCurrentUsage / orgUsageLimit) * 100) : 0 + const isExceeded = effectiveCurrentUsage >= orgUsageLimit + const isWarning = !isExceeded && percentUsed >= 80 // Calculate days remaining in billing period - const daysRemaining = usageData.billingPeriodEnd + const daysRemaining = subscription.periodEnd ? Math.max( 0, - Math.ceil((usageData.billingPeriodEnd.getTime() - Date.now()) / (1000 * 60 * 60 * 24)) + Math.ceil((subscription.periodEnd.getTime() - Date.now()) / (1000 * 60 * 60 * 24)) ) : 0 const orgCredits = await getCreditBalance(userId) - const orgTotalProjected = totalBasePrice + totalOverage const orgBillingInterval = getBillingInterval(subscription.metadata as SubscriptionMetadata) return { type: 'organization', plan: subscription.plan, - basePrice: totalBasePrice, - currentUsage: totalCurrentUsage, - overageAmount: totalOverage, - totalProjected: orgTotalProjected, - usageLimit: usageData.limit, + currentUsage: effectiveCurrentUsage, + usageLimit: orgUsageLimit, percentUsed, - isWarning: percentUsed >= 80 && percentUsed < 100, - isExceeded: usageData.currentUsage >= usageData.limit, + isWarning, + isExceeded, daysRemaining, creditBalance: orgCredits.balance, billingInterval: orgBillingInterval, - tierCredits: getPlanTierCredits(subscription.plan), - basePriceCredits: dollarsToCredits(totalBasePrice), - currentUsageCredits: dollarsToCredits(totalCurrentUsage), - overageAmountCredits: dollarsToCredits(totalOverage), - totalProjectedCredits: dollarsToCredits(orgTotalProjected), - usageLimitCredits: dollarsToCredits(usageData.limit), // Subscription details isPaid: planIsPaid, isPro: planIsPro, isTeam: planIsTeam, isEnterprise: planIsEnterprise, + isOrgScoped: true, + organizationId: organizationId, status: subscription.status || null, seats: subscription.seats || null, metadata: subscription.metadata || null, @@ -419,40 +487,21 @@ export async function getSimplifiedBillingSummary( cancelAtPeriodEnd: subscription.cancelAtPeriodEnd || undefined, // Usage details usage: { - current: usageData.currentUsage, - limit: usageData.limit, + current: effectiveCurrentUsage, + limit: orgUsageLimit, percentUsed, - isWarning: percentUsed >= 80 && percentUsed < 100, - isExceeded: usageData.currentUsage >= usageData.limit, - billingPeriodStart: usageData.billingPeriodStart, - billingPeriodEnd: usageData.billingPeriodEnd, + isWarning, + isExceeded, + billingPeriodStart: subscription.periodStart ?? null, + billingPeriodEnd: subscription.periodEnd ?? null, lastPeriodCost: usageData.lastPeriodCost, lastPeriodCopilotCost: totalLastPeriodCopilotCost, daysRemaining, copilotCost: totalCopilotCost, - currentCredits: dollarsToCredits(usageData.currentUsage), - limitCredits: dollarsToCredits(usageData.limit), - lastPeriodCostCredits: dollarsToCredits(usageData.lastPeriodCost), - lastPeriodCopilotCostCredits: dollarsToCredits(totalLastPeriodCopilotCost), - copilotCostCredits: dollarsToCredits(totalCopilotCost), - }, - organizationData: { - seatCount: licensedSeats, - memberCount: members.length, - totalBasePrice, - totalCurrentUsage, - totalOverage, - totalBasePriceCredits: dollarsToCredits(totalBasePrice), - totalCurrentUsageCredits: dollarsToCredits(totalCurrentUsage), - totalOverageCredits: dollarsToCredits(totalOverage), }, } } - // Individual billing summary - const { basePrice } = getPlanPricing(plan) - - // Fetch user stats for copilot cost breakdown const userStatsRows = await db .select({ currentPeriodCopilotCost: userStats.currentPeriodCopilotCost, @@ -468,52 +517,17 @@ export async function getSimplifiedBillingSummary( const lastPeriodCopilotCost = userStatsRows.length > 0 ? toNumber(toDecimal(userStatsRows[0].lastPeriodCopilotCost)) : 0 - // For team and enterprise plans, calculate total team usage instead of individual usage - let currentUsage = usageData.currentUsage + const currentUsage = usageData.currentUsage let totalCopilotCost = copilotCost let totalLastPeriodCopilotCost = lastPeriodCopilotCost - if (isOrgPlan(plan) && subscription?.referenceId) { - // Get all team members and sum their usage - const teamMembers = await db - .select({ userId: member.userId }) - .from(member) - .where(eq(member.organizationId, subscription.referenceId)) - - let totalTeamUsageDecimal = new Decimal(0) - let totalTeamCopilotCostDecimal = new Decimal(0) - let totalTeamLastPeriodCopilotCostDecimal = new Decimal(0) - for (const teamMember of teamMembers) { - const memberUsageData = await getUserUsageData(teamMember.userId) - totalTeamUsageDecimal = totalTeamUsageDecimal.plus(toDecimal(memberUsageData.currentUsage)) - - // Fetch copilot cost for this team member - const memberStats = await db - .select({ - currentPeriodCopilotCost: userStats.currentPeriodCopilotCost, - lastPeriodCopilotCost: userStats.lastPeriodCopilotCost, - }) - .from(userStats) - .where(eq(userStats.userId, teamMember.userId)) - .limit(1) - - if (memberStats.length > 0) { - totalTeamCopilotCostDecimal = totalTeamCopilotCostDecimal.plus( - toDecimal(memberStats[0].currentPeriodCopilotCost) - ) - totalTeamLastPeriodCopilotCostDecimal = totalTeamLastPeriodCopilotCostDecimal.plus( - toDecimal(memberStats[0].lastPeriodCopilotCost) - ) - } - } - currentUsage = toNumber(totalTeamUsageDecimal) - totalCopilotCost = toNumber(totalTeamCopilotCostDecimal) - totalLastPeriodCopilotCost = toNumber(totalTeamLastPeriodCopilotCostDecimal) + if (orgScoped && subscription?.referenceId) { + const pooled = await aggregateOrgMemberStats(subscription.referenceId) + totalCopilotCost = pooled.currentPeriodCopilotCost + totalLastPeriodCopilotCost = pooled.lastPeriodCopilotCost } - const overageAmount = toNumber(Decimal.max(0, toDecimal(currentUsage).minus(basePrice))) const percentUsed = usageData.limit > 0 ? (currentUsage / usageData.limit) * 100 : 0 - // Calculate days remaining in billing period const daysRemaining = usageData.billingPeriodEnd ? Math.max( 0, @@ -522,7 +536,6 @@ export async function getSimplifiedBillingSummary( : 0 const userCredits = await getCreditBalance(userId) - const individualTotalProjected = basePrice + overageAmount const individualBillingInterval = getBillingInterval( subscription?.metadata as SubscriptionMetadata ) @@ -530,10 +543,7 @@ export async function getSimplifiedBillingSummary( return { type: 'individual', plan, - basePrice, - currentUsage: currentUsage, - overageAmount, - totalProjected: individualTotalProjected, + currentUsage, usageLimit: usageData.limit, percentUsed, isWarning: percentUsed >= 80 && percentUsed < 100, @@ -541,17 +551,13 @@ export async function getSimplifiedBillingSummary( daysRemaining, creditBalance: userCredits.balance, billingInterval: individualBillingInterval, - tierCredits: getPlanTierCredits(plan), - basePriceCredits: dollarsToCredits(basePrice), - currentUsageCredits: dollarsToCredits(currentUsage), - overageAmountCredits: dollarsToCredits(overageAmount), - totalProjectedCredits: dollarsToCredits(individualTotalProjected), - usageLimitCredits: dollarsToCredits(usageData.limit), // Subscription details isPaid: planIsPaid, isPro: planIsPro, isTeam: planIsTeam, isEnterprise: planIsEnterprise, + isOrgScoped: orgScoped, + organizationId: subscriptionOrgId, status: subscription?.status || null, seats: subscription?.seats || null, metadata: subscription?.metadata || null, @@ -571,11 +577,6 @@ export async function getSimplifiedBillingSummary( lastPeriodCopilotCost: totalLastPeriodCopilotCost, daysRemaining, copilotCost: totalCopilotCost, - currentCredits: dollarsToCredits(currentUsage), - limitCredits: dollarsToCredits(usageData.limit), - lastPeriodCostCredits: dollarsToCredits(usageData.lastPeriodCost), - lastPeriodCopilotCostCredits: dollarsToCredits(totalLastPeriodCopilotCost), - copilotCostCredits: dollarsToCredits(totalCopilotCost), }, } } catch (error) { @@ -592,10 +593,7 @@ function getDefaultBillingSummary(type: 'individual' | 'organization') { return { type, plan: 'free', - basePrice: 0, currentUsage: 0, - overageAmount: 0, - totalProjected: 0, usageLimit: freeTierLimit, percentUsed: 0, isWarning: false, @@ -603,17 +601,13 @@ function getDefaultBillingSummary(type: 'individual' | 'organization') { daysRemaining: 0, creditBalance: 0, billingInterval: 'month' as const, - tierCredits: 0, - basePriceCredits: 0, - currentUsageCredits: 0, - overageAmountCredits: 0, - totalProjectedCredits: 0, - usageLimitCredits: dollarsToCredits(freeTierLimit), // Subscription details isPaid: false, isPro: false, isTeam: false, isEnterprise: false, + isOrgScoped: false, + organizationId: null, status: null, seats: null, metadata: null, @@ -632,23 +626,6 @@ function getDefaultBillingSummary(type: 'individual' | 'organization') { lastPeriodCopilotCost: 0, daysRemaining: 0, copilotCost: 0, - currentCredits: 0, - limitCredits: dollarsToCredits(freeTierLimit), - lastPeriodCostCredits: 0, - lastPeriodCopilotCostCredits: 0, - copilotCostCredits: 0, }, - ...(type === 'organization' && { - organizationData: { - seatCount: 0, - memberCount: 0, - totalBasePrice: 0, - totalCurrentUsage: 0, - totalOverage: 0, - totalBasePriceCredits: 0, - totalCurrentUsageCredits: 0, - totalOverageCredits: 0, - }, - }), } } diff --git a/apps/sim/lib/billing/core/organization.ts b/apps/sim/lib/billing/core/organization.ts index c025e722b6d..f23f38a3d6e 100644 --- a/apps/sim/lib/billing/core/organization.ts +++ b/apps/sim/lib/billing/core/organization.ts @@ -1,44 +1,23 @@ import { db } from '@sim/db' -import { member, organization, subscription, user, userStats } from '@sim/db/schema' +import { member, organization, user, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' -import { and, eq, inArray } from 'drizzle-orm' +import { and, eq } from 'drizzle-orm' import { isOrganizationBillingBlocked } from '@/lib/billing/core/access' -import { getPlanPricing } from '@/lib/billing/core/billing' -import { computeDailyRefreshConsumed } from '@/lib/billing/credits/daily-refresh' -import { getPlanTierDollars, isEnterprise, isPaid, isTeam } from '@/lib/billing/plan-helpers' +import { getOrganizationSubscription, getPlanPricing } from '@/lib/billing/core/billing' +import { + computeDailyRefreshConsumed, + getOrgMemberRefreshBounds, +} from '@/lib/billing/credits/daily-refresh' +import { getPlanTierDollars, isEnterprise, isPaid } from '@/lib/billing/plan-helpers' import { - ENTITLED_SUBSCRIPTION_STATUSES, getEffectiveSeats, getFreeTierLimit, hasUsableSubscriptionStatus, } from '@/lib/billing/subscriptions/utils' +import { toDecimal, toNumber } from '@/lib/billing/utils/decimal' const logger = createLogger('OrganizationBilling') -/** - * Get organization subscription directly by organization ID - * This is for our new pattern where referenceId = organizationId - */ -async function getOrganizationSubscription(organizationId: string) { - try { - const orgSubs = await db - .select() - .from(subscription) - .where( - and( - eq(subscription.referenceId, organizationId), - inArray(subscription.status, ENTITLED_SUBSCRIPTION_STATUSES) - ) - ) - .limit(1) - - return orgSubs.length > 0 ? orgSubs[0] : null - } catch (error) { - logger.error('Error getting organization subscription', { error, organizationId }) - return null - } -} - function roundCurrency(value: number): number { return Math.round(value * 100) / 100 } @@ -143,51 +122,47 @@ export async function getOrganizationBillingData( // Calculate aggregated statistics let totalCurrentUsage = members.reduce((sum, m) => sum + m.currentUsage, 0) - // Deduct daily refresh from pooled usage if (isPaid(subscription.plan) && subscription.periodStart) { const planDollars = getPlanTierDollars(subscription.plan) if (planDollars > 0) { const memberIds = members.map((m) => m.userId) + const userBounds = await getOrgMemberRefreshBounds( + subscription.referenceId, + subscription.periodStart + ) const refreshConsumed = await computeDailyRefreshConsumed({ userIds: memberIds, periodStart: subscription.periodStart, periodEnd: subscription.periodEnd ?? null, planDollars, - seats: subscription.seats ?? 1, + seats: subscription.seats || 1, + userBounds: Object.keys(userBounds).length > 0 ? userBounds : undefined, }) totalCurrentUsage = Math.max(0, totalCurrentUsage - refreshConsumed) } } - // Get per-seat pricing for the plan const { basePrice: pricePerSeat } = getPlanPricing(subscription.plan) - const licensedSeats = subscription.seats ?? 0 + // Stripe subscription quantity; `||` not `??` because 0 seats is + // never valid for a paid sub — fall through to 1. + const licensedSeats = subscription.seats || 1 - // For seat count used in UI (invitations, team management): - // Team: seats column (Stripe quantity) - // Enterprise: metadata.seats (allocated seats, not Stripe quantity which is always 1) + // UI seat count — metadata.seats on enterprise (column is always 1). const effectiveSeats = getEffectiveSeats(subscription) - // Calculate minimum billing amount let minimumBillingAmount: number let totalUsageLimit: number if (isEnterprise(subscription.plan)) { - // Enterprise has fixed pricing set through custom Stripe product - // Their usage limit is configured to match their monthly cost - const configuredLimit = organizationData.orgUsageLimit - ? Number.parseFloat(organizationData.orgUsageLimit) - : 0 - minimumBillingAmount = configuredLimit // For enterprise, this equals their fixed monthly cost - totalUsageLimit = configuredLimit // Same as their monthly cost + const configuredLimit = toNumber(toDecimal(organizationData.orgUsageLimit)) + minimumBillingAmount = configuredLimit + totalUsageLimit = configuredLimit } else { - // Team plan: Billing is based on licensed seats from Stripe minimumBillingAmount = licensedSeats * pricePerSeat - // Total usage limit: never below the minimum based on licensed seats const configuredLimit = organizationData.orgUsageLimit - ? Number.parseFloat(organizationData.orgUsageLimit) + ? toNumber(toDecimal(organizationData.orgUsageLimit)) : null totalUsageLimit = configuredLimit !== null @@ -197,7 +172,6 @@ export async function getOrganizationBillingData( const averageUsagePerMember = members.length > 0 ? totalCurrentUsage / members.length : 0 - // Billing period comes from the organization's subscription const billingPeriodStart = subscription.periodStart || null const billingPeriodEnd = subscription.periodEnd || null @@ -206,9 +180,9 @@ export async function getOrganizationBillingData( organizationName: organizationData.name || '', subscriptionPlan: subscription.plan, subscriptionStatus: subscription.status || 'inactive', - totalSeats: effectiveSeats, // Uses metadata.seats for enterprise, seats column for team + totalSeats: effectiveSeats, usedSeats: members.length, - seatsCount: licensedSeats, // Used for billing calculations (Stripe quantity) + seatsCount: licensedSeats, totalCurrentUsage: roundCurrency(totalCurrentUsage), totalUsageLimit: roundCurrency(totalUsageLimit), minimumBillingAmount: roundCurrency(minimumBillingAmount), @@ -255,7 +229,6 @@ export async function updateOrganizationUsageLimit( return { success: false, error: 'An active subscription is required to edit usage limits' } } - // Enterprise plans have fixed usage limits that cannot be changed if (isEnterprise(subscription.plan)) { return { success: false, @@ -263,18 +236,17 @@ export async function updateOrganizationUsageLimit( } } - // Only team plans can update their usage limits - if (!isTeam(subscription.plan)) { + if (!isPaid(subscription.plan)) { return { success: false, - error: 'Only team organizations can update usage limits', + error: 'Organization is not on a paid plan', } } const { basePrice } = getPlanPricing(subscription.plan) - const minimumLimit = (subscription.seats ?? 0) * basePrice + const seatCount = subscription.seats || 1 + const minimumLimit = seatCount * basePrice - // Validate new limit is not below minimum if (newLimit < minimumLimit) { return { success: false, @@ -282,8 +254,6 @@ export async function updateOrganizationUsageLimit( } } - // Update the organization usage limit - // Convert number to string for decimal column await db .update(organization) .set({ diff --git a/apps/sim/lib/billing/core/plan.ts b/apps/sim/lib/billing/core/plan.ts index efed6996b3a..cb8fea848db 100644 --- a/apps/sim/lib/billing/core/plan.ts +++ b/apps/sim/lib/billing/core/plan.ts @@ -15,7 +15,17 @@ export type HighestPrioritySubscription = Awaited Team > Pro > Free + * + * Selection order: + * 1. Plan tier: Enterprise > Team > Pro > Free + * 2. Within the same tier, **org-scoped subs beat personally-scoped subs**. + * + * The tie-break matters because a user can legitimately hold both scopes + * at once — e.g. they accepted an org invite while their own personal Pro + * is still in its `cancelAtPeriodEnd` grace window. In that case the org + * is already paying for their usage, so pooled resources should win over + * the runoff personal sub; otherwise usage, credits, and rate limits would + * leak onto the user's row until the next billing cycle. */ export async function getHighestPrioritySubscription(userId: string) { try { @@ -59,17 +69,19 @@ export async function getHighestPrioritySubscription(userId: string) { } } - const allSubs = [...personalSubs, ...orgSubs] + if (personalSubs.length === 0 && orgSubs.length === 0) return null - if (allSubs.length === 0) return null + // Within each tier, prefer org-scoped over personally-scoped. + const pickAtTier = (predicate: (sub: (typeof personalSubs)[number]) => boolean) => + orgSubs.find(predicate) ?? personalSubs.find(predicate) - const enterpriseSub = allSubs.find((s) => checkEnterprisePlan(s)) + const enterpriseSub = pickAtTier(checkEnterprisePlan) if (enterpriseSub) return enterpriseSub - const teamSub = allSubs.find((s) => checkTeamPlan(s)) + const teamSub = pickAtTier(checkTeamPlan) if (teamSub) return teamSub - const proSub = allSubs.find((s) => checkProPlan(s)) + const proSub = pickAtTier(checkProPlan) if (proSub) return proSub return null diff --git a/apps/sim/lib/billing/core/subscription.ts b/apps/sim/lib/billing/core/subscription.ts index 2e62e61206f..f33c52a83f5 100644 --- a/apps/sim/lib/billing/core/subscription.ts +++ b/apps/sim/lib/billing/core/subscription.ts @@ -61,6 +61,63 @@ export async function writeBillingInterval( .where(eq(subscription.id, subscriptionId)) } +/** + * Sync the subscription's `plan` column to match Stripe. Closes a gap + * where plan changes (Pro → Team upgrades, tier swaps) updated price, + * seats, and referenceId at Stripe but left the DB plan stale. Returns + * `true` if a write was issued, `false` if no change was needed. + */ +export async function syncSubscriptionPlan( + subscriptionId: string, + currentPlan: string | null, + planFromStripe: string | null +): Promise { + if (!planFromStripe) return false + if (currentPlan === planFromStripe) return false + + await db + .update(subscription) + .set({ plan: planFromStripe }) + .where(eq(subscription.id, subscriptionId)) + + logger.info('Synced subscription plan name from Stripe', { + subscriptionId, + previousPlan: currentPlan, + newPlan: planFromStripe, + }) + + return true +} + +/** + * Get the organization's subscription row when its status is one of + * `USABLE_SUBSCRIPTION_STATUSES` (product access — stricter than + * `ENTITLED_SUBSCRIPTION_STATUSES` which also includes `past_due`). + * Use this for feature-gating ("can this org use the product right + * now"). Use `getOrganizationSubscription` (from `core/billing.ts`) + * when you need the billing-side entitlement row that includes + * past-due subscriptions. Returns `null` when there is no usable sub. + */ +export async function getOrganizationSubscriptionUsable(organizationId: string) { + try { + const [orgSub] = await db + .select() + .from(subscription) + .where( + and( + eq(subscription.referenceId, organizationId), + inArray(subscription.status, USABLE_SUBSCRIPTION_STATUSES) + ) + ) + .limit(1) + + return orgSub ?? null + } catch (error) { + logger.error('Error getting usable organization subscription', { error, organizationId }) + return null + } +} + /** * Check if a referenceId (user ID or org ID) has a paid subscription row. * Used for duplicate subscription prevention and transfer safety. @@ -198,16 +255,7 @@ export async function isEnterpriseOrgAdminOrOwner(userId: string): Promise { return false } - const [orgSub] = await db - .select() - .from(subscription) - .where( - and( - eq(subscription.referenceId, memberRecord.organizationId), - inArray(subscription.status, USABLE_SUBSCRIPTION_STATUSES) - ) - ) - .limit(1) + const orgSub = await getOrganizationSubscriptionUsable(memberRecord.organizationId) const hasTeamPlan = orgSub && (checkTeamPlan(orgSub) || checkEnterprisePlan(orgSub)) @@ -311,16 +350,7 @@ export async function isOrganizationOnTeamOrEnterprisePlan( return false } - const [orgSub] = await db - .select() - .from(subscription) - .where( - and( - eq(subscription.referenceId, organizationId), - inArray(subscription.status, USABLE_SUBSCRIPTION_STATUSES) - ) - ) - .limit(1) + const orgSub = await getOrganizationSubscriptionUsable(organizationId) return !!orgSub && (checkTeamPlan(orgSub) || checkEnterprisePlan(orgSub)) } catch (error) { @@ -347,16 +377,7 @@ export async function isOrganizationOnEnterprisePlan(organizationId: string): Pr return false } - const [orgSub] = await db - .select() - .from(subscription) - .where( - and( - eq(subscription.referenceId, organizationId), - inArray(subscription.status, USABLE_SUBSCRIPTION_STATUSES) - ) - ) - .limit(1) + const orgSub = await getOrganizationSubscriptionUsable(organizationId) return !!orgSub && checkEnterprisePlan(orgSub) } catch (error) { diff --git a/apps/sim/lib/billing/core/usage.ts b/apps/sim/lib/billing/core/usage.ts index 75058dcf4e3..c560acc63a9 100644 --- a/apps/sim/lib/billing/core/usage.ts +++ b/apps/sim/lib/billing/core/usage.ts @@ -1,7 +1,7 @@ import { db } from '@sim/db' import { member, organization, settings, user, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' -import { eq, inArray } from 'drizzle-orm' +import { eq } from 'drizzle-orm' import { getEmailSubject, renderCreditsExhaustedEmail, @@ -13,15 +13,11 @@ import { getHighestPrioritySubscription, type HighestPrioritySubscription, } from '@/lib/billing/core/plan' -import { computeDailyRefreshConsumed } from '@/lib/billing/credits/daily-refresh' import { - getPlanTierDollars, - isEnterprise, - isFree, - isOrgPlan, - isPaid, - isPro, -} from '@/lib/billing/plan-helpers' + computeDailyRefreshConsumed, + getOrgMemberRefreshBounds, +} from '@/lib/billing/credits/daily-refresh' +import { getPlanTierDollars, isEnterprise, isFree, isPaid, isPro } from '@/lib/billing/plan-helpers' import { canEditUsageLimit, getFreeTierLimit, @@ -29,6 +25,7 @@ import { getPlanPricing, hasPaidSubscriptionStatus, hasUsableSubscriptionAccess, + isOrgScopedSubscription, } from '@/lib/billing/subscriptions/utils' import type { BillingData, UsageData, UsageLimitInfo } from '@/lib/billing/types' import { Decimal, toDecimal, toNumber } from '@/lib/billing/utils/decimal' @@ -46,9 +43,44 @@ export interface OrgUsageLimitResult { } /** - * Calculates the effective usage limit for a team or enterprise organization. - * - Enterprise: Uses orgUsageLimit directly (fixed pricing) - * - Team: Uses orgUsageLimit but never below seats × basePrice + * Sum `currentPeriodCost` across all members of an organization. + * The single source of truth for pooled-usage reads so every caller + * applies identical null-handling and query shape. Does NOT apply + * daily-refresh deduction — callers layer that on top themselves + * because refresh math needs the caller's `sub` context (plan, + * period, seats, per-user bounds). + * + * Uses `LEFT JOIN` so members whose `userStats` row is missing still + * appear (contributing 0), which keeps `memberIds` complete for + * downstream refresh / bounds computations. + */ +export async function getPooledOrgCurrentPeriodCost( + organizationId: string +): Promise<{ memberIds: string[]; currentPeriodCost: number }> { + const rows = await db + .select({ + userId: member.userId, + currentPeriodCost: userStats.currentPeriodCost, + }) + .from(member) + .leftJoin(userStats, eq(member.userId, userStats.userId)) + .where(eq(member.organizationId, organizationId)) + + let pooled = new Decimal(0) + const memberIds: string[] = [] + for (const row of rows) { + memberIds.push(row.userId) + pooled = pooled.plus(toDecimal(row.currentPeriodCost)) + } + + return { memberIds, currentPeriodCost: toNumber(pooled) } +} + +/** + * Calculates the effective usage limit for an organization-scoped plan. + * Enterprise uses the configured orgUsageLimit directly; every other + * paid plan uses `basePrice × seats` (Stripe's `price × quantity`) as a + * floor. Returns `{ limit, minimum }` where `limit = max(configured, minimum)`. */ export async function getOrgUsageLimit( organizationId: string, @@ -76,15 +108,18 @@ export async function getOrgUsageLimit( } const { basePrice } = getPlanPricing(plan) - const minimum = (seats ?? 0) * basePrice + // `||` not `??` — 0 is never a valid seat count for a paid sub. + const seatCount = seats || 1 + const minimum = seatCount * basePrice if (configured !== null) { return { limit: Math.max(configured, minimum), minimum } } - logger.warn('Team org missing usage limit, using seats × basePrice fallback', { + logger.warn('Org missing usage limit, using plan-driven minimum as fallback', { orgId: organizationId, - seats, + plan, + seats: seatCount, minimum, }) return { limit: minimum, minimum } @@ -150,11 +185,13 @@ export async function getUserUsageData(userId: string): Promise { } const stats = userStatsData[0] + const orgScoped = isOrgScopedSubscription(subscription, userId) + let currentUsageDecimal = toDecimal(stats.currentPeriodCost) - // For Pro users, include any snapshotted usage (from when they joined a team) - // This ensures they see their total Pro usage in the UI - if (subscription && isPro(subscription.plan) && subscription.referenceId === userId) { + // For personally-scoped Pro users, include any snapshotted usage from + // a prior org-join so the display reflects their total Pro usage. + if (subscription && isPro(subscription.plan) && !orgScoped) { const snapshotUsageDecimal = toDecimal(stats.proPeriodCostSnapshot) if (snapshotUsageDecimal.greaterThan(0)) { currentUsageDecimal = currentUsageDecimal.plus(snapshotUsageDecimal) @@ -166,47 +203,60 @@ export async function getUserUsageData(userId: string): Promise { }) } } - const currentUsage = toNumber(currentUsageDecimal) + let currentUsage = toNumber(currentUsageDecimal) - // Determine usage limit based on plan type let limit: number + // Shared between the pooled-usage and pooled-refresh blocks so we + // don't issue the member lookup twice per org-scoped call. + let orgMemberIds: string[] = [] - if (!subscription || isFree(subscription.plan) || isPro(subscription.plan)) { - // Free/Pro: Use individual user limit from userStats - limit = stats.currentUsageLimit - ? toNumber(toDecimal(stats.currentUsageLimit)) - : getFreeTierLimit() - } else { - // Team/Enterprise: Use organization limit + if (orgScoped && subscription) { const orgLimit = await getOrgUsageLimit( subscription.referenceId, subscription.plan, subscription.seats ) limit = orgLimit.limit + + const pooled = await getPooledOrgCurrentPeriodCost(subscription.referenceId) + orgMemberIds = pooled.memberIds + currentUsage = pooled.currentPeriodCost + } else { + limit = stats.currentUsageLimit + ? toNumber(toDecimal(stats.currentUsageLimit)) + : getFreeTierLimit() } - // Derive billing period dates from subscription (source of truth). const billingPeriodStart = subscription?.periodStart ?? null const billingPeriodEnd = subscription?.periodEnd ?? null - // Compute daily refresh deduction for individual (non-org) paid plans. - // Org plans apply refresh at the pooled level in getEffectiveCurrentPeriodCost. let dailyRefreshConsumed = 0 - if ( - subscription && - isPaid(subscription.plan) && - !isOrgPlan(subscription.plan) && - billingPeriodStart - ) { + if (subscription && isPaid(subscription.plan) && billingPeriodStart) { const planDollars = getPlanTierDollars(subscription.plan) if (planDollars > 0) { - dailyRefreshConsumed = await computeDailyRefreshConsumed({ - userIds: [userId], - periodStart: billingPeriodStart, - periodEnd: billingPeriodEnd, - planDollars, - }) + if (orgScoped) { + if (orgMemberIds.length > 0) { + const userBounds = await getOrgMemberRefreshBounds( + subscription.referenceId, + billingPeriodStart + ) + dailyRefreshConsumed = await computeDailyRefreshConsumed({ + userIds: orgMemberIds, + periodStart: billingPeriodStart, + periodEnd: billingPeriodEnd, + planDollars, + seats: subscription.seats || 1, + userBounds: Object.keys(userBounds).length > 0 ? userBounds : undefined, + }) + } + } else { + dailyRefreshConsumed = await computeDailyRefreshConsumed({ + userIds: [userId], + periodStart: billingPeriodStart, + periodEnd: billingPeriodEnd, + planDollars, + }) + } } } @@ -246,21 +296,13 @@ export async function getUserUsageLimitInfo(userId: string): Promise { .limit(1) if (existingStats.length > 0) { - return // User already has usage stats + return } - // Check user's subscription to determine initial limit const subscription = await getHighestPrioritySubscription(userId) - const isTeamOrEnterprise = subscription && isOrgPlan(subscription.plan) + const orgScoped = isOrgScopedSubscription(subscription, userId) - // Create initial usage stats await db.insert(userStats).values({ id: generateId(), userId, - // Team/enterprise: null (use org limit), Free/Pro: individual limit - currentUsageLimit: isTeamOrEnterprise ? null : getFreeTierLimit().toString(), + currentUsageLimit: orgScoped ? null : getFreeTierLimit().toString(), usageLimitUpdatedAt: new Date(), }) logger.info('Initialized user stats', { userId, plan: subscription?.plan || 'free', - hasIndividualLimit: !isTeamOrEnterprise, + hasIndividualLimit: !orgScoped, }) } @@ -330,11 +377,11 @@ export async function updateUserUsageLimit( try { const subscription = await getHighestPrioritySubscription(userId) - // Team/enterprise users don't have individual limits - if (subscription && isOrgPlan(subscription.plan)) { + if (isOrgScopedSubscription(subscription, userId)) { return { success: false, - error: 'Team and enterprise members use organization limits', + error: + 'This subscription is managed at the organization level. Update the organization usage limit instead.', } } @@ -389,9 +436,9 @@ export async function updateUserUsageLimit( } /** - * Get usage limit for a user (used by checkUsageStatus for server-side checks) - * Free/Pro: Individual user limit from userStats - * Team/Enterprise: Organization limit + * Get usage limit for a user (used by checkUsageStatus for server-side + * checks). Org-scoped subs return the organization limit; + * personally-scoped subs return the individual user limit from userStats. */ export async function getUserUsageLimit( userId: string, @@ -402,46 +449,44 @@ export async function getUserUsageLimit( ? preloadedSubscription : await getHighestPrioritySubscription(userId) - if (!subscription || isFree(subscription.plan) || isPro(subscription.plan)) { - // Free/Pro: Use individual limit from userStats - const userStatsQuery = await db - .select({ currentUsageLimit: userStats.currentUsageLimit }) - .from(userStats) - .where(eq(userStats.userId, userId)) + if (isOrgScopedSubscription(subscription, userId) && subscription) { + const orgExists = await db + .select({ id: organization.id }) + .from(organization) + .where(eq(organization.id, subscription.referenceId)) .limit(1) - if (userStatsQuery.length === 0) { - throw new Error( - `No user stats record found for userId: ${userId}. User must be properly initialized before execution.` - ) - } - - // Individual limits should never be null for free/pro users - if (!userStatsQuery[0].currentUsageLimit) { - throw new Error( - `Invalid null usage limit for ${subscription?.plan || 'free'} user: ${userId}. User stats must be properly initialized.` - ) + if (orgExists.length === 0) { + throw new Error(`Organization not found: ${subscription.referenceId} for user: ${userId}`) } - return toNumber(toDecimal(userStatsQuery[0].currentUsageLimit)) + const orgLimit = await getOrgUsageLimit( + subscription.referenceId, + subscription.plan, + subscription.seats + ) + return orgLimit.limit } - // Team/Enterprise: Verify org exists then use organization limit - const orgExists = await db - .select({ id: organization.id }) - .from(organization) - .where(eq(organization.id, subscription.referenceId)) + + const userStatsQuery = await db + .select({ currentUsageLimit: userStats.currentUsageLimit }) + .from(userStats) + .where(eq(userStats.userId, userId)) .limit(1) - if (orgExists.length === 0) { - throw new Error(`Organization not found: ${subscription.referenceId} for user: ${userId}`) + if (userStatsQuery.length === 0) { + throw new Error( + `No user stats record found for userId: ${userId}. User must be properly initialized before execution.` + ) } - const orgLimit = await getOrgUsageLimit( - subscription.referenceId, - subscription.plan, - subscription.seats - ) - return orgLimit.limit + if (!userStatsQuery[0].currentUsageLimit) { + throw new Error( + `Invalid null usage limit for ${subscription?.plan || 'free'} user: ${userId}. User stats must be properly initialized.` + ) + } + + return toNumber(toDecimal(userStatsQuery[0].currentUsageLimit)) } /** @@ -486,8 +531,7 @@ export async function syncUsageLimitsFromSubscription(userId: string): Promise { const subscription = await getHighestPrioritySubscription(userId) + const orgScoped = isOrgScopedSubscription(subscription, userId) let rawCost: number let refreshUserIds: string[] = [userId] - if (!subscription || isFree(subscription.plan) || isPro(subscription.plan)) { + if (orgScoped && subscription) { + const pooled = await getPooledOrgCurrentPeriodCost(subscription.referenceId) + if (pooled.memberIds.length === 0) return 0 + refreshUserIds = pooled.memberIds + rawCost = pooled.currentPeriodCost + } else { const rows = await db .select({ current: userStats.currentPeriodCost }) .from(userStats) @@ -605,26 +652,6 @@ export async function getEffectiveCurrentPeriodCost(userId: string): Promise m.userId) - refreshUserIds = memberIds - const rows = await db - .select({ current: userStats.currentPeriodCost }) - .from(userStats) - .where(inArray(userStats.userId, memberIds)) - - let pooled = new Decimal(0) - for (const r of rows) { - pooled = pooled.plus(toDecimal(r.current)) - } - rawCost = toNumber(pooled) } if (!subscription || !isPaid(subscription.plan) || !subscription.periodStart) { @@ -634,12 +661,18 @@ export async function getEffectiveCurrentPeriodCost(userId: string): Promise 0 ? userBounds : undefined, }) return Math.max(0, rawCost - refreshConsumed) diff --git a/apps/sim/lib/billing/credits/balance.ts b/apps/sim/lib/billing/credits/balance.ts index 1c2c84f02e1..69a23cea982 100644 --- a/apps/sim/lib/billing/credits/balance.ts +++ b/apps/sim/lib/billing/credits/balance.ts @@ -1,11 +1,14 @@ import { db } from '@sim/db' -import { member, organization, userStats } from '@sim/db/schema' +import { organization, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' -import { and, eq, sql } from 'drizzle-orm' +import { eq, sql } from 'drizzle-orm' import { getEffectiveBillingStatus } from '@/lib/billing/core/access' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' -import { isOrgPlan, isPro, isTeam } from '@/lib/billing/plan-helpers' -import { hasUsableSubscriptionAccess } from '@/lib/billing/subscriptions/utils' +import { isPro, isTeam } from '@/lib/billing/plan-helpers' +import { + hasUsableSubscriptionAccess, + isOrgScopedSubscription, +} from '@/lib/billing/subscriptions/utils' import { Decimal, toDecimal, toFixedString, toNumber } from '@/lib/billing/utils/decimal' const logger = createLogger('CreditBalance') @@ -16,31 +19,47 @@ export interface CreditBalanceInfo { entityId: string } -export async function getCreditBalance(userId: string): Promise { - const subscription = await getHighestPrioritySubscription(userId) - - if (subscription && isOrgPlan(subscription.plan)) { - const orgRows = await db +/** + * Read credit balance directly from a known entity (user or organization). + * Use this in webhook / admin paths that already know the target entity — + * unlike `getCreditBalance(userId)` it does not route through + * `getHighestPrioritySubscription`, so callers don't need to resolve the + * org owner as a user-id proxy. + */ +export async function getCreditBalanceForEntity( + entityType: 'user' | 'organization', + entityId: string +): Promise { + if (entityType === 'organization') { + const rows = await db .select({ creditBalance: organization.creditBalance }) .from(organization) - .where(eq(organization.id, subscription.referenceId)) + .where(eq(organization.id, entityId)) .limit(1) + return rows.length > 0 ? toNumber(toDecimal(rows[0].creditBalance)) : 0 + } + + const rows = await db + .select({ creditBalance: userStats.creditBalance }) + .from(userStats) + .where(eq(userStats.userId, entityId)) + .limit(1) + return rows.length > 0 ? toNumber(toDecimal(rows[0].creditBalance)) : 0 +} + +export async function getCreditBalance(userId: string): Promise { + const subscription = await getHighestPrioritySubscription(userId) + if (isOrgScopedSubscription(subscription, userId) && subscription) { return { - balance: orgRows.length > 0 ? toNumber(toDecimal(orgRows[0].creditBalance)) : 0, + balance: await getCreditBalanceForEntity('organization', subscription.referenceId), entityType: 'organization', entityId: subscription.referenceId, } } - const userRows = await db - .select({ creditBalance: userStats.creditBalance }) - .from(userStats) - .where(eq(userStats.userId, userId)) - .limit(1) - return { - balance: userRows.length > 0 ? toNumber(toDecimal(userRows[0].creditBalance)) : 0, + balance: await getCreditBalanceForEntity('user', userId), entityType: 'user', entityId: userId, } @@ -155,11 +174,11 @@ export async function deductFromCredits(userId: string, cost: number): Promise { // Enterprise users must contact support to purchase credits return isPro(subscription.plan) || isTeam(subscription.plan) } - -export async function isOrgAdmin(userId: string, organizationId: string): Promise { - const memberRows = await db - .select({ role: member.role }) - .from(member) - .where(and(eq(member.organizationId, organizationId), eq(member.userId, userId))) - .limit(1) - - if (memberRows.length === 0) return false - return memberRows[0].role === 'owner' || memberRows[0].role === 'admin' -} diff --git a/apps/sim/lib/billing/credits/daily-refresh.ts b/apps/sim/lib/billing/credits/daily-refresh.ts index 03d386d965b..48e13d7b2d8 100644 --- a/apps/sim/lib/billing/credits/daily-refresh.ts +++ b/apps/sim/lib/billing/credits/daily-refresh.ts @@ -12,15 +12,26 @@ */ import { db } from '@sim/db' -import { usageLog } from '@sim/db/schema' +import { member, usageLog, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' -import { and, gte, inArray, lt, sql, sum } from 'drizzle-orm' +import { and, eq, gte, inArray, lt, or, sql, sum } from 'drizzle-orm' import { DAILY_REFRESH_RATE } from '@/lib/billing/constants' const logger = createLogger('DailyRefresh') const MS_PER_DAY = 86_400_000 +/** + * Optional per-user date window. `usageLog` rows outside + * `[userStart, userEnd)` are excluded from that user's contribution. + * Used to slice refresh around a mid-cycle org join so pre-join and + * post-join refresh are billed by the right subscription. + */ +export interface PerUserBounds { + userStart?: Date | null + userEnd?: Date | null +} + /** * Compute the total daily refresh credits consumed in the current billing period * using a single aggregating SQL query grouped by day offset. @@ -36,8 +47,9 @@ export async function computeDailyRefreshConsumed(params: { periodEnd?: Date | null planDollars: number seats?: number + userBounds?: Record }): Promise { - const { userIds, periodStart, periodEnd, planDollars, seats = 1 } = params + const { userIds, periodStart, periodEnd, planDollars, seats = 1, userBounds } = params if (planDollars <= 0 || userIds.length === 0) return 0 @@ -51,6 +63,39 @@ export async function computeDailyRefreshConsumed(params: { const dayCount = Math.ceil((cap.getTime() - periodStart.getTime()) / MS_PER_DAY) if (dayCount <= 0) return 0 + const unboundedUsers = userBounds ? userIds.filter((id) => !(id in userBounds)) : userIds + + const boundedClauses = userBounds + ? Object.entries(userBounds).flatMap(([userId, bounds]) => { + if (!userIds.includes(userId)) return [] + const effectiveStart = + bounds.userStart && bounds.userStart > periodStart ? bounds.userStart : periodStart + const effectiveEnd = bounds.userEnd && bounds.userEnd < cap ? bounds.userEnd : cap + if (effectiveEnd <= effectiveStart) return [] + return [ + and( + eq(usageLog.userId, userId), + gte(usageLog.createdAt, effectiveStart), + lt(usageLog.createdAt, effectiveEnd) + ), + ] + }) + : [] + + const rowFilters = + unboundedUsers.length > 0 + ? [ + and( + inArray(usageLog.userId, unboundedUsers), + gte(usageLog.createdAt, periodStart), + lt(usageLog.createdAt, cap) + ), + ...boundedClauses, + ] + : boundedClauses + + if (rowFilters.length === 0) return 0 + const rows = await db .select({ dayIndex: @@ -60,13 +105,7 @@ export async function computeDailyRefreshConsumed(params: { dayTotal: sum(usageLog.cost).as('day_total'), }) .from(usageLog) - .where( - and( - inArray(usageLog.userId, userIds), - gte(usageLog.createdAt, periodStart), - lt(usageLog.createdAt, cap) - ) - ) + .where(rowFilters.length === 1 ? rowFilters[0] : or(...rowFilters)) .groupBy(sql`day_index`) let totalConsumed = 0 @@ -81,6 +120,7 @@ export async function computeDailyRefreshConsumed(params: { days: dayCount, dailyRefreshDollars, totalConsumed, + hasUserBounds: Boolean(userBounds), }) return totalConsumed @@ -92,3 +132,25 @@ export async function computeDailyRefreshConsumed(params: { export function getDailyRefreshDollars(planDollars: number): number { return planDollars * DAILY_REFRESH_RATE } + +export async function getOrgMemberRefreshBounds( + organizationId: string, + periodStart: Date +): Promise> { + const rows = await db + .select({ + userId: member.userId, + snapshotAt: userStats.proPeriodCostSnapshotAt, + }) + .from(member) + .leftJoin(userStats, eq(member.userId, userStats.userId)) + .where(eq(member.organizationId, organizationId)) + + const bounds: Record = {} + for (const row of rows) { + if (row.snapshotAt && row.snapshotAt > periodStart) { + bounds[row.userId] = { userStart: row.snapshotAt } + } + } + return bounds +} diff --git a/apps/sim/lib/billing/credits/purchase.ts b/apps/sim/lib/billing/credits/purchase.ts index 69d792c16c0..496f3b0cbb1 100644 --- a/apps/sim/lib/billing/credits/purchase.ts +++ b/apps/sim/lib/billing/credits/purchase.ts @@ -2,12 +2,15 @@ import { db } from '@sim/db' import { organization, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' import { eq } from 'drizzle-orm' -import type Stripe from 'stripe' import { getPlanPricing } from '@/lib/billing/core/billing' +import { isOrganizationOwnerOrAdmin } from '@/lib/billing/core/organization' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' -import { canPurchaseCredits, isOrgAdmin } from '@/lib/billing/credits/balance' -import { isEnterprise, isTeam } from '@/lib/billing/plan-helpers' +import { canPurchaseCredits } from '@/lib/billing/credits/balance' +import { isEnterprise } from '@/lib/billing/plan-helpers' import { requireStripeClient } from '@/lib/billing/stripe-client' +import { getCustomerId, resolveDefaultPaymentMethod } from '@/lib/billing/stripe-payment-method' +import { isOrgScopedSubscription } from '@/lib/billing/subscriptions/utils' +import { toDecimal, toNumber } from '@/lib/billing/utils/decimal' const logger = createLogger('CreditPurchase') @@ -24,8 +27,10 @@ export async function setUsageLimitForCredits( ): Promise { try { const { basePrice } = getPlanPricing(plan) + + const seatCount = seats || 1 const planBase = - entityType === 'organization' ? Number(basePrice) * (seats || 1) : Number(basePrice) + entityType === 'organization' ? Number(basePrice) * seatCount : Number(basePrice) const creditBalanceNum = Number(creditBalance) const newLimit = planBase + creditBalanceNum @@ -36,8 +41,7 @@ export async function setUsageLimitForCredits( .where(eq(organization.id, entityId)) .limit(1) - const currentLimit = - orgRows.length > 0 ? Number.parseFloat(orgRows[0].orgUsageLimit || '0') : 0 + const currentLimit = orgRows.length > 0 ? toNumber(toDecimal(orgRows[0].orgUsageLimit)) : 0 if (newLimit > currentLimit) { await db @@ -63,7 +67,7 @@ export async function setUsageLimitForCredits( .limit(1) const currentLimit = - userStatsRows.length > 0 ? Number.parseFloat(userStatsRows[0].currentUsageLimit || '0') : 0 + userStatsRows.length > 0 ? toNumber(toDecimal(userStatsRows[0].currentUsageLimit)) : 0 if (newLimit > currentLimit) { await db @@ -97,12 +101,6 @@ export interface PurchaseResult { error?: string } -function getPaymentMethodId( - pm: string | Stripe.PaymentMethod | null | undefined -): string | undefined { - return typeof pm === 'string' ? pm : pm?.id -} - export async function purchaseCredits(params: PurchaseCreditsParams): Promise { const { userId, amountDollars, requestId } = params @@ -128,8 +126,10 @@ export async function purchaseCredits(params: PurchaseCreditsParams): Promise 0 && orgData[0].orgUsageLimit - ? Number.parseFloat(orgData[0].orgUsageLimit) + ? toNumber(toDecimal(orgData[0].orgUsageLimit)) : 0 // Update if no limit set, or if new seat-based minimum is higher @@ -286,8 +290,9 @@ export async function syncSubscriptionUsageLimits(subscription: SubscriptionData }) .where(eq(organization.id, organizationId)) - logger.info('Set organization usage limit for team plan', { + logger.info('Set organization usage limit', { organizationId, + plan: subscription.plan, seats, basePrice, orgLimit, @@ -322,6 +327,64 @@ export async function syncSubscriptionUsageLimits(subscription: SubscriptionData subscriptionId: subscription.id, plan: subscription.plan, }) + + // Bulk version of the per-member transfer in invitation-accept: + // catches members whose personal bytes never made it into the + // org pool (e.g. org upgraded free → paid after they joined). + // `.for('update')` row-locks so concurrent increment/decrement + // calls cannot slip between the snapshot SELECT and the + // zeroing UPDATE and get silently dropped. Idempotent — zeroed + // rows are filtered out. + if (isPaid(subscription.plan)) { + try { + const memberIds = members.map((m) => m.userId) + await db.transaction(async (tx) => { + const personalStorageRows = await tx + .select({ + userId: userStats.userId, + bytes: userStats.storageUsedBytes, + }) + .from(userStats) + .where(inArray(userStats.userId, memberIds)) + .for('update') + + const toTransfer = personalStorageRows.filter((r) => (r.bytes ?? 0) > 0) + const totalBytes = toTransfer.reduce((acc, r) => acc + (r.bytes ?? 0), 0) + + if (totalBytes === 0) return + + await tx + .update(organization) + .set({ + storageUsedBytes: sql`${organization.storageUsedBytes} + ${totalBytes}`, + }) + .where(eq(organization.id, organizationId)) + + await tx + .update(userStats) + .set({ storageUsedBytes: 0 }) + .where( + inArray( + userStats.userId, + toTransfer.map((r) => r.userId) + ) + ) + + logger.info('Transferred personal storage bytes to org pool during sync', { + organizationId, + subscriptionId: subscription.id, + memberCount: toTransfer.length, + totalBytes, + }) + }) + } catch (storageError) { + logger.error('Failed to transfer personal storage to org pool', { + organizationId, + subscriptionId: subscription.id, + error: storageError, + }) + } + } } } } catch (error) { diff --git a/apps/sim/lib/billing/organizations/membership.ts b/apps/sim/lib/billing/organizations/membership.ts index 1f9a8780451..35b08984a32 100644 --- a/apps/sim/lib/billing/organizations/membership.ts +++ b/apps/sim/lib/billing/organizations/membership.ts @@ -16,10 +16,12 @@ import { import { createLogger } from '@sim/logger' import { and, eq, inArray, isNull, ne, or, sql } from 'drizzle-orm' import { syncUsageLimitsFromSubscription } from '@/lib/billing/core/usage' -import { isOrgPlan, sqlIsPro } from '@/lib/billing/plan-helpers' -import { requireStripeClient } from '@/lib/billing/stripe-client' +import { isPaid, sqlIsPro } from '@/lib/billing/plan-helpers' import { ENTITLED_SUBSCRIPTION_STATUSES } from '@/lib/billing/subscriptions/utils' +import { toDecimal, toNumber } from '@/lib/billing/utils/decimal' import { validateSeatAvailability } from '@/lib/billing/validation/seat-management' +import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-handlers' +import { enqueueOutboxEvent } from '@/lib/core/outbox/service' import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('OrganizationMembership') @@ -137,31 +139,28 @@ export async function restoreUserProSubscription(userId: string): Promise { + await tx + .update(subscriptionTable) + .set({ cancelAtPeriodEnd: false }) + .where(eq(subscriptionTable.id, personalPro.id)) + + if (personalPro.stripeSubscriptionId) { + await enqueueOutboxEvent(tx, OUTBOX_EVENT_TYPES.STRIPE_SYNC_CANCEL_AT_PERIOD_END, { + stripeSubscriptionId: personalPro.stripeSubscriptionId, + subscriptionId: personalPro.id, + reason: 'member-left-paid-org', + }) + } }) - } - - try { - await db - .update(subscriptionTable) - .set({ cancelAtPeriodEnd: false }) - .where(eq(subscriptionTable.id, personalPro.id)) result.restored = true - logger.info('Restored personal Pro subscription', { + logger.info('Restored personal Pro subscription (DB committed, Stripe queued)', { userId, subscriptionId: personalPro.id, }) } catch (dbError) { - logger.error('DB update failed when restoring personal Pro', { + logger.error('Failed to restore personal Pro subscription', { userId, subscriptionId: personalPro.id, error: dbError, @@ -179,12 +178,10 @@ export async function restoreUserProSubscription(userId: string): Promise 0) { - const currentNum = Number.parseFloat(currentUsage) const restoredUsage = (currentNum + snapshotNum).toString() await db @@ -192,6 +189,7 @@ export async function restoreUserProSubscription(userId: string): Promise 0) { + await tx + .update(organization) + .set({ + storageUsedBytes: sql`${organization.storageUsedBytes} + ${bytesToTransfer}`, + }) + .where(eq(organization.id, organizationId)) + + await tx + .update(userStats) + .set({ storageUsedBytes: 0 }) + .where(eq(userStats.userId, userId)) + + logger.info('Transferred personal storage bytes to org pool on admin add', { + userId, + organizationId, + bytes: bytesToTransfer, + }) + } } }) @@ -565,7 +598,7 @@ export async function removeUserFromOrganization( .limit(1) if (departingUserStats?.currentPeriodCost) { - const usage = Number.parseFloat(departingUserStats.currentPeriodCost) + const usage = toNumber(toDecimal(departingUserStats.currentPeriodCost)) if (usage > 0) { await db .update(organization) @@ -627,7 +660,8 @@ export async function removeUserFromOrganization( ) ) - hasAnyPaidTeam = orgPaidSubs.some((s) => isOrgPlan(s.plan)) + // Still covered by a paid org sub → don't restore personal Pro. + hasAnyPaidTeam = orgPaidSubs.some((s) => isPaid(s.plan)) } if (!hasAnyPaidTeam) { diff --git a/apps/sim/lib/billing/plan-helpers.ts b/apps/sim/lib/billing/plan-helpers.ts index 0031bf3dffe..54e7abbe4b4 100644 --- a/apps/sim/lib/billing/plan-helpers.ts +++ b/apps/sim/lib/billing/plan-helpers.ts @@ -42,6 +42,13 @@ export function isPaid(plan: string | null | undefined): boolean { return isPro(plan) || isTeam(plan) || isEnterprise(plan) } +/** + * True when the plan **name** is a team/enterprise plan. This is a + * plan-name check, NOT a scope check — a `pro_*` plan attached to an + * organization is org-scoped at the billing level even though this + * returns `false` for it. For scope decisions use + * `isOrgScopedSubscription` (sync) or `isSubscriptionOrgScoped` (async). + */ export function isOrgPlan(plan: string | null | undefined): boolean { return isTeam(plan) || isEnterprise(plan) } diff --git a/apps/sim/lib/billing/storage/limits.ts b/apps/sim/lib/billing/storage/limits.ts index 6838a4b932d..7cfb6b19ff6 100644 --- a/apps/sim/lib/billing/storage/limits.ts +++ b/apps/sim/lib/billing/storage/limits.ts @@ -13,7 +13,8 @@ import { import { organization, subscription, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' import { eq } from 'drizzle-orm' -import { getPlanTypeForLimits, isEnterprise, isFree, isOrgPlan } from '@/lib/billing/plan-helpers' +import { getPlanTypeForLimits, isEnterprise, isFree } from '@/lib/billing/plan-helpers' +import { isOrgScopedSubscription } from '@/lib/billing/subscriptions/utils' import { getEnv } from '@/lib/core/config/env' import { isBillingEnabled } from '@/lib/core/config/feature-flags' @@ -78,7 +79,6 @@ export function getStorageLimitForPlan(plan: string, metadata?: any): number { */ export async function getUserStorageLimit(userId: string): Promise { try { - // Check if user is in a team/enterprise org const { getHighestPrioritySubscription } = await import('@/lib/billing/core/subscription') const sub = await getHighestPrioritySubscription(userId) @@ -88,18 +88,9 @@ export async function getUserStorageLimit(userId: string): Promise { return limits.free } - if (!isOrgPlan(sub.plan)) { - const effectivePlan = getPlanTypeForLimits(sub.plan) - const limitByPlan: Record<'free' | 'pro' | 'team', number> = { - free: limits.free, - pro: limits.pro, - team: limits.team, - } - return limitByPlan[effectivePlan as 'free' | 'pro' | 'team'] ?? limits.free - } - - if (isOrgPlan(sub.plan)) { - // Get organization storage limit + // Org-scoped subs use pooled org-level storage. Custom limits come from the + // subscription metadata; otherwise use the team/enterprise default. + if (isOrgScopedSubscription(sub, userId)) { const orgRecord = await db .select({ metadata: subscription.metadata }) .from(subscription) @@ -113,11 +104,17 @@ export async function getUserStorageLimit(userId: string): Promise { } } - // Default for team/enterprise return isEnterprise(sub.plan) ? limits.enterpriseDefault : limits.team } - return limits.free + // Personally-scoped plans use the per-plan default storage cap. + const effectivePlan = getPlanTypeForLimits(sub.plan) + const limitByPlan: Record<'free' | 'pro' | 'team', number> = { + free: limits.free, + pro: limits.pro, + team: limits.team, + } + return limitByPlan[effectivePlan as 'free' | 'pro' | 'team'] ?? limits.free } catch (error) { logger.error('Error getting user storage limit:', error) return getStorageLimits().free @@ -130,11 +127,12 @@ export async function getUserStorageLimit(userId: string): Promise { */ export async function getUserStorageUsage(userId: string): Promise { try { - // Check if user is in a team/enterprise org const { getHighestPrioritySubscription } = await import('@/lib/billing/core/subscription') const sub = await getHighestPrioritySubscription(userId) - if (sub && isOrgPlan(sub.plan)) { + // Org-scoped subs share pooled `organization.storageUsedBytes`; + // personal plans use `userStats`. + if (isOrgScopedSubscription(sub, userId) && sub) { const orgRecord = await db .select({ storageUsedBytes: organization.storageUsedBytes }) .from(organization) @@ -144,7 +142,6 @@ export async function getUserStorageUsage(userId: string): Promise { return orgRecord.length > 0 ? orgRecord[0].storageUsedBytes || 0 : 0 } - // Free/Pro: Use user stats const stats = await db .select({ storageUsedBytes: userStats.storageUsedBytes }) .from(userStats) diff --git a/apps/sim/lib/billing/storage/tracking.ts b/apps/sim/lib/billing/storage/tracking.ts index 4776e2ad558..8fb3d962efb 100644 --- a/apps/sim/lib/billing/storage/tracking.ts +++ b/apps/sim/lib/billing/storage/tracking.ts @@ -8,7 +8,7 @@ import { db } from '@sim/db' import { organization, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' import { eq, sql } from 'drizzle-orm' -import { isOrgPlan } from '@/lib/billing/plan-helpers' +import { isOrgScopedSubscription } from '@/lib/billing/subscriptions/utils' import { isBillingEnabled } from '@/lib/core/config/feature-flags' const logger = createLogger('StorageTracking') @@ -24,11 +24,11 @@ export async function incrementStorageUsage(userId: string, bytes: number): Prom } try { - // Check if user is in a team/enterprise org const { getHighestPrioritySubscription } = await import('@/lib/billing/core/subscription') const sub = await getHighestPrioritySubscription(userId) - if (sub && isOrgPlan(sub.plan)) { + // Org-scoped subs pool at the org level; personal plans per-user. + if (isOrgScopedSubscription(sub, userId) && sub) { await db .update(organization) .set({ @@ -38,7 +38,6 @@ export async function incrementStorageUsage(userId: string, bytes: number): Prom logger.info(`Incremented org storage: ${bytes} bytes for org ${sub.referenceId}`) } else { - // Update user stats storage await db .update(userStats) .set({ @@ -65,11 +64,10 @@ export async function decrementStorageUsage(userId: string, bytes: number): Prom } try { - // Check if user is in a team/enterprise org const { getHighestPrioritySubscription } = await import('@/lib/billing/core/subscription') const sub = await getHighestPrioritySubscription(userId) - if (sub && isOrgPlan(sub.plan)) { + if (isOrgScopedSubscription(sub, userId) && sub) { await db .update(organization) .set({ @@ -79,7 +77,6 @@ export async function decrementStorageUsage(userId: string, bytes: number): Prom logger.info(`Decremented org storage: ${bytes} bytes for org ${sub.referenceId}`) } else { - // Update user stats storage await db .update(userStats) .set({ diff --git a/apps/sim/lib/billing/stripe-payment-method.ts b/apps/sim/lib/billing/stripe-payment-method.ts new file mode 100644 index 00000000000..1bb130ec913 --- /dev/null +++ b/apps/sim/lib/billing/stripe-payment-method.ts @@ -0,0 +1,74 @@ +import { createLogger } from '@sim/logger' +import type Stripe from 'stripe' + +const logger = createLogger('StripePaymentMethod') + +/** + * Extract the payment-method id from any of the shapes Stripe returns + * for a `default_payment_method` field (id string, full object, null, + * or undefined). + */ +function getPaymentMethodId( + pm: string | Stripe.PaymentMethod | null | undefined +): string | undefined { + return typeof pm === 'string' ? pm : pm?.id +} + +/** + * Extract the customer id from any of the shapes Stripe returns for a + * `customer` field (id string, full `Customer`, or `DeletedCustomer`). + */ +export function getCustomerId( + customer: string | Stripe.Customer | Stripe.DeletedCustomer | null | undefined +): string | undefined { + if (!customer) return undefined + return typeof customer === 'string' ? customer : customer.id +} + +/** + * Resolve a subscription's default payment method with fallback to the + * customer's invoice-settings PM. Used for ad-hoc invoices that are + * not directly linked to the subscription (overage, credits, threshold + * billing) so Stripe can auto-collect on finalize. + * + * Returns both the resolved PM id and the subscription's collection + * method so callers can pass it through to `invoices.create` without a + * second subscription retrieve. On any Stripe error the returned + * `collectionMethod` is `null` — callers should treat that as + * "unknown" and handle accordingly rather than assuming a default. + */ +export async function resolveDefaultPaymentMethod( + stripe: Stripe, + stripeSubscriptionId: string, + customerId: string +): Promise<{ + paymentMethodId: string | undefined + collectionMethod: 'charge_automatically' | 'send_invoice' | null +}> { + let collectionMethod: 'charge_automatically' | 'send_invoice' | null = null + let paymentMethodId: string | undefined + + try { + const sub = await stripe.subscriptions.retrieve(stripeSubscriptionId) + collectionMethod = + sub.collection_method === 'send_invoice' ? 'send_invoice' : 'charge_automatically' + paymentMethodId = getPaymentMethodId(sub.default_payment_method) + + if (!paymentMethodId && collectionMethod === 'charge_automatically') { + const customer = await stripe.customers.retrieve(customerId) + if (customer && !('deleted' in customer)) { + paymentMethodId = getPaymentMethodId( + (customer as Stripe.Customer).invoice_settings?.default_payment_method + ) + } + } + } catch (error) { + logger.warn('Failed to resolve default payment method', { + stripeSubscriptionId, + customerId, + error: error instanceof Error ? error.message : error, + }) + } + + return { paymentMethodId, collectionMethod } +} diff --git a/apps/sim/lib/billing/subscriptions/utils.ts b/apps/sim/lib/billing/subscriptions/utils.ts index 078bc77294d..746a31bf2ce 100644 --- a/apps/sim/lib/billing/subscriptions/utils.ts +++ b/apps/sim/lib/billing/subscriptions/utils.ts @@ -93,7 +93,9 @@ export function getEffectiveSeats(subscription: any): number { return 0 } - if (isTeam(subscription.plan)) { + // Mirrors the Stripe subscription's `quantity`. For personal Pro this + // is null in practice, so `?? 0` returns 0. + if (isTeam(subscription.plan) || isPro(subscription.plan)) { return subscription.seats ?? 0 } @@ -109,9 +111,27 @@ export function checkTeamPlan(subscription: any): boolean { } /** - * Get the minimum usage limit for an individual user (used for validation) - * Only applicable for plans with individual limits (Free/Pro) - * Team and Enterprise plans use organization-level limits instead + * True when the subscription's `referenceId` is an org (i.e. not the + * caller's own `userId`). Prefer this over plan-name checks for scope + * decisions — a `pro_*` sub attached to an org is org-scoped even though + * `isTeam` / `isOrgPlan` return false. + */ +export function isOrgScopedSubscription( + subscription: { referenceId?: string | null } | null | undefined, + userId: string +): boolean { + if (!subscription?.referenceId) return false + return subscription.referenceId !== userId +} + +/** + * Get the minimum usage limit for an individual user (used for validation). + * + * Callers should only invoke this for **personally-scoped** subscriptions — + * any org-scoped subscription (team, enterprise, or `pro_*` attached to an + * organization) uses the organization-level limit instead. Callers are + * responsible for gating with `isOrgScopedSubscription` before calling. + * * @param subscription The subscription object * @returns The per-user minimum limit in dollars */ @@ -127,9 +147,6 @@ export function getPerUserMinimumLimit(subscription: any): number { } if (isOrgPlan(subscription.plan)) { - // Team and Enterprise don't have individual limits - they use organization limits - // This function should not be called for these plans - // Returning 0 to indicate no individual minimum return 0 } diff --git a/apps/sim/lib/billing/threshold-billing.ts b/apps/sim/lib/billing/threshold-billing.ts index 8e59b429f3e..254ebdc88bf 100644 --- a/apps/sim/lib/billing/threshold-billing.ts +++ b/apps/sim/lib/billing/threshold-billing.ts @@ -1,114 +1,28 @@ import { db } from '@sim/db' import { member, organization, subscription, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' -import { and, eq, inArray, sql } from 'drizzle-orm' -import type Stripe from 'stripe' +import { eq, inArray, sql } from 'drizzle-orm' import { DEFAULT_OVERAGE_THRESHOLD } from '@/lib/billing/constants' import { getEffectiveBillingStatus, isOrganizationBillingBlocked } from '@/lib/billing/core/access' -import { calculateSubscriptionOverage, getPlanPricing } from '@/lib/billing/core/billing' -import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' -import { computeDailyRefreshConsumed } from '@/lib/billing/credits/daily-refresh' +import { calculateSubscriptionOverage, computeOrgOverageAmount } from '@/lib/billing/core/billing' import { - getPlanTierDollars, - isEnterprise, - isFree, - isPaid, - isTeam, -} from '@/lib/billing/plan-helpers' -import { requireStripeClient } from '@/lib/billing/stripe-client' + getHighestPrioritySubscription, + getOrganizationSubscriptionUsable, +} from '@/lib/billing/core/subscription' +import { isEnterprise, isFree } from '@/lib/billing/plan-helpers' import { hasUsableSubscriptionAccess, - USABLE_SUBSCRIPTION_STATUSES, + isOrgScopedSubscription, } from '@/lib/billing/subscriptions/utils' +import { toDecimal, toNumber } from '@/lib/billing/utils/decimal' +import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-handlers' import { env } from '@/lib/core/config/env' +import { enqueueOutboxEvent } from '@/lib/core/outbox/service' const logger = createLogger('ThresholdBilling') const OVERAGE_THRESHOLD = env.OVERAGE_THRESHOLD_DOLLARS || DEFAULT_OVERAGE_THRESHOLD -function parseDecimal(value: string | number | null | undefined): number { - if (value === null || value === undefined) return 0 - return Number.parseFloat(value.toString()) -} - -async function createAndFinalizeOverageInvoice( - stripe: ReturnType, - params: { - customerId: string - stripeSubscriptionId: string - amountCents: number - description: string - itemDescription: string - metadata: Record - idempotencyKey: string - } -): Promise { - const getPaymentMethodId = ( - pm: string | Stripe.PaymentMethod | null | undefined - ): string | undefined => (typeof pm === 'string' ? pm : pm?.id) - - let defaultPaymentMethod: string | undefined - try { - const stripeSub = await stripe.subscriptions.retrieve(params.stripeSubscriptionId) - const subDpm = getPaymentMethodId(stripeSub.default_payment_method) - if (subDpm) { - defaultPaymentMethod = subDpm - } else { - const custObj = await stripe.customers.retrieve(params.customerId) - if (custObj && !('deleted' in custObj)) { - const cust = custObj as Stripe.Customer - const custDpm = getPaymentMethodId(cust.invoice_settings?.default_payment_method) - if (custDpm) defaultPaymentMethod = custDpm - } - } - } catch (e) { - logger.error('Failed to retrieve subscription or customer', { error: e }) - } - - const invoice = await stripe.invoices.create( - { - customer: params.customerId, - collection_method: 'charge_automatically', - auto_advance: false, - description: params.description, - metadata: params.metadata, - ...(defaultPaymentMethod ? { default_payment_method: defaultPaymentMethod } : {}), - }, - { idempotencyKey: `${params.idempotencyKey}-invoice` } - ) - - await stripe.invoiceItems.create( - { - customer: params.customerId, - invoice: invoice.id, - amount: params.amountCents, - currency: 'usd', - description: params.itemDescription, - metadata: params.metadata, - }, - { idempotencyKey: params.idempotencyKey } - ) - - if (invoice.id) { - const finalized = await stripe.invoices.finalizeInvoice(invoice.id) - - if (finalized.status === 'open' && finalized.id) { - try { - await stripe.invoices.pay(finalized.id, { - payment_method: defaultPaymentMethod, - }) - } catch (payError) { - logger.error('Failed to auto-pay threshold overage invoice', { - error: payError, - invoiceId: finalized.id, - }) - } - } - } - - return invoice.id || '' -} - export async function checkAndBillOverageThreshold(userId: string): Promise { try { const threshold = OVERAGE_THRESHOLD @@ -128,10 +42,12 @@ export async function checkAndBillOverageThreshold(userId: string): Promise 0) { creditsApplied = Math.min(creditBalance, amountToBill) - // Update credit balance within the transaction await tx .update(userStats) .set({ @@ -200,7 +132,7 @@ export async function checkAndBillOverageThreshold(userId: string): Promise m.userId !== owner.userId).map((m) => m.userId) @@ -405,34 +304,33 @@ export async function checkAndBillOrganizationOverageThreshold( .where(inArray(userStats.userId, nonOwnerIds)) for (const stats of memberStatsRows) { - totalTeamUsage += parseDecimal(stats.currentPeriodCost) + pooledCurrentPeriodCost += toNumber(toDecimal(stats.currentPeriodCost)) } } - let dailyRefreshDeduction = 0 - if (isPaid(orgSubscription.plan) && orgSubscription.periodStart) { - const planDollars = getPlanTierDollars(orgSubscription.plan) - if (planDollars > 0) { - const allMemberIds = members.map((m) => m.userId) - dailyRefreshDeduction = await computeDailyRefreshConsumed({ - userIds: allMemberIds, - periodStart: orgSubscription.periodStart, - periodEnd: orgSubscription.periodEnd ?? null, - planDollars, - seats: orgSubscription.seats ?? 1, - }) - } - } + const departedMemberUsage = toNumber(toDecimal(orgLock[0].departedMemberUsage)) + + const { + totalOverage: currentOverage, + baseSubscriptionAmount: basePrice, + effectiveUsage: effectiveTeamUsage, + } = await computeOrgOverageAmount({ + plan: orgSubscription.plan, + seats: orgSubscription.seats ?? null, + periodStart: orgSubscription.periodStart ?? null, + periodEnd: orgSubscription.periodEnd ?? null, + organizationId, + pooledCurrentPeriodCost, + departedMemberUsage, + memberIds: members.map((m) => m.userId), + }) - const effectiveTeamUsage = Math.max(0, totalTeamUsage - dailyRefreshDeduction) - const { basePrice: basePricePerSeat } = getPlanPricing(orgSubscription.plan) - const basePrice = basePricePerSeat * (orgSubscription.seats ?? 0) - const currentOverage = Math.max(0, effectiveTeamUsage - basePrice) const unbilledOverage = Math.max(0, currentOverage - totalBilledOverage) logger.debug('Organization threshold billing check', { organizationId, - totalTeamUsage, + totalTeamUsage: pooledCurrentPeriodCost + departedMemberUsage, + effectiveTeamUsage, basePrice, currentOverage, totalBilledOverage, @@ -444,13 +342,24 @@ export async function checkAndBillOrganizationOverageThreshold( return } - // Apply credits to reduce the amount to bill (use locked org's balance) + // Validate Stripe identifiers BEFORE mutating credits/trackers. + const stripeSubscriptionId = orgSubscription.stripeSubscriptionId + if (!stripeSubscriptionId) { + logger.error('No Stripe subscription ID for organization', { organizationId }) + return + } + + const customerId = orgSubscription.stripeCustomerId + if (!customerId) { + logger.error('No Stripe customer ID for organization', { organizationId }) + return + } + let amountToBill = unbilledOverage let creditsApplied = 0 if (orgCreditBalance > 0) { creditsApplied = Math.min(orgCreditBalance, amountToBill) - // Update credit balance within the transaction await tx .update(organization) .set({ @@ -467,7 +376,7 @@ export async function checkAndBillOrganizationOverageThreshold( }) } - // If credits covered everything, just update the billed amount but don't create invoice + // If credits covered everything, bump billed tracker but don't enqueue Stripe invoice. if (amountToBill <= 0) { await tx .update(userStats) @@ -484,19 +393,6 @@ export async function checkAndBillOrganizationOverageThreshold( return } - const stripeSubscriptionId = orgSubscription.stripeSubscriptionId - if (!stripeSubscriptionId) { - logger.error('No Stripe subscription ID for organization', { organizationId }) - return - } - - const stripe = requireStripeClient() - const stripeSubscription = await stripe.subscriptions.retrieve(stripeSubscriptionId) - const customerId = - typeof stripeSubscription.customer === 'string' - ? stripeSubscription.customer - : stripeSubscription.customer.id - const periodEnd = orgSubscription.periodEnd ? Math.floor(orgSubscription.periodEnd.getTime() / 1000) : Math.floor(Date.now() / 1000) @@ -504,23 +400,24 @@ export async function checkAndBillOrganizationOverageThreshold( const amountCents = Math.round(amountToBill * 100) const totalOverageCents = Math.round(currentOverage * 100) - const idempotencyKey = `threshold-overage-org:${customerId}:${stripeSubscriptionId}:${billingPeriod}:${totalOverageCents}:${amountCents}` - - logger.info('Creating organization threshold overage invoice', { - organizationId, - amountToBill, - creditsApplied, - billingPeriod, - }) - - const cents = amountCents + // Bump billed tracker and enqueue Stripe invoice atomically. + // See user-path above for the full retry-invariant reasoning. + await tx + .update(userStats) + .set({ + billedOverageThisPeriod: sql`${userStats.billedOverageThisPeriod} + ${unbilledOverage}`, + }) + .where(eq(userStats.userId, owner.userId)) - const invoiceId = await createAndFinalizeOverageInvoice(stripe, { + await enqueueOutboxEvent(tx, OUTBOX_EVENT_TYPES.STRIPE_THRESHOLD_OVERAGE_INVOICE, { customerId, stripeSubscriptionId, - amountCents: cents, + amountCents, description: `Team threshold overage billing – ${billingPeriod}`, itemDescription: `Team usage overage ($${amountToBill.toFixed(2)})`, + billingPeriod, + invoiceIdemKeyStem: `threshold-overage-org-invoice:${customerId}:${stripeSubscriptionId}:${billingPeriod}:${totalOverageCents}:${amountCents}`, + itemIdemKeyStem: `threshold-overage-org-item:${customerId}:${stripeSubscriptionId}:${billingPeriod}:${totalOverageCents}:${amountCents}`, metadata: { type: 'overage_threshold_billing_org', organizationId, @@ -528,23 +425,15 @@ export async function checkAndBillOrganizationOverageThreshold( billingPeriod, totalOverageAtTimeOfBilling: currentOverage.toFixed(2), }, - idempotencyKey, }) - await tx - .update(userStats) - .set({ - billedOverageThisPeriod: sql`${userStats.billedOverageThisPeriod} + ${unbilledOverage}`, - }) - .where(eq(userStats.userId, owner.userId)) - - logger.info('Successfully created and finalized organization threshold overage invoice', { + logger.info('Queued organization threshold overage invoice for Stripe', { organizationId, ownerId: owner.userId, creditsApplied, amountBilled: amountToBill, totalProcessed: unbilledOverage, - invoiceId, + billingPeriod, }) }) } catch (error) { diff --git a/apps/sim/lib/billing/types/index.ts b/apps/sim/lib/billing/types/index.ts index ac8c9736e1f..34addf2983a 100644 --- a/apps/sim/lib/billing/types/index.ts +++ b/apps/sim/lib/billing/types/index.ts @@ -62,6 +62,15 @@ export interface UsageLimitInfo { minimumLimit: number plan: string updatedAt: Date | null + /** + * Whether the limit is stored on the user (`'user'`) or the organization + * (`'organization'`). Callers should route edits to the matching API + * context. Org-scoped includes any subscription whose `referenceId` is + * an organization id, regardless of plan name. + */ + scope: 'user' | 'organization' + /** Present only when `scope === 'organization'`. */ + organizationId: string | null } export interface BillingData { diff --git a/apps/sim/lib/billing/validation/seat-management.ts b/apps/sim/lib/billing/validation/seat-management.ts index 8712b427584..06472edabeb 100644 --- a/apps/sim/lib/billing/validation/seat-management.ts +++ b/apps/sim/lib/billing/validation/seat-management.ts @@ -3,7 +3,7 @@ import { invitation, member, organization, subscription, user, userStats } from import { createLogger } from '@sim/logger' import { and, count, eq } from 'drizzle-orm' import { getOrganizationSubscription } from '@/lib/billing/core/billing' -import { isEnterprise, isFree, isPro } from '@/lib/billing/plan-helpers' +import { isEnterprise, isFree } from '@/lib/billing/plan-helpers' import { getEffectiveSeats } from '@/lib/billing/subscriptions/utils' import { isBillingEnabled } from '@/lib/core/config/feature-flags' import { quickValidateEmail } from '@/lib/messaging/email/validation' @@ -62,11 +62,10 @@ export async function validateSeatAvailability( } } - // Free and Pro plans don't support organizations - if (isFree(subscription.plan) || isPro(subscription.plan)) { + if (isFree(subscription.plan)) { return { canInvite: false, - reason: 'Organization features require Team or Enterprise plan', + reason: 'Organization features require a paid plan', currentSeats: 0, maxSeats: 0, availableSeats: 0, @@ -81,9 +80,8 @@ export async function validateSeatAvailability( const currentSeats = memberCount[0]?.count || 0 - // Determine seat limits based on subscription - // Team: seats from Stripe subscription quantity (seats column) - // Enterprise: seats from metadata.seats (not from seats column which is always 1) + // Team: seats from the `seats` column (Stripe quantity). + // Enterprise: seats from metadata.seats (column is always 1). const maxSeats = getEffectiveSeats(subscription) const availableSeats = Math.max(0, maxSeats - currentSeats) @@ -156,7 +154,6 @@ export async function getOrganizationSeatInfo( const currentSeats = memberCount[0]?.count || 0 - // Team: seats from column, Enterprise: seats from metadata const maxSeats = getEffectiveSeats(subscription) const canAddSeats = !isEnterprise(subscription.plan) diff --git a/apps/sim/lib/billing/webhooks/idempotency.ts b/apps/sim/lib/billing/webhooks/idempotency.ts new file mode 100644 index 00000000000..e9613168af0 --- /dev/null +++ b/apps/sim/lib/billing/webhooks/idempotency.ts @@ -0,0 +1,39 @@ +import { IdempotencyService } from '@/lib/core/idempotency/service' + +/** + * Idempotency service for Stripe webhook handlers. + * + * Stripe delivers webhook events at-least-once and retries failed + * deliveries for up to 3 days. Handlers that perform non-idempotent work + * (crediting accounts, removing credits, resetting usage trackers, etc.) + * must be wrapped in a claim so duplicate deliveries are collapsed to a + * single execution. + * + * Storage is **forced to Postgres** regardless of whether Redis is + * configured. Billing handlers mutate `user_stats` / `organization` / + * `subscription` rows via DB transactions — keeping the idempotency + * record in the same Postgres closes the narrow window where the + * operation commits but a Redis `storeResult` fails, which would cause + * Stripe's next retry to re-run the money-affecting work. The latency + * cost (1–5 ms per claim/store) is invisible on webhook responses, and + * volume is low enough (roughly one event per customer per billing + * cycle) that DB storage scales comfortably. + * + * `retryFailures: true` means a thrown handler releases the claim so + * Stripe's next retry runs from scratch — without it, one transient + * failure would poison the key for the whole TTL window. + * + * TTL of 7 days is slightly longer than Stripe's 3-day retry horizon so + * late retries still dedupe against completed work. Rows past their TTL + * are handled two ways: `atomicallyClaimDb` reclaims stale rows inline + * via `ON CONFLICT DO UPDATE WHERE created_at < expired_before` (so + * correctness does not depend on cleanup running), and the external + * cleanup cron (scheduled from the infra repo) hits + * `/api/webhooks/cleanup/idempotency` to bound table size. + */ +export const stripeWebhookIdempotency = new IdempotencyService({ + namespace: 'stripe-webhook', + ttlSeconds: 60 * 60 * 24 * 7, + retryFailures: true, + forceStorage: 'database', +}) diff --git a/apps/sim/lib/billing/webhooks/invoices.test.ts b/apps/sim/lib/billing/webhooks/invoices.test.ts index 63b14c04f83..f0a004059b2 100644 --- a/apps/sim/lib/billing/webhooks/invoices.test.ts +++ b/apps/sim/lib/billing/webhooks/invoices.test.ts @@ -92,6 +92,7 @@ vi.mock('@/components/emails', () => ({ vi.mock('@/lib/billing/core/billing', () => ({ calculateSubscriptionOverage: vi.fn(), + isSubscriptionOrgScoped: vi.fn().mockResolvedValue(true), })) vi.mock('@/lib/billing/credits/balance', () => ({ @@ -119,6 +120,36 @@ vi.mock('@/lib/billing/stripe-client', () => ({ requireStripeClient: vi.fn(), })) +vi.mock('@/lib/billing/stripe-payment-method', () => ({ + resolveDefaultPaymentMethod: vi.fn(async () => ({ + paymentMethodId: undefined, + collectionMethod: 'charge_automatically', + })), + getPaymentMethodId: vi.fn(), + getCustomerId: vi.fn(), +})) + +vi.mock('@/lib/billing/subscriptions/utils', () => ({ + ENTITLED_SUBSCRIPTION_STATUSES: ['active', 'trialing', 'past_due'], +})) + +vi.mock('@/lib/billing/utils/decimal', () => ({ + toDecimal: vi.fn((v: string | number | null | undefined) => { + if (v === null || v === undefined || v === '') return { toNumber: () => 0 } + return { toNumber: () => Number(v) } + }), + toNumber: vi.fn((d: { toNumber: () => number }) => d.toNumber()), +})) + +vi.mock('@/lib/billing/webhooks/idempotency', () => ({ + stripeWebhookIdempotency: { + executeWithIdempotency: vi.fn( + async (_provider: string, _identifier: string, operation: () => Promise) => + operation() + ), + }, +})) + vi.mock('@/lib/core/utils/urls', () => ({ getBaseUrl: vi.fn(() => 'https://sim.test'), })) diff --git a/apps/sim/lib/billing/webhooks/invoices.ts b/apps/sim/lib/billing/webhooks/invoices.ts index 398e40804cc..bed1a7834e4 100644 --- a/apps/sim/lib/billing/webhooks/invoices.ts +++ b/apps/sim/lib/billing/webhooks/invoices.ts @@ -8,15 +8,19 @@ import { userStats, } from '@sim/db/schema' import { createLogger } from '@sim/logger' -import { and, eq, inArray, isNull, ne, or } from 'drizzle-orm' +import { and, eq, inArray, isNull, ne, or, sql } from 'drizzle-orm' import type Stripe from 'stripe' import { getEmailSubject, PaymentFailedEmail, renderCreditPurchaseEmail } from '@/components/emails' -import { calculateSubscriptionOverage } from '@/lib/billing/core/billing' -import { addCredits, getCreditBalance, removeCredits } from '@/lib/billing/credits/balance' +import { calculateSubscriptionOverage, isSubscriptionOrgScoped } from '@/lib/billing/core/billing' +import { addCredits, getCreditBalanceForEntity } from '@/lib/billing/credits/balance' import { setUsageLimitForCredits } from '@/lib/billing/credits/purchase' import { blockOrgMembers, unblockOrgMembers } from '@/lib/billing/organizations/membership' -import { isEnterprise, isOrgPlan, isTeam } from '@/lib/billing/plan-helpers' +import { isEnterprise } from '@/lib/billing/plan-helpers' import { requireStripeClient } from '@/lib/billing/stripe-client' +import { resolveDefaultPaymentMethod } from '@/lib/billing/stripe-payment-method' +import { ENTITLED_SUBSCRIPTION_STATUSES } from '@/lib/billing/subscriptions/utils' +import { toDecimal, toNumber } from '@/lib/billing/utils/decimal' +import { stripeWebhookIdempotency } from '@/lib/billing/webhooks/idempotency' import { getBaseUrl } from '@/lib/core/utils/urls' import { sendEmail } from '@/lib/messaging/email/mailer' import { getPersonalEmailFrom } from '@/lib/messaging/email/utils' @@ -30,11 +34,6 @@ const METADATA_SUBSCRIPTION_INVOICE_TYPES = new Set([ 'overage_threshold_billing_org', ]) -function parseDecimal(value: string | number | null | undefined): number { - if (value === null || value === undefined) return 0 - return Number.parseFloat(value.toString()) -} - type InvoiceSubscriptionResolutionSource = | 'parent.subscription_details.subscription' | 'metadata.subscriptionId' @@ -263,11 +262,11 @@ async function sendPaymentFailureEmails( const amountDue = invoice.amount_due / 100 // Convert cents to dollars const { lastFourDigits, failureReason } = await getPaymentMethodDetails(invoice) - // Get users to notify + // Notify based on subscription scope — org-scoped subs alert owners/admins. let usersToNotify: Array<{ email: string; name: string | null }> = [] + const orgScoped = await isSubscriptionOrgScoped(sub) - if (isOrgPlan(sub.plan)) { - // For team/enterprise, notify all owners and admins + if (orgScoped) { const members = await db .select({ userId: member.userId, @@ -276,7 +275,6 @@ async function sendPaymentFailureEmails( .from(member) .where(eq(member.organizationId, sub.referenceId)) - // Get owner/admin user details const ownerAdminIds = members .filter((m) => m.role === 'owner' || m.role === 'admin') .map((m) => m.userId) @@ -290,7 +288,6 @@ async function sendPaymentFailureEmails( usersToNotify = users.filter((u) => u.email && quickValidateEmail(u.email).isValid) } } else { - // For individual plans, notify the user const users = await db .select({ email: user.email, name: user.name }) .from(user) @@ -343,15 +340,17 @@ async function sendPaymentFailureEmails( } /** - * Get total billed overage for a subscription, handling team vs individual plans - * For team plans: sums billedOverageThisPeriod across all members - * For other plans: gets billedOverageThisPeriod for the user + * Get total billed overage for a subscription, handling org-scoped vs + * personally-scoped plans. + * - Org-scoped (team, enterprise, or `pro_*` attached to an org): + * stored on the org owner's `userStats.billedOverageThisPeriod`. + * - Personally-scoped: the user's own `billedOverageThisPeriod`. */ export async function getBilledOverageForSubscription(sub: { plan: string | null referenceId: string }): Promise { - if (isTeam(sub.plan)) { + if (await isSubscriptionOrgScoped(sub)) { const ownerRows = await db .select({ userId: member.userId }) .from(member) @@ -373,7 +372,7 @@ export async function getBilledOverageForSubscription(sub: { .where(eq(userStats.userId, ownerId)) .limit(1) - return ownerStats.length > 0 ? parseDecimal(ownerStats[0].billedOverageThisPeriod) : 0 + return ownerStats.length > 0 ? toNumber(toDecimal(ownerStats[0].billedOverageThisPeriod)) : 0 } const userStatsRecords = await db @@ -382,11 +381,13 @@ export async function getBilledOverageForSubscription(sub: { .where(eq(userStats.userId, sub.referenceId)) .limit(1) - return userStatsRecords.length > 0 ? parseDecimal(userStatsRecords[0].billedOverageThisPeriod) : 0 + return userStatsRecords.length > 0 + ? toNumber(toDecimal(userStatsRecords[0].billedOverageThisPeriod)) + : 0 } export async function resetUsageForSubscription(sub: { plan: string | null; referenceId: string }) { - if (isOrgPlan(sub.plan)) { + if (await isSubscriptionOrgScoped(sub)) { const membersRows = await db .select({ userId: member.userId }) .from(member) @@ -409,8 +410,8 @@ export async function resetUsageForSubscription(sub: { plan: string | null; refe .set({ lastPeriodCost: current, lastPeriodCopilotCost: currentCopilot, - currentPeriodCost: '0', - currentPeriodCopilotCost: '0', + currentPeriodCost: sql`GREATEST(0, ${userStats.currentPeriodCost} - ${current}::decimal)`, + currentPeriodCopilotCost: sql`GREATEST(0, ${userStats.currentPeriodCopilotCost} - ${currentCopilot}::decimal)`, billedOverageThisPeriod: '0', }) .where(eq(userStats.userId, m.userId)) @@ -432,23 +433,41 @@ export async function resetUsageForSubscription(sub: { plan: string | null; refe .where(eq(userStats.userId, sub.referenceId)) .limit(1) if (currentStats.length > 0) { - // For Pro plans, combine current + snapshot for lastPeriodCost, then clear both - const current = Number.parseFloat(currentStats[0].current?.toString() || '0') - const snapshot = Number.parseFloat(currentStats[0].snapshot?.toString() || '0') - const totalLastPeriod = (current + snapshot).toString() + const current = currentStats[0].current || '0' + const snapshot = toNumber(toDecimal(currentStats[0].snapshot)) const currentCopilot = currentStats[0].currentCopilot || '0' - await db - .update(userStats) - .set({ - lastPeriodCost: totalLastPeriod, - lastPeriodCopilotCost: currentCopilot, - currentPeriodCost: '0', - currentPeriodCopilotCost: '0', - proPeriodCostSnapshot: '0', // Clear snapshot at period end - billedOverageThisPeriod: '0', // Clear threshold billing tracker at period end - }) - .where(eq(userStats.userId, sub.referenceId)) + // Snapshot > 0: user joined a paid org mid-cycle. The pre-join + // portion was billed on this invoice (snapshot); `currentPeriodCost` + // is post-join usage the org will bill next cycle-close, so keep + // it. Only retire the personal-billing trackers here. + if (snapshot > 0) { + await db + .update(userStats) + .set({ + lastPeriodCost: snapshot.toString(), + lastPeriodCopilotCost: '0', + proPeriodCostSnapshot: '0', + proPeriodCostSnapshotAt: null, + billedOverageThisPeriod: '0', + }) + .where(eq(userStats.userId, sub.referenceId)) + } else { + const totalLastPeriod = toNumber(toDecimal(current).plus(snapshot)).toString() + // Delta-reset for the same reason as the org branch above. + await db + .update(userStats) + .set({ + lastPeriodCost: totalLastPeriod, + lastPeriodCopilotCost: currentCopilot, + currentPeriodCost: sql`GREATEST(0, ${userStats.currentPeriodCost} - ${current}::decimal)`, + currentPeriodCopilotCost: sql`GREATEST(0, ${userStats.currentPeriodCopilotCost} - ${currentCopilot}::decimal)`, + proPeriodCostSnapshot: '0', + proPeriodCostSnapshotAt: null, + billedOverageThisPeriod: '0', + }) + .where(eq(userStats.userId, sub.referenceId)) + } } } } @@ -472,90 +491,132 @@ async function handleCreditPurchaseSuccess(invoice: Stripe.Invoice): Promise 0) { - const sub = subscription[0] - const { balance: newCreditBalance } = await getCreditBalance(entityId) - await setUsageLimitForCredits(entityType, entityId, sub.plan, sub.seats, newCreditBalance) + if (!invoice.id) { + logger.error('Credit purchase invoice missing id, cannot dedupe', { + metadata: invoice.metadata, + }) + return } - logger.info('Credit purchase completed via webhook', { - invoiceId: invoice.id, - entityType, - entityId, - amount, - purchasedBy, - }) - - // Send confirmation emails - try { - const { balance: newBalance } = await getCreditBalance( - entityType === 'organization' ? entityId : purchasedBy || entityId - ) - let recipients: Array<{ email: string; name: string | null }> = [] + // Idempotent apply: duplicate Stripe deliveries collapse to a single + // execution. On exception the key is released (retryFailures: true) + // so the next Stripe retry runs from scratch. On success, subsequent + // deliveries short-circuit with the cached result. + // + // CRITICAL: everything after `addCredits` must be either idempotent or + // wrapped in try/catch that does not rethrow. Otherwise a failure + // after credits commit would release the key and the retry would + // double-credit. `setUsageLimitForCredits` and the email are both + // best-effort and wrapped; the subscription lookup before them is a + // read, safe to rerun. + await stripeWebhookIdempotency.executeWithIdempotency('credit-purchase', invoice.id, async () => { + await addCredits(entityType, entityId, amount) + + try { + const subscription = await db + .select() + .from(subscriptionTable) + .where( + and( + eq(subscriptionTable.referenceId, entityId), + inArray(subscriptionTable.status, ENTITLED_SUBSCRIPTION_STATUSES) + ) + ) + .limit(1) - if (entityType === 'organization') { - const members = await db - .select({ userId: member.userId, role: member.role }) - .from(member) - .where(eq(member.organizationId, entityId)) + if (subscription.length > 0) { + const sub = subscription[0] + const newCreditBalance = await getCreditBalanceForEntity(entityType, entityId) + await setUsageLimitForCredits(entityType, entityId, sub.plan, sub.seats, newCreditBalance) + } + } catch (limitError) { + // Limit bump is best-effort. Customer already got credits; if the + // cap doesn't auto-raise they can edit it themselves or another + // credit purchase will rebase it. Do NOT rethrow — that would + // release the idempotency claim and double-credit on retry. + logger.error('Failed to update usage limit after credit purchase', { + invoiceId: invoice.id, + entityType, + entityId, + error: limitError, + }) + } - const ownerAdminIds = members - .filter((m) => m.role === 'owner' || m.role === 'admin') - .map((m) => m.userId) + logger.info('Credit purchase completed via webhook', { + invoiceId: invoice.id, + entityType, + entityId, + amount, + purchasedBy, + }) - if (ownerAdminIds.length > 0) { - recipients = await db + try { + const newBalance = await getCreditBalanceForEntity(entityType, entityId) + let recipients: Array<{ email: string; name: string | null }> = [] + + if (entityType === 'organization') { + const members = await db + .select({ userId: member.userId, role: member.role }) + .from(member) + .where(eq(member.organizationId, entityId)) + + const ownerAdminIds = members + .filter((m) => m.role === 'owner' || m.role === 'admin') + .map((m) => m.userId) + + if (ownerAdminIds.length > 0) { + recipients = await db + .select({ email: user.email, name: user.name }) + .from(user) + .where(inArray(user.id, ownerAdminIds)) + } + } else if (purchasedBy) { + const users = await db .select({ email: user.email, name: user.name }) .from(user) - .where(inArray(user.id, ownerAdminIds)) - } - } else if (purchasedBy) { - const users = await db - .select({ email: user.email, name: user.name }) - .from(user) - .where(eq(user.id, purchasedBy)) - .limit(1) + .where(eq(user.id, purchasedBy)) + .limit(1) - recipients = users - } + recipients = users + } - for (const recipient of recipients) { - if (!recipient.email) continue + for (const recipient of recipients) { + if (!recipient.email) continue - const emailHtml = await renderCreditPurchaseEmail({ - userName: recipient.name || undefined, - amount, - newBalance, - }) + const emailHtml = await renderCreditPurchaseEmail({ + userName: recipient.name || undefined, + amount, + newBalance, + }) - await sendEmail({ - to: recipient.email, - subject: getEmailSubject('credit-purchase'), - html: emailHtml, - emailType: 'transactional', - }) + await sendEmail({ + to: recipient.email, + subject: getEmailSubject('credit-purchase'), + html: emailHtml, + emailType: 'transactional', + }) - logger.info('Sent credit purchase confirmation email', { - email: recipient.email, + logger.info('Sent credit purchase confirmation email', { + email: recipient.email, + invoiceId: invoice.id, + }) + } + } catch (emailError) { + // Emails are best-effort — a failure here should NOT release the + // claim (otherwise Stripe retries would re-credit the user). + logger.error('Failed to send credit purchase emails', { + emailError, invoiceId: invoice.id, }) } - } catch (emailError) { - logger.error('Failed to send credit purchase emails', { emailError, invoiceId: invoice.id }) - } + + return { ok: true } + }) } /** @@ -566,77 +627,80 @@ export async function handleInvoicePaymentSucceeded(event: Stripe.Event) { try { const invoice = event.data.object as Stripe.Invoice - // Handle credit purchase invoices if (invoice.metadata?.type === 'credit_purchase') { await handleCreditPurchaseSuccess(invoice) return } - const resolvedInvoice = await resolveInvoiceSubscription(invoice, 'invoice.payment_succeeded') - if (!resolvedInvoice) { - return - } - - const { sub } = resolvedInvoice + await stripeWebhookIdempotency.executeWithIdempotency( + 'invoice-payment-succeeded', + event.id, + async () => { + const resolvedInvoice = await resolveInvoiceSubscription( + invoice, + 'invoice.payment_succeeded' + ) + if (!resolvedInvoice) { + return + } - // Only reset usage here if the tenant was previously blocked; otherwise invoice.created already reset it - let wasBlocked = false - if (isOrgPlan(sub.plan)) { - const membersRows = await db - .select({ userId: member.userId }) - .from(member) - .where(eq(member.organizationId, sub.referenceId)) - const memberIds = membersRows.map((m) => m.userId) - if (memberIds.length > 0) { - const blockedRows = await db - .select({ blocked: userStats.billingBlocked }) - .from(userStats) - .where(inArray(userStats.userId, memberIds)) - - wasBlocked = blockedRows.some((row) => !!row.blocked) - } - } else { - const row = await db - .select({ blocked: userStats.billingBlocked }) - .from(userStats) - .where(eq(userStats.userId, sub.referenceId)) - .limit(1) - wasBlocked = row.length > 0 ? !!row[0].blocked : false - } + const { sub } = resolvedInvoice + const subIsOrgScoped = await isSubscriptionOrgScoped(sub) + + let wasBlocked = false + if (subIsOrgScoped) { + const membersRows = await db + .select({ userId: member.userId }) + .from(member) + .where(eq(member.organizationId, sub.referenceId)) + const memberIds = membersRows.map((m) => m.userId) + if (memberIds.length > 0) { + const blockedRows = await db + .select({ blocked: userStats.billingBlocked }) + .from(userStats) + .where(inArray(userStats.userId, memberIds)) + + wasBlocked = blockedRows.some((row) => !!row.blocked) + } + } else { + const row = await db + .select({ blocked: userStats.billingBlocked }) + .from(userStats) + .where(eq(userStats.userId, sub.referenceId)) + .limit(1) + wasBlocked = row.length > 0 ? !!row[0].blocked : false + } - // For proration invoices (mid-cycle upgrades/seat changes), only unblock if real money - // was collected. A $0 credit invoice from a downgrade should not unblock a user who - // was blocked for a different failed payment. - const isProrationInvoice = invoice.billing_reason === 'subscription_update' - const shouldUnblock = !isProrationInvoice || (invoice.amount_paid ?? 0) > 0 + const isProrationInvoice = invoice.billing_reason === 'subscription_update' + const shouldUnblock = !isProrationInvoice || (invoice.amount_paid ?? 0) > 0 + + if (shouldUnblock) { + if (subIsOrgScoped) { + await unblockOrgMembers(sub.referenceId, 'payment_failed') + } else { + await db + .update(userStats) + .set({ billingBlocked: false, billingBlockedReason: null }) + .where( + and( + eq(userStats.userId, sub.referenceId), + eq(userStats.billingBlockedReason, 'payment_failed') + ) + ) + } + } else { + logger.info('Skipping unblock for zero-amount proration invoice', { + invoiceId: invoice.id, + billingReason: invoice.billing_reason, + amountPaid: invoice.amount_paid, + }) + } - if (shouldUnblock) { - if (isOrgPlan(sub.plan)) { - await unblockOrgMembers(sub.referenceId, 'payment_failed') - } else { - await db - .update(userStats) - .set({ billingBlocked: false, billingBlockedReason: null }) - .where( - and( - eq(userStats.userId, sub.referenceId), - eq(userStats.billingBlockedReason, 'payment_failed') - ) - ) + if (wasBlocked && !isProrationInvoice) { + await resetUsageForSubscription({ plan: sub.plan, referenceId: sub.referenceId }) + } } - } else { - logger.info('Skipping unblock for zero-amount proration invoice', { - invoiceId: invoice.id, - billingReason: invoice.billing_reason, - amountPaid: invoice.amount_paid, - }) - } - - // Only reset usage for cycle renewals — proration invoices should not wipe - // accumulated usage mid-cycle. - if (wasBlocked && !isProrationInvoice) { - await resetUsageForSubscription({ plan: sub.plan, referenceId: sub.referenceId }) - } + ) } catch (error) { logger.error('Failed to handle invoice payment succeeded', { eventId: event.id, error }) throw error @@ -651,96 +715,100 @@ export async function handleInvoicePaymentFailed(event: Stripe.Event) { try { const invoice = event.data.object as Stripe.Invoice - const resolvedInvoice = await resolveInvoiceSubscription(invoice, 'invoice.payment_failed') - if (!resolvedInvoice) { - return - } - - const { invoiceType, resolutionSource, stripeSubscriptionId, sub } = resolvedInvoice - - // Extract and validate customer ID - const customerId = invoice.customer - if (!customerId || typeof customerId !== 'string') { - logger.error('Invalid customer ID on invoice', { - invoiceId: invoice.id, - customer: invoice.customer, - }) - return - } + await stripeWebhookIdempotency.executeWithIdempotency( + 'invoice-payment-failed', + event.id, + async () => { + const resolvedInvoice = await resolveInvoiceSubscription(invoice, 'invoice.payment_failed') + if (!resolvedInvoice) { + return + } - const failedAmount = invoice.amount_due / 100 // Convert from cents to dollars - const billingPeriod = invoice.metadata?.billingPeriod || 'unknown' - const attemptCount = invoice.attempt_count ?? 1 + const { invoiceType, resolutionSource, stripeSubscriptionId, sub } = resolvedInvoice - logger.warn('Invoice payment failed', { - invoiceId: invoice.id, - customerId, - failedAmount, - billingPeriod, - attemptCount, - customerEmail: invoice.customer_email, - hostedInvoiceUrl: invoice.hosted_invoice_url, - invoiceType: invoiceType ?? 'subscription', - resolutionSource, - }) + const customerId = invoice.customer + if (!customerId || typeof customerId !== 'string') { + logger.error('Invalid customer ID on invoice', { + invoiceId: invoice.id, + customer: invoice.customer, + }) + return + } - // Block users after first payment failure - if (attemptCount >= 1) { - logger.error('Payment failure - blocking users', { - customerId, - attemptCount, - invoiceId: invoice.id, - invoiceType: invoiceType ?? 'subscription', - resolutionSource, - stripeSubscriptionId, - }) + const failedAmount = invoice.amount_due / 100 + const billingPeriod = invoice.metadata?.billingPeriod || 'unknown' + const attemptCount = invoice.attempt_count ?? 1 - if (isOrgPlan(sub.plan)) { - const memberCount = await blockOrgMembers(sub.referenceId, 'payment_failed') - logger.info('Blocked team/enterprise members due to payment failure', { + logger.warn('Invoice payment failed', { + invoiceId: invoice.id, + customerId, + failedAmount, + billingPeriod, + attemptCount, + customerEmail: invoice.customer_email, + hostedInvoiceUrl: invoice.hosted_invoice_url, invoiceType: invoiceType ?? 'subscription', - memberCount, - organizationId: sub.referenceId, + resolutionSource, }) - } else { - await db - .update(userStats) - .set({ billingBlocked: true, billingBlockedReason: 'payment_failed' }) - .where( - and( - eq(userStats.userId, sub.referenceId), - or( - ne(userStats.billingBlockedReason, 'dispute'), - isNull(userStats.billingBlockedReason) + + if (attemptCount >= 1) { + logger.error('Payment failure - blocking users', { + customerId, + attemptCount, + invoiceId: invoice.id, + invoiceType: invoiceType ?? 'subscription', + resolutionSource, + stripeSubscriptionId, + }) + + if (await isSubscriptionOrgScoped(sub)) { + const memberCount = await blockOrgMembers(sub.referenceId, 'payment_failed') + logger.info('Blocked org members due to payment failure', { + invoiceType: invoiceType ?? 'subscription', + memberCount, + organizationId: sub.referenceId, + }) + } else { + await db + .update(userStats) + .set({ billingBlocked: true, billingBlockedReason: 'payment_failed' }) + .where( + and( + eq(userStats.userId, sub.referenceId), + or( + ne(userStats.billingBlockedReason, 'dispute'), + isNull(userStats.billingBlockedReason) + ) + ) ) - ) - ) - logger.info('Blocked user due to payment failure', { - invoiceType: invoiceType ?? 'subscription', - userId: sub.referenceId, - }) - } + logger.info('Blocked user due to payment failure', { + invoiceType: invoiceType ?? 'subscription', + userId: sub.referenceId, + }) + } - if (attemptCount === 1) { - await sendPaymentFailureEmails(sub, invoice, customerId) - logger.info('Payment failure email sent on first attempt', { - customerId, - invoiceId: invoice.id, - }) - } else { - logger.info('Skipping payment failure email on retry attempt', { - attemptCount, - customerId, - invoiceId: invoice.id, - }) + if (attemptCount === 1) { + await sendPaymentFailureEmails(sub, invoice, customerId) + logger.info('Payment failure email sent on first attempt', { + customerId, + invoiceId: invoice.id, + }) + } else { + logger.info('Skipping payment failure email on retry attempt', { + attemptCount, + customerId, + invoiceId: invoice.id, + }) + } + } } - } + ) } catch (error) { logger.error('Failed to handle invoice payment failed', { eventId: event.id, error, }) - throw error // Re-throw to signal webhook failure + throw error } } @@ -751,7 +819,6 @@ export async function handleInvoicePaymentFailed(event: Stripe.Event) { export async function handleInvoiceFinalized(event: Stripe.Event) { try { const invoice = event.data.object as Stripe.Invoice - // Only run for subscription renewal invoices (cycle boundary) const subscription = invoice.parent?.subscription_details?.subscription const stripeSubscriptionId = typeof subscription === 'string' ? subscription : subscription?.id if (!stripeSubscriptionId) { @@ -771,151 +838,222 @@ export async function handleInvoiceFinalized(event: Stripe.Event) { if (records.length === 0) return const sub = records[0] - // Enterprise plans have no overages - reset usage and exit if (isEnterprise(sub.plan)) { await resetUsageForSubscription({ plan: sub.plan, referenceId: sub.referenceId }) return } - const stripe = requireStripeClient() - const periodEnd = - invoice.lines?.data?.[0]?.period?.end || invoice.period_end || Math.floor(Date.now() / 1000) - const billingPeriod = new Date(periodEnd * 1000).toISOString().slice(0, 7) + await stripeWebhookIdempotency.executeWithIdempotency( + 'invoice-finalized', + event.id, + async () => { + const stripe = requireStripeClient() + const periodEnd = + invoice.lines?.data?.[0]?.period?.end || + invoice.period_end || + Math.floor(Date.now() / 1000) + const billingPeriod = new Date(periodEnd * 1000).toISOString().slice(0, 7) + + const totalOverage = await calculateSubscriptionOverage(sub) + + const entityType = (await isSubscriptionOrgScoped(sub)) ? 'organization' : 'user' + const entityId = sub.referenceId + + // Resolve the userStats row that holds the `billedOverageThisPeriod` + // tracker. Org subs: the owner's row. Personal: the user's own row. + // Throw if an org has no owner — returning early would cache a + // "successful" no-op, and the next cycle's tracker would still + // reflect this cycle's billed amount, breaking future overage math. + let trackerUserId: string + if (entityType === 'organization') { + const ownerRows = await db + .select({ userId: member.userId }) + .from(member) + .where(and(eq(member.organizationId, entityId), eq(member.role, 'owner'))) + .limit(1) + const ownerId = ownerRows[0]?.userId + if (!ownerId) { + throw new Error( + `Organization ${entityId} has no owner member; cannot process invoice finalization` + ) + } + trackerUserId = ownerId + } else { + trackerUserId = entityId + } - // Compute overage (only for team and pro plans), before resetting usage - const totalOverage = await calculateSubscriptionOverage(sub) + // Phase 1 — atomic commit. Lock the tracker row first so we read + // `billedOverageThisPeriod` serialized against concurrent events; + // then read the credit balance, decrement it, and bump the + // tracker to `totalOverage`. On retry, the locked re-read sees + // `billed == totalOverage` → `remaining == 0` → credit removal + // skipped. That's the invariant preventing double-deduction. + const phase1 = await db.transaction(async (tx) => { + const trackerRows = await tx + .select({ billed: userStats.billedOverageThisPeriod }) + .from(userStats) + .where(eq(userStats.userId, trackerUserId)) + .for('update') + .limit(1) + + const billedInTx = trackerRows.length > 0 ? toNumber(toDecimal(trackerRows[0].billed)) : 0 + const remaining = Math.max(0, totalOverage - billedInTx) + + if (remaining === 0) { + return { billedInTx, applied: 0, billed: 0, remaining: 0 } + } - // Get already-billed overage from threshold billing - const billedOverage = await getBilledOverageForSubscription(sub) + const lockedBalance = + entityType === 'organization' + ? await tx + .select({ creditBalance: organization.creditBalance }) + .from(organization) + .where(eq(organization.id, entityId)) + .for('update') + .limit(1) + : await tx + .select({ creditBalance: userStats.creditBalance }) + .from(userStats) + .where(eq(userStats.userId, entityId)) + .for('update') + .limit(1) + + const creditBalance = + lockedBalance.length > 0 ? toNumber(toDecimal(lockedBalance[0].creditBalance)) : 0 + + const applied = Math.min(creditBalance, remaining) + const billed = remaining - applied + + if (applied > 0) { + if (entityType === 'organization') { + await tx + .update(organization) + .set({ + creditBalance: sql`GREATEST(0, ${organization.creditBalance} - ${applied})`, + }) + .where(eq(organization.id, entityId)) + } else { + await tx + .update(userStats) + .set({ + creditBalance: sql`GREATEST(0, ${userStats.creditBalance} - ${applied})`, + }) + .where(eq(userStats.userId, entityId)) + } + } - // Only bill the remaining unbilled overage - let remainingOverage = Math.max(0, totalOverage - billedOverage) + await tx + .update(userStats) + .set({ billedOverageThisPeriod: totalOverage.toString() }) + .where(eq(userStats.userId, trackerUserId)) - // Apply credits to reduce overage at end of cycle - let creditsApplied = 0 - if (remainingOverage > 0) { - const entityType = isOrgPlan(sub.plan) ? 'organization' : 'user' - const entityId = sub.referenceId - const { balance: creditBalance } = await getCreditBalance(entityId) + return { billedInTx, applied, billed, remaining } + }) - if (creditBalance > 0) { - creditsApplied = Math.min(creditBalance, remainingOverage) - await removeCredits(entityType, entityId, creditsApplied) - remainingOverage = remainingOverage - creditsApplied + const creditsApplied = phase1.applied + const amountToBillStripe = phase1.billed - logger.info('Applied credits to reduce overage at cycle end', { + logger.info('Invoice finalized overage calculation', { subscriptionId: sub.id, - creditBalance, + totalOverage, + billedOverageBeforeTx: phase1.billedInTx, creditsApplied, - remainingOverageAfterCredits: remainingOverage, + amountToBillStripe, + billingPeriod, }) - } - } - - logger.info('Invoice finalized overage calculation', { - subscriptionId: sub.id, - totalOverage, - billedOverage, - creditsApplied, - remainingOverage, - billingPeriod, - }) - - if (remainingOverage > 0) { - const customerId = String(invoice.customer) - const cents = Math.round(remainingOverage * 100) - const itemIdemKey = `overage-item:${customerId}:${stripeSubscriptionId}:${billingPeriod}` - const invoiceIdemKey = `overage-invoice:${customerId}:${stripeSubscriptionId}:${billingPeriod}` - // Inherit billing settings from the Stripe subscription/customer for autopay - const getPaymentMethodId = ( - pm: string | Stripe.PaymentMethod | null | undefined - ): string | undefined => (typeof pm === 'string' ? pm : pm?.id) + // Phase 2 — Stripe invoice. Runs outside any DB transaction. + // Every call uses a deterministic idempotency key so retries + // converge on the same invoice object: re-create returns the + // existing draft, re-finalize no-ops on an already-finalized + // invoice, re-pay no-ops on an already-paid invoice. + if (amountToBillStripe > 0) { + const customerId = String(invoice.customer) + const cents = Math.round(amountToBillStripe * 100) + const itemIdemKey = `overage-item:${customerId}:${stripeSubscriptionId}:${billingPeriod}` + const invoiceIdemKey = `overage-invoice:${customerId}:${stripeSubscriptionId}:${billingPeriod}` + const finalizeIdemKey = `overage-finalize:${customerId}:${stripeSubscriptionId}:${billingPeriod}` + const payIdemKey = `overage-pay:${customerId}:${stripeSubscriptionId}:${billingPeriod}` + + const { paymentMethodId: defaultPaymentMethod, collectionMethod } = + await resolveDefaultPaymentMethod(stripe, stripeSubscriptionId, customerId) + + const effectiveCollectionMethod = collectionMethod ?? 'charge_automatically' + + const overageInvoice = await stripe.invoices.create( + { + customer: customerId, + collection_method: effectiveCollectionMethod, + auto_advance: false, + ...(defaultPaymentMethod ? { default_payment_method: defaultPaymentMethod } : {}), + metadata: { + type: 'overage_billing', + billingPeriod, + subscriptionId: stripeSubscriptionId, + }, + }, + { idempotencyKey: invoiceIdemKey } + ) - let collectionMethod: 'charge_automatically' | 'send_invoice' = 'charge_automatically' - let defaultPaymentMethod: string | undefined - try { - const stripeSub = await stripe.subscriptions.retrieve(stripeSubscriptionId) - if (stripeSub.collection_method === 'send_invoice') { - collectionMethod = 'send_invoice' - } - const subDpm = getPaymentMethodId(stripeSub.default_payment_method) - if (subDpm) { - defaultPaymentMethod = subDpm - } else if (collectionMethod === 'charge_automatically') { - const custObj = await stripe.customers.retrieve(customerId) - if (custObj && !('deleted' in custObj)) { - const cust = custObj as Stripe.Customer - const custDpm = getPaymentMethodId(cust.invoice_settings?.default_payment_method) - if (custDpm) defaultPaymentMethod = custDpm - } - } - } catch (e) { - logger.error('Failed to retrieve subscription or customer', { error: e }) - } + await stripe.invoiceItems.create( + { + customer: customerId, + invoice: overageInvoice.id, + amount: cents, + currency: 'usd', + description: `Usage Based Overage – ${billingPeriod}`, + metadata: { + type: 'overage_billing', + billingPeriod, + subscriptionId: stripeSubscriptionId, + }, + }, + { idempotencyKey: itemIdemKey } + ) - // Create a draft invoice first so we can attach the item directly - const overageInvoice = await stripe.invoices.create( - { - customer: customerId, - collection_method: collectionMethod, - auto_advance: false, - ...(defaultPaymentMethod ? { default_payment_method: defaultPaymentMethod } : {}), - metadata: { - type: 'overage_billing', - billingPeriod, - subscriptionId: stripeSubscriptionId, - }, - }, - { idempotencyKey: invoiceIdemKey } - ) - - // Attach the item to this invoice - await stripe.invoiceItems.create( - { - customer: customerId, - invoice: overageInvoice.id, - amount: cents, - currency: 'usd', - description: `Usage Based Overage – ${billingPeriod}`, - metadata: { - type: 'overage_billing', - billingPeriod, - subscriptionId: stripeSubscriptionId, - }, - }, - { idempotencyKey: itemIdemKey } - ) - - // Finalize to trigger autopay (if charge_automatically and a PM is present) - const draftId = overageInvoice.id - if (typeof draftId !== 'string' || draftId.length === 0) { - logger.error('Stripe created overage invoice without id; aborting finalize') - } else { - const finalized = await stripe.invoices.finalizeInvoice(draftId) - // Some manual invoices may remain open after finalize; ensure we pay immediately when possible - if (collectionMethod === 'charge_automatically' && finalized.status === 'open') { - try { - const payId = finalized.id - if (typeof payId !== 'string' || payId.length === 0) { - logger.error('Finalized invoice missing id') - throw new Error('Finalized invoice missing id') + const draftId = overageInvoice.id + if (typeof draftId !== 'string' || draftId.length === 0) { + logger.error('Stripe created overage invoice without id; aborting finalize') + } else { + const finalized = await stripe.invoices.finalizeInvoice( + draftId, + {}, + { idempotencyKey: finalizeIdemKey } + ) + if ( + effectiveCollectionMethod === 'charge_automatically' && + finalized.status === 'open' + ) { + try { + const payId = finalized.id + if (typeof payId !== 'string' || payId.length === 0) { + logger.error('Finalized invoice missing id') + throw new Error('Finalized invoice missing id') + } + await stripe.invoices.pay( + payId, + { payment_method: defaultPaymentMethod }, + { idempotencyKey: payIdemKey } + ) + } catch (payError) { + logger.error('Failed to auto-pay overage invoice', { + error: payError, + invoiceId: finalized.id, + }) + } } - await stripe.invoices.pay(payId, { - payment_method: defaultPaymentMethod, - }) - } catch (payError) { - logger.error('Failed to auto-pay overage invoice', { - error: payError, - invoiceId: finalized.id, - }) } } - } - } - // Finally, reset usage for this subscription after overage handling - await resetUsageForSubscription({ plan: sub.plan, referenceId: sub.referenceId }) + // Phase 3 — reset usage for the new period. Clears trackers and + // rolls `currentPeriodCost` forward by delta. Idempotent on its + // own (delta subtraction of a value that's already been + // subtracted is a no-op). + await resetUsageForSubscription({ plan: sub.plan, referenceId: sub.referenceId }) + + return { totalOverage, creditsApplied, amountToBillStripe } + } + ) } catch (error) { logger.error('Failed to handle invoice finalized', { error }) throw error diff --git a/apps/sim/lib/billing/webhooks/outbox-handlers.ts b/apps/sim/lib/billing/webhooks/outbox-handlers.ts new file mode 100644 index 00000000000..64eb64a1973 --- /dev/null +++ b/apps/sim/lib/billing/webhooks/outbox-handlers.ts @@ -0,0 +1,174 @@ +import { db } from '@sim/db' +import { subscription as subscriptionTable } from '@sim/db/schema' +import { createLogger } from '@sim/logger' +import { eq } from 'drizzle-orm' +import { requireStripeClient } from '@/lib/billing/stripe-client' +import { resolveDefaultPaymentMethod } from '@/lib/billing/stripe-payment-method' +import type { OutboxHandler } from '@/lib/core/outbox/service' + +const logger = createLogger('BillingOutboxHandlers') + +export const OUTBOX_EVENT_TYPES = { + /** + * Sync a subscription's `cancel_at_period_end` flag from our DB to + * Stripe. The handler reads the current DB value at processing time + * — so rapid cancel→uncancel→cancel sequences always converge on + * the last-committed DB state regardless of outbox ordering. Callers + * enqueue this event after every DB change to `cancelAtPeriodEnd`. + */ + STRIPE_SYNC_CANCEL_AT_PERIOD_END: 'stripe.sync-cancel-at-period-end', + STRIPE_THRESHOLD_OVERAGE_INVOICE: 'stripe.threshold-overage-invoice', +} as const + +export interface StripeSyncCancelAtPeriodEndPayload { + stripeSubscriptionId: string + /** The DB subscription row id — also our source-of-truth pointer. */ + subscriptionId: string + /** Optional: reason this was enqueued — e.g. 'member-joined-paid-org'. */ + reason?: string +} + +export interface StripeThresholdOverageInvoicePayload { + customerId: string + stripeSubscriptionId: string + amountCents: number + description: string + itemDescription: string + billingPeriod: string + /** Stripe idempotency key stem — we append the outbox event id for per-retry safety. */ + invoiceIdemKeyStem: string + itemIdemKeyStem: string + metadata?: Record +} + +const stripeSyncCancelAtPeriodEnd: OutboxHandler = async ( + payload, + ctx +) => { + // Read the DB value at processing time (not at enqueue time). This + // makes the handler idempotent across racing enqueues: multiple + // events for the same subscription all push whatever the DB + // currently says, converging on the last committed value. + const rows = await db + .select({ cancelAtPeriodEnd: subscriptionTable.cancelAtPeriodEnd }) + .from(subscriptionTable) + .where(eq(subscriptionTable.id, payload.subscriptionId)) + .limit(1) + + if (rows.length === 0) { + logger.warn('Subscription not found when syncing cancel_at_period_end', { + subscriptionId: payload.subscriptionId, + }) + return + } + + const desiredValue = Boolean(rows[0].cancelAtPeriodEnd) + const stripe = requireStripeClient() + await stripe.subscriptions.update( + payload.stripeSubscriptionId, + { cancel_at_period_end: desiredValue }, + { idempotencyKey: `outbox:${ctx.eventId}` } + ) + logger.info('Synced cancel_at_period_end from DB to Stripe', { + eventId: ctx.eventId, + stripeSubscriptionId: payload.stripeSubscriptionId, + subscriptionId: payload.subscriptionId, + desiredValue, + reason: payload.reason, + }) +} + +const stripeThresholdOverageInvoice: OutboxHandler = async ( + payload, + ctx +) => { + const stripe = requireStripeClient() + + // Resolve default PM from (subscription → customer) so Stripe can + // auto-collect when the invoice finalizes. Without this, an ad-hoc + // invoice (no subscription link) falls back to customer-level PM + // only, which may not be set for customers onboarded via Checkout + // Subscription flows. + const { paymentMethodId: defaultPaymentMethod } = await resolveDefaultPaymentMethod( + stripe, + payload.stripeSubscriptionId, + payload.customerId + ) + + // Compose Stripe idempotency keys from caller-provided stem + outbox + // event id so retries of the SAME outbox event collapse on Stripe's + // side. + const invoiceIdemKey = `${payload.invoiceIdemKeyStem}:${ctx.eventId}` + const itemIdemKey = `${payload.itemIdemKeyStem}:${ctx.eventId}` + const finalizeIdemKey = `${payload.invoiceIdemKeyStem}:finalize:${ctx.eventId}` + const payIdemKey = `${payload.invoiceIdemKeyStem}:pay:${ctx.eventId}` + + // `auto_advance: false` + explicit finalize mirrors pre-refactor + // behavior: we control exactly when the invoice finalizes, so it + // doesn't silently convert to paid/open on Stripe's schedule while + // our retry state is still in flight. + const invoice = await stripe.invoices.create( + { + customer: payload.customerId, + collection_method: 'charge_automatically', + auto_advance: false, + description: payload.description, + metadata: payload.metadata, + ...(defaultPaymentMethod ? { default_payment_method: defaultPaymentMethod } : {}), + }, + { idempotencyKey: invoiceIdemKey } + ) + + if (!invoice.id) { + throw new Error('Stripe returned invoice without id') + } + + await stripe.invoiceItems.create( + { + customer: payload.customerId, + invoice: invoice.id, + amount: payload.amountCents, + currency: 'usd', + description: payload.itemDescription, + metadata: payload.metadata, + }, + { idempotencyKey: itemIdemKey } + ) + + const finalized = await stripe.invoices.finalizeInvoice( + invoice.id, + {}, + { idempotencyKey: finalizeIdemKey } + ) + + if (finalized.status === 'open' && finalized.id && defaultPaymentMethod) { + try { + await stripe.invoices.pay( + finalized.id, + { payment_method: defaultPaymentMethod }, + { idempotencyKey: payIdemKey } + ) + } catch (payError) { + logger.warn('Auto-pay failed for threshold overage invoice — Stripe dunning will retry', { + invoiceId: finalized.id, + error: payError instanceof Error ? payError.message : payError, + }) + } + } + + logger.info('Created threshold overage invoice via outbox', { + eventId: ctx.eventId, + invoiceId: invoice.id, + customerId: payload.customerId, + amountCents: payload.amountCents, + billingPeriod: payload.billingPeriod, + defaultPaymentMethod: defaultPaymentMethod ? 'resolved' : 'none', + }) +} + +export const billingOutboxHandlers = { + [OUTBOX_EVENT_TYPES.STRIPE_SYNC_CANCEL_AT_PERIOD_END]: + stripeSyncCancelAtPeriodEnd as OutboxHandler, + [OUTBOX_EVENT_TYPES.STRIPE_THRESHOLD_OVERAGE_INVOICE]: + stripeThresholdOverageInvoice as OutboxHandler, +} as const diff --git a/apps/sim/lib/billing/webhooks/subscription.ts b/apps/sim/lib/billing/webhooks/subscription.ts index 8c261a6f458..323f2347847 100644 --- a/apps/sim/lib/billing/webhooks/subscription.ts +++ b/apps/sim/lib/billing/webhooks/subscription.ts @@ -2,13 +2,14 @@ import { db } from '@sim/db' import { member, organization, subscription } from '@sim/db/schema' import { createLogger } from '@sim/logger' import { and, eq, inArray, ne } from 'drizzle-orm' -import { calculateSubscriptionOverage } from '@/lib/billing/core/billing' +import { calculateSubscriptionOverage, isSubscriptionOrgScoped } from '@/lib/billing/core/billing' import { hasPaidSubscription } from '@/lib/billing/core/subscription' import { syncUsageLimitsFromSubscription } from '@/lib/billing/core/usage' import { restoreUserProSubscription } from '@/lib/billing/organizations/membership' -import { isEnterprise, isPaid, isPro, isTeam } from '@/lib/billing/plan-helpers' +import { isEnterprise, isPaid, isPro } from '@/lib/billing/plan-helpers' import { requireStripeClient } from '@/lib/billing/stripe-client' import { ENTITLED_SUBSCRIPTION_STATUSES } from '@/lib/billing/subscriptions/utils' +import { stripeWebhookIdempotency } from '@/lib/billing/webhooks/idempotency' import { getBilledOverageForSubscription, resetUsageForSubscription, @@ -175,194 +176,206 @@ export async function handleSubscriptionCreated(subscriptionData: { } /** - * Handle subscription deletion/cancellation - bill for final period overages - * This fires when a subscription reaches its cancel_at_period_end date or is cancelled immediately + * Handle subscription deletion/cancellation — bill for final period + * overages, reset usage, restore member Pros, and clean up the org. + * + * Wrapped in `stripeWebhookIdempotency` keyed by Stripe `event.id` so + * that duplicate webhook deliveries collapse to a single execution. The + * three failure-prone side effects each have their own recovery story: + * - Final Stripe invoice: created with a deterministic idempotency key, + * so re-create returns the existing invoice on retry + * - `resetUsageForSubscription`: delta-based reset, near-idempotent + * - `cleanupOrganizationSubscription`: delete is idempotent (ON NOT + * EXISTS); Pro restore flips `cancelAtPeriodEnd=false`, idempotent + * If any step throws, `retryFailures: true` releases the claim so + * Stripe's next retry runs from scratch and recovers. */ -export async function handleSubscriptionDeleted(subscription: { - id: string - plan: string | null - referenceId: string - stripeSubscriptionId: string | null - seats?: number | null -}) { - try { - const stripeSubscriptionId = subscription.stripeSubscriptionId || '' - - logger.info('Processing subscription deletion', { - stripeSubscriptionId, - subscriptionId: subscription.id, - }) - - // Calculate overage for the final billing period - const totalOverage = await calculateSubscriptionOverage(subscription) - const stripe = requireStripeClient() - - // Enterprise plans have no overages - reset usage and cleanup org - if (isEnterprise(subscription.plan)) { - await resetUsageForSubscription({ - plan: subscription.plan, - referenceId: subscription.referenceId, - }) - - const { restoredProCount, membersSynced, organizationDeleted } = - await cleanupOrganizationSubscription(subscription.referenceId) - - logger.info('Successfully processed enterprise subscription cancellation', { - subscriptionId: subscription.id, - stripeSubscriptionId, - restoredProCount, - organizationDeleted, - membersSynced, - }) - - captureServerEvent(subscription.referenceId, 'subscription_cancelled', { - plan: subscription.plan ?? 'unknown', - reference_id: subscription.referenceId, - }) - - return - } +export async function handleSubscriptionDeleted( + subscription: { + id: string + plan: string | null + referenceId: string + stripeSubscriptionId: string | null + seats?: number | null + }, + stripeEventId?: string +) { + const stripeSubscriptionId = subscription.stripeSubscriptionId || '' + + logger.info('Processing subscription deletion', { + stripeEventId, + stripeSubscriptionId, + subscriptionId: subscription.id, + }) + + // Fall back to the subscription DB id when we don't have an event id + // (e.g. called outside the Stripe webhook context). Still dedupes a + // single subscription's deletion, just not event-granular. + const idempotencyIdentifier = stripeEventId ?? `sub:${subscription.id}` - // Get already-billed overage from threshold billing - const billedOverage = await getBilledOverageForSubscription(subscription) + try { + await stripeWebhookIdempotency.executeWithIdempotency( + 'subscription-deleted', + idempotencyIdentifier, + async () => { + const totalOverage = await calculateSubscriptionOverage(subscription) + const stripe = requireStripeClient() + + // Enterprise plans have no overages — reset usage and cleanup org + if (isEnterprise(subscription.plan)) { + await resetUsageForSubscription({ + plan: subscription.plan, + referenceId: subscription.referenceId, + }) + + const { restoredProCount, membersSynced, organizationDeleted } = + await cleanupOrganizationSubscription(subscription.referenceId) + + logger.info('Successfully processed enterprise subscription cancellation', { + subscriptionId: subscription.id, + stripeSubscriptionId, + restoredProCount, + organizationDeleted, + membersSynced, + }) + + captureServerEvent(subscription.referenceId, 'subscription_cancelled', { + plan: subscription.plan ?? 'unknown', + reference_id: subscription.referenceId, + }) + + return { totalOverage: 0, kind: 'enterprise' as const } + } - // Only bill the remaining unbilled overage - const remainingOverage = Math.max(0, totalOverage - billedOverage) + const billedOverage = await getBilledOverageForSubscription(subscription) + const remainingOverage = Math.max(0, totalOverage - billedOverage) - logger.info('Subscription deleted overage calculation', { - subscriptionId: subscription.id, - totalOverage, - billedOverage, - remainingOverage, - }) + logger.info('Subscription deleted overage calculation', { + subscriptionId: subscription.id, + totalOverage, + billedOverage, + remainingOverage, + }) - // Create final overage invoice if needed - if (remainingOverage > 0 && stripeSubscriptionId) { - const stripeSubscription = await stripe.subscriptions.retrieve(stripeSubscriptionId) - const customerId = stripeSubscription.customer as string - const cents = Math.round(remainingOverage * 100) - - // Use the subscription end date for the billing period - const endedAt = stripeSubscription.ended_at || Math.floor(Date.now() / 1000) - const billingPeriod = new Date(endedAt * 1000).toISOString().slice(0, 7) - - const itemIdemKey = `final-overage-item:${customerId}:${stripeSubscriptionId}:${billingPeriod}` - const invoiceIdemKey = `final-overage-invoice:${customerId}:${stripeSubscriptionId}:${billingPeriod}` - - try { - // Create a one-time invoice for the final overage - const overageInvoice = await stripe.invoices.create( - { - customer: customerId, - collection_method: 'charge_automatically', - auto_advance: true, // Auto-finalize and attempt payment - description: `Final overage charges for ${subscription.plan} subscription (${billingPeriod})`, - metadata: { - type: 'final_overage_billing', - billingPeriod, - subscriptionId: stripeSubscriptionId, - cancelledAt: stripeSubscription.canceled_at?.toString() || '', + // Phase — Stripe final overage invoice. Idempotency keys ensure + // retry-safe creation; errors propagate up to the wrapper so the + // webhook gets retried rather than swallowed. + if (remainingOverage > 0 && stripeSubscriptionId) { + const stripeSubscription = await stripe.subscriptions.retrieve(stripeSubscriptionId) + const customerId = stripeSubscription.customer as string + const cents = Math.round(remainingOverage * 100) + const endedAt = stripeSubscription.ended_at || Math.floor(Date.now() / 1000) + const billingPeriod = new Date(endedAt * 1000).toISOString().slice(0, 7) + + const itemIdemKey = `final-overage-item:${customerId}:${stripeSubscriptionId}:${billingPeriod}` + const invoiceIdemKey = `final-overage-invoice:${customerId}:${stripeSubscriptionId}:${billingPeriod}` + const finalizeIdemKey = `final-overage-finalize:${customerId}:${stripeSubscriptionId}:${billingPeriod}` + + const overageInvoice = await stripe.invoices.create( + { + customer: customerId, + collection_method: 'charge_automatically', + auto_advance: true, + description: `Final overage charges for ${subscription.plan} subscription (${billingPeriod})`, + metadata: { + type: 'final_overage_billing', + billingPeriod, + subscriptionId: stripeSubscriptionId, + cancelledAt: stripeSubscription.canceled_at?.toString() || '', + }, }, - }, - { idempotencyKey: invoiceIdemKey } - ) - - // Add the overage line item - await stripe.invoiceItems.create( - { - customer: customerId, - invoice: overageInvoice.id, - amount: cents, - currency: 'usd', - description: `Usage overage for ${subscription.plan} plan (Final billing period)`, - metadata: { - type: 'final_usage_overage', - usage: remainingOverage.toFixed(2), - totalOverage: totalOverage.toFixed(2), - billedOverage: billedOverage.toFixed(2), - billingPeriod, + { idempotencyKey: invoiceIdemKey } + ) + + await stripe.invoiceItems.create( + { + customer: customerId, + invoice: overageInvoice.id, + amount: cents, + currency: 'usd', + description: `Usage overage for ${subscription.plan} plan (Final billing period)`, + metadata: { + type: 'final_usage_overage', + usage: remainingOverage.toFixed(2), + totalOverage: totalOverage.toFixed(2), + billedOverage: billedOverage.toFixed(2), + billingPeriod, + }, }, - }, - { idempotencyKey: itemIdemKey } - ) - - // Finalize the invoice (this will trigger payment collection) - if (overageInvoice.id) { - await stripe.invoices.finalizeInvoice(overageInvoice.id) + { idempotencyKey: itemIdemKey } + ) + + if (overageInvoice.id) { + await stripe.invoices.finalizeInvoice( + overageInvoice.id, + {}, + { idempotencyKey: finalizeIdemKey } + ) + } + + logger.info('Created final overage invoice for cancelled subscription', { + subscriptionId: subscription.id, + stripeSubscriptionId, + invoiceId: overageInvoice.id, + totalOverage, + billedOverage, + remainingOverage, + cents, + billingPeriod, + }) + } else { + logger.info('No overage to bill for cancelled subscription', { + subscriptionId: subscription.id, + plan: subscription.plan, + }) } - logger.info('Created final overage invoice for cancelled subscription', { - subscriptionId: subscription.id, - stripeSubscriptionId, - invoiceId: overageInvoice.id, - totalOverage, - billedOverage, - remainingOverage, - cents, - billingPeriod, + // Phase — reset usage, then plan-specific cleanup. Both are + // idempotent on re-run (delete is already-no-op if org is gone; + // reset-by-delta is a no-op when trackers are already zeroed). + await resetUsageForSubscription({ + plan: subscription.plan, + referenceId: subscription.referenceId, }) - } catch (invoiceError) { - logger.error('Failed to create final overage invoice', { + + let restoredProCount = 0 + let organizationDeleted = false + let membersSynced = 0 + + if (await isSubscriptionOrgScoped(subscription)) { + const cleanup = await cleanupOrganizationSubscription(subscription.referenceId) + restoredProCount = cleanup.restoredProCount + membersSynced = cleanup.membersSynced + organizationDeleted = cleanup.organizationDeleted + } else if (isPro(subscription.plan)) { + await syncUsageLimitsFromSubscription(subscription.referenceId) + membersSynced = 1 + } + + logger.info('Successfully processed subscription cancellation', { subscriptionId: subscription.id, stripeSubscriptionId, + plan: subscription.plan, totalOverage, - billedOverage, - remainingOverage, - error: invoiceError, + restoredProCount, + organizationDeleted, + membersSynced, }) - // Don't throw - we don't want to fail the webhook - } - } else { - logger.info('No overage to bill for cancelled subscription', { - subscriptionId: subscription.id, - plan: subscription.plan, - }) - } - - // Reset usage after billing - await resetUsageForSubscription({ - plan: subscription.plan, - referenceId: subscription.referenceId, - }) - // Plan-specific cleanup after billing - let restoredProCount = 0 - let organizationDeleted = false - let membersSynced = 0 - - if (isTeam(subscription.plan)) { - const cleanup = await cleanupOrganizationSubscription(subscription.referenceId) - restoredProCount = cleanup.restoredProCount - membersSynced = cleanup.membersSynced - organizationDeleted = cleanup.organizationDeleted - } else if (isPro(subscription.plan)) { - await syncUsageLimitsFromSubscription(subscription.referenceId) - membersSynced = 1 - } - - // Note: better-auth's Stripe plugin already updates status to 'canceled' before calling this handler - // We handle overage billing, usage reset, Pro restoration, limit syncing, and org cleanup - - logger.info('Successfully processed subscription cancellation', { - subscriptionId: subscription.id, - stripeSubscriptionId, - plan: subscription.plan, - totalOverage, - restoredProCount, - organizationDeleted, - membersSynced, - }) + captureServerEvent(subscription.referenceId, 'subscription_cancelled', { + plan: subscription.plan ?? 'unknown', + reference_id: subscription.referenceId, + }) - captureServerEvent(subscription.referenceId, 'subscription_cancelled', { - plan: subscription.plan ?? 'unknown', - reference_id: subscription.referenceId, - }) + return { totalOverage, remainingOverage, restoredProCount, organizationDeleted } + } + ) } catch (error) { logger.error('Failed to handle subscription deletion', { subscriptionId: subscription.id, - stripeSubscriptionId: subscription.stripeSubscriptionId || '', + stripeSubscriptionId, error, }) - throw error // Re-throw to signal webhook failure for retry + throw error } } diff --git a/apps/sim/lib/copilot/request/tools/billing.ts b/apps/sim/lib/copilot/request/tools/billing.ts index 2f4b0e2d7ac..43d51d621f1 100644 --- a/apps/sim/lib/copilot/request/tools/billing.ts +++ b/apps/sim/lib/copilot/request/tools/billing.ts @@ -1,6 +1,7 @@ import { createLogger } from '@sim/logger' import { getHighestPrioritySubscription } from '@/lib/billing/core/plan' -import { isPaid } from '@/lib/billing/plan-helpers' +import { isEnterprise, isPaid } from '@/lib/billing/plan-helpers' +import { isOrgScopedSubscription } from '@/lib/billing/subscriptions/utils' import { MothershipStreamV1CompletionStatus, MothershipStreamV1EventType, @@ -29,14 +30,25 @@ export async function handleBillingLimitResponse( execContext: ExecutionContext, options: OrchestratorOptions ): Promise { - let action = 'upgrade_plan' + let action: 'upgrade_plan' | 'increase_limit' = 'upgrade_plan' let message = "You've reached your usage limit. Please upgrade your plan to continue." try { const sub = await getHighestPrioritySubscription(userId) if (sub && isPaid(sub.plan)) { + // Paid subs use the existing `increase_limit` action so the UI + // (`UsageUpgradeDisplay`) renders its standard button. The message + // text does the work of clarifying the action when the user can't + // actually self-serve the limit change. action = 'increase_limit' - message = - "You've reached your usage limit for this billing period. Please increase your usage limit to continue." + const orgScoped = isOrgScopedSubscription(sub, userId) + if (orgScoped) { + message = isEnterprise(sub.plan) + ? "You've reached your organization's usage limit for this billing period. Only an organization admin or Sim support can raise an enterprise limit — reach out to them to continue." + : "You've reached your organization's usage limit for this billing period. Only an organization owner or admin can raise the limit — please ask them to update it from the team billing settings." + } else { + message = + "You've reached your usage limit for this billing period. Please increase your usage limit from billing settings to continue." + } } } catch { logger.warn('Failed to determine subscription plan, defaulting to upgrade_plan') diff --git a/apps/sim/lib/core/idempotency/service.ts b/apps/sim/lib/core/idempotency/service.ts index 96ed86a3bb3..14e4cb46cee 100644 --- a/apps/sim/lib/core/idempotency/service.ts +++ b/apps/sim/lib/core/idempotency/service.ts @@ -1,7 +1,7 @@ import { db } from '@sim/db' import { idempotencyKey } from '@sim/db/schema' import { createLogger } from '@sim/logger' -import { eq } from 'drizzle-orm' +import { eq, lt } from 'drizzle-orm' import { getRedisClient } from '@/lib/core/config/redis' import { getMaxExecutionTimeout } from '@/lib/core/execution-limits' import { getStorageMethod, type StorageMethod } from '@/lib/core/storage' @@ -16,6 +16,20 @@ export interface IdempotencyConfig { namespace?: string /** When true, failed keys are deleted rather than stored so the operation is retried on the next attempt. */ retryFailures?: boolean + /** + * Force a specific storage backend regardless of the environment's + * auto-detection. Use `'database'` for correctness-critical flows + * (money, billing, compliance) where the claim + operation should + * fate-share with the Postgres transaction — this closes the narrow + * window where the operation commits to DB but `storeResult` to Redis + * fails and the retry re-runs the operation. Latency cost is 1–5ms + * per call, imperceptible on webhook code paths. + * + * Leave unset (or set `'redis'`) for latency-sensitive, high-volume + * flows like app webhook triggers where the scale benefits of Redis + * outweigh the narrow durability window. + */ + forceStorage?: StorageMethod } export interface IdempotencyResult { @@ -50,11 +64,12 @@ const POLL_INTERVAL_MS = 1000 * that need duplicate prevention. * * Storage is determined once based on configuration: - * - If REDIS_URL is set → Redis - * - If REDIS_URL is not set → PostgreSQL + * - If `forceStorage` is set → that backend unconditionally + * - Else if `REDIS_URL` is set → Redis + * - Else → PostgreSQL */ export class IdempotencyService { - private config: Required + private config: Required> private storageMethod: StorageMethod constructor(config: IdempotencyConfig = {}) { @@ -63,9 +78,10 @@ export class IdempotencyService { namespace: config.namespace ?? 'default', retryFailures: config.retryFailures ?? false, } - this.storageMethod = getStorageMethod() + this.storageMethod = config.forceStorage ?? getStorageMethod() logger.info(`IdempotencyService using ${this.storageMethod} storage`, { namespace: this.config.namespace, + forced: Boolean(config.forceStorage), }) } @@ -220,15 +236,31 @@ export class IdempotencyService { normalizedKey: string, inProgressResult: ProcessingResult ): Promise { + const now = new Date() + const expiredBefore = new Date(now.getTime() - this.config.ttlSeconds * 1000) + + // `ON CONFLICT DO UPDATE WHERE created_at < expiredBefore` steals the + // claim when the existing row has outlived the TTL (e.g. a prior + // holder crashed mid-operation and never wrote `completed`/`failed` + // or released the key). RETURNING yields a row in two cases: + // (1) fresh INSERT — no prior row existed; + // (2) UPDATE of an expired row — WHERE matched. + // An empty RETURNING means conflict with an unexpired row; the + // existing holder is still live and we must not steal. const insertResult = await db .insert(idempotencyKey) .values({ key: normalizedKey, result: inProgressResult, - createdAt: new Date(), + createdAt: now, }) - .onConflictDoNothing({ + .onConflictDoUpdate({ target: [idempotencyKey.key], + set: { + result: inProgressResult, + createdAt: now, + }, + setWhere: lt(idempotencyKey.createdAt, expiredBefore), }) .returning({ key: idempotencyKey.key }) @@ -489,7 +521,18 @@ export const pollingIdempotency = new IdempotencyService({ retryFailures: true, }) +/** + * Used by the internal `/api/billing/update-cost` endpoint (copilot, + * workspace-chat, MCP, mothership) to dedupe cost-recording calls. Storage + * is forced to Postgres: the operation writes AI cost to `user_stats`, + * and if Redis evicts the dedup key under memory pressure (high call + * volume) or drops it on restart, a retry would double-record usage — + * real money. DB storage fate-shares with `user_stats` and is + * eviction-proof; ~1-5ms added latency is invisible against LLM call + * latency. + */ export const billingIdempotency = new IdempotencyService({ namespace: 'billing', ttlSeconds: 60 * 60, // 1 hour + forceStorage: 'database', }) diff --git a/apps/sim/lib/core/outbox/service.test.ts b/apps/sim/lib/core/outbox/service.test.ts new file mode 100644 index 00000000000..5b282e7d12d --- /dev/null +++ b/apps/sim/lib/core/outbox/service.test.ts @@ -0,0 +1,385 @@ +/** + * @vitest-environment node + */ + +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' + +type OutboxRow = { + id: string + eventType: string + payload: unknown + status: 'pending' | 'processing' | 'completed' | 'dead_letter' + attempts: number + maxAttempts: number + availableAt: Date + lockedAt: Date | null + lastError: string | null + createdAt: Date + processedAt: Date | null +} + +// Hoisted mock state — all tests manipulate these directly. +const { state, mockDb } = vi.hoisted(() => { + const state = { + // Rows returned from the FOR UPDATE SKIP LOCKED select in claimBatch. + claimedRows: [] as OutboxRow[], + // Whether the terminal update (lease CAS) should report a match. + leaseHeld: true, + // IDs the reaper's UPDATE should return (simulates stuck `processing` rows). + reapedRowIds: [] as string[], + // Everything written (for assertions). + inserts: [] as Array<{ values: unknown }>, + updates: [] as Array<{ set: Record; where?: unknown }>, + } + + const makeUpdateChain = () => { + const row: { set: Record; where?: unknown } = { set: {} } + const chain: Record = {} + chain.set = vi.fn((s: Record) => { + row.set = s + return chain + }) + chain.where = vi.fn((w: unknown) => { + row.where = w + state.updates.push(row) + return chain + }) + chain.returning = vi.fn(async () => { + // Terminal UPDATE (lease CAS): has `attempts` + `availableAt` + // on retry, or explicit completed/dead_letter. Reaper path sets + // status='pending' without attempts/availableAt. + const isReaperUpdate = + row.set.status === 'pending' && !('attempts' in row.set) && !('availableAt' in row.set) + + if (isReaperUpdate) { + return state.reapedRowIds.map((id) => ({ id })) + } + + if ( + row.set.status === 'completed' || + row.set.status === 'dead_letter' || + (row.set.status === 'pending' && 'attempts' in row.set && 'availableAt' in row.set) + ) { + return state.leaseHeld ? [{ id: 'evt-1' }] : [] + } + + return [] + }) + return chain + } + + const makeSelectChain = () => { + const chain: Record = {} + const self = () => chain + chain.from = vi.fn(self) + chain.where = vi.fn(self) + chain.orderBy = vi.fn(self) + chain.limit = vi.fn(self) + chain.for = vi.fn(async () => state.claimedRows) + return chain + } + + const mockDb = { + insert: vi.fn(() => { + const chain: Record = {} + chain.values = vi.fn(async (v: unknown) => { + state.inserts.push({ values: v }) + }) + return chain + }), + update: vi.fn(() => makeUpdateChain()), + select: vi.fn(() => makeSelectChain()), + transaction: vi.fn(async (fn: (tx: unknown) => Promise) => fn(mockDb)), + } + + return { state, mockDb } +}) + +vi.mock('@sim/db', () => ({ db: mockDb })) + +vi.mock('@sim/db/schema', () => ({ + outboxEvent: { + id: 'outbox_event.id', + eventType: 'outbox_event.event_type', + payload: 'outbox_event.payload', + status: 'outbox_event.status', + attempts: 'outbox_event.attempts', + maxAttempts: 'outbox_event.max_attempts', + availableAt: 'outbox_event.available_at', + lockedAt: 'outbox_event.locked_at', + lastError: 'outbox_event.last_error', + createdAt: 'outbox_event.created_at', + processedAt: 'outbox_event.processed_at', + $inferSelect: {} as OutboxRow, + }, +})) + +vi.mock('@sim/logger', () => ({ + createLogger: () => ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }), +})) + +vi.mock('drizzle-orm', () => ({ + and: vi.fn((...args) => ({ _op: 'and', args })), + asc: vi.fn((col) => ({ _op: 'asc', col })), + eq: vi.fn((col, val) => ({ _op: 'eq', col, val })), + inArray: vi.fn((col, vals) => ({ _op: 'inArray', col, vals })), + lte: vi.fn((col, val) => ({ _op: 'lte', col, val })), +})) + +vi.mock('@/lib/core/utils/uuid', () => ({ + generateId: vi.fn(() => 'test-event-id'), +})) + +import { enqueueOutboxEvent, processOutboxEvents } from './service' + +function makePendingRow(overrides: Partial = {}): OutboxRow { + return { + id: 'evt-1', + eventType: 'test.event', + payload: { foo: 'bar' }, + status: 'pending', + attempts: 0, + maxAttempts: 10, + availableAt: new Date(Date.now() - 1000), + lockedAt: null, + lastError: null, + createdAt: new Date(Date.now() - 5000), + processedAt: null, + ...overrides, + } +} + +function resetState() { + state.claimedRows = [] + state.leaseHeld = true + state.reapedRowIds = [] + state.inserts.length = 0 + state.updates.length = 0 +} + +describe('enqueueOutboxEvent', () => { + beforeEach(() => { + vi.clearAllMocks() + resetState() + }) + + it('inserts a row with the given event type and payload', async () => { + const id = await enqueueOutboxEvent(mockDb, 'test.event', { foo: 'bar' }) + expect(id).toBe('test-event-id') + expect(state.inserts[0].values).toMatchObject({ + id: 'test-event-id', + eventType: 'test.event', + payload: { foo: 'bar' }, + maxAttempts: 10, + }) + }) + + it('respects maxAttempts override', async () => { + await enqueueOutboxEvent(mockDb, 'test.event', {}, { maxAttempts: 3 }) + expect(state.inserts[0].values).toMatchObject({ maxAttempts: 3 }) + }) + + it('respects availableAt override for delayed processing', async () => { + const future = new Date(Date.now() + 60_000) + await enqueueOutboxEvent(mockDb, 'test.event', {}, { availableAt: future }) + expect((state.inserts[0].values as { availableAt: Date }).availableAt).toBe(future) + }) +}) + +describe('processOutboxEvents — empty / no handler', () => { + beforeEach(() => { + vi.clearAllMocks() + resetState() + }) + + it('returns zero counts when no events are due', async () => { + const result = await processOutboxEvents({}) + expect(result).toEqual({ + processed: 0, + retried: 0, + deadLettered: 0, + leaseLost: 0, + reaped: 0, + }) + }) + + it('dead-letters events with no registered handler', async () => { + state.claimedRows = [makePendingRow({ eventType: 'unknown.event' })] + + const result = await processOutboxEvents({}) + + expect(result.deadLettered).toBe(1) + const terminal = state.updates.find((u) => u.set.status === 'dead_letter') + expect(terminal).toBeDefined() + expect(terminal?.set.lastError).toMatch(/No handler registered/) + }) +}) + +describe('processOutboxEvents — handler success and retry', () => { + beforeEach(() => { + vi.clearAllMocks() + resetState() + }) + + it('transitions to completed on handler success and passes context to handler', async () => { + const handlerCalls: Array<{ payload: unknown; eventId: string; attempts: number }> = [] + const handler = vi.fn(async (payload: unknown, ctx: { eventId: string; attempts: number }) => { + handlerCalls.push({ payload, eventId: ctx.eventId, attempts: ctx.attempts }) + }) + + state.claimedRows = [makePendingRow()] + + const result = await processOutboxEvents({ 'test.event': handler }) + + expect(result.processed).toBe(1) + expect(handlerCalls).toEqual([{ payload: { foo: 'bar' }, eventId: 'evt-1', attempts: 0 }]) + const completeUpdate = state.updates.find((u) => u.set.status === 'completed') + expect(completeUpdate).toBeDefined() + }) + + it('schedules retry with exponential backoff on handler failure below maxAttempts', async () => { + const handler = vi.fn(async () => { + throw new Error('transient failure') + }) + + state.claimedRows = [makePendingRow({ attempts: 2 })] + + const before = Date.now() + const result = await processOutboxEvents({ 'test.event': handler }) + + expect(result.retried).toBe(1) + const retryUpdate = state.updates.find((u) => u.set.status === 'pending' && 'attempts' in u.set) + expect(retryUpdate).toBeDefined() + expect(retryUpdate?.set.attempts).toBe(3) + expect(retryUpdate?.set.lastError).toBe('transient failure') + // Backoff after nextAttempts=3: 1000 * 2^3 = 8000ms + const scheduledAt = retryUpdate?.set.availableAt as Date + expect(scheduledAt.getTime()).toBeGreaterThan(before + 7500) + expect(scheduledAt.getTime()).toBeLessThan(before + 10_000) + }) + + it('dead-letters on failure when attempts reaches maxAttempts', async () => { + const handler = vi.fn(async () => { + throw new Error('permanent failure') + }) + + state.claimedRows = [makePendingRow({ attempts: 9, maxAttempts: 10 })] + + const result = await processOutboxEvents({ 'test.event': handler }) + + expect(result.deadLettered).toBe(1) + const deadUpdate = state.updates.find((u) => u.set.status === 'dead_letter') + expect(deadUpdate).toBeDefined() + expect(deadUpdate?.set.attempts).toBe(10) + expect(deadUpdate?.set.lastError).toBe('permanent failure') + }) + + it('caps exponential backoff at 1 hour', async () => { + const handler = vi.fn(async () => { + throw new Error('transient') + }) + + state.claimedRows = [makePendingRow({ attempts: 20, maxAttempts: 100 })] + + const before = Date.now() + await processOutboxEvents({ 'test.event': handler }) + + const retryUpdate = state.updates.find((u) => u.set.status === 'pending' && 'attempts' in u.set) + expect(retryUpdate).toBeDefined() + const scheduledAt = retryUpdate?.set.availableAt as Date + // 1hr = 3,600,000ms + expect(scheduledAt.getTime()).toBeLessThan(before + 3_600_000 + 1000) + expect(scheduledAt.getTime()).toBeGreaterThan(before + 3_599_000) + }) +}) + +describe('processOutboxEvents — lease CAS / reaper race', () => { + beforeEach(() => { + vi.clearAllMocks() + resetState() + }) + + it('reports leaseLost when completion UPDATE affects zero rows', async () => { + const handler = vi.fn(async () => { + // "succeeds" but terminal write will fail the lease CAS + }) + + state.claimedRows = [makePendingRow()] + state.leaseHeld = false + + const result = await processOutboxEvents({ 'test.event': handler }) + + expect(result.leaseLost).toBe(1) + expect(result.processed).toBe(0) + }) + + it('reports leaseLost on retry-schedule UPDATE when row was reclaimed', async () => { + const handler = vi.fn(async () => { + throw new Error('transient') + }) + + state.claimedRows = [makePendingRow({ attempts: 2 })] + state.leaseHeld = false + + const result = await processOutboxEvents({ 'test.event': handler }) + + expect(result.leaseLost).toBe(1) + expect(result.retried).toBe(0) + }) +}) + +describe('processOutboxEvents — handler timeout', () => { + beforeEach(() => { + vi.clearAllMocks() + resetState() + vi.useFakeTimers() + }) + + afterEach(() => { + vi.useRealTimers() + }) + + it('times out a stuck handler and schedules retry', async () => { + const neverResolves = vi.fn(() => new Promise(() => {})) + + state.claimedRows = [makePendingRow({ attempts: 0 })] + + const promise = processOutboxEvents({ 'test.event': neverResolves }) + // Must exceed DEFAULT_HANDLER_TIMEOUT_MS (90s). + await vi.advanceTimersByTimeAsync(90 * 1000 + 1) + const result = await promise + + expect(result.retried).toBe(1) + const retryUpdate = state.updates.find((u) => u.set.status === 'pending' && 'attempts' in u.set) + expect(retryUpdate?.set.lastError).toMatch(/timed out/) + }) +}) + +describe('processOutboxEvents — reaper recovery', () => { + beforeEach(() => { + vi.clearAllMocks() + resetState() + }) + + it('reaps stuck processing rows back to pending and reports count', async () => { + state.reapedRowIds = ['stuck-1', 'stuck-2', 'stuck-3'] + + const result = await processOutboxEvents({}) + + expect(result.reaped).toBe(3) + expect(result.processed).toBe(0) + + // The reaper's UPDATE sets status='pending' with NO attempts / availableAt + // fields — that's how runHandler's retry update is distinguished from it. + const reaperUpdate = state.updates.find( + (u) => u.set.status === 'pending' && !('attempts' in u.set) && !('availableAt' in u.set) + ) + expect(reaperUpdate).toBeDefined() + expect(reaperUpdate?.set.lockedAt).toBeNull() + }) + + it('returns zero reaped when no rows are stuck', async () => { + const result = await processOutboxEvents({}) + expect(result.reaped).toBe(0) + }) +}) diff --git a/apps/sim/lib/core/outbox/service.ts b/apps/sim/lib/core/outbox/service.ts new file mode 100644 index 00000000000..e8b29570a30 --- /dev/null +++ b/apps/sim/lib/core/outbox/service.ts @@ -0,0 +1,366 @@ +import { db } from '@sim/db' +import { outboxEvent } from '@sim/db/schema' +import { createLogger } from '@sim/logger' +import { and, asc, eq, inArray, lte } from 'drizzle-orm' +import { generateId } from '@/lib/core/utils/uuid' + +const logger = createLogger('OutboxService') + +const DEFAULT_MAX_ATTEMPTS = 10 +const STUCK_PROCESSING_THRESHOLD_MS = 10 * 60 * 1000 // 10 minutes +const MAX_BACKOFF_MS = 60 * 60 * 1000 // 1 hour +const BASE_BACKOFF_MS = 1000 // 1 second, doubled per attempt +// Kept below the serverless route `maxDuration` (120s) so our in-process +// timeout fires before the platform kills the invocation and leaves the +// row stranded in `processing` for the 10-minute reaper window. Also well +// under `STUCK_PROCESSING_THRESHOLD_MS` so the reaper cannot steal a row +// a worker is still actively processing. +const DEFAULT_HANDLER_TIMEOUT_MS = 90 * 1000 // 90 seconds + +/** + * Context passed to every outbox handler. Use `eventId` as the Stripe + * (or any external service) idempotency key so that handler retries + * collapse on the external side: a second execution of the same event + * lands on the same Stripe invoice id / charge id rather than creating + * a duplicate. The outbox lease CAS handles our DB side. + */ +export interface OutboxEventContext { + eventId: string + eventType: string + /** How many times this event has been attempted (zero on first run). */ + attempts: number +} + +/** + * A handler invoked by the outbox worker for events of a given type. + * Throwing bumps `attempts` and schedules a retry via exponential + * backoff; a successful return transitions the event to `completed`. + */ +export type OutboxHandler = (payload: T, context: OutboxEventContext) => Promise + +/** + * Map of `eventType` → handler. Register all handlers in one place + * and pass them to `processOutboxEvents`. + */ +export type OutboxHandlerRegistry = Record + +export interface EnqueueOptions { + /** Total attempts before the event moves to `dead_letter`. Default 10. */ + maxAttempts?: number + /** Earliest time a worker may pick up this event. Default now. */ + availableAt?: Date +} + +export interface ProcessOutboxResult { + processed: number + retried: number + deadLettered: number + leaseLost: number + reaped: number +} + +/** + * Transactional outbox for reliable "DB write + external system" flows. + * + * Callers enqueue an event *inside* a `db.transaction` alongside the + * primary write; the event row commits or rolls back with the business + * data. A polling worker (invoked via the cron endpoint) claims pending + * rows with `SELECT ... FOR UPDATE SKIP LOCKED`, marks them as + * `processing`, runs the registered handler outside the transaction, + * and transitions the event to `completed` / `pending` (retry) / + * `dead_letter` (max attempts exceeded). + * + * Two-phase claim-then-process keeps external API calls out of DB + * transactions. A reaper at the top of each run reclaims `processing` + * rows whose worker died mid-operation (stale `lockedAt`). + * + * Enqueue must be called with a `tx` from `db.transaction` so atomicity + * with the primary write is preserved. `db` itself is also accepted but + * then the caller must guarantee the enqueue and the primary write share + * a transaction some other way (or none at all). + */ +export async function enqueueOutboxEvent( + executor: Pick, + eventType: string, + payload: T, + options: EnqueueOptions = {} +): Promise { + const id = generateId() + await executor.insert(outboxEvent).values({ + id, + eventType, + payload: payload as never, + maxAttempts: options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS, + availableAt: options.availableAt ?? new Date(), + }) + logger.info('Enqueued outbox event', { id, eventType }) + return id +} + +/** + * Process one batch of outbox events. Safe to call concurrently from + * multiple workers — `SELECT FOR UPDATE SKIP LOCKED` serializes claims. + */ +export async function processOutboxEvents( + handlers: OutboxHandlerRegistry, + options: { batchSize?: number } = {} +): Promise { + const batchSize = options.batchSize ?? 10 + + const reaped = await reapStuckProcessingRows() + + const claimed = await claimBatch(batchSize) + if (claimed.length === 0) { + return { processed: 0, retried: 0, deadLettered: 0, leaseLost: 0, reaped } + } + + let processed = 0 + let retried = 0 + let deadLettered = 0 + let leaseLost = 0 + + for (const event of claimed) { + const result = await runHandler(event, handlers) + if (result === 'completed') processed++ + else if (result === 'dead_letter') deadLettered++ + else if (result === 'lease_lost') leaseLost++ + else retried++ + } + + return { processed, retried, deadLettered, leaseLost, reaped } +} + +/** + * Reaper: move `processing` rows whose worker died (stale `lockedAt`) + * back to `pending` so another worker can pick them up. Without this, + * a SIGKILL between claim and result-write would permanently strand + * the row in `processing`. + */ +async function reapStuckProcessingRows(): Promise { + const stuckBefore = new Date(Date.now() - STUCK_PROCESSING_THRESHOLD_MS) + const result = await db + .update(outboxEvent) + .set({ status: 'pending', lockedAt: null }) + .where(and(eq(outboxEvent.status, 'processing'), lte(outboxEvent.lockedAt, stuckBefore))) + .returning({ id: outboxEvent.id }) + + if (result.length > 0) { + logger.warn('Reaped stuck outbox processing rows', { + count: result.length, + thresholdMs: STUCK_PROCESSING_THRESHOLD_MS, + }) + } + return result.length +} + +/** + * Phase 1: claim a batch of due pending events. + * + * `SELECT ... FOR UPDATE SKIP LOCKED` atomically picks rows that no + * other worker is currently looking at. We then flip those rows to + * `processing` inside the same tx so the claim survives the lock + * release — the status change becomes the out-of-band mutual exclusion. + */ +async function claimBatch(batchSize: number): Promise<(typeof outboxEvent.$inferSelect)[]> { + const now = new Date() + return db.transaction(async (tx) => { + const rows = await tx + .select() + .from(outboxEvent) + .where(and(eq(outboxEvent.status, 'pending'), lte(outboxEvent.availableAt, now))) + .orderBy(asc(outboxEvent.createdAt)) + .limit(batchSize) + .for('update', { skipLocked: true }) + + if (rows.length === 0) return [] + + await tx + .update(outboxEvent) + .set({ status: 'processing', lockedAt: now }) + .where( + inArray( + outboxEvent.id, + rows.map((r) => r.id) + ) + ) + + // Return rows with the claim state we just committed. `lockedAt` + // on this object is the authoritative lease timestamp used by the + // terminal-update lease CAS (see `runHandler`). + return rows.map((row) => ({ + ...row, + status: 'processing' as const, + lockedAt: now, + })) + }) +} + +/** + * Phase 2: invoke the handler for a claimed event, outside any DB + * transaction, then transition the row to its terminal or retry state. + * + * Every terminal UPDATE is guarded by a lease CAS (`WHERE status = + * 'processing' AND locked_at = event.lockedAt`). This defends against + * the "slow handler + reaper" race: if our handler takes longer than + * `STUCK_PROCESSING_THRESHOLD_MS`, the reaper will have reset the row + * to `pending` and another worker may have reclaimed it with a fresh + * `locked_at`. Our stale terminal write's WHERE clause won't match — + * rowCount is 0 — and we log+skip instead of clobbering the new lease. + */ +async function runHandler( + event: typeof outboxEvent.$inferSelect, + handlers: OutboxHandlerRegistry +): Promise<'completed' | 'pending' | 'dead_letter' | 'lease_lost'> { + const handler = handlers[event.eventType] + + if (!handler) { + logger.error('No handler registered for outbox event type', { + eventId: event.id, + eventType: event.eventType, + }) + await updateIfLeaseHeld(event, { + status: 'dead_letter', + lastError: `No handler registered for event type '${event.eventType}'`, + processedAt: new Date(), + lockedAt: null, + }) + return 'dead_letter' + } + + try { + await runHandlerWithTimeout(handler, event) + const updated = await updateIfLeaseHeld(event, { + status: 'completed', + processedAt: new Date(), + lockedAt: null, + }) + if (!updated) { + logger.warn('Outbox event completion skipped — lease lost (reaped + reclaimed)', { + eventId: event.id, + eventType: event.eventType, + }) + return 'lease_lost' + } + logger.info('Outbox event processed', { + eventId: event.id, + eventType: event.eventType, + attempts: event.attempts + 1, + }) + return 'completed' + } catch (error) { + const nextAttempts = event.attempts + 1 + const isDead = nextAttempts >= event.maxAttempts + const errMsg = error instanceof Error ? error.message : String(error) + + if (isDead) { + const updated = await updateIfLeaseHeld(event, { + attempts: nextAttempts, + status: 'dead_letter', + lastError: errMsg, + processedAt: new Date(), + lockedAt: null, + }) + if (!updated) { + logger.warn('Outbox event dead-letter skipped — lease lost', { + eventId: event.id, + eventType: event.eventType, + }) + return 'lease_lost' + } + logger.error('Outbox event dead-lettered after max attempts', { + eventId: event.id, + eventType: event.eventType, + attempts: nextAttempts, + error: errMsg, + }) + return 'dead_letter' + } + + // Exponential backoff, capped at MAX_BACKOFF_MS. + const backoffMs = Math.min(MAX_BACKOFF_MS, BASE_BACKOFF_MS * 2 ** nextAttempts) + const nextAvailableAt = new Date(Date.now() + backoffMs) + const updated = await updateIfLeaseHeld(event, { + attempts: nextAttempts, + status: 'pending', + lastError: errMsg, + availableAt: nextAvailableAt, + lockedAt: null, + }) + if (!updated) { + logger.warn('Outbox event retry-schedule skipped — lease lost', { + eventId: event.id, + eventType: event.eventType, + }) + return 'lease_lost' + } + logger.warn('Outbox event failed, scheduled retry', { + eventId: event.id, + eventType: event.eventType, + attempts: nextAttempts, + backoffMs, + nextAvailableAt: nextAvailableAt.toISOString(), + error: errMsg, + }) + return 'pending' + } +} + +function runHandlerWithTimeout( + handler: OutboxHandler, + event: typeof outboxEvent.$inferSelect, + timeoutMs: number = DEFAULT_HANDLER_TIMEOUT_MS +): Promise { + const context: OutboxEventContext = { + eventId: event.id, + eventType: event.eventType, + attempts: event.attempts, + } + + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + reject(new Error(`Outbox handler timed out after ${timeoutMs}ms`)) + }, timeoutMs) + + handler(event.payload, context) + .then((value) => { + clearTimeout(timeout) + resolve(value) + }) + .catch((err) => { + clearTimeout(timeout) + reject(err) + }) + }) +} + +/** + * Conditional terminal update scoped to the lease acquired at claim + * time. Returns true if the UPDATE affected a row, false if the row's + * lease was revoked (reaped, reclaimed by another worker). Callers + * treat `false` as a "lease lost" signal and skip without retrying — + * the newer owner is responsible for the row now. + */ +async function updateIfLeaseHeld( + event: typeof outboxEvent.$inferSelect, + patch: { + status: 'completed' | 'pending' | 'dead_letter' + attempts?: number + lastError?: string | null + availableAt?: Date + lockedAt: Date | null + processedAt?: Date | null + } +): Promise { + const whereClauses = [eq(outboxEvent.id, event.id), eq(outboxEvent.status, 'processing')] + if (event.lockedAt) { + whereClauses.push(eq(outboxEvent.lockedAt, event.lockedAt)) + } + + const result = await db + .update(outboxEvent) + .set(patch) + .where(and(...whereClauses)) + .returning({ id: outboxEvent.id }) + + return result.length > 0 +} diff --git a/apps/sim/lib/core/rate-limiter/rate-limiter.ts b/apps/sim/lib/core/rate-limiter/rate-limiter.ts index 50186ce9755..85366e80400 100644 --- a/apps/sim/lib/core/rate-limiter/rate-limiter.ts +++ b/apps/sim/lib/core/rate-limiter/rate-limiter.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { isOrgPlan } from '@/lib/billing/plan-helpers' +import { isOrgScopedSubscription } from '@/lib/billing/subscriptions/utils' import { toError } from '@/lib/core/utils/helpers' import { createStorageAdapter, type RateLimitStorageAdapter } from './storage' import { @@ -42,7 +42,7 @@ export class RateLimiter { private getRateLimitKey(userId: string, subscription: SubscriptionInfo | null): string { if (!subscription) return userId - if (isOrgPlan(subscription.plan) && subscription.referenceId !== userId) { + if (isOrgScopedSubscription(subscription, userId)) { return subscription.referenceId } diff --git a/apps/sim/lib/logs/execution/logger.ts b/apps/sim/lib/logs/execution/logger.ts index afa70de6ea5..ef96063387c 100644 --- a/apps/sim/lib/logs/execution/logger.ts +++ b/apps/sim/lib/logs/execution/logger.ts @@ -16,7 +16,6 @@ import { maybeSendUsageThresholdEmail, } from '@/lib/billing/core/usage' import { type ModelUsageMetadata, recordUsage } from '@/lib/billing/core/usage-log' -import { isOrgPlan } from '@/lib/billing/plan-helpers' import { checkAndBillOverageThreshold } from '@/lib/billing/threshold-billing' import { isBillingEnabled } from '@/lib/core/config/feature-flags' import { redactApiKeys } from '@/lib/core/security/redaction' @@ -415,9 +414,11 @@ export class ExecutionLogger implements IExecutionLoggerService { const costDelta = costSummary.totalCost const { getDisplayPlanName } = await import('@/lib/billing/plan-helpers') + const { isOrgScopedSubscription } = await import('@/lib/billing/subscriptions/utils') const planName = getDisplayPlanName(sub?.plan) - const scope: 'user' | 'organization' = - sub && isOrgPlan(sub.plan) ? 'organization' : 'user' + const scope: 'user' | 'organization' = isOrgScopedSubscription(sub, usr.id) + ? 'organization' + : 'user' if (scope === 'user') { const before = await checkUsageStatus(usr.id) diff --git a/packages/db/migrations/0191_unusual_mongu.sql b/packages/db/migrations/0191_unusual_mongu.sql new file mode 100644 index 00000000000..22d1f29d83d --- /dev/null +++ b/packages/db/migrations/0191_unusual_mongu.sql @@ -0,0 +1,17 @@ +CREATE TABLE "outbox_event" ( + "id" text PRIMARY KEY NOT NULL, + "event_type" text NOT NULL, + "payload" json NOT NULL, + "status" text DEFAULT 'pending' NOT NULL, + "attempts" integer DEFAULT 0 NOT NULL, + "max_attempts" integer DEFAULT 10 NOT NULL, + "available_at" timestamp DEFAULT now() NOT NULL, + "locked_at" timestamp, + "last_error" text, + "created_at" timestamp DEFAULT now() NOT NULL, + "processed_at" timestamp +); +--> statement-breakpoint +ALTER TABLE "user_stats" ADD COLUMN "pro_period_cost_snapshot_at" timestamp;--> statement-breakpoint +CREATE INDEX "outbox_event_status_available_idx" ON "outbox_event" USING btree ("status","available_at");--> statement-breakpoint +CREATE INDEX "outbox_event_locked_at_idx" ON "outbox_event" USING btree ("locked_at"); \ No newline at end of file diff --git a/packages/db/migrations/meta/0191_snapshot.json b/packages/db/migrations/meta/0191_snapshot.json new file mode 100644 index 00000000000..387f6e38fe8 --- /dev/null +++ b/packages/db/migrations/meta/0191_snapshot.json @@ -0,0 +1,14785 @@ +{ + "id": "28bc7319-8037-40ec-bc22-42d167a46852", + "prevId": "bb103638-c742-4300-a0fe-757734e707f1", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.a2a_agent": { + "name": "a2a_agent", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "version": { + "name": "version", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'1.0.0'" + }, + "capabilities": { + "name": "capabilities", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "skills": { + "name": "skills", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'" + }, + "authentication": { + "name": "authentication", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "signatures": { + "name": "signatures", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'" + }, + "is_published": { + "name": "is_published", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "published_at": { + "name": "published_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "a2a_agent_workflow_id_idx": { + "name": "a2a_agent_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "a2a_agent_created_by_idx": { + "name": "a2a_agent_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "a2a_agent_workspace_workflow_unique": { + "name": "a2a_agent_workspace_workflow_unique", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"a2a_agent\".\"archived_at\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "a2a_agent_archived_at_idx": { + "name": "a2a_agent_archived_at_idx", + "columns": [ + { + "expression": "archived_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "a2a_agent_workspace_id_workspace_id_fk": { + "name": "a2a_agent_workspace_id_workspace_id_fk", + "tableFrom": "a2a_agent", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "a2a_agent_workflow_id_workflow_id_fk": { + "name": "a2a_agent_workflow_id_workflow_id_fk", + "tableFrom": "a2a_agent", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "a2a_agent_created_by_user_id_fk": { + "name": "a2a_agent_created_by_user_id_fk", + "tableFrom": "a2a_agent", + "tableTo": "user", + "columnsFrom": ["created_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.a2a_push_notification_config": { + "name": "a2a_push_notification_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "auth_schemes": { + "name": "auth_schemes", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'" + }, + "auth_credentials": { + "name": "auth_credentials", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "a2a_push_notification_config_task_unique": { + "name": "a2a_push_notification_config_task_unique", + "columns": [ + { + "expression": "task_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "a2a_push_notification_config_task_id_a2a_task_id_fk": { + "name": "a2a_push_notification_config_task_id_a2a_task_id_fk", + "tableFrom": "a2a_push_notification_config", + "tableTo": "a2a_task", + "columnsFrom": ["task_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.a2a_task": { + "name": "a2a_task", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "agent_id": { + "name": "agent_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "session_id": { + "name": "session_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "a2a_task_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'submitted'" + }, + "messages": { + "name": "messages", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'" + }, + "artifacts": { + "name": "artifacts", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'[]'" + }, + "execution_id": { + "name": "execution_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "a2a_task_agent_id_idx": { + "name": "a2a_task_agent_id_idx", + "columns": [ + { + "expression": "agent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "a2a_task_session_id_idx": { + "name": "a2a_task_session_id_idx", + "columns": [ + { + "expression": "session_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "a2a_task_status_idx": { + "name": "a2a_task_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "a2a_task_execution_id_idx": { + "name": "a2a_task_execution_id_idx", + "columns": [ + { + "expression": "execution_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "a2a_task_created_at_idx": { + "name": "a2a_task_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "a2a_task_agent_id_a2a_agent_id_fk": { + "name": "a2a_task_agent_id_a2a_agent_id_fk", + "tableFrom": "a2a_task", + "tableTo": "a2a_agent", + "columnsFrom": ["agent_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.academy_certificate": { + "name": "academy_certificate", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "course_id": { + "name": "course_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "academy_cert_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "issued_at": { + "name": "issued_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "certificate_number": { + "name": "certificate_number", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "academy_certificate_user_id_idx": { + "name": "academy_certificate_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "academy_certificate_course_id_idx": { + "name": "academy_certificate_course_id_idx", + "columns": [ + { + "expression": "course_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "academy_certificate_user_course_unique": { + "name": "academy_certificate_user_course_unique", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "course_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "academy_certificate_number_idx": { + "name": "academy_certificate_number_idx", + "columns": [ + { + "expression": "certificate_number", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "academy_certificate_status_idx": { + "name": "academy_certificate_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "academy_certificate_user_id_user_id_fk": { + "name": "academy_certificate_user_id_user_id_fk", + "tableFrom": "academy_certificate", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "academy_certificate_certificate_number_unique": { + "name": "academy_certificate_certificate_number_unique", + "nullsNotDistinct": false, + "columns": ["certificate_number"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.account": { + "name": "account", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "account_user_id_idx": { + "name": "account_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_account_on_account_id_provider_id": { + "name": "idx_account_on_account_id_provider_id", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "provider_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.api_key": { + "name": "api_key", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'personal'" + }, + "last_used": { + "name": "last_used", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "api_key_workspace_type_idx": { + "name": "api_key_workspace_type_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "api_key_user_type_idx": { + "name": "api_key_user_type_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "api_key_user_id_user_id_fk": { + "name": "api_key_user_id_user_id_fk", + "tableFrom": "api_key", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "api_key_workspace_id_workspace_id_fk": { + "name": "api_key_workspace_id_workspace_id_fk", + "tableFrom": "api_key", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "api_key_created_by_user_id_fk": { + "name": "api_key_created_by_user_id_fk", + "tableFrom": "api_key", + "tableTo": "user", + "columnsFrom": ["created_by"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "api_key_key_unique": { + "name": "api_key_key_unique", + "nullsNotDistinct": false, + "columns": ["key"] + } + }, + "policies": {}, + "checkConstraints": { + "workspace_type_check": { + "name": "workspace_type_check", + "value": "(type = 'workspace' AND workspace_id IS NOT NULL) OR (type = 'personal' AND workspace_id IS NULL)" + } + }, + "isRLSEnabled": false + }, + "public.async_jobs": { + "name": "async_jobs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "payload": { + "name": "payload", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "started_at": { + "name": "started_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "run_at": { + "name": "run_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "attempts": { + "name": "attempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "max_attempts": { + "name": "max_attempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 3 + }, + "error": { + "name": "error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "output": { + "name": "output", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "async_jobs_status_started_at_idx": { + "name": "async_jobs_status_started_at_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "started_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "async_jobs_status_completed_at_idx": { + "name": "async_jobs_status_completed_at_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "completed_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.audit_log": { + "name": "audit_log", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "actor_id": { + "name": "actor_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resource_type": { + "name": "resource_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resource_id": { + "name": "resource_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "actor_name": { + "name": "actor_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "actor_email": { + "name": "actor_email", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "resource_name": { + "name": "resource_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "audit_log_workspace_created_idx": { + "name": "audit_log_workspace_created_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "audit_log_actor_created_idx": { + "name": "audit_log_actor_created_idx", + "columns": [ + { + "expression": "actor_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "audit_log_resource_idx": { + "name": "audit_log_resource_idx", + "columns": [ + { + "expression": "resource_type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "resource_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "audit_log_action_idx": { + "name": "audit_log_action_idx", + "columns": [ + { + "expression": "action", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "audit_log_workspace_id_workspace_id_fk": { + "name": "audit_log_workspace_id_workspace_id_fk", + "tableFrom": "audit_log", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + }, + "audit_log_actor_id_user_id_fk": { + "name": "audit_log_actor_id_user_id_fk", + "tableFrom": "audit_log", + "tableTo": "user", + "columnsFrom": ["actor_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.chat": { + "name": "chat", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "customizations": { + "name": "customizations", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "auth_type": { + "name": "auth_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'public'" + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "allowed_emails": { + "name": "allowed_emails", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'" + }, + "output_configs": { + "name": "output_configs", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'" + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "identifier_idx": { + "name": "identifier_idx", + "columns": [ + { + "expression": "identifier", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"chat\".\"archived_at\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "chat_archived_at_idx": { + "name": "chat_archived_at_idx", + "columns": [ + { + "expression": "archived_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "chat_workflow_id_workflow_id_fk": { + "name": "chat_workflow_id_workflow_id_fk", + "tableFrom": "chat", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "chat_user_id_user_id_fk": { + "name": "chat_user_id_user_id_fk", + "tableFrom": "chat", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.copilot_async_tool_calls": { + "name": "copilot_async_tool_calls", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "run_id": { + "name": "run_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "checkpoint_id": { + "name": "checkpoint_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "tool_call_id": { + "name": "tool_call_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tool_name": { + "name": "tool_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "args": { + "name": "args", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "status": { + "name": "status", + "type": "copilot_async_tool_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "result": { + "name": "result", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "error": { + "name": "error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "claimed_at": { + "name": "claimed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "claimed_by": { + "name": "claimed_by", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "copilot_async_tool_calls_run_id_idx": { + "name": "copilot_async_tool_calls_run_id_idx", + "columns": [ + { + "expression": "run_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_async_tool_calls_checkpoint_id_idx": { + "name": "copilot_async_tool_calls_checkpoint_id_idx", + "columns": [ + { + "expression": "checkpoint_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_async_tool_calls_tool_call_id_idx": { + "name": "copilot_async_tool_calls_tool_call_id_idx", + "columns": [ + { + "expression": "tool_call_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_async_tool_calls_status_idx": { + "name": "copilot_async_tool_calls_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_async_tool_calls_run_status_idx": { + "name": "copilot_async_tool_calls_run_status_idx", + "columns": [ + { + "expression": "run_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_async_tool_calls_tool_call_id_unique": { + "name": "copilot_async_tool_calls_tool_call_id_unique", + "columns": [ + { + "expression": "tool_call_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "copilot_async_tool_calls_run_id_copilot_runs_id_fk": { + "name": "copilot_async_tool_calls_run_id_copilot_runs_id_fk", + "tableFrom": "copilot_async_tool_calls", + "tableTo": "copilot_runs", + "columnsFrom": ["run_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "copilot_async_tool_calls_checkpoint_id_copilot_run_checkpoints_id_fk": { + "name": "copilot_async_tool_calls_checkpoint_id_copilot_run_checkpoints_id_fk", + "tableFrom": "copilot_async_tool_calls", + "tableTo": "copilot_run_checkpoints", + "columnsFrom": ["checkpoint_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.copilot_chats": { + "name": "copilot_chats", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "chat_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'copilot'" + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "messages": { + "name": "messages", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'" + }, + "model": { + "name": "model", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'claude-3-7-sonnet-latest'" + }, + "conversation_id": { + "name": "conversation_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "preview_yaml": { + "name": "preview_yaml", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "plan_artifact": { + "name": "plan_artifact", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "config": { + "name": "config", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "resources": { + "name": "resources", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'" + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "copilot_chats_user_id_idx": { + "name": "copilot_chats_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_chats_workflow_id_idx": { + "name": "copilot_chats_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_chats_user_workflow_idx": { + "name": "copilot_chats_user_workflow_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_chats_user_workspace_idx": { + "name": "copilot_chats_user_workspace_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_chats_created_at_idx": { + "name": "copilot_chats_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_chats_updated_at_idx": { + "name": "copilot_chats_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "copilot_chats_user_id_user_id_fk": { + "name": "copilot_chats_user_id_user_id_fk", + "tableFrom": "copilot_chats", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "copilot_chats_workflow_id_workflow_id_fk": { + "name": "copilot_chats_workflow_id_workflow_id_fk", + "tableFrom": "copilot_chats", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "copilot_chats_workspace_id_workspace_id_fk": { + "name": "copilot_chats_workspace_id_workspace_id_fk", + "tableFrom": "copilot_chats", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.copilot_feedback": { + "name": "copilot_feedback", + "schema": "", + "columns": { + "feedback_id": { + "name": "feedback_id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chat_id": { + "name": "chat_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "user_query": { + "name": "user_query", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "agent_response": { + "name": "agent_response", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "is_positive": { + "name": "is_positive", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "feedback": { + "name": "feedback", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "workflow_yaml": { + "name": "workflow_yaml", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "copilot_feedback_user_id_idx": { + "name": "copilot_feedback_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_feedback_chat_id_idx": { + "name": "copilot_feedback_chat_id_idx", + "columns": [ + { + "expression": "chat_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_feedback_user_chat_idx": { + "name": "copilot_feedback_user_chat_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "chat_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_feedback_is_positive_idx": { + "name": "copilot_feedback_is_positive_idx", + "columns": [ + { + "expression": "is_positive", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_feedback_created_at_idx": { + "name": "copilot_feedback_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "copilot_feedback_user_id_user_id_fk": { + "name": "copilot_feedback_user_id_user_id_fk", + "tableFrom": "copilot_feedback", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "copilot_feedback_chat_id_copilot_chats_id_fk": { + "name": "copilot_feedback_chat_id_copilot_chats_id_fk", + "tableFrom": "copilot_feedback", + "tableTo": "copilot_chats", + "columnsFrom": ["chat_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.copilot_run_checkpoints": { + "name": "copilot_run_checkpoints", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "run_id": { + "name": "run_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "pending_tool_call_id": { + "name": "pending_tool_call_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "conversation_snapshot": { + "name": "conversation_snapshot", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "agent_state": { + "name": "agent_state", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "provider_request": { + "name": "provider_request", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "copilot_run_checkpoints_run_id_idx": { + "name": "copilot_run_checkpoints_run_id_idx", + "columns": [ + { + "expression": "run_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_run_checkpoints_pending_tool_call_id_idx": { + "name": "copilot_run_checkpoints_pending_tool_call_id_idx", + "columns": [ + { + "expression": "pending_tool_call_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_run_checkpoints_run_pending_tool_unique": { + "name": "copilot_run_checkpoints_run_pending_tool_unique", + "columns": [ + { + "expression": "run_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "pending_tool_call_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "copilot_run_checkpoints_run_id_copilot_runs_id_fk": { + "name": "copilot_run_checkpoints_run_id_copilot_runs_id_fk", + "tableFrom": "copilot_run_checkpoints", + "tableTo": "copilot_runs", + "columnsFrom": ["run_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.copilot_runs": { + "name": "copilot_runs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "execution_id": { + "name": "execution_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "parent_run_id": { + "name": "parent_run_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "chat_id": { + "name": "chat_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stream_id": { + "name": "stream_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "agent": { + "name": "agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "model": { + "name": "model", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "copilot_run_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "request_context": { + "name": "request_context", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "started_at": { + "name": "started_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "error": { + "name": "error", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "copilot_runs_execution_id_idx": { + "name": "copilot_runs_execution_id_idx", + "columns": [ + { + "expression": "execution_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_runs_parent_run_id_idx": { + "name": "copilot_runs_parent_run_id_idx", + "columns": [ + { + "expression": "parent_run_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_runs_chat_id_idx": { + "name": "copilot_runs_chat_id_idx", + "columns": [ + { + "expression": "chat_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_runs_user_id_idx": { + "name": "copilot_runs_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_runs_workflow_id_idx": { + "name": "copilot_runs_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_runs_workspace_id_idx": { + "name": "copilot_runs_workspace_id_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_runs_status_idx": { + "name": "copilot_runs_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_runs_chat_execution_idx": { + "name": "copilot_runs_chat_execution_idx", + "columns": [ + { + "expression": "chat_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "execution_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_runs_execution_started_at_idx": { + "name": "copilot_runs_execution_started_at_idx", + "columns": [ + { + "expression": "execution_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "started_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_runs_stream_id_unique": { + "name": "copilot_runs_stream_id_unique", + "columns": [ + { + "expression": "stream_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "copilot_runs_chat_id_copilot_chats_id_fk": { + "name": "copilot_runs_chat_id_copilot_chats_id_fk", + "tableFrom": "copilot_runs", + "tableTo": "copilot_chats", + "columnsFrom": ["chat_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "copilot_runs_user_id_user_id_fk": { + "name": "copilot_runs_user_id_user_id_fk", + "tableFrom": "copilot_runs", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "copilot_runs_workflow_id_workflow_id_fk": { + "name": "copilot_runs_workflow_id_workflow_id_fk", + "tableFrom": "copilot_runs", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "copilot_runs_workspace_id_workspace_id_fk": { + "name": "copilot_runs_workspace_id_workspace_id_fk", + "tableFrom": "copilot_runs", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.copilot_workflow_read_hashes": { + "name": "copilot_workflow_read_hashes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "chat_id": { + "name": "chat_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "copilot_workflow_read_hashes_chat_id_idx": { + "name": "copilot_workflow_read_hashes_chat_id_idx", + "columns": [ + { + "expression": "chat_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_workflow_read_hashes_workflow_id_idx": { + "name": "copilot_workflow_read_hashes_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "copilot_workflow_read_hashes_chat_workflow_unique": { + "name": "copilot_workflow_read_hashes_chat_workflow_unique", + "columns": [ + { + "expression": "chat_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "copilot_workflow_read_hashes_chat_id_copilot_chats_id_fk": { + "name": "copilot_workflow_read_hashes_chat_id_copilot_chats_id_fk", + "tableFrom": "copilot_workflow_read_hashes", + "tableTo": "copilot_chats", + "columnsFrom": ["chat_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "copilot_workflow_read_hashes_workflow_id_workflow_id_fk": { + "name": "copilot_workflow_read_hashes_workflow_id_workflow_id_fk", + "tableFrom": "copilot_workflow_read_hashes", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.credential": { + "name": "credential", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "credential_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env_key": { + "name": "env_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "env_owner_user_id": { + "name": "env_owner_user_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "encrypted_service_account_key": { + "name": "encrypted_service_account_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "credential_workspace_id_idx": { + "name": "credential_workspace_id_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_type_idx": { + "name": "credential_type_idx", + "columns": [ + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_provider_id_idx": { + "name": "credential_provider_id_idx", + "columns": [ + { + "expression": "provider_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_account_id_idx": { + "name": "credential_account_id_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_env_owner_user_id_idx": { + "name": "credential_env_owner_user_id_idx", + "columns": [ + { + "expression": "env_owner_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_workspace_account_unique": { + "name": "credential_workspace_account_unique", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "account_id IS NOT NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_workspace_env_unique": { + "name": "credential_workspace_env_unique", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "env_key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "type = 'env_workspace'", + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_workspace_personal_env_unique": { + "name": "credential_workspace_personal_env_unique", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "env_key", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "env_owner_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "type = 'env_personal'", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "credential_workspace_id_workspace_id_fk": { + "name": "credential_workspace_id_workspace_id_fk", + "tableFrom": "credential", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_account_id_account_id_fk": { + "name": "credential_account_id_account_id_fk", + "tableFrom": "credential", + "tableTo": "account", + "columnsFrom": ["account_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_env_owner_user_id_user_id_fk": { + "name": "credential_env_owner_user_id_user_id_fk", + "tableFrom": "credential", + "tableTo": "user", + "columnsFrom": ["env_owner_user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_created_by_user_id_fk": { + "name": "credential_created_by_user_id_fk", + "tableFrom": "credential", + "tableTo": "user", + "columnsFrom": ["created_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "credential_oauth_source_check": { + "name": "credential_oauth_source_check", + "value": "(type <> 'oauth') OR (account_id IS NOT NULL AND provider_id IS NOT NULL)" + }, + "credential_workspace_env_source_check": { + "name": "credential_workspace_env_source_check", + "value": "(type <> 'env_workspace') OR (env_key IS NOT NULL AND env_owner_user_id IS NULL)" + }, + "credential_personal_env_source_check": { + "name": "credential_personal_env_source_check", + "value": "(type <> 'env_personal') OR (env_key IS NOT NULL AND env_owner_user_id IS NOT NULL)" + } + }, + "isRLSEnabled": false + }, + "public.credential_member": { + "name": "credential_member", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "credential_id": { + "name": "credential_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "credential_member_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'member'" + }, + "status": { + "name": "status", + "type": "credential_member_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "joined_at": { + "name": "joined_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "invited_by": { + "name": "invited_by", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "credential_member_user_id_idx": { + "name": "credential_member_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_member_role_idx": { + "name": "credential_member_role_idx", + "columns": [ + { + "expression": "role", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_member_status_idx": { + "name": "credential_member_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_member_unique": { + "name": "credential_member_unique", + "columns": [ + { + "expression": "credential_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "credential_member_credential_id_credential_id_fk": { + "name": "credential_member_credential_id_credential_id_fk", + "tableFrom": "credential_member", + "tableTo": "credential", + "columnsFrom": ["credential_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_member_user_id_user_id_fk": { + "name": "credential_member_user_id_user_id_fk", + "tableFrom": "credential_member", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_member_invited_by_user_id_fk": { + "name": "credential_member_invited_by_user_id_fk", + "tableFrom": "credential_member", + "tableTo": "user", + "columnsFrom": ["invited_by"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.credential_set": { + "name": "credential_set", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "credential_set_created_by_idx": { + "name": "credential_set_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_set_org_name_unique": { + "name": "credential_set_org_name_unique", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_set_provider_id_idx": { + "name": "credential_set_provider_id_idx", + "columns": [ + { + "expression": "provider_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "credential_set_organization_id_organization_id_fk": { + "name": "credential_set_organization_id_organization_id_fk", + "tableFrom": "credential_set", + "tableTo": "organization", + "columnsFrom": ["organization_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_set_created_by_user_id_fk": { + "name": "credential_set_created_by_user_id_fk", + "tableFrom": "credential_set", + "tableTo": "user", + "columnsFrom": ["created_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.credential_set_invitation": { + "name": "credential_set_invitation", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "credential_set_id": { + "name": "credential_set_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "invited_by": { + "name": "invited_by", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "credential_set_invitation_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "accepted_at": { + "name": "accepted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "accepted_by_user_id": { + "name": "accepted_by_user_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "credential_set_invitation_set_id_idx": { + "name": "credential_set_invitation_set_id_idx", + "columns": [ + { + "expression": "credential_set_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_set_invitation_token_idx": { + "name": "credential_set_invitation_token_idx", + "columns": [ + { + "expression": "token", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_set_invitation_status_idx": { + "name": "credential_set_invitation_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_set_invitation_expires_at_idx": { + "name": "credential_set_invitation_expires_at_idx", + "columns": [ + { + "expression": "expires_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "credential_set_invitation_credential_set_id_credential_set_id_fk": { + "name": "credential_set_invitation_credential_set_id_credential_set_id_fk", + "tableFrom": "credential_set_invitation", + "tableTo": "credential_set", + "columnsFrom": ["credential_set_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_set_invitation_invited_by_user_id_fk": { + "name": "credential_set_invitation_invited_by_user_id_fk", + "tableFrom": "credential_set_invitation", + "tableTo": "user", + "columnsFrom": ["invited_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_set_invitation_accepted_by_user_id_user_id_fk": { + "name": "credential_set_invitation_accepted_by_user_id_user_id_fk", + "tableFrom": "credential_set_invitation", + "tableTo": "user", + "columnsFrom": ["accepted_by_user_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "credential_set_invitation_token_unique": { + "name": "credential_set_invitation_token_unique", + "nullsNotDistinct": false, + "columns": ["token"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.credential_set_member": { + "name": "credential_set_member", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "credential_set_id": { + "name": "credential_set_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "credential_set_member_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "joined_at": { + "name": "joined_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "invited_by": { + "name": "invited_by", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "credential_set_member_user_id_idx": { + "name": "credential_set_member_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_set_member_unique": { + "name": "credential_set_member_unique", + "columns": [ + { + "expression": "credential_set_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "credential_set_member_status_idx": { + "name": "credential_set_member_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "credential_set_member_credential_set_id_credential_set_id_fk": { + "name": "credential_set_member_credential_set_id_credential_set_id_fk", + "tableFrom": "credential_set_member", + "tableTo": "credential_set", + "columnsFrom": ["credential_set_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_set_member_user_id_user_id_fk": { + "name": "credential_set_member_user_id_user_id_fk", + "tableFrom": "credential_set_member", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "credential_set_member_invited_by_user_id_fk": { + "name": "credential_set_member_invited_by_user_id_fk", + "tableFrom": "credential_set_member", + "tableTo": "user", + "columnsFrom": ["invited_by"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.custom_tools": { + "name": "custom_tools", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "schema": { + "name": "schema", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "code": { + "name": "code", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "custom_tools_workspace_id_idx": { + "name": "custom_tools_workspace_id_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "custom_tools_workspace_title_unique": { + "name": "custom_tools_workspace_title_unique", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "title", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "custom_tools_workspace_id_workspace_id_fk": { + "name": "custom_tools_workspace_id_workspace_id_fk", + "tableFrom": "custom_tools", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "custom_tools_user_id_user_id_fk": { + "name": "custom_tools_user_id_user_id_fk", + "tableFrom": "custom_tools", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.docs_embeddings": { + "name": "docs_embeddings", + "schema": "", + "columns": { + "chunk_id": { + "name": "chunk_id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "chunk_text": { + "name": "chunk_text", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "source_document": { + "name": "source_document", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "source_link": { + "name": "source_link", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "header_text": { + "name": "header_text", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "header_level": { + "name": "header_level", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "token_count": { + "name": "token_count", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "embedding": { + "name": "embedding", + "type": "vector(1536)", + "primaryKey": false, + "notNull": true + }, + "embedding_model": { + "name": "embedding_model", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'text-embedding-3-small'" + }, + "metadata": { + "name": "metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "chunk_text_tsv": { + "name": "chunk_text_tsv", + "type": "tsvector", + "primaryKey": false, + "notNull": false, + "generated": { + "as": "to_tsvector('english', \"docs_embeddings\".\"chunk_text\")", + "type": "stored" + } + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "docs_emb_source_document_idx": { + "name": "docs_emb_source_document_idx", + "columns": [ + { + "expression": "source_document", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "docs_emb_header_level_idx": { + "name": "docs_emb_header_level_idx", + "columns": [ + { + "expression": "header_level", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "docs_emb_source_header_idx": { + "name": "docs_emb_source_header_idx", + "columns": [ + { + "expression": "source_document", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "header_level", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "docs_emb_model_idx": { + "name": "docs_emb_model_idx", + "columns": [ + { + "expression": "embedding_model", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "docs_emb_created_at_idx": { + "name": "docs_emb_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "docs_embedding_vector_hnsw_idx": { + "name": "docs_embedding_vector_hnsw_idx", + "columns": [ + { + "expression": "embedding", + "isExpression": false, + "asc": true, + "nulls": "last", + "opclass": "vector_cosine_ops" + } + ], + "isUnique": false, + "concurrently": false, + "method": "hnsw", + "with": { + "m": 16, + "ef_construction": 64 + } + }, + "docs_emb_metadata_gin_idx": { + "name": "docs_emb_metadata_gin_idx", + "columns": [ + { + "expression": "metadata", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "gin", + "with": {} + }, + "docs_emb_chunk_text_fts_idx": { + "name": "docs_emb_chunk_text_fts_idx", + "columns": [ + { + "expression": "chunk_text_tsv", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "gin", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "docs_embedding_not_null_check": { + "name": "docs_embedding_not_null_check", + "value": "\"embedding\" IS NOT NULL" + }, + "docs_header_level_check": { + "name": "docs_header_level_check", + "value": "\"header_level\" >= 1 AND \"header_level\" <= 6" + } + }, + "isRLSEnabled": false + }, + "public.document": { + "name": "document", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "knowledge_base_id": { + "name": "knowledge_base_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "filename": { + "name": "filename", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "file_url": { + "name": "file_url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "mime_type": { + "name": "mime_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chunk_count": { + "name": "chunk_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "token_count": { + "name": "token_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "character_count": { + "name": "character_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "processing_status": { + "name": "processing_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "processing_started_at": { + "name": "processing_started_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "processing_completed_at": { + "name": "processing_completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "processing_error": { + "name": "processing_error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "user_excluded": { + "name": "user_excluded", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "tag1": { + "name": "tag1", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tag2": { + "name": "tag2", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tag3": { + "name": "tag3", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tag4": { + "name": "tag4", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tag5": { + "name": "tag5", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tag6": { + "name": "tag6", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tag7": { + "name": "tag7", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "number1": { + "name": "number1", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "number2": { + "name": "number2", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "number3": { + "name": "number3", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "number4": { + "name": "number4", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "number5": { + "name": "number5", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "date1": { + "name": "date1", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "date2": { + "name": "date2", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "boolean1": { + "name": "boolean1", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "boolean2": { + "name": "boolean2", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "boolean3": { + "name": "boolean3", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "connector_id": { + "name": "connector_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "content_hash": { + "name": "content_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "source_url": { + "name": "source_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "uploaded_at": { + "name": "uploaded_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "doc_kb_id_idx": { + "name": "doc_kb_id_idx", + "columns": [ + { + "expression": "knowledge_base_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_filename_idx": { + "name": "doc_filename_idx", + "columns": [ + { + "expression": "filename", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_processing_status_idx": { + "name": "doc_processing_status_idx", + "columns": [ + { + "expression": "knowledge_base_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "processing_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_connector_external_id_idx": { + "name": "doc_connector_external_id_idx", + "columns": [ + { + "expression": "connector_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "external_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"document\".\"deleted_at\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_connector_id_idx": { + "name": "doc_connector_id_idx", + "columns": [ + { + "expression": "connector_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_archived_at_idx": { + "name": "doc_archived_at_idx", + "columns": [ + { + "expression": "archived_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_deleted_at_idx": { + "name": "doc_deleted_at_idx", + "columns": [ + { + "expression": "deleted_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_tag1_idx": { + "name": "doc_tag1_idx", + "columns": [ + { + "expression": "tag1", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_tag2_idx": { + "name": "doc_tag2_idx", + "columns": [ + { + "expression": "tag2", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_tag3_idx": { + "name": "doc_tag3_idx", + "columns": [ + { + "expression": "tag3", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_tag4_idx": { + "name": "doc_tag4_idx", + "columns": [ + { + "expression": "tag4", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_tag5_idx": { + "name": "doc_tag5_idx", + "columns": [ + { + "expression": "tag5", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_tag6_idx": { + "name": "doc_tag6_idx", + "columns": [ + { + "expression": "tag6", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_tag7_idx": { + "name": "doc_tag7_idx", + "columns": [ + { + "expression": "tag7", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_number1_idx": { + "name": "doc_number1_idx", + "columns": [ + { + "expression": "number1", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_number2_idx": { + "name": "doc_number2_idx", + "columns": [ + { + "expression": "number2", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_number3_idx": { + "name": "doc_number3_idx", + "columns": [ + { + "expression": "number3", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_number4_idx": { + "name": "doc_number4_idx", + "columns": [ + { + "expression": "number4", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_number5_idx": { + "name": "doc_number5_idx", + "columns": [ + { + "expression": "number5", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_date1_idx": { + "name": "doc_date1_idx", + "columns": [ + { + "expression": "date1", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_date2_idx": { + "name": "doc_date2_idx", + "columns": [ + { + "expression": "date2", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_boolean1_idx": { + "name": "doc_boolean1_idx", + "columns": [ + { + "expression": "boolean1", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_boolean2_idx": { + "name": "doc_boolean2_idx", + "columns": [ + { + "expression": "boolean2", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "doc_boolean3_idx": { + "name": "doc_boolean3_idx", + "columns": [ + { + "expression": "boolean3", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "document_knowledge_base_id_knowledge_base_id_fk": { + "name": "document_knowledge_base_id_knowledge_base_id_fk", + "tableFrom": "document", + "tableTo": "knowledge_base", + "columnsFrom": ["knowledge_base_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "document_connector_id_knowledge_connector_id_fk": { + "name": "document_connector_id_knowledge_connector_id_fk", + "tableFrom": "document", + "tableTo": "knowledge_connector", + "columnsFrom": ["connector_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.embedding": { + "name": "embedding", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "knowledge_base_id": { + "name": "knowledge_base_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "document_id": { + "name": "document_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chunk_index": { + "name": "chunk_index", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "chunk_hash": { + "name": "chunk_hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "content_length": { + "name": "content_length", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "token_count": { + "name": "token_count", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "embedding": { + "name": "embedding", + "type": "vector(1536)", + "primaryKey": false, + "notNull": false + }, + "embedding_model": { + "name": "embedding_model", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'text-embedding-3-small'" + }, + "start_offset": { + "name": "start_offset", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "end_offset": { + "name": "end_offset", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "tag1": { + "name": "tag1", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tag2": { + "name": "tag2", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tag3": { + "name": "tag3", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tag4": { + "name": "tag4", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tag5": { + "name": "tag5", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tag6": { + "name": "tag6", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "tag7": { + "name": "tag7", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "number1": { + "name": "number1", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "number2": { + "name": "number2", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "number3": { + "name": "number3", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "number4": { + "name": "number4", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "number5": { + "name": "number5", + "type": "double precision", + "primaryKey": false, + "notNull": false + }, + "date1": { + "name": "date1", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "date2": { + "name": "date2", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "boolean1": { + "name": "boolean1", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "boolean2": { + "name": "boolean2", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "boolean3": { + "name": "boolean3", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "content_tsv": { + "name": "content_tsv", + "type": "tsvector", + "primaryKey": false, + "notNull": false, + "generated": { + "as": "to_tsvector('english', \"embedding\".\"content\")", + "type": "stored" + } + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "emb_kb_id_idx": { + "name": "emb_kb_id_idx", + "columns": [ + { + "expression": "knowledge_base_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_doc_id_idx": { + "name": "emb_doc_id_idx", + "columns": [ + { + "expression": "document_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_doc_chunk_idx": { + "name": "emb_doc_chunk_idx", + "columns": [ + { + "expression": "document_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "chunk_index", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_kb_model_idx": { + "name": "emb_kb_model_idx", + "columns": [ + { + "expression": "knowledge_base_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "embedding_model", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_kb_enabled_idx": { + "name": "emb_kb_enabled_idx", + "columns": [ + { + "expression": "knowledge_base_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "enabled", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_doc_enabled_idx": { + "name": "emb_doc_enabled_idx", + "columns": [ + { + "expression": "document_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "enabled", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "embedding_vector_hnsw_idx": { + "name": "embedding_vector_hnsw_idx", + "columns": [ + { + "expression": "embedding", + "isExpression": false, + "asc": true, + "nulls": "last", + "opclass": "vector_cosine_ops" + } + ], + "isUnique": false, + "concurrently": false, + "method": "hnsw", + "with": { + "m": 16, + "ef_construction": 64 + } + }, + "emb_tag1_idx": { + "name": "emb_tag1_idx", + "columns": [ + { + "expression": "tag1", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_tag2_idx": { + "name": "emb_tag2_idx", + "columns": [ + { + "expression": "tag2", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_tag3_idx": { + "name": "emb_tag3_idx", + "columns": [ + { + "expression": "tag3", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_tag4_idx": { + "name": "emb_tag4_idx", + "columns": [ + { + "expression": "tag4", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_tag5_idx": { + "name": "emb_tag5_idx", + "columns": [ + { + "expression": "tag5", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_tag6_idx": { + "name": "emb_tag6_idx", + "columns": [ + { + "expression": "tag6", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_tag7_idx": { + "name": "emb_tag7_idx", + "columns": [ + { + "expression": "tag7", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_number1_idx": { + "name": "emb_number1_idx", + "columns": [ + { + "expression": "number1", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_number2_idx": { + "name": "emb_number2_idx", + "columns": [ + { + "expression": "number2", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_number3_idx": { + "name": "emb_number3_idx", + "columns": [ + { + "expression": "number3", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_number4_idx": { + "name": "emb_number4_idx", + "columns": [ + { + "expression": "number4", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_number5_idx": { + "name": "emb_number5_idx", + "columns": [ + { + "expression": "number5", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_date1_idx": { + "name": "emb_date1_idx", + "columns": [ + { + "expression": "date1", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_date2_idx": { + "name": "emb_date2_idx", + "columns": [ + { + "expression": "date2", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_boolean1_idx": { + "name": "emb_boolean1_idx", + "columns": [ + { + "expression": "boolean1", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_boolean2_idx": { + "name": "emb_boolean2_idx", + "columns": [ + { + "expression": "boolean2", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_boolean3_idx": { + "name": "emb_boolean3_idx", + "columns": [ + { + "expression": "boolean3", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "emb_content_fts_idx": { + "name": "emb_content_fts_idx", + "columns": [ + { + "expression": "content_tsv", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "gin", + "with": {} + } + }, + "foreignKeys": { + "embedding_knowledge_base_id_knowledge_base_id_fk": { + "name": "embedding_knowledge_base_id_knowledge_base_id_fk", + "tableFrom": "embedding", + "tableTo": "knowledge_base", + "columnsFrom": ["knowledge_base_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "embedding_document_id_document_id_fk": { + "name": "embedding_document_id_document_id_fk", + "tableFrom": "embedding", + "tableTo": "document", + "columnsFrom": ["document_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "embedding_not_null_check": { + "name": "embedding_not_null_check", + "value": "\"embedding\" IS NOT NULL" + } + }, + "isRLSEnabled": false + }, + "public.environment": { + "name": "environment", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "variables": { + "name": "variables", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "environment_user_id_user_id_fk": { + "name": "environment_user_id_user_id_fk", + "tableFrom": "environment", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "environment_user_id_unique": { + "name": "environment_user_id_unique", + "nullsNotDistinct": false, + "columns": ["user_id"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.form": { + "name": "form", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "customizations": { + "name": "customizations", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "auth_type": { + "name": "auth_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'public'" + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "allowed_emails": { + "name": "allowed_emails", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'[]'" + }, + "show_branding": { + "name": "show_branding", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "form_identifier_idx": { + "name": "form_identifier_idx", + "columns": [ + { + "expression": "identifier", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"form\".\"archived_at\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "form_workflow_id_idx": { + "name": "form_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "form_user_id_idx": { + "name": "form_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "form_archived_at_idx": { + "name": "form_archived_at_idx", + "columns": [ + { + "expression": "archived_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "form_workflow_id_workflow_id_fk": { + "name": "form_workflow_id_workflow_id_fk", + "tableFrom": "form", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "form_user_id_user_id_fk": { + "name": "form_user_id_user_id_fk", + "tableFrom": "form", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.idempotency_key": { + "name": "idempotency_key", + "schema": "", + "columns": { + "key": { + "name": "key", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "result": { + "name": "result", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "idempotency_key_created_at_idx": { + "name": "idempotency_key_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.invitation": { + "name": "invitation", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "inviter_id": { + "name": "inviter_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "invitation_email_idx": { + "name": "invitation_email_idx", + "columns": [ + { + "expression": "email", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "invitation_organization_id_idx": { + "name": "invitation_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "invitation_inviter_id_user_id_fk": { + "name": "invitation_inviter_id_user_id_fk", + "tableFrom": "invitation", + "tableTo": "user", + "columnsFrom": ["inviter_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "invitation_organization_id_organization_id_fk": { + "name": "invitation_organization_id_organization_id_fk", + "tableFrom": "invitation", + "tableTo": "organization", + "columnsFrom": ["organization_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.job_execution_logs": { + "name": "job_execution_logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "schedule_id": { + "name": "schedule_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "execution_id": { + "name": "execution_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "level": { + "name": "level", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'running'" + }, + "trigger": { + "name": "trigger", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "started_at": { + "name": "started_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ended_at": { + "name": "ended_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "total_duration_ms": { + "name": "total_duration_ms", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "execution_data": { + "name": "execution_data", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "cost": { + "name": "cost", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "job_execution_logs_schedule_id_idx": { + "name": "job_execution_logs_schedule_id_idx", + "columns": [ + { + "expression": "schedule_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "job_execution_logs_workspace_started_at_idx": { + "name": "job_execution_logs_workspace_started_at_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "started_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "job_execution_logs_execution_id_unique": { + "name": "job_execution_logs_execution_id_unique", + "columns": [ + { + "expression": "execution_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "job_execution_logs_trigger_idx": { + "name": "job_execution_logs_trigger_idx", + "columns": [ + { + "expression": "trigger", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "job_execution_logs_schedule_id_workflow_schedule_id_fk": { + "name": "job_execution_logs_schedule_id_workflow_schedule_id_fk", + "tableFrom": "job_execution_logs", + "tableTo": "workflow_schedule", + "columnsFrom": ["schedule_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + }, + "job_execution_logs_workspace_id_workspace_id_fk": { + "name": "job_execution_logs_workspace_id_workspace_id_fk", + "tableFrom": "job_execution_logs", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.jwks": { + "name": "jwks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "public_key": { + "name": "public_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "private_key": { + "name": "private_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.knowledge_base": { + "name": "knowledge_base", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "token_count": { + "name": "token_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "embedding_model": { + "name": "embedding_model", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'text-embedding-3-small'" + }, + "embedding_dimension": { + "name": "embedding_dimension", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1536 + }, + "chunking_config": { + "name": "chunking_config", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'{\"maxSize\": 1024, \"minSize\": 1, \"overlap\": 200}'" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "kb_user_id_idx": { + "name": "kb_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "kb_workspace_id_idx": { + "name": "kb_workspace_id_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "kb_user_workspace_idx": { + "name": "kb_user_workspace_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "kb_deleted_at_idx": { + "name": "kb_deleted_at_idx", + "columns": [ + { + "expression": "deleted_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "kb_workspace_name_active_unique": { + "name": "kb_workspace_name_active_unique", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"knowledge_base\".\"deleted_at\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "knowledge_base_user_id_user_id_fk": { + "name": "knowledge_base_user_id_user_id_fk", + "tableFrom": "knowledge_base", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "knowledge_base_workspace_id_workspace_id_fk": { + "name": "knowledge_base_workspace_id_workspace_id_fk", + "tableFrom": "knowledge_base", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.knowledge_base_tag_definitions": { + "name": "knowledge_base_tag_definitions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "knowledge_base_id": { + "name": "knowledge_base_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tag_slot": { + "name": "tag_slot", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "field_type": { + "name": "field_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'text'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "kb_tag_definitions_kb_slot_idx": { + "name": "kb_tag_definitions_kb_slot_idx", + "columns": [ + { + "expression": "knowledge_base_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "tag_slot", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "kb_tag_definitions_kb_display_name_idx": { + "name": "kb_tag_definitions_kb_display_name_idx", + "columns": [ + { + "expression": "knowledge_base_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "display_name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "kb_tag_definitions_kb_id_idx": { + "name": "kb_tag_definitions_kb_id_idx", + "columns": [ + { + "expression": "knowledge_base_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "knowledge_base_tag_definitions_knowledge_base_id_knowledge_base_id_fk": { + "name": "knowledge_base_tag_definitions_knowledge_base_id_knowledge_base_id_fk", + "tableFrom": "knowledge_base_tag_definitions", + "tableTo": "knowledge_base", + "columnsFrom": ["knowledge_base_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.knowledge_connector": { + "name": "knowledge_connector", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "knowledge_base_id": { + "name": "knowledge_base_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "connector_type": { + "name": "connector_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "credential_id": { + "name": "credential_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "encrypted_api_key": { + "name": "encrypted_api_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "source_config": { + "name": "source_config", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "sync_mode": { + "name": "sync_mode", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'full'" + }, + "sync_interval_minutes": { + "name": "sync_interval_minutes", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1440 + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "last_sync_error": { + "name": "last_sync_error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "last_sync_doc_count": { + "name": "last_sync_doc_count", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "next_sync_at": { + "name": "next_sync_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "consecutive_failures": { + "name": "consecutive_failures", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "kc_knowledge_base_id_idx": { + "name": "kc_knowledge_base_id_idx", + "columns": [ + { + "expression": "knowledge_base_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "kc_status_next_sync_idx": { + "name": "kc_status_next_sync_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "next_sync_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "kc_archived_at_idx": { + "name": "kc_archived_at_idx", + "columns": [ + { + "expression": "archived_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "kc_deleted_at_idx": { + "name": "kc_deleted_at_idx", + "columns": [ + { + "expression": "deleted_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "knowledge_connector_knowledge_base_id_knowledge_base_id_fk": { + "name": "knowledge_connector_knowledge_base_id_knowledge_base_id_fk", + "tableFrom": "knowledge_connector", + "tableTo": "knowledge_base", + "columnsFrom": ["knowledge_base_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.knowledge_connector_sync_log": { + "name": "knowledge_connector_sync_log", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "connector_id": { + "name": "connector_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "started_at": { + "name": "started_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "docs_added": { + "name": "docs_added", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "docs_updated": { + "name": "docs_updated", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "docs_deleted": { + "name": "docs_deleted", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "docs_unchanged": { + "name": "docs_unchanged", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "docs_failed": { + "name": "docs_failed", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "kcsl_connector_id_idx": { + "name": "kcsl_connector_id_idx", + "columns": [ + { + "expression": "connector_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "knowledge_connector_sync_log_connector_id_knowledge_connector_id_fk": { + "name": "knowledge_connector_sync_log_connector_id_knowledge_connector_id_fk", + "tableFrom": "knowledge_connector_sync_log", + "tableTo": "knowledge_connector", + "columnsFrom": ["connector_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mcp_servers": { + "name": "mcp_servers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "transport": { + "name": "transport", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "headers": { + "name": "headers", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "timeout": { + "name": "timeout", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 30000 + }, + "retries": { + "name": "retries", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 3 + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "last_connected": { + "name": "last_connected", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "connection_status": { + "name": "connection_status", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'disconnected'" + }, + "last_error": { + "name": "last_error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status_config": { + "name": "status_config", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "tool_count": { + "name": "tool_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "last_tools_refresh": { + "name": "last_tools_refresh", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "total_requests": { + "name": "total_requests", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "last_used": { + "name": "last_used", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "mcp_servers_workspace_enabled_idx": { + "name": "mcp_servers_workspace_enabled_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "enabled", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "mcp_servers_workspace_deleted_idx": { + "name": "mcp_servers_workspace_deleted_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "deleted_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "mcp_servers_workspace_id_workspace_id_fk": { + "name": "mcp_servers_workspace_id_workspace_id_fk", + "tableFrom": "mcp_servers", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mcp_servers_created_by_user_id_fk": { + "name": "mcp_servers_created_by_user_id_fk", + "tableFrom": "mcp_servers", + "tableTo": "user", + "columnsFrom": ["created_by"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.member": { + "name": "member", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "member_user_id_unique": { + "name": "member_user_id_unique", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "member_organization_id_idx": { + "name": "member_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "member_user_id_user_id_fk": { + "name": "member_user_id_user_id_fk", + "tableFrom": "member", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "member_organization_id_organization_id_fk": { + "name": "member_organization_id_organization_id_fk", + "tableFrom": "member", + "tableTo": "organization", + "columnsFrom": ["organization_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.memory": { + "name": "memory", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "data": { + "name": "data", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "memory_key_idx": { + "name": "memory_key_idx", + "columns": [ + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "memory_workspace_idx": { + "name": "memory_workspace_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "memory_workspace_key_idx": { + "name": "memory_workspace_key_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "memory_workspace_id_workspace_id_fk": { + "name": "memory_workspace_id_workspace_id_fk", + "tableFrom": "memory", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mothership_inbox_allowed_sender": { + "name": "mothership_inbox_allowed_sender", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "added_by": { + "name": "added_by", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "inbox_sender_ws_email_idx": { + "name": "inbox_sender_ws_email_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "email", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "mothership_inbox_allowed_sender_workspace_id_workspace_id_fk": { + "name": "mothership_inbox_allowed_sender_workspace_id_workspace_id_fk", + "tableFrom": "mothership_inbox_allowed_sender", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mothership_inbox_allowed_sender_added_by_user_id_fk": { + "name": "mothership_inbox_allowed_sender_added_by_user_id_fk", + "tableFrom": "mothership_inbox_allowed_sender", + "tableTo": "user", + "columnsFrom": ["added_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mothership_inbox_task": { + "name": "mothership_inbox_task", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "from_email": { + "name": "from_email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "from_name": { + "name": "from_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "subject": { + "name": "subject", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "body_preview": { + "name": "body_preview", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "body_text": { + "name": "body_text", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "body_html": { + "name": "body_html", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "email_message_id": { + "name": "email_message_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "in_reply_to": { + "name": "in_reply_to", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "response_message_id": { + "name": "response_message_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "agentmail_message_id": { + "name": "agentmail_message_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'received'" + }, + "chat_id": { + "name": "chat_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "trigger_job_id": { + "name": "trigger_job_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "result_summary": { + "name": "result_summary", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "rejection_reason": { + "name": "rejection_reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "has_attachments": { + "name": "has_attachments", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "cc_recipients": { + "name": "cc_recipients", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "processing_started_at": { + "name": "processing_started_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "inbox_task_ws_created_at_idx": { + "name": "inbox_task_ws_created_at_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "inbox_task_ws_status_idx": { + "name": "inbox_task_ws_status_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "inbox_task_response_msg_id_idx": { + "name": "inbox_task_response_msg_id_idx", + "columns": [ + { + "expression": "response_message_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "inbox_task_email_msg_id_idx": { + "name": "inbox_task_email_msg_id_idx", + "columns": [ + { + "expression": "email_message_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "mothership_inbox_task_workspace_id_workspace_id_fk": { + "name": "mothership_inbox_task_workspace_id_workspace_id_fk", + "tableFrom": "mothership_inbox_task", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mothership_inbox_task_chat_id_copilot_chats_id_fk": { + "name": "mothership_inbox_task_chat_id_copilot_chats_id_fk", + "tableFrom": "mothership_inbox_task", + "tableTo": "copilot_chats", + "columnsFrom": ["chat_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.mothership_inbox_webhook": { + "name": "mothership_inbox_webhook", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "webhook_id": { + "name": "webhook_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "mothership_inbox_webhook_workspace_id_workspace_id_fk": { + "name": "mothership_inbox_webhook_workspace_id_workspace_id_fk", + "tableFrom": "mothership_inbox_webhook", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "mothership_inbox_webhook_workspace_id_unique": { + "name": "mothership_inbox_webhook_workspace_id_unique", + "nullsNotDistinct": false, + "columns": ["workspace_id"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.oauth_access_token": { + "name": "oauth_access_token", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "client_id": { + "name": "client_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "scopes": { + "name": "scopes", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "oauth_access_token_access_token_idx": { + "name": "oauth_access_token_access_token_idx", + "columns": [ + { + "expression": "access_token", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "oauth_access_token_refresh_token_idx": { + "name": "oauth_access_token_refresh_token_idx", + "columns": [ + { + "expression": "refresh_token", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "oauth_access_token_client_id_oauth_application_client_id_fk": { + "name": "oauth_access_token_client_id_oauth_application_client_id_fk", + "tableFrom": "oauth_access_token", + "tableTo": "oauth_application", + "columnsFrom": ["client_id"], + "columnsTo": ["client_id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "oauth_access_token_user_id_user_id_fk": { + "name": "oauth_access_token_user_id_user_id_fk", + "tableFrom": "oauth_access_token", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "oauth_access_token_access_token_unique": { + "name": "oauth_access_token_access_token_unique", + "nullsNotDistinct": false, + "columns": ["access_token"] + }, + "oauth_access_token_refresh_token_unique": { + "name": "oauth_access_token_refresh_token_unique", + "nullsNotDistinct": false, + "columns": ["refresh_token"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.oauth_application": { + "name": "oauth_application", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "icon": { + "name": "icon", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_id": { + "name": "client_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "client_secret": { + "name": "client_secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "redirect_urls": { + "name": "redirect_urls", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "disabled": { + "name": "disabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "oauth_application_client_id_idx": { + "name": "oauth_application_client_id_idx", + "columns": [ + { + "expression": "client_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "oauth_application_user_id_user_id_fk": { + "name": "oauth_application_user_id_user_id_fk", + "tableFrom": "oauth_application", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "oauth_application_client_id_unique": { + "name": "oauth_application_client_id_unique", + "nullsNotDistinct": false, + "columns": ["client_id"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.oauth_consent": { + "name": "oauth_consent", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "client_id": { + "name": "client_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "scopes": { + "name": "scopes", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "consent_given": { + "name": "consent_given", + "type": "boolean", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "oauth_consent_user_client_idx": { + "name": "oauth_consent_user_client_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "client_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "oauth_consent_client_id_oauth_application_client_id_fk": { + "name": "oauth_consent_client_id_oauth_application_client_id_fk", + "tableFrom": "oauth_consent", + "tableTo": "oauth_application", + "columnsFrom": ["client_id"], + "columnsTo": ["client_id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "oauth_consent_user_id_user_id_fk": { + "name": "oauth_consent_user_id_user_id_fk", + "tableFrom": "oauth_consent", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.organization": { + "name": "organization", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "logo": { + "name": "logo", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "whitelabel_settings": { + "name": "whitelabel_settings", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "org_usage_limit": { + "name": "org_usage_limit", + "type": "numeric", + "primaryKey": false, + "notNull": false + }, + "storage_used_bytes": { + "name": "storage_used_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "departed_member_usage": { + "name": "departed_member_usage", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "credit_balance": { + "name": "credit_balance", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.outbox_event": { + "name": "outbox_event", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "event_type": { + "name": "event_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "payload": { + "name": "payload", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "attempts": { + "name": "attempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "max_attempts": { + "name": "max_attempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 10 + }, + "available_at": { + "name": "available_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "locked_at": { + "name": "locked_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "last_error": { + "name": "last_error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "processed_at": { + "name": "processed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "outbox_event_status_available_idx": { + "name": "outbox_event_status_available_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "available_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "outbox_event_locked_at_idx": { + "name": "outbox_event_locked_at_idx", + "columns": [ + { + "expression": "locked_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.paused_executions": { + "name": "paused_executions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "execution_id": { + "name": "execution_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "execution_snapshot": { + "name": "execution_snapshot", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "pause_points": { + "name": "pause_points", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "total_pause_count": { + "name": "total_pause_count", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "resumed_count": { + "name": "resumed_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'paused'" + }, + "metadata": { + "name": "metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'::jsonb" + }, + "paused_at": { + "name": "paused_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "paused_executions_workflow_id_idx": { + "name": "paused_executions_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "paused_executions_status_idx": { + "name": "paused_executions_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "paused_executions_execution_id_unique": { + "name": "paused_executions_execution_id_unique", + "columns": [ + { + "expression": "execution_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "paused_executions_workflow_id_workflow_id_fk": { + "name": "paused_executions_workflow_id_workflow_id_fk", + "tableFrom": "paused_executions", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.pending_credential_draft": { + "name": "pending_credential_draft", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "credential_id": { + "name": "credential_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "pending_draft_user_provider_ws": { + "name": "pending_draft_user_provider_ws", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "provider_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "pending_credential_draft_user_id_user_id_fk": { + "name": "pending_credential_draft_user_id_user_id_fk", + "tableFrom": "pending_credential_draft", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "pending_credential_draft_workspace_id_workspace_id_fk": { + "name": "pending_credential_draft_workspace_id_workspace_id_fk", + "tableFrom": "pending_credential_draft", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "pending_credential_draft_credential_id_credential_id_fk": { + "name": "pending_credential_draft_credential_id_credential_id_fk", + "tableFrom": "pending_credential_draft", + "tableTo": "credential", + "columnsFrom": ["credential_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.permission_group": { + "name": "permission_group", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "config": { + "name": "config", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "auto_add_new_members": { + "name": "auto_add_new_members", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": { + "permission_group_created_by_idx": { + "name": "permission_group_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "permission_group_org_name_unique": { + "name": "permission_group_org_name_unique", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "permission_group_org_auto_add_unique": { + "name": "permission_group_org_auto_add_unique", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "auto_add_new_members = true", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "permission_group_organization_id_organization_id_fk": { + "name": "permission_group_organization_id_organization_id_fk", + "tableFrom": "permission_group", + "tableTo": "organization", + "columnsFrom": ["organization_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "permission_group_created_by_user_id_fk": { + "name": "permission_group_created_by_user_id_fk", + "tableFrom": "permission_group", + "tableTo": "user", + "columnsFrom": ["created_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.permission_group_member": { + "name": "permission_group_member", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "permission_group_id": { + "name": "permission_group_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "assigned_by": { + "name": "assigned_by", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "assigned_at": { + "name": "assigned_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "permission_group_member_group_id_idx": { + "name": "permission_group_member_group_id_idx", + "columns": [ + { + "expression": "permission_group_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "permission_group_member_user_id_unique": { + "name": "permission_group_member_user_id_unique", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "permission_group_member_permission_group_id_permission_group_id_fk": { + "name": "permission_group_member_permission_group_id_permission_group_id_fk", + "tableFrom": "permission_group_member", + "tableTo": "permission_group", + "columnsFrom": ["permission_group_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "permission_group_member_user_id_user_id_fk": { + "name": "permission_group_member_user_id_user_id_fk", + "tableFrom": "permission_group_member", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "permission_group_member_assigned_by_user_id_fk": { + "name": "permission_group_member_assigned_by_user_id_fk", + "tableFrom": "permission_group_member", + "tableTo": "user", + "columnsFrom": ["assigned_by"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.permissions": { + "name": "permissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "entity_type": { + "name": "entity_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "entity_id": { + "name": "entity_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permission_type": { + "name": "permission_type", + "type": "permission_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "permissions_user_id_idx": { + "name": "permissions_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "permissions_entity_idx": { + "name": "permissions_entity_idx", + "columns": [ + { + "expression": "entity_type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "entity_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "permissions_user_entity_type_idx": { + "name": "permissions_user_entity_type_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "entity_type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "permissions_user_entity_permission_idx": { + "name": "permissions_user_entity_permission_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "entity_type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "permission_type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "permissions_user_entity_idx": { + "name": "permissions_user_entity_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "entity_type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "entity_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "permissions_unique_constraint": { + "name": "permissions_unique_constraint", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "entity_type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "entity_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "permissions_user_id_user_id_fk": { + "name": "permissions_user_id_user_id_fk", + "tableFrom": "permissions", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.rate_limit_bucket": { + "name": "rate_limit_bucket", + "schema": "", + "columns": { + "key": { + "name": "key", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "tokens": { + "name": "tokens", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "last_refill_at": { + "name": "last_refill_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.resume_queue": { + "name": "resume_queue", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "paused_execution_id": { + "name": "paused_execution_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "parent_execution_id": { + "name": "parent_execution_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "new_execution_id": { + "name": "new_execution_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "context_id": { + "name": "context_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "resume_input": { + "name": "resume_input", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "queued_at": { + "name": "queued_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "claimed_at": { + "name": "claimed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "failure_reason": { + "name": "failure_reason", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "resume_queue_parent_status_idx": { + "name": "resume_queue_parent_status_idx", + "columns": [ + { + "expression": "parent_execution_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "queued_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "resume_queue_new_execution_idx": { + "name": "resume_queue_new_execution_idx", + "columns": [ + { + "expression": "new_execution_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "resume_queue_paused_execution_id_paused_executions_id_fk": { + "name": "resume_queue_paused_execution_id_paused_executions_id_fk", + "tableFrom": "resume_queue", + "tableTo": "paused_executions", + "columnsFrom": ["paused_execution_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "active_organization_id": { + "name": "active_organization_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "impersonated_by": { + "name": "impersonated_by", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "session_user_id_idx": { + "name": "session_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "session_token_idx": { + "name": "session_token_idx", + "columns": [ + { + "expression": "token", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "session_active_organization_id_organization_id_fk": { + "name": "session_active_organization_id_organization_id_fk", + "tableFrom": "session", + "tableTo": "organization", + "columnsFrom": ["active_organization_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": ["token"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.settings": { + "name": "settings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "theme": { + "name": "theme", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'system'" + }, + "auto_connect": { + "name": "auto_connect", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "telemetry_enabled": { + "name": "telemetry_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "email_preferences": { + "name": "email_preferences", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "billing_usage_notifications_enabled": { + "name": "billing_usage_notifications_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "show_training_controls": { + "name": "show_training_controls", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "super_user_mode_enabled": { + "name": "super_user_mode_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "error_notifications_enabled": { + "name": "error_notifications_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "snap_to_grid_size": { + "name": "snap_to_grid_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "show_action_bar": { + "name": "show_action_bar", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "copilot_enabled_models": { + "name": "copilot_enabled_models", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "copilot_auto_allowed_tools": { + "name": "copilot_auto_allowed_tools", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'" + }, + "last_active_workspace_id": { + "name": "last_active_workspace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "settings_user_id_user_id_fk": { + "name": "settings_user_id_user_id_fk", + "tableFrom": "settings", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "settings_user_id_unique": { + "name": "settings_user_id_unique", + "nullsNotDistinct": false, + "columns": ["user_id"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.skill": { + "name": "skill", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "skill_workspace_name_unique": { + "name": "skill_workspace_name_unique", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "skill_workspace_id_workspace_id_fk": { + "name": "skill_workspace_id_workspace_id_fk", + "tableFrom": "skill", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "skill_user_id_user_id_fk": { + "name": "skill_user_id_user_id_fk", + "tableFrom": "skill", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.sso_provider": { + "name": "sso_provider", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "issuer": { + "name": "issuer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "oidc_config": { + "name": "oidc_config", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "saml_config": { + "name": "saml_config", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sso_provider_provider_id_idx": { + "name": "sso_provider_provider_id_idx", + "columns": [ + { + "expression": "provider_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sso_provider_domain_idx": { + "name": "sso_provider_domain_idx", + "columns": [ + { + "expression": "domain", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sso_provider_user_id_idx": { + "name": "sso_provider_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sso_provider_organization_id_idx": { + "name": "sso_provider_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "sso_provider_user_id_user_id_fk": { + "name": "sso_provider_user_id_user_id_fk", + "tableFrom": "sso_provider", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "sso_provider_organization_id_organization_id_fk": { + "name": "sso_provider_organization_id_organization_id_fk", + "tableFrom": "sso_provider", + "tableTo": "organization", + "columnsFrom": ["organization_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.subscription": { + "name": "subscription", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "plan": { + "name": "plan", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "reference_id": { + "name": "reference_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "stripe_customer_id": { + "name": "stripe_customer_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripe_subscription_id": { + "name": "stripe_subscription_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "period_start": { + "name": "period_start", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "period_end": { + "name": "period_end", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "cancel_at_period_end": { + "name": "cancel_at_period_end", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "seats": { + "name": "seats", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "trial_start": { + "name": "trial_start", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "trial_end": { + "name": "trial_end", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "json", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "subscription_reference_status_idx": { + "name": "subscription_reference_status_idx", + "columns": [ + { + "expression": "reference_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "check_enterprise_metadata": { + "name": "check_enterprise_metadata", + "value": "plan != 'enterprise' OR metadata IS NOT NULL" + } + }, + "isRLSEnabled": false + }, + "public.template_creators": { + "name": "template_creators", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "reference_type": { + "name": "reference_type", + "type": "template_creator_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "reference_id": { + "name": "reference_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "profile_image_url": { + "name": "profile_image_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "details": { + "name": "details", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "template_creators_reference_idx": { + "name": "template_creators_reference_idx", + "columns": [ + { + "expression": "reference_type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "reference_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "template_creators_reference_id_idx": { + "name": "template_creators_reference_id_idx", + "columns": [ + { + "expression": "reference_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "template_creators_created_by_idx": { + "name": "template_creators_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "template_creators_created_by_user_id_fk": { + "name": "template_creators_created_by_user_id_fk", + "tableFrom": "template_creators", + "tableTo": "user", + "columnsFrom": ["created_by"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.template_stars": { + "name": "template_stars", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "template_id": { + "name": "template_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "starred_at": { + "name": "starred_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "template_stars_user_id_idx": { + "name": "template_stars_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "template_stars_template_id_idx": { + "name": "template_stars_template_id_idx", + "columns": [ + { + "expression": "template_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "template_stars_user_template_idx": { + "name": "template_stars_user_template_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "template_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "template_stars_template_user_idx": { + "name": "template_stars_template_user_idx", + "columns": [ + { + "expression": "template_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "template_stars_starred_at_idx": { + "name": "template_stars_starred_at_idx", + "columns": [ + { + "expression": "starred_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "template_stars_template_starred_at_idx": { + "name": "template_stars_template_starred_at_idx", + "columns": [ + { + "expression": "template_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "starred_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "template_stars_user_template_unique": { + "name": "template_stars_user_template_unique", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "template_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "template_stars_user_id_user_id_fk": { + "name": "template_stars_user_id_user_id_fk", + "tableFrom": "template_stars", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "template_stars_template_id_templates_id_fk": { + "name": "template_stars_template_id_templates_id_fk", + "tableFrom": "template_stars", + "tableTo": "templates", + "columnsFrom": ["template_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.templates": { + "name": "templates", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "details": { + "name": "details", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "creator_id": { + "name": "creator_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "views": { + "name": "views", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "stars": { + "name": "stars", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "status": { + "name": "status", + "type": "template_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "tags": { + "name": "tags", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "'{}'::text[]" + }, + "required_credentials": { + "name": "required_credentials", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'" + }, + "state": { + "name": "state", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "og_image_url": { + "name": "og_image_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "templates_status_idx": { + "name": "templates_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "templates_creator_id_idx": { + "name": "templates_creator_id_idx", + "columns": [ + { + "expression": "creator_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "templates_views_idx": { + "name": "templates_views_idx", + "columns": [ + { + "expression": "views", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "templates_stars_idx": { + "name": "templates_stars_idx", + "columns": [ + { + "expression": "stars", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "templates_status_views_idx": { + "name": "templates_status_views_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "views", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "templates_status_stars_idx": { + "name": "templates_status_stars_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "stars", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "templates_created_at_idx": { + "name": "templates_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "templates_updated_at_idx": { + "name": "templates_updated_at_idx", + "columns": [ + { + "expression": "updated_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "templates_workflow_id_workflow_id_fk": { + "name": "templates_workflow_id_workflow_id_fk", + "tableFrom": "templates", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + }, + "templates_creator_id_template_creators_id_fk": { + "name": "templates_creator_id_template_creators_id_fk", + "tableFrom": "templates", + "tableTo": "template_creators", + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.usage_log": { + "name": "usage_log", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "category": { + "name": "category", + "type": "usage_log_category", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "source": { + "name": "source", + "type": "usage_log_source", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "cost": { + "name": "cost", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "execution_id": { + "name": "execution_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "usage_log_user_created_at_idx": { + "name": "usage_log_user_created_at_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "usage_log_source_idx": { + "name": "usage_log_source_idx", + "columns": [ + { + "expression": "source", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "usage_log_workspace_id_idx": { + "name": "usage_log_workspace_id_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "usage_log_workflow_id_idx": { + "name": "usage_log_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "usage_log_user_id_user_id_fk": { + "name": "usage_log_user_id_user_id_fk", + "tableFrom": "usage_log", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "usage_log_workspace_id_workspace_id_fk": { + "name": "usage_log_workspace_id_workspace_id_fk", + "tableFrom": "usage_log", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + }, + "usage_log_workflow_id_workflow_id_fk": { + "name": "usage_log_workflow_id_workflow_id_fk", + "tableFrom": "usage_log", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "normalized_email": { + "name": "normalized_email", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "email_verified": { + "name": "email_verified", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "stripe_customer_id": { + "name": "stripe_customer_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'user'" + }, + "banned": { + "name": "banned", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "ban_reason": { + "name": "ban_reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ban_expires": { + "name": "ban_expires", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": ["email"] + }, + "user_normalized_email_unique": { + "name": "user_normalized_email_unique", + "nullsNotDistinct": false, + "columns": ["normalized_email"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_stats": { + "name": "user_stats", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "total_manual_executions": { + "name": "total_manual_executions", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "total_api_calls": { + "name": "total_api_calls", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "total_webhook_triggers": { + "name": "total_webhook_triggers", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "total_scheduled_executions": { + "name": "total_scheduled_executions", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "total_chat_executions": { + "name": "total_chat_executions", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "total_mcp_executions": { + "name": "total_mcp_executions", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "total_a2a_executions": { + "name": "total_a2a_executions", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "total_tokens_used": { + "name": "total_tokens_used", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "total_cost": { + "name": "total_cost", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "current_usage_limit": { + "name": "current_usage_limit", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": "'5'" + }, + "usage_limit_updated_at": { + "name": "usage_limit_updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "current_period_cost": { + "name": "current_period_cost", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "last_period_cost": { + "name": "last_period_cost", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": "'0'" + }, + "billed_overage_this_period": { + "name": "billed_overage_this_period", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "pro_period_cost_snapshot": { + "name": "pro_period_cost_snapshot", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": "'0'" + }, + "pro_period_cost_snapshot_at": { + "name": "pro_period_cost_snapshot_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "credit_balance": { + "name": "credit_balance", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "total_copilot_cost": { + "name": "total_copilot_cost", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "current_period_copilot_cost": { + "name": "current_period_copilot_cost", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "last_period_copilot_cost": { + "name": "last_period_copilot_cost", + "type": "numeric", + "primaryKey": false, + "notNull": false, + "default": "'0'" + }, + "total_copilot_tokens": { + "name": "total_copilot_tokens", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "total_copilot_calls": { + "name": "total_copilot_calls", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "total_mcp_copilot_calls": { + "name": "total_mcp_copilot_calls", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "total_mcp_copilot_cost": { + "name": "total_mcp_copilot_cost", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "current_period_mcp_copilot_cost": { + "name": "current_period_mcp_copilot_cost", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "storage_used_bytes": { + "name": "storage_used_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "last_active": { + "name": "last_active", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "billing_blocked": { + "name": "billing_blocked", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "billing_blocked_reason": { + "name": "billing_blocked_reason", + "type": "billing_blocked_reason", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "user_stats_user_id_user_id_fk": { + "name": "user_stats_user_id_user_id_fk", + "tableFrom": "user_stats", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_stats_user_id_unique": { + "name": "user_stats_user_id_unique", + "nullsNotDistinct": false, + "columns": ["user_id"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_table_definitions": { + "name": "user_table_definitions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "schema": { + "name": "schema", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "max_rows": { + "name": "max_rows", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 10000 + }, + "row_count": { + "name": "row_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "user_table_def_workspace_id_idx": { + "name": "user_table_def_workspace_id_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "user_table_def_workspace_name_unique": { + "name": "user_table_def_workspace_name_unique", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"user_table_definitions\".\"archived_at\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "user_table_def_archived_at_idx": { + "name": "user_table_def_archived_at_idx", + "columns": [ + { + "expression": "archived_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "user_table_definitions_workspace_id_workspace_id_fk": { + "name": "user_table_definitions_workspace_id_workspace_id_fk", + "tableFrom": "user_table_definitions", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_table_definitions_created_by_user_id_fk": { + "name": "user_table_definitions_created_by_user_id_fk", + "tableFrom": "user_table_definitions", + "tableTo": "user", + "columnsFrom": ["created_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user_table_rows": { + "name": "user_table_rows", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "table_id": { + "name": "table_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "data": { + "name": "data", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "position": { + "name": "position", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "user_table_rows_table_id_idx": { + "name": "user_table_rows_table_id_idx", + "columns": [ + { + "expression": "table_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "user_table_rows_data_gin_idx": { + "name": "user_table_rows_data_gin_idx", + "columns": [ + { + "expression": "data", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "gin", + "with": {} + }, + "user_table_rows_workspace_table_idx": { + "name": "user_table_rows_workspace_table_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "table_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "user_table_rows_table_position_idx": { + "name": "user_table_rows_table_position_idx", + "columns": [ + { + "expression": "table_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "position", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "user_table_rows_table_id_user_table_definitions_id_fk": { + "name": "user_table_rows_table_id_user_table_definitions_id_fk", + "tableFrom": "user_table_rows", + "tableTo": "user_table_definitions", + "columnsFrom": ["table_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_table_rows_workspace_id_workspace_id_fk": { + "name": "user_table_rows_workspace_id_workspace_id_fk", + "tableFrom": "user_table_rows", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_table_rows_created_by_user_id_fk": { + "name": "user_table_rows_created_by_user_id_fk", + "tableFrom": "user_table_rows", + "tableTo": "user", + "columnsFrom": ["created_by"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.verification": { + "name": "verification", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "verification_identifier_idx": { + "name": "verification_identifier_idx", + "columns": [ + { + "expression": "identifier", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "verification_expires_at_idx": { + "name": "verification_expires_at_idx", + "columns": [ + { + "expression": "expires_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.waitlist": { + "name": "waitlist", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "waitlist_email_unique": { + "name": "waitlist_email_unique", + "nullsNotDistinct": false, + "columns": ["email"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.webhook": { + "name": "webhook", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "deployment_version_id": { + "name": "deployment_version_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "block_id": { + "name": "block_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "provider_config": { + "name": "provider_config", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "failed_count": { + "name": "failed_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "last_failed_at": { + "name": "last_failed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "credential_set_id": { + "name": "credential_set_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "path_deployment_unique": { + "name": "path_deployment_unique", + "columns": [ + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "deployment_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"webhook\".\"archived_at\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "idx_webhook_on_workflow_id_block_id": { + "name": "idx_webhook_on_workflow_id_block_id", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "block_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "webhook_workflow_deployment_idx": { + "name": "webhook_workflow_deployment_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "deployment_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "webhook_credential_set_id_idx": { + "name": "webhook_credential_set_id_idx", + "columns": [ + { + "expression": "credential_set_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "webhook_archived_at_idx": { + "name": "webhook_archived_at_idx", + "columns": [ + { + "expression": "archived_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "webhook_workflow_id_workflow_id_fk": { + "name": "webhook_workflow_id_workflow_id_fk", + "tableFrom": "webhook", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "webhook_deployment_version_id_workflow_deployment_version_id_fk": { + "name": "webhook_deployment_version_id_workflow_deployment_version_id_fk", + "tableFrom": "webhook", + "tableTo": "workflow_deployment_version", + "columnsFrom": ["deployment_version_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "webhook_credential_set_id_credential_set_id_fk": { + "name": "webhook_credential_set_id_credential_set_id_fk", + "tableFrom": "webhook", + "tableTo": "credential_set", + "columnsFrom": ["credential_set_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workflow": { + "name": "workflow", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "folder_id": { + "name": "folder_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "color": { + "name": "color", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'#3972F6'" + }, + "last_synced": { + "name": "last_synced", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "is_deployed": { + "name": "is_deployed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "deployed_at": { + "name": "deployed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "is_public_api": { + "name": "is_public_api", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "run_count": { + "name": "run_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "last_run_at": { + "name": "last_run_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "variables": { + "name": "variables", + "type": "json", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "workflow_user_id_idx": { + "name": "workflow_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_workspace_id_idx": { + "name": "workflow_workspace_id_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_user_workspace_idx": { + "name": "workflow_user_workspace_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_workspace_folder_name_active_unique": { + "name": "workflow_workspace_folder_name_active_unique", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "coalesce(\"folder_id\", '')", + "asc": true, + "isExpression": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"workflow\".\"archived_at\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_folder_sort_idx": { + "name": "workflow_folder_sort_idx", + "columns": [ + { + "expression": "folder_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "sort_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_archived_at_idx": { + "name": "workflow_archived_at_idx", + "columns": [ + { + "expression": "archived_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workflow_user_id_user_id_fk": { + "name": "workflow_user_id_user_id_fk", + "tableFrom": "workflow", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_workspace_id_workspace_id_fk": { + "name": "workflow_workspace_id_workspace_id_fk", + "tableFrom": "workflow", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_folder_id_workflow_folder_id_fk": { + "name": "workflow_folder_id_workflow_folder_id_fk", + "tableFrom": "workflow", + "tableTo": "workflow_folder", + "columnsFrom": ["folder_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workflow_blocks": { + "name": "workflow_blocks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "position_x": { + "name": "position_x", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "position_y": { + "name": "position_y", + "type": "numeric", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "horizontal_handles": { + "name": "horizontal_handles", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "is_wide": { + "name": "is_wide", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "advanced_mode": { + "name": "advanced_mode", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "trigger_mode": { + "name": "trigger_mode", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "locked": { + "name": "locked", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "height": { + "name": "height", + "type": "numeric", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "sub_blocks": { + "name": "sub_blocks", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "outputs": { + "name": "outputs", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "data": { + "name": "data", + "type": "jsonb", + "primaryKey": false, + "notNull": false, + "default": "'{}'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workflow_blocks_workflow_id_idx": { + "name": "workflow_blocks_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_blocks_type_idx": { + "name": "workflow_blocks_type_idx", + "columns": [ + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workflow_blocks_workflow_id_workflow_id_fk": { + "name": "workflow_blocks_workflow_id_workflow_id_fk", + "tableFrom": "workflow_blocks", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workflow_checkpoints": { + "name": "workflow_checkpoints", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chat_id": { + "name": "chat_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "message_id": { + "name": "message_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "workflow_state": { + "name": "workflow_state", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workflow_checkpoints_user_id_idx": { + "name": "workflow_checkpoints_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_checkpoints_workflow_id_idx": { + "name": "workflow_checkpoints_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_checkpoints_chat_id_idx": { + "name": "workflow_checkpoints_chat_id_idx", + "columns": [ + { + "expression": "chat_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_checkpoints_message_id_idx": { + "name": "workflow_checkpoints_message_id_idx", + "columns": [ + { + "expression": "message_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_checkpoints_user_workflow_idx": { + "name": "workflow_checkpoints_user_workflow_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_checkpoints_workflow_chat_idx": { + "name": "workflow_checkpoints_workflow_chat_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "chat_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_checkpoints_created_at_idx": { + "name": "workflow_checkpoints_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_checkpoints_chat_created_at_idx": { + "name": "workflow_checkpoints_chat_created_at_idx", + "columns": [ + { + "expression": "chat_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workflow_checkpoints_user_id_user_id_fk": { + "name": "workflow_checkpoints_user_id_user_id_fk", + "tableFrom": "workflow_checkpoints", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_checkpoints_workflow_id_workflow_id_fk": { + "name": "workflow_checkpoints_workflow_id_workflow_id_fk", + "tableFrom": "workflow_checkpoints", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_checkpoints_chat_id_copilot_chats_id_fk": { + "name": "workflow_checkpoints_chat_id_copilot_chats_id_fk", + "tableFrom": "workflow_checkpoints", + "tableTo": "copilot_chats", + "columnsFrom": ["chat_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workflow_deployment_version": { + "name": "workflow_deployment_version", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "version": { + "name": "version", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "state": { + "name": "state", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "is_active": { + "name": "is_active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "workflow_deployment_version_workflow_version_unique": { + "name": "workflow_deployment_version_workflow_version_unique", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "version", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_deployment_version_workflow_active_idx": { + "name": "workflow_deployment_version_workflow_active_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "is_active", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_deployment_version_created_at_idx": { + "name": "workflow_deployment_version_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workflow_deployment_version_workflow_id_workflow_id_fk": { + "name": "workflow_deployment_version_workflow_id_workflow_id_fk", + "tableFrom": "workflow_deployment_version", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workflow_edges": { + "name": "workflow_edges", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "source_block_id": { + "name": "source_block_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_block_id": { + "name": "target_block_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "source_handle": { + "name": "source_handle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_handle": { + "name": "target_handle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workflow_edges_workflow_id_idx": { + "name": "workflow_edges_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_edges_workflow_source_idx": { + "name": "workflow_edges_workflow_source_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "source_block_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_edges_workflow_target_idx": { + "name": "workflow_edges_workflow_target_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "target_block_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workflow_edges_workflow_id_workflow_id_fk": { + "name": "workflow_edges_workflow_id_workflow_id_fk", + "tableFrom": "workflow_edges", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_edges_source_block_id_workflow_blocks_id_fk": { + "name": "workflow_edges_source_block_id_workflow_blocks_id_fk", + "tableFrom": "workflow_edges", + "tableTo": "workflow_blocks", + "columnsFrom": ["source_block_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_edges_target_block_id_workflow_blocks_id_fk": { + "name": "workflow_edges_target_block_id_workflow_blocks_id_fk", + "tableFrom": "workflow_edges", + "tableTo": "workflow_blocks", + "columnsFrom": ["target_block_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workflow_execution_logs": { + "name": "workflow_execution_logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "execution_id": { + "name": "execution_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "state_snapshot_id": { + "name": "state_snapshot_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "deployment_version_id": { + "name": "deployment_version_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "level": { + "name": "level", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'running'" + }, + "trigger": { + "name": "trigger", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "started_at": { + "name": "started_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "ended_at": { + "name": "ended_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "total_duration_ms": { + "name": "total_duration_ms", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "execution_data": { + "name": "execution_data", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "cost": { + "name": "cost", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "files": { + "name": "files", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workflow_execution_logs_workflow_id_idx": { + "name": "workflow_execution_logs_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_execution_logs_state_snapshot_id_idx": { + "name": "workflow_execution_logs_state_snapshot_id_idx", + "columns": [ + { + "expression": "state_snapshot_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_execution_logs_deployment_version_id_idx": { + "name": "workflow_execution_logs_deployment_version_id_idx", + "columns": [ + { + "expression": "deployment_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_execution_logs_trigger_idx": { + "name": "workflow_execution_logs_trigger_idx", + "columns": [ + { + "expression": "trigger", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_execution_logs_level_idx": { + "name": "workflow_execution_logs_level_idx", + "columns": [ + { + "expression": "level", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_execution_logs_started_at_idx": { + "name": "workflow_execution_logs_started_at_idx", + "columns": [ + { + "expression": "started_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_execution_logs_execution_id_unique": { + "name": "workflow_execution_logs_execution_id_unique", + "columns": [ + { + "expression": "execution_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_execution_logs_workflow_started_at_idx": { + "name": "workflow_execution_logs_workflow_started_at_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "started_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_execution_logs_workspace_started_at_idx": { + "name": "workflow_execution_logs_workspace_started_at_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "started_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_execution_logs_running_started_at_idx": { + "name": "workflow_execution_logs_running_started_at_idx", + "columns": [ + { + "expression": "started_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "where": "status = 'running'", + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workflow_execution_logs_workflow_id_workflow_id_fk": { + "name": "workflow_execution_logs_workflow_id_workflow_id_fk", + "tableFrom": "workflow_execution_logs", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + }, + "workflow_execution_logs_workspace_id_workspace_id_fk": { + "name": "workflow_execution_logs_workspace_id_workspace_id_fk", + "tableFrom": "workflow_execution_logs", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_execution_logs_state_snapshot_id_workflow_execution_snapshots_id_fk": { + "name": "workflow_execution_logs_state_snapshot_id_workflow_execution_snapshots_id_fk", + "tableFrom": "workflow_execution_logs", + "tableTo": "workflow_execution_snapshots", + "columnsFrom": ["state_snapshot_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "workflow_execution_logs_deployment_version_id_workflow_deployment_version_id_fk": { + "name": "workflow_execution_logs_deployment_version_id_workflow_deployment_version_id_fk", + "tableFrom": "workflow_execution_logs", + "tableTo": "workflow_deployment_version", + "columnsFrom": ["deployment_version_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workflow_execution_snapshots": { + "name": "workflow_execution_snapshots", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "state_hash": { + "name": "state_hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "state_data": { + "name": "state_data", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workflow_snapshots_workflow_id_idx": { + "name": "workflow_snapshots_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_snapshots_hash_idx": { + "name": "workflow_snapshots_hash_idx", + "columns": [ + { + "expression": "state_hash", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_snapshots_workflow_hash_idx": { + "name": "workflow_snapshots_workflow_hash_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "state_hash", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_snapshots_created_at_idx": { + "name": "workflow_snapshots_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workflow_execution_snapshots_workflow_id_workflow_id_fk": { + "name": "workflow_execution_snapshots_workflow_id_workflow_id_fk", + "tableFrom": "workflow_execution_snapshots", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workflow_folder": { + "name": "workflow_folder", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "parent_id": { + "name": "parent_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "color": { + "name": "color", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "'#6B7280'" + }, + "is_expanded": { + "name": "is_expanded", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "sort_order": { + "name": "sort_order", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "workflow_folder_user_idx": { + "name": "workflow_folder_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_folder_workspace_parent_idx": { + "name": "workflow_folder_workspace_parent_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_folder_parent_sort_idx": { + "name": "workflow_folder_parent_sort_idx", + "columns": [ + { + "expression": "parent_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "sort_order", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_folder_archived_at_idx": { + "name": "workflow_folder_archived_at_idx", + "columns": [ + { + "expression": "archived_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workflow_folder_user_id_user_id_fk": { + "name": "workflow_folder_user_id_user_id_fk", + "tableFrom": "workflow_folder", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_folder_workspace_id_workspace_id_fk": { + "name": "workflow_folder_workspace_id_workspace_id_fk", + "tableFrom": "workflow_folder", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workflow_mcp_server": { + "name": "workflow_mcp_server", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_public": { + "name": "is_public", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workflow_mcp_server_workspace_id_idx": { + "name": "workflow_mcp_server_workspace_id_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_mcp_server_created_by_idx": { + "name": "workflow_mcp_server_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_mcp_server_deleted_at_idx": { + "name": "workflow_mcp_server_deleted_at_idx", + "columns": [ + { + "expression": "deleted_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workflow_mcp_server_workspace_id_workspace_id_fk": { + "name": "workflow_mcp_server_workspace_id_workspace_id_fk", + "tableFrom": "workflow_mcp_server", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_mcp_server_created_by_user_id_fk": { + "name": "workflow_mcp_server_created_by_user_id_fk", + "tableFrom": "workflow_mcp_server", + "tableTo": "user", + "columnsFrom": ["created_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workflow_mcp_tool": { + "name": "workflow_mcp_tool", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "server_id": { + "name": "server_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tool_name": { + "name": "tool_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "tool_description": { + "name": "tool_description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "parameter_schema": { + "name": "parameter_schema", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workflow_mcp_tool_server_id_idx": { + "name": "workflow_mcp_tool_server_id_idx", + "columns": [ + { + "expression": "server_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_mcp_tool_workflow_id_idx": { + "name": "workflow_mcp_tool_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_mcp_tool_server_workflow_unique": { + "name": "workflow_mcp_tool_server_workflow_unique", + "columns": [ + { + "expression": "server_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"workflow_mcp_tool\".\"archived_at\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_mcp_tool_archived_at_idx": { + "name": "workflow_mcp_tool_archived_at_idx", + "columns": [ + { + "expression": "archived_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workflow_mcp_tool_server_id_workflow_mcp_server_id_fk": { + "name": "workflow_mcp_tool_server_id_workflow_mcp_server_id_fk", + "tableFrom": "workflow_mcp_tool", + "tableTo": "workflow_mcp_server", + "columnsFrom": ["server_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_mcp_tool_workflow_id_workflow_id_fk": { + "name": "workflow_mcp_tool_workflow_id_workflow_id_fk", + "tableFrom": "workflow_mcp_tool", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workflow_schedule": { + "name": "workflow_schedule", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deployment_version_id": { + "name": "deployment_version_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "block_id": { + "name": "block_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "cron_expression": { + "name": "cron_expression", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "next_run_at": { + "name": "next_run_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "last_ran_at": { + "name": "last_ran_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "last_queued_at": { + "name": "last_queued_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "trigger_type": { + "name": "trigger_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "timezone": { + "name": "timezone", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'UTC'" + }, + "failed_count": { + "name": "failed_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "last_failed_at": { + "name": "last_failed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "source_type": { + "name": "source_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'workflow'" + }, + "job_title": { + "name": "job_title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "prompt": { + "name": "prompt", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "lifecycle": { + "name": "lifecycle", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'persistent'" + }, + "success_condition": { + "name": "success_condition", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "max_runs": { + "name": "max_runs", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "run_count": { + "name": "run_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "source_chat_id": { + "name": "source_chat_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "source_task_name": { + "name": "source_task_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "source_user_id": { + "name": "source_user_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "source_workspace_id": { + "name": "source_workspace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "job_history": { + "name": "job_history", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workflow_schedule_workflow_block_deployment_unique": { + "name": "workflow_schedule_workflow_block_deployment_unique", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "block_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "deployment_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"workflow_schedule\".\"archived_at\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_schedule_workflow_deployment_idx": { + "name": "workflow_schedule_workflow_deployment_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "deployment_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_schedule_archived_at_idx": { + "name": "workflow_schedule_archived_at_idx", + "columns": [ + { + "expression": "archived_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workflow_schedule_workflow_id_workflow_id_fk": { + "name": "workflow_schedule_workflow_id_workflow_id_fk", + "tableFrom": "workflow_schedule", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_schedule_deployment_version_id_workflow_deployment_version_id_fk": { + "name": "workflow_schedule_deployment_version_id_workflow_deployment_version_id_fk", + "tableFrom": "workflow_schedule", + "tableTo": "workflow_deployment_version", + "columnsFrom": ["deployment_version_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_schedule_source_user_id_user_id_fk": { + "name": "workflow_schedule_source_user_id_user_id_fk", + "tableFrom": "workflow_schedule", + "tableTo": "user", + "columnsFrom": ["source_user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workflow_schedule_source_workspace_id_workspace_id_fk": { + "name": "workflow_schedule_source_workspace_id_workspace_id_fk", + "tableFrom": "workflow_schedule", + "tableTo": "workspace", + "columnsFrom": ["source_workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workflow_subflows": { + "name": "workflow_subflows", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "config": { + "name": "config", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workflow_subflows_workflow_id_idx": { + "name": "workflow_subflows_workflow_id_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workflow_subflows_workflow_type_idx": { + "name": "workflow_subflows_workflow_type_idx", + "columns": [ + { + "expression": "workflow_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workflow_subflows_workflow_id_workflow_id_fk": { + "name": "workflow_subflows_workflow_id_workflow_id_fk", + "tableFrom": "workflow_subflows", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workspace": { + "name": "workspace", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "color": { + "name": "color", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'#33C482'" + }, + "logo_url": { + "name": "logo_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner_id": { + "name": "owner_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "billed_account_user_id": { + "name": "billed_account_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "allow_personal_api_keys": { + "name": "allow_personal_api_keys", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "inbox_enabled": { + "name": "inbox_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "inbox_address": { + "name": "inbox_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "inbox_provider_id": { + "name": "inbox_provider_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "workspace_owner_id_user_id_fk": { + "name": "workspace_owner_id_user_id_fk", + "tableFrom": "workspace", + "tableTo": "user", + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workspace_billed_account_user_id_user_id_fk": { + "name": "workspace_billed_account_user_id_user_id_fk", + "tableFrom": "workspace", + "tableTo": "user", + "columnsFrom": ["billed_account_user_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workspace_byok_keys": { + "name": "workspace_byok_keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "encrypted_api_key": { + "name": "encrypted_api_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workspace_byok_provider_unique": { + "name": "workspace_byok_provider_unique", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "provider_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_byok_workspace_idx": { + "name": "workspace_byok_workspace_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workspace_byok_keys_workspace_id_workspace_id_fk": { + "name": "workspace_byok_keys_workspace_id_workspace_id_fk", + "tableFrom": "workspace_byok_keys", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workspace_byok_keys_created_by_user_id_fk": { + "name": "workspace_byok_keys_created_by_user_id_fk", + "tableFrom": "workspace_byok_keys", + "tableTo": "user", + "columnsFrom": ["created_by"], + "columnsTo": ["id"], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workspace_environment": { + "name": "workspace_environment", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "variables": { + "name": "variables", + "type": "json", + "primaryKey": false, + "notNull": true, + "default": "'{}'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workspace_environment_workspace_unique": { + "name": "workspace_environment_workspace_unique", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workspace_environment_workspace_id_workspace_id_fk": { + "name": "workspace_environment_workspace_id_workspace_id_fk", + "tableFrom": "workspace_environment", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workspace_file": { + "name": "workspace_file", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "size": { + "name": "size", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "uploaded_at": { + "name": "uploaded_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workspace_file_workspace_id_idx": { + "name": "workspace_file_workspace_id_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_file_key_idx": { + "name": "workspace_file_key_idx", + "columns": [ + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_file_deleted_at_idx": { + "name": "workspace_file_deleted_at_idx", + "columns": [ + { + "expression": "deleted_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workspace_file_workspace_id_workspace_id_fk": { + "name": "workspace_file_workspace_id_workspace_id_fk", + "tableFrom": "workspace_file", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workspace_file_uploaded_by_user_id_fk": { + "name": "workspace_file_uploaded_by_user_id_fk", + "tableFrom": "workspace_file", + "tableTo": "user", + "columnsFrom": ["uploaded_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "workspace_file_key_unique": { + "name": "workspace_file_key_unique", + "nullsNotDistinct": false, + "columns": ["key"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workspace_files": { + "name": "workspace_files", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "context": { + "name": "context", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "chat_id": { + "name": "chat_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "original_name": { + "name": "original_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "content_type": { + "name": "content_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "size": { + "name": "size", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "deleted_at": { + "name": "deleted_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "uploaded_at": { + "name": "uploaded_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workspace_files_key_active_unique": { + "name": "workspace_files_key_active_unique", + "columns": [ + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"workspace_files\".\"deleted_at\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_files_workspace_name_active_unique": { + "name": "workspace_files_workspace_name_active_unique", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "original_name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"workspace_files\".\"deleted_at\" IS NULL AND \"workspace_files\".\"context\" = 'workspace' AND \"workspace_files\".\"workspace_id\" IS NOT NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_files_key_idx": { + "name": "workspace_files_key_idx", + "columns": [ + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_files_user_id_idx": { + "name": "workspace_files_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_files_workspace_id_idx": { + "name": "workspace_files_workspace_id_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_files_context_idx": { + "name": "workspace_files_context_idx", + "columns": [ + { + "expression": "context", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_files_chat_id_idx": { + "name": "workspace_files_chat_id_idx", + "columns": [ + { + "expression": "chat_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_files_deleted_at_idx": { + "name": "workspace_files_deleted_at_idx", + "columns": [ + { + "expression": "deleted_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workspace_files_user_id_user_id_fk": { + "name": "workspace_files_user_id_user_id_fk", + "tableFrom": "workspace_files", + "tableTo": "user", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workspace_files_workspace_id_workspace_id_fk": { + "name": "workspace_files_workspace_id_workspace_id_fk", + "tableFrom": "workspace_files", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workspace_files_chat_id_copilot_chats_id_fk": { + "name": "workspace_files_chat_id_copilot_chats_id_fk", + "tableFrom": "workspace_files", + "tableTo": "copilot_chats", + "columnsFrom": ["chat_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workspace_invitation": { + "name": "workspace_invitation", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "inviter_id": { + "name": "inviter_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'member'" + }, + "status": { + "name": "status", + "type": "workspace_invitation_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "permissions": { + "name": "permissions", + "type": "permission_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'admin'" + }, + "org_invitation_id": { + "name": "org_invitation_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "workspace_invitation_workspace_id_workspace_id_fk": { + "name": "workspace_invitation_workspace_id_workspace_id_fk", + "tableFrom": "workspace_invitation", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workspace_invitation_inviter_id_user_id_fk": { + "name": "workspace_invitation_inviter_id_user_id_fk", + "tableFrom": "workspace_invitation", + "tableTo": "user", + "columnsFrom": ["inviter_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "workspace_invitation_token_unique": { + "name": "workspace_invitation_token_unique", + "nullsNotDistinct": false, + "columns": ["token"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workspace_notification_delivery": { + "name": "workspace_notification_delivery", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "subscription_id": { + "name": "subscription_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "workflow_id": { + "name": "workflow_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "execution_id": { + "name": "execution_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "notification_delivery_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "attempts": { + "name": "attempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "last_attempt_at": { + "name": "last_attempt_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "next_attempt_at": { + "name": "next_attempt_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "response_status": { + "name": "response_status", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "response_body": { + "name": "response_body", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workspace_notification_delivery_subscription_id_idx": { + "name": "workspace_notification_delivery_subscription_id_idx", + "columns": [ + { + "expression": "subscription_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_notification_delivery_execution_id_idx": { + "name": "workspace_notification_delivery_execution_id_idx", + "columns": [ + { + "expression": "execution_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_notification_delivery_status_idx": { + "name": "workspace_notification_delivery_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_notification_delivery_next_attempt_idx": { + "name": "workspace_notification_delivery_next_attempt_idx", + "columns": [ + { + "expression": "next_attempt_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workspace_notification_delivery_subscription_id_workspace_notification_subscription_id_fk": { + "name": "workspace_notification_delivery_subscription_id_workspace_notification_subscription_id_fk", + "tableFrom": "workspace_notification_delivery", + "tableTo": "workspace_notification_subscription", + "columnsFrom": ["subscription_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workspace_notification_delivery_workflow_id_workflow_id_fk": { + "name": "workspace_notification_delivery_workflow_id_workflow_id_fk", + "tableFrom": "workspace_notification_delivery", + "tableTo": "workflow", + "columnsFrom": ["workflow_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.workspace_notification_subscription": { + "name": "workspace_notification_subscription", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "notification_type": { + "name": "notification_type", + "type": "notification_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "workflow_ids": { + "name": "workflow_ids", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "'{}'::text[]" + }, + "all_workflows": { + "name": "all_workflows", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "level_filter": { + "name": "level_filter", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY['info', 'error']::text[]" + }, + "trigger_filter": { + "name": "trigger_filter", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "ARRAY['api', 'webhook', 'schedule', 'manual', 'chat']::text[]" + }, + "include_final_output": { + "name": "include_final_output", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_trace_spans": { + "name": "include_trace_spans", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_rate_limits": { + "name": "include_rate_limits", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_usage_data": { + "name": "include_usage_data", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "webhook_config": { + "name": "webhook_config", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "email_recipients": { + "name": "email_recipients", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "slack_config": { + "name": "slack_config", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "alert_config": { + "name": "alert_config", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "last_alert_at": { + "name": "last_alert_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_by": { + "name": "created_by", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "workspace_notification_workspace_id_idx": { + "name": "workspace_notification_workspace_id_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_notification_active_idx": { + "name": "workspace_notification_active_idx", + "columns": [ + { + "expression": "active", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "workspace_notification_type_idx": { + "name": "workspace_notification_type_idx", + "columns": [ + { + "expression": "notification_type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "workspace_notification_subscription_workspace_id_workspace_id_fk": { + "name": "workspace_notification_subscription_workspace_id_workspace_id_fk", + "tableFrom": "workspace_notification_subscription", + "tableTo": "workspace", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "workspace_notification_subscription_created_by_user_id_fk": { + "name": "workspace_notification_subscription_created_by_user_id_fk", + "tableFrom": "workspace_notification_subscription", + "tableTo": "user", + "columnsFrom": ["created_by"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.a2a_task_status": { + "name": "a2a_task_status", + "schema": "public", + "values": [ + "submitted", + "working", + "input-required", + "completed", + "failed", + "canceled", + "rejected", + "auth-required", + "unknown" + ] + }, + "public.academy_cert_status": { + "name": "academy_cert_status", + "schema": "public", + "values": ["active", "revoked", "expired"] + }, + "public.billing_blocked_reason": { + "name": "billing_blocked_reason", + "schema": "public", + "values": ["payment_failed", "dispute"] + }, + "public.chat_type": { + "name": "chat_type", + "schema": "public", + "values": ["mothership", "copilot"] + }, + "public.copilot_async_tool_status": { + "name": "copilot_async_tool_status", + "schema": "public", + "values": ["pending", "running", "completed", "failed", "cancelled", "delivered"] + }, + "public.copilot_run_status": { + "name": "copilot_run_status", + "schema": "public", + "values": ["active", "paused_waiting_for_tool", "resuming", "complete", "error", "cancelled"] + }, + "public.credential_member_role": { + "name": "credential_member_role", + "schema": "public", + "values": ["admin", "member"] + }, + "public.credential_member_status": { + "name": "credential_member_status", + "schema": "public", + "values": ["active", "pending", "revoked"] + }, + "public.credential_set_invitation_status": { + "name": "credential_set_invitation_status", + "schema": "public", + "values": ["pending", "accepted", "expired", "cancelled"] + }, + "public.credential_set_member_status": { + "name": "credential_set_member_status", + "schema": "public", + "values": ["active", "pending", "revoked"] + }, + "public.credential_type": { + "name": "credential_type", + "schema": "public", + "values": ["oauth", "env_workspace", "env_personal", "service_account"] + }, + "public.notification_delivery_status": { + "name": "notification_delivery_status", + "schema": "public", + "values": ["pending", "in_progress", "success", "failed"] + }, + "public.notification_type": { + "name": "notification_type", + "schema": "public", + "values": ["webhook", "email", "slack"] + }, + "public.permission_type": { + "name": "permission_type", + "schema": "public", + "values": ["admin", "write", "read"] + }, + "public.template_creator_type": { + "name": "template_creator_type", + "schema": "public", + "values": ["user", "organization"] + }, + "public.template_status": { + "name": "template_status", + "schema": "public", + "values": ["pending", "approved", "rejected"] + }, + "public.usage_log_category": { + "name": "usage_log_category", + "schema": "public", + "values": ["model", "fixed"] + }, + "public.usage_log_source": { + "name": "usage_log_source", + "schema": "public", + "values": [ + "workflow", + "wand", + "copilot", + "workspace-chat", + "mcp_copilot", + "mothership_block", + "knowledge-base", + "voice-input" + ] + }, + "public.workspace_invitation_status": { + "name": "workspace_invitation_status", + "schema": "public", + "values": ["pending", "accepted", "rejected", "cancelled"] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} diff --git a/packages/db/migrations/meta/_journal.json b/packages/db/migrations/meta/_journal.json index 1c0b60d974c..4086f44b90e 100644 --- a/packages/db/migrations/meta/_journal.json +++ b/packages/db/migrations/meta/_journal.json @@ -1331,6 +1331,13 @@ "when": 1776114737326, "tag": "0190_shocking_karma", "breakpoints": true + }, + { + "idx": 191, + "version": "7", + "when": 1776502306122, + "tag": "0191_unusual_mongu", + "breakpoints": true } ] } diff --git a/packages/db/schema.ts b/packages/db/schema.ts index d0efe10e48c..3c9aba327ad 100644 --- a/packages/db/schema.ts +++ b/packages/db/schema.ts @@ -768,6 +768,7 @@ export const userStats = pgTable('user_stats', { billedOverageThisPeriod: decimal('billed_overage_this_period').notNull().default('0'), // Amount of overage already billed via threshold billing // Pro usage snapshot when joining a team (to prevent double-billing) proPeriodCostSnapshot: decimal('pro_period_cost_snapshot').default('0'), // Snapshot of Pro usage when joining team + proPeriodCostSnapshotAt: timestamp('pro_period_cost_snapshot_at'), // When the snapshot was captured (= join moment). Used to cap daily-refresh computation so post-join refresh isn't deducted from pre-join personal Pro usage (and vice-versa for the org's pooled refresh). // Pre-purchased credits (for Pro users only) creditBalance: decimal('credit_balance').notNull().default('0'), // Copilot usage tracking @@ -1971,6 +1972,30 @@ export const idempotencyKey = pgTable( }) ) +export const outboxEvent = pgTable( + 'outbox_event', + { + id: text('id').primaryKey(), + eventType: text('event_type').notNull(), + payload: json('payload').notNull(), + status: text('status').notNull().default('pending'), + attempts: integer('attempts').notNull().default(0), + maxAttempts: integer('max_attempts').notNull().default(10), + availableAt: timestamp('available_at').notNull().defaultNow(), + lockedAt: timestamp('locked_at'), + lastError: text('last_error'), + createdAt: timestamp('created_at').notNull().defaultNow(), + processedAt: timestamp('processed_at'), + }, + (table) => ({ + statusAvailableIdx: index('outbox_event_status_available_idx').on( + table.status, + table.availableAt + ), + lockedAtIdx: index('outbox_event_locked_at_idx').on(table.lockedAt), + }) +) + export const mcpServers = pgTable( 'mcp_servers', { From c19187257ea164338944dbf969f4024bc67f3fcb Mon Sep 17 00:00:00 2001 From: Theodore Li Date: Sat, 18 Apr 2026 12:45:25 -0700 Subject: [PATCH 5/9] fix(ui): stop scrolling on leaving workflow sidebar for drag-drop (#4139) * fix(ui): stop scrolling on leaving workflow sidebar for drag-drop * Address comments, fix hover state * address comments --- .../components/sidebar/hooks/use-drag-drop.ts | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-drag-drop.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-drag-drop.ts index 30dd068ef5f..185be69aa6a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-drag-drop.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-drag-drop.ts @@ -252,11 +252,13 @@ export function useDragDrop(options: UseDragDropOptions = {}) { if (!isDragging) { isDraggingRef.current = true setIsDragging(true) + } else if (scrollAnimationRef.current === null) { + scrollAnimationRef.current = requestAnimationFrame(handleAutoScroll) } return true }, - [isDragging] + [isDragging, handleAutoScroll] ) const getSiblingItems = useCallback( @@ -616,6 +618,34 @@ export function useDragDrop(options: UseDragDropOptions = {}) { siblingsCacheRef.current.clear() }, []) + useEffect(() => { + if (!isDragging) return + const container = scrollContainerRef.current + if (!container) return + const onLeave = (e: DragEvent) => { + const related = e.relatedTarget as Node | null + if (related && container.contains(related)) return + if (scrollAnimationRef.current !== null) { + cancelAnimationFrame(scrollAnimationRef.current) + scrollAnimationRef.current = null + } + dropIndicatorRef.current = null + setDropIndicator(null) + setHoverFolderId(null) + } + const onWindowDrop = (e: DragEvent) => { + const target = e.target as Node | null + if (target && container.contains(target)) return + handleDragEnd() + } + container.addEventListener('dragleave', onLeave) + window.addEventListener('drop', onWindowDrop, true) + return () => { + container.removeEventListener('dragleave', onLeave) + window.removeEventListener('drop', onWindowDrop, true) + } + }, [isDragging, handleDragEnd]) + const setScrollContainer = useCallback((element: HTMLDivElement | null) => { scrollContainerRef.current = element }, []) From b5674d9ed42ff273d851a4f7082725649d57d0a8 Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 18 Apr 2026 14:39:03 -0700 Subject: [PATCH 6/9] improvement(codebase): centralize test mocks, extract @sim/utils, remove dead code (#4228) * improvement(codebase): centralize test mocks, extract @sim/utils, remove dead code * improvement(codebase): apply @sim/utils conventions to staging-introduced files --- .claude/rules/global.md | 9 +- .claude/rules/sim-testing.md | 83 +- .cursor/rules/global.mdc | 9 +- .cursor/rules/sim-testing.mdc | 84 +- AGENTS.md | 2 +- CLAUDE.md | 4 +- .../components/sandbox-canvas-provider.tsx | 2 +- apps/sim/app/api/a2a/agents/route.ts | 2 +- apps/sim/app/api/a2a/serve/[agentId]/route.ts | 2 +- apps/sim/app/api/a2a/serve/[agentId]/utils.ts | 2 +- .../sim/app/api/academy/certificates/route.ts | 2 +- .../api/auth/oauth/connections/route.test.ts | 65 +- .../api/auth/oauth/credentials/route.test.ts | 61 +- .../api/auth/oauth/disconnect/route.test.ts | 61 +- .../app/api/auth/oauth/token/route.test.ts | 115 +- apps/sim/app/api/auth/oauth/utils.test.ts | 5 - apps/sim/app/api/auth/oauth/utils.ts | 2 +- .../app/api/auth/shopify/authorize/route.ts | 2 +- apps/sim/app/api/auth/socket-token/route.ts | 2 +- apps/sim/app/api/billing/switch-plan/route.ts | 2 +- apps/sim/app/api/billing/update-cost/route.ts | 2 +- .../api/chat/[identifier]/otp/route.test.ts | 58 +- .../app/api/chat/[identifier]/otp/route.ts | 2 +- .../app/api/chat/[identifier]/route.test.ts | 97 +- apps/sim/app/api/chat/[identifier]/route.ts | 2 +- .../app/api/chat/manage/[id]/route.test.ts | 143 +- apps/sim/app/api/chat/route.test.ts | 96 +- apps/sim/app/api/chat/utils.test.ts | 29 +- .../app/api/copilot/api-keys/route.test.ts | 79 +- apps/sim/app/api/copilot/chat/abort/route.ts | 2 +- .../app/api/copilot/chat/delete/route.test.ts | 34 +- apps/sim/app/api/copilot/chat/queries.ts | 2 +- .../app/api/copilot/chat/stop/route.test.ts | 21 +- apps/sim/app/api/copilot/chat/stop/route.ts | 2 +- .../app/api/copilot/chat/stream/route.test.ts | 27 +- apps/sim/app/api/copilot/chat/stream/route.ts | 3 +- .../chat/update-messages/route.test.ts | 75 +- apps/sim/app/api/copilot/chats/route.test.ts | 70 +- .../copilot/checkpoints/revert/route.test.ts | 42 +- .../app/api/copilot/checkpoints/route.test.ts | 64 +- .../sim/app/api/copilot/confirm/route.test.ts | 34 +- apps/sim/app/api/copilot/confirm/route.ts | 2 +- .../app/api/copilot/feedback/route.test.ts | 102 +- apps/sim/app/api/copilot/models/route.ts | 2 +- apps/sim/app/api/copilot/stats/route.test.ts | 76 +- apps/sim/app/api/creators/route.ts | 2 +- .../api/credential-sets/[id]/invite/route.ts | 2 +- .../api/credential-sets/[id]/members/route.ts | 2 +- .../credential-sets/invite/[token]/route.ts | 2 +- .../api/credential-sets/memberships/route.ts | 2 +- apps/sim/app/api/credential-sets/route.ts | 2 +- .../app/api/credentials/[id]/members/route.ts | 2 +- apps/sim/app/api/credentials/[id]/route.ts | 2 +- apps/sim/app/api/credentials/draft/route.ts | 2 +- apps/sim/app/api/credentials/route.ts | 2 +- .../cron/cleanup-stale-executions/route.ts | 2 +- apps/sim/app/api/environment/route.ts | 2 +- apps/sim/app/api/files/delete/route.test.ts | 50 +- apps/sim/app/api/files/parse/route.test.ts | 31 +- .../sim/app/api/files/presigned/route.test.ts | 11 +- .../api/files/serve/[...path]/route.test.ts | 10 +- apps/sim/app/api/files/upload/route.test.ts | 56 +- .../app/api/folders/[id]/duplicate/route.ts | 2 +- apps/sim/app/api/folders/[id]/route.test.ts | 60 +- apps/sim/app/api/folders/route.test.ts | 27 +- apps/sim/app/api/folders/route.ts | 2 +- apps/sim/app/api/form/[identifier]/route.ts | 2 +- apps/sim/app/api/form/route.ts | 2 +- apps/sim/app/api/form/utils.test.ts | 15 +- .../app/api/function/execute/route.test.ts | 33 +- apps/sim/app/api/jobs/[jobId]/route.test.ts | 42 +- apps/sim/app/api/jobs/[jobId]/route.ts | 2 +- .../[connectorId]/documents/route.test.ts | 96 +- .../connectors/[connectorId]/route.test.ts | 149 +- .../[connectorId]/sync/route.test.ts | 56 +- .../api/knowledge/[id]/connectors/route.ts | 2 +- .../[documentId]/chunks/[chunkId]/route.ts | 2 +- .../[id]/documents/[documentId]/route.test.ts | 171 +-- .../[documentId]/tag-definitions/route.ts | 2 +- .../knowledge/[id]/documents/route.test.ts | 157 +-- .../app/api/knowledge/[id]/documents/route.ts | 2 +- .../knowledge/[id]/documents/upsert/route.ts | 2 +- .../[id]/next-available-slot/route.ts | 2 +- apps/sim/app/api/knowledge/[id]/route.test.ts | 150 +- .../[id]/tag-definitions/[tagId]/route.ts | 2 +- .../knowledge/[id]/tag-definitions/route.ts | 2 +- .../app/api/knowledge/[id]/tag-usage/route.ts | 2 +- apps/sim/app/api/knowledge/route.test.ts | 112 +- .../app/api/knowledge/search/route.test.ts | 123 +- .../app/api/knowledge/search/utils.test.ts | 4 +- apps/sim/app/api/mcp/copilot/route.ts | 4 +- apps/sim/app/api/mcp/events/route.test.ts | 31 +- .../api/mcp/serve/[serverId]/route.test.ts | 66 +- .../app/api/mcp/servers/[id]/refresh/route.ts | 2 +- apps/sim/app/api/mcp/servers/[id]/route.ts | 2 +- apps/sim/app/api/mcp/servers/route.ts | 4 +- .../api/mcp/servers/test-connection/route.ts | 2 +- apps/sim/app/api/mcp/tools/stored/route.ts | 2 +- .../api/mcp/workflow-servers/[id]/route.ts | 2 +- .../[id]/tools/[toolId]/route.ts | 2 +- .../mcp/workflow-servers/[id]/tools/route.ts | 4 +- .../sim/app/api/mcp/workflow-servers/route.ts | 4 +- apps/sim/app/api/memory/route.ts | 2 +- .../api/mothership/chats/[chatId]/route.ts | 2 +- apps/sim/app/api/mothership/execute/route.ts | 4 +- apps/sim/app/api/notifications/poll/route.ts | 2 +- .../[id]/invitations/[invitationId]/route.ts | 2 +- .../organizations/[id]/invitations/route.ts | 2 +- .../api/organizations/[id]/members/route.ts | 2 +- .../[id]/members/bulk/route.ts | 2 +- .../permission-groups/[id]/members/route.ts | 2 +- apps/sim/app/api/permission-groups/route.ts | 2 +- apps/sim/app/api/providers/route.ts | 2 +- .../[executionId]/[contextId]/route.ts | 4 +- apps/sim/app/api/schedules/[id]/route.test.ts | 54 +- .../app/api/schedules/execute/route.test.ts | 14 +- apps/sim/app/api/schedules/execute/route.ts | 4 +- apps/sim/app/api/schedules/route.test.ts | 51 +- apps/sim/app/api/schedules/route.ts | 2 +- apps/sim/app/api/stars/route.ts | 7 +- .../api/superuser/import-workflow/route.ts | 2 +- .../table/[tableId]/import-csv/route.test.ts | 24 +- .../api/table/[tableId]/import-csv/route.ts | 4 +- .../api/table/[tableId]/rows/[rowId]/route.ts | 2 +- .../sim/app/api/table/[tableId]/rows/route.ts | 2 +- .../api/table/[tableId]/rows/upsert/route.ts | 2 +- apps/sim/app/api/table/import-csv/route.ts | 4 +- apps/sim/app/api/templates/[id]/star/route.ts | 2 +- apps/sim/app/api/templates/[id]/use/route.ts | 2 +- .../api/templates/approved/sanitized/route.ts | 2 +- apps/sim/app/api/templates/route.ts | 2 +- .../app/api/tools/a2a/send-message/route.ts | 4 +- .../app/api/tools/asana/create-task/route.ts | 2 +- .../app/api/tools/asana/update-task/route.ts | 2 +- apps/sim/app/api/tools/cloudwatch/utils.ts | 2 +- .../api/tools/crowdstrike/query/route.test.ts | 12 +- .../app/api/tools/crowdstrike/query/route.ts | 2 +- apps/sim/app/api/tools/custom/route.test.ts | 89 +- .../api/tools/dynamodb/introspect/route.ts | 2 +- .../api/tools/iam/add-user-to-group/route.ts | 2 +- .../api/tools/iam/attach-role-policy/route.ts | 2 +- .../api/tools/iam/attach-user-policy/route.ts | 2 +- .../api/tools/iam/create-access-key/route.ts | 2 +- .../app/api/tools/iam/create-role/route.ts | 2 +- .../app/api/tools/iam/create-user/route.ts | 2 +- .../api/tools/iam/delete-access-key/route.ts | 2 +- .../app/api/tools/iam/delete-role/route.ts | 2 +- .../app/api/tools/iam/delete-user/route.ts | 2 +- .../api/tools/iam/detach-role-policy/route.ts | 2 +- .../api/tools/iam/detach-user-policy/route.ts | 2 +- apps/sim/app/api/tools/iam/get-role/route.ts | 2 +- apps/sim/app/api/tools/iam/get-user/route.ts | 2 +- .../app/api/tools/iam/list-groups/route.ts | 2 +- .../app/api/tools/iam/list-policies/route.ts | 2 +- .../sim/app/api/tools/iam/list-roles/route.ts | 2 +- .../sim/app/api/tools/iam/list-users/route.ts | 2 +- .../tools/iam/remove-user-from-group/route.ts | 2 +- apps/sim/app/api/tools/image/route.ts | 2 +- apps/sim/app/api/tools/jira/update/route.ts | 2 +- apps/sim/app/api/tools/jira/write/route.ts | 2 +- apps/sim/app/api/tools/jsm/approvals/route.ts | 2 +- apps/sim/app/api/tools/jsm/comment/route.ts | 2 +- apps/sim/app/api/tools/jsm/comments/route.ts | 2 +- apps/sim/app/api/tools/jsm/customers/route.ts | 2 +- .../app/api/tools/jsm/forms/answers/route.ts | 2 +- .../app/api/tools/jsm/forms/attach/route.ts | 2 +- .../sim/app/api/tools/jsm/forms/copy/route.ts | 2 +- .../app/api/tools/jsm/forms/delete/route.ts | 2 +- .../api/tools/jsm/forms/externalise/route.ts | 2 +- apps/sim/app/api/tools/jsm/forms/get/route.ts | 2 +- .../api/tools/jsm/forms/internalise/route.ts | 2 +- .../app/api/tools/jsm/forms/issue/route.ts | 2 +- .../app/api/tools/jsm/forms/reopen/route.ts | 2 +- .../sim/app/api/tools/jsm/forms/save/route.ts | 2 +- .../api/tools/jsm/forms/structure/route.ts | 2 +- .../app/api/tools/jsm/forms/submit/route.ts | 2 +- .../api/tools/jsm/forms/templates/route.ts | 2 +- .../app/api/tools/jsm/organization/route.ts | 2 +- .../app/api/tools/jsm/organizations/route.ts | 2 +- .../app/api/tools/jsm/participants/route.ts | 2 +- apps/sim/app/api/tools/jsm/queues/route.ts | 2 +- apps/sim/app/api/tools/jsm/request/route.ts | 2 +- apps/sim/app/api/tools/jsm/requests/route.ts | 2 +- .../api/tools/jsm/requesttypefields/route.ts | 2 +- .../app/api/tools/jsm/requesttypes/route.ts | 2 +- .../app/api/tools/jsm/servicedesks/route.ts | 2 +- apps/sim/app/api/tools/jsm/sla/route.ts | 2 +- .../sim/app/api/tools/jsm/transition/route.ts | 2 +- .../app/api/tools/jsm/transitions/route.ts | 2 +- .../tools/microsoft-teams/channels/route.ts | 2 +- .../api/tools/microsoft-teams/chats/route.ts | 2 +- .../api/tools/microsoft-teams/teams/route.ts | 2 +- .../sim/app/api/tools/mongodb/delete/route.ts | 2 +- .../app/api/tools/mongodb/execute/route.ts | 2 +- .../sim/app/api/tools/mongodb/insert/route.ts | 2 +- .../app/api/tools/mongodb/introspect/route.ts | 2 +- apps/sim/app/api/tools/mongodb/query/route.ts | 2 +- .../sim/app/api/tools/mongodb/update/route.ts | 2 +- apps/sim/app/api/tools/mysql/delete/route.ts | 2 +- apps/sim/app/api/tools/mysql/execute/route.ts | 2 +- apps/sim/app/api/tools/mysql/insert/route.ts | 2 +- .../app/api/tools/mysql/introspect/route.ts | 2 +- apps/sim/app/api/tools/mysql/query/route.ts | 2 +- apps/sim/app/api/tools/mysql/update/route.ts | 2 +- apps/sim/app/api/tools/neo4j/create/route.ts | 2 +- apps/sim/app/api/tools/neo4j/delete/route.ts | 2 +- apps/sim/app/api/tools/neo4j/execute/route.ts | 2 +- .../app/api/tools/neo4j/introspect/route.ts | 2 +- apps/sim/app/api/tools/neo4j/merge/route.ts | 2 +- apps/sim/app/api/tools/neo4j/query/route.ts | 2 +- apps/sim/app/api/tools/neo4j/update/route.ts | 2 +- .../sim/app/api/tools/onedrive/files/route.ts | 2 +- .../app/api/tools/onedrive/folder/route.ts | 2 +- .../app/api/tools/onedrive/folders/route.ts | 2 +- .../tools/onepassword/create-item/route.ts | 2 +- .../tools/onepassword/delete-item/route.ts | 2 +- .../api/tools/onepassword/get-item/route.ts | 2 +- .../api/tools/onepassword/get-vault/route.ts | 2 +- .../api/tools/onepassword/list-items/route.ts | 2 +- .../tools/onepassword/list-vaults/route.ts | 2 +- .../tools/onepassword/replace-item/route.ts | 2 +- .../tools/onepassword/resolve-secret/route.ts | 2 +- .../tools/onepassword/update-item/route.ts | 2 +- apps/sim/app/api/tools/onepassword/utils.ts | 2 +- .../app/api/tools/outlook/folders/route.ts | 2 +- .../app/api/tools/postgresql/delete/route.ts | 2 +- .../app/api/tools/postgresql/execute/route.ts | 2 +- .../app/api/tools/postgresql/insert/route.ts | 2 +- .../api/tools/postgresql/introspect/route.ts | 2 +- .../app/api/tools/postgresql/query/route.ts | 2 +- .../app/api/tools/postgresql/update/route.ts | 2 +- apps/sim/app/api/tools/rds/delete/route.ts | 2 +- apps/sim/app/api/tools/rds/execute/route.ts | 2 +- apps/sim/app/api/tools/rds/insert/route.ts | 2 +- .../sim/app/api/tools/rds/introspect/route.ts | 2 +- apps/sim/app/api/tools/rds/query/route.ts | 2 +- apps/sim/app/api/tools/rds/update/route.ts | 2 +- apps/sim/app/api/tools/search/route.ts | 2 +- .../secrets_manager/create-secret/route.ts | 2 +- .../secrets_manager/delete-secret/route.ts | 2 +- .../tools/secrets_manager/get-secret/route.ts | 2 +- .../secrets_manager/list-secrets/route.ts | 2 +- .../secrets_manager/update-secret/route.ts | 2 +- apps/sim/app/api/tools/sftp/utils.ts | 2 +- .../app/api/tools/sharepoint/site/route.ts | 2 +- apps/sim/app/api/tools/smtp/send/route.ts | 2 +- apps/sim/app/api/tools/sqs/send/route.ts | 2 +- .../tools/ssh/check-command-exists/route.ts | 2 +- .../api/tools/ssh/check-file-exists/route.ts | 2 +- .../api/tools/ssh/create-directory/route.ts | 2 +- .../app/api/tools/ssh/delete-file/route.ts | 2 +- .../app/api/tools/ssh/download-file/route.ts | 2 +- .../api/tools/ssh/execute-command/route.ts | 2 +- .../app/api/tools/ssh/execute-script/route.ts | 2 +- .../api/tools/ssh/get-system-info/route.ts | 2 +- .../app/api/tools/ssh/list-directory/route.ts | 2 +- .../app/api/tools/ssh/move-rename/route.ts | 2 +- .../api/tools/ssh/read-file-content/route.ts | 2 +- .../app/api/tools/ssh/upload-file/route.ts | 2 +- apps/sim/app/api/tools/ssh/utils.ts | 2 +- .../api/tools/ssh/write-file-content/route.ts | 2 +- .../app/api/tools/sts/assume-role/route.ts | 2 +- .../tools/sts/get-access-key-info/route.ts | 2 +- .../tools/sts/get-caller-identity/route.ts | 2 +- .../api/tools/sts/get-session-token/route.ts | 2 +- apps/sim/app/api/tools/stt/route.ts | 4 +- .../sim/app/api/tools/textract/parse/route.ts | 2 +- apps/sim/app/api/tools/tts/unified/route.ts | 2 +- apps/sim/app/api/tools/video/route.ts | 4 +- apps/sim/app/api/users/me/api-keys/route.ts | 2 +- apps/sim/app/api/users/me/settings/route.ts | 2 +- .../me/subscription/[id]/transfer/route.ts | 2 +- apps/sim/app/api/users/me/usage-logs/route.ts | 2 +- apps/sim/app/api/v1/admin/credits/route.ts | 2 +- .../app/api/v1/admin/organizations/route.ts | 2 +- .../api/v1/admin/outbox/[id]/requeue/route.ts | 14 +- apps/sim/app/api/v1/admin/outbox/route.ts | 13 +- .../api/v1/admin/users/[id]/billing/route.ts | 2 +- .../api/v1/admin/workflows/import/route.ts | 2 +- .../v1/admin/workspaces/[id]/import/route.ts | 2 +- .../v1/admin/workspaces/[id]/members/route.ts | 2 +- apps/sim/app/api/v1/audit-logs/[id]/route.ts | 2 +- apps/sim/app/api/v1/audit-logs/route.ts | 2 +- apps/sim/app/api/v1/copilot/chat/route.ts | 4 +- apps/sim/app/api/v1/logs/[id]/route.ts | 2 +- apps/sim/app/api/v1/logs/route.ts | 2 +- .../v1/tables/[tableId]/rows/[rowId]/route.ts | 2 +- .../app/api/v1/tables/[tableId]/rows/route.ts | 2 +- .../v1/tables/[tableId]/rows/upsert/route.ts | 2 +- apps/sim/app/api/v1/workflows/[id]/route.ts | 2 +- apps/sim/app/api/v1/workflows/route.ts | 2 +- apps/sim/app/api/webhooks/agentmail/route.ts | 2 +- .../app/api/webhooks/outbox/process/route.ts | 12 +- .../app/api/webhooks/poll/[provider]/route.ts | 2 +- apps/sim/app/api/webhooks/route.ts | 2 +- .../api/webhooks/trigger/[path]/route.test.ts | 97 +- .../workflows/[id]/chat/status/route.test.ts | 54 +- .../[id]/execute/route.async.test.ts | 52 +- .../app/api/workflows/[id]/execute/route.ts | 4 +- .../[executionId]/cancel/route.test.ts | 34 +- .../executions/[executionId]/stream/route.ts | 3 +- .../workflows/[id]/form/status/route.test.ts | 47 +- apps/sim/app/api/workflows/[id]/route.test.ts | 80 +- .../sim/app/api/workflows/[id]/state/route.ts | 2 +- .../workflows/[id]/variables/route.test.ts | 67 +- apps/sim/app/api/workflows/route.test.ts | 84 +- apps/sim/app/api/workflows/route.ts | 2 +- .../[id]/_preview/create-preview-route.ts | 2 +- .../app/api/workspaces/[id]/api-keys/route.ts | 2 +- .../api/workspaces/[id]/byok-keys/route.ts | 2 +- .../[id]/docx/preview/route.test.ts | 24 +- .../api/workspaces/[id]/environment/route.ts | 2 +- .../workspaces/[id]/inbox/senders/route.ts | 2 +- .../[notificationId]/test/route.ts | 4 +- .../workspaces/[id]/notifications/route.ts | 2 +- .../workspaces/[id]/pdf/preview/route.test.ts | 24 +- .../api/workspaces/[id]/permissions/route.ts | 2 +- .../[id]/pptx/preview/route.test.ts | 24 +- .../invitations/[invitationId]/route.test.ts | 104 +- .../invitations/[invitationId]/route.ts | 2 +- .../api/workspaces/invitations/route.test.ts | 85 +- .../app/api/workspaces/invitations/route.ts | 2 +- apps/sim/app/api/workspaces/route.ts | 2 +- apps/sim/app/chat/[identifier]/chat.tsx | 2 +- apps/sim/app/chat/components/input/input.tsx | 2 +- .../message/components/file-download.tsx | 2 +- apps/sim/app/chat/hooks/use-chat-streaming.ts | 2 +- .../app/credential-account/[token]/page.tsx | 5 +- apps/sim/app/ingest/[[...path]]/route.ts | 2 +- .../[executionId]/resume-page-client.tsx | 10 +- .../resource-content/resource-content.tsx | 2 +- .../[workspaceId]/home/hooks/use-chat.ts | 5 +- .../[workspaceId]/knowledge/[id]/base.tsx | 2 +- .../components/base-card/base-card.tsx | 2 +- .../knowledge/hooks/use-knowledge-upload.ts | 2 +- .../components/trace-spans/trace-spans.tsx | 2 +- .../components/log-details/log-details.tsx | 2 +- .../logs/components/logs-list/logs-list.tsx | 2 +- .../app/workspace/[workspaceId]/logs/logs.tsx | 2 +- .../app/workspace/[workspaceId]/logs/utils.ts | 2 +- .../providers/global-commands-provider.tsx | 2 +- .../scheduled-tasks/scheduled-tasks.tsx | 2 +- .../settings/components/api-keys/api-keys.tsx | 2 +- .../settings/components/copilot/copilot.tsx | 2 +- .../components/inbox/inbox-task-list.tsx | 2 +- .../recently-deleted/recently-deleted.tsx | 2 +- .../credit-balance/credit-balance.tsx | 2 +- .../components/usage-limit/usage-limit.tsx | 2 +- .../components/table-filter/table-filter.tsx | 2 +- .../w/[workflowId]/components/chat/chat.tsx | 2 +- .../chat/hooks/use-chat-file-upload.ts | 2 +- .../user-input/hooks/use-file-attachments.ts | 2 +- .../deploy-modal/components/a2a/a2a.tsx | 2 +- .../general/components/versions.tsx | 2 +- .../document-tag-entry/document-tag-entry.tsx | 2 +- .../components/dropdown/dropdown.tsx | 2 +- .../components/eval-input/eval-input.tsx | 2 +- .../filter-builder/filter-builder.tsx | 2 +- .../knowledge-tag-filters.tsx | 2 +- .../components/sort-builder/sort-builder.tsx | 2 +- .../components/starter/input-format.tsx | 2 +- .../sub-block/components/table/table.tsx | 2 +- .../variables-input/variables-input.tsx | 2 +- .../w/[workflowId]/components/panel/panel.tsx | 2 +- .../components/terminal/terminal.tsx | 2 +- .../hooks/use-workflow-execution.ts | 5 +- .../utils/workflow-execution-utils.ts | 2 +- .../[workspaceId]/w/[workflowId]/workflow.tsx | 2 +- .../preview-editor/preview-editor.tsx | 2 +- .../components/folder-item/folder-item.tsx | 2 +- .../sidebar/hooks/use-folder-operations.ts | 2 +- .../sidebar/hooks/use-workflow-operations.ts | 2 +- .../w/hooks/use-duplicate-folder.ts | 2 +- .../w/hooks/use-duplicate-selection.ts | 2 +- .../w/hooks/use-duplicate-workflow.ts | 2 +- .../w/hooks/use-import-workspace.ts | 2 +- .../workspace/providers/socket-provider.tsx | 2 +- .../async-preprocessing-correlation.test.ts | 54 +- apps/sim/background/resume-execution.ts | 2 +- apps/sim/background/schedule-execution.ts | 4 +- apps/sim/background/webhook-execution.ts | 4 +- apps/sim/background/workflow-execution.ts | 4 +- .../workspace-notification-delivery.ts | 6 +- apps/sim/blocks/blocks/langsmith.ts | 2 +- apps/sim/blocks/blocks/mistral_parse.ts | 2 +- apps/sim/blocks/blocks/notion.ts | 2 +- apps/sim/blocks/blocks/reducto.ts | 2 +- apps/sim/blocks/blocks/sharepoint.ts | 2 +- apps/sim/blocks/blocks/table.ts | 2 +- apps/sim/blocks/utils.ts | 2 +- .../emcn/components/toast/toast.tsx | 2 +- apps/sim/connectors/airtable/airtable.ts | 2 +- apps/sim/connectors/asana/asana.ts | 2 +- apps/sim/connectors/confluence/confluence.ts | 2 +- apps/sim/connectors/discord/discord.ts | 2 +- apps/sim/connectors/dropbox/dropbox.ts | 2 +- apps/sim/connectors/evernote/evernote.ts | 2 +- apps/sim/connectors/fireflies/fireflies.ts | 2 +- apps/sim/connectors/github/github.ts | 2 +- apps/sim/connectors/gmail/gmail.ts | 2 +- .../sim/connectors/google-docs/google-docs.ts | 2 +- .../connectors/google-drive/google-drive.ts | 2 +- .../connectors/google-sheets/google-sheets.ts | 2 +- apps/sim/connectors/intercom/intercom.ts | 2 +- apps/sim/connectors/linear/linear.ts | 2 +- apps/sim/connectors/mapTags.test.ts | 3 - .../microsoft-teams/microsoft-teams.ts | 2 +- apps/sim/connectors/notion/notion.ts | 2 +- apps/sim/connectors/obsidian/obsidian.ts | 2 +- apps/sim/connectors/onedrive/onedrive.ts | 2 +- apps/sim/connectors/outlook/outlook.ts | 2 +- apps/sim/connectors/reddit/reddit.ts | 2 +- apps/sim/connectors/servicenow/servicenow.ts | 2 +- apps/sim/connectors/sharepoint/sharepoint.ts | 2 +- apps/sim/connectors/slack/slack.ts | 2 +- apps/sim/connectors/webflow/webflow.ts | 2 +- apps/sim/connectors/wordpress/wordpress.ts | 2 +- apps/sim/connectors/zendesk/zendesk.ts | 2 +- .../utils/permission-check.test.ts | 7 +- .../ee/audit-logs/components/audit-logs.tsx | 2 +- apps/sim/executor/dag/builder.test.ts | 5 +- .../executor/dag/construction/edges.test.ts | 5 +- apps/sim/executor/dag/construction/edges.ts | 2 +- apps/sim/executor/execution/block-executor.ts | 2 +- .../executor/execution/edge-manager.test.ts | 5 +- apps/sim/executor/execution/engine.test.ts | 3 - apps/sim/executor/execution/engine.ts | 2 +- .../handlers/agent/agent-handler.test.ts | 11 +- .../executor/handlers/agent/agent-handler.ts | 7 +- .../executor/handlers/agent/memory.test.ts | 3 - apps/sim/executor/handlers/agent/memory.ts | 2 +- .../executor/handlers/api/api-handler.test.ts | 8 +- .../condition/condition-handler.test.ts | 4 +- .../evaluator/evaluator-handler.test.ts | 18 +- .../function/function-handler.test.ts | 3 - .../handlers/generic/generic-handler.ts | 2 +- .../mothership/mothership-handler.test.ts | 16 +- .../handlers/mothership/mothership-handler.ts | 4 +- .../handlers/router/router-handler.test.ts | 26 +- .../handlers/workflow/workflow-handler.ts | 2 +- apps/sim/executor/orchestrators/loop.ts | 2 +- .../executor/orchestrators/parallel.test.ts | 9 - apps/sim/executor/orchestrators/parallel.ts | 2 +- apps/sim/executor/utils.test.ts | 3 - .../sim/executor/utils/file-tool-processor.ts | 2 +- .../executor/utils/parallel-expansion.test.ts | 5 +- apps/sim/executor/utils/subflow-utils.ts | 2 +- apps/sim/executor/variables/resolver.ts | 2 +- .../variables/resolvers/block.test.ts | 2 - .../executor/variables/resolvers/env.test.ts | 5 +- .../executor/variables/resolvers/loop.test.ts | 5 +- .../variables/resolvers/parallel.test.ts | 5 +- .../variables/resolvers/workflow.test.ts | 3 - apps/sim/hooks/queries/a2a/tasks.ts | 2 +- apps/sim/hooks/queries/admin-users.ts | 2 +- apps/sim/hooks/queries/folders.test.ts | 12 +- apps/sim/hooks/queries/folders.ts | 2 +- apps/sim/hooks/queries/inbox.ts | 2 +- apps/sim/hooks/queries/workflows.ts | 2 +- apps/sim/hooks/use-code-undo-redo.ts | 2 +- apps/sim/hooks/use-collaborative-workflow.ts | 2 +- apps/sim/hooks/use-stream-cleanup.ts | 5 +- apps/sim/hooks/use-undo-redo.ts | 2 +- apps/sim/lib/a2a/utils.ts | 4 +- apps/sim/lib/api-key/auth.ts | 2 +- apps/sim/lib/audio/extractor.ts | 11 +- apps/sim/lib/audit/log.test.ts | 10 +- apps/sim/lib/audit/log.ts | 2 +- apps/sim/lib/auth/anonymous.ts | 2 +- apps/sim/lib/auth/auth.ts | 4 +- apps/sim/lib/auth/cimd.ts | 4 +- .../lib/billing/calculations/usage-monitor.ts | 2 +- apps/sim/lib/billing/core/usage-log.ts | 4 +- apps/sim/lib/billing/core/usage.ts | 2 +- .../lib/billing/credits/daily-refresh.test.ts | 11 +- apps/sim/lib/billing/organization.ts | 2 +- .../lib/billing/organizations/membership.ts | 2 +- apps/sim/lib/billing/webhooks/enterprise.ts | 2 +- .../sim/lib/billing/webhooks/invoices.test.ts | 46 +- .../lib/chunkers/json-yaml-chunker.test.ts | 3 - .../lib/chunkers/recursive-chunker.test.ts | 5 +- apps/sim/lib/chunkers/regex-chunker.test.ts | 5 +- apps/sim/lib/chunkers/regex-chunker.ts | 2 +- .../sim/lib/chunkers/sentence-chunker.test.ts | 5 +- .../chunkers/structured-data-chunker.test.ts | 5 +- apps/sim/lib/chunkers/token-chunker.test.ts | 5 +- apps/sim/lib/copilot/auth/permissions.test.ts | 11 +- apps/sim/lib/copilot/chat/payload.test.ts | 9 +- apps/sim/lib/copilot/chat/payload.ts | 2 +- apps/sim/lib/copilot/chat/post.test.ts | 45 +- apps/sim/lib/copilot/chat/post.ts | 2 +- .../sim/lib/copilot/chat/workspace-context.ts | 2 +- .../copilot/persistence/tool-confirm/index.ts | 2 +- .../request/context/request-context.ts | 2 +- .../request/go/file-preview-adapter.ts | 2 +- apps/sim/lib/copilot/request/go/parser.ts | 2 +- apps/sim/lib/copilot/request/go/stream.ts | 2 +- .../copilot/request/handlers/handlers.test.ts | 3 - apps/sim/lib/copilot/request/handlers/tool.ts | 2 +- .../sim/lib/copilot/request/handlers/types.ts | 2 +- apps/sim/lib/copilot/request/http.ts | 2 +- .../lib/copilot/request/lifecycle/finalize.ts | 2 +- .../lib/copilot/request/lifecycle/headless.ts | 4 +- apps/sim/lib/copilot/request/lifecycle/run.ts | 4 +- .../lib/copilot/request/lifecycle/start.ts | 2 +- apps/sim/lib/copilot/request/session/abort.ts | 3 +- .../copilot/request/session/buffer.test.ts | 9 +- .../sim/lib/copilot/request/session/buffer.ts | 3 +- .../request/session/file-preview-session.ts | 3 +- .../sim/lib/copilot/request/session/writer.ts | 2 +- apps/sim/lib/copilot/request/subagent.ts | 4 +- .../sim/lib/copilot/request/tools/executor.ts | 2 +- apps/sim/lib/copilot/request/tools/files.ts | 2 +- .../lib/copilot/request/tools/resources.ts | 2 +- apps/sim/lib/copilot/request/tools/tables.ts | 2 +- apps/sim/lib/copilot/resources/persistence.ts | 2 +- .../sim/lib/copilot/tool-executor/executor.ts | 2 +- .../tools/client/run-tool-execution.ts | 4 +- .../tools/handlers/deployment/deploy.ts | 4 +- .../tools/handlers/deployment/manage.test.ts | 16 +- .../tools/handlers/deployment/manage.ts | 4 +- apps/sim/lib/copilot/tools/handlers/jobs.ts | 4 +- .../handlers/management/manage-credential.ts | 2 +- .../handlers/management/manage-custom-tool.ts | 2 +- .../handlers/management/manage-mcp-tool.ts | 2 +- .../tools/handlers/management/manage-skill.ts | 2 +- .../tools/handlers/materialize-file.ts | 4 +- apps/sim/lib/copilot/tools/handlers/oauth.ts | 2 +- .../tools/handlers/restore-resource.ts | 4 +- .../tools/handlers/upload-file-reader.ts | 2 +- .../lib/copilot/tools/handlers/vfs.test.ts | 2 - apps/sim/lib/copilot/tools/handlers/vfs.ts | 2 +- .../tools/handlers/workflow/mutations.ts | 4 +- .../tools/handlers/workflow/queries.test.ts | 24 +- .../tools/handlers/workflow/queries.ts | 2 +- .../tools/registry/server-tool-adapter.ts | 2 +- .../server/blocks/get-blocks-metadata-tool.ts | 2 +- .../tools/server/files/edit-content.ts | 2 +- .../tools/server/files/file-intent-store.ts | 3 +- .../tools/server/files/file-preview.ts | 2 +- .../tools/server/files/workspace-file.ts | 2 +- .../tools/server/image/generate-image.ts | 2 +- .../tools/server/knowledge/knowledge-base.ts | 4 +- .../tools/server/other/search-online.ts | 2 +- .../tools/server/table/user-table.test.ts | 10 +- .../copilot/tools/server/table/user-table.ts | 4 +- .../tools/server/user/get-credentials.ts | 2 +- .../user/set-environment-variables.test.ts | 7 - .../server/workflow/edit-workflow/builders.ts | 2 +- .../server/workflow/edit-workflow/index.ts | 2 +- .../workflow/edit-workflow/operations.test.ts | 9 - .../workflow/edit-workflow/validation.test.ts | 5 +- .../validation/selector-validator.test.ts | 50 +- .../copilot/validation/selector-validator.ts | 2 +- apps/sim/lib/copilot/vfs/file-reader.ts | 2 +- apps/sim/lib/copilot/vfs/workspace-vfs.ts | 2 +- .../lib/core/async-jobs/backends/database.ts | 2 +- apps/sim/lib/core/config/redis.test.ts | 3 +- apps/sim/lib/core/config/redis.ts | 2 +- apps/sim/lib/core/idempotency/cleanup.ts | 2 +- apps/sim/lib/core/idempotency/service.ts | 4 +- apps/sim/lib/core/outbox/service.test.ts | 2 +- apps/sim/lib/core/outbox/service.ts | 5 +- .../hosted-key-rate-limiter.test.ts | 3 - .../core/rate-limiter/rate-limiter.test.ts | 2 - .../sim/lib/core/rate-limiter/rate-limiter.ts | 2 +- .../core/rate-limiter/storage/factory.test.ts | 32 +- apps/sim/lib/core/security/csp.test.ts | 8 +- apps/sim/lib/core/security/encryption.test.ts | 4 +- .../core/security/input-validation.server.ts | 2 +- .../core/security/input-validation.test.ts | 7 +- apps/sim/lib/core/telemetry.ts | 2 +- apps/sim/lib/core/utils.test.ts | 10 +- apps/sim/lib/core/utils/helpers.ts | 17 - apps/sim/lib/core/utils/pg-error.test.ts | 30 - apps/sim/lib/core/utils/request.ts | 2 +- apps/sim/lib/credentials/access.ts | 2 +- apps/sim/lib/credentials/draft-hooks.ts | 2 +- apps/sim/lib/credentials/environment.ts | 2 +- apps/sim/lib/credentials/oauth.ts | 2 +- apps/sim/lib/environment/utils.ts | 2 +- apps/sim/lib/execution/buffered-stream.ts | 3 +- apps/sim/lib/execution/cancellation.test.ts | 11 +- apps/sim/lib/execution/event-buffer.ts | 2 +- apps/sim/lib/execution/isolated-vm.test.ts | 76 +- apps/sim/lib/execution/isolated-vm.ts | 2 +- apps/sim/lib/execution/preprocessing.test.ts | 15 +- .../preprocessing.webhook-correlation.test.ts | 15 +- .../lib/execution/sandbox/bundles/build.ts | 9 +- .../lib/execution/sandbox/bundles/docx.cjs | 28 +- .../lib/execution/sandbox/bundles/pdf-lib.cjs | 42 +- .../execution/sandbox/bundles/pptxgenjs.cjs | 125 +- apps/sim/lib/execution/sandbox/run-task.ts | 2 +- apps/sim/lib/knowledge/chunks/service.ts | 2 +- .../knowledge/connectors/sync-engine.test.ts | 14 +- .../lib/knowledge/connectors/sync-engine.ts | 4 +- .../knowledge/documents/document-processor.ts | 2 +- apps/sim/lib/knowledge/documents/service.ts | 4 +- .../sim/lib/knowledge/documents/utils.test.ts | 7 +- apps/sim/lib/knowledge/documents/utils.ts | 3 +- apps/sim/lib/knowledge/service.ts | 4 +- apps/sim/lib/knowledge/tags/service.ts | 2 +- apps/sim/lib/logs/events.ts | 2 +- apps/sim/lib/logs/execution/logger.test.ts | 19 +- apps/sim/lib/logs/execution/logger.ts | 2 +- .../logs/execution/logging-factory.test.ts | 43 +- .../logs/execution/logging-session.test.ts | 14 +- .../sim/lib/logs/execution/logging-session.ts | 2 +- .../logs/execution/snapshot/service.test.ts | 25 +- .../lib/logs/execution/snapshot/service.ts | 2 +- apps/sim/lib/mcp/client.test.ts | 3 - apps/sim/lib/mcp/connection-manager.test.ts | 2 - apps/sim/lib/mcp/domain-check.test.ts | 27 +- apps/sim/lib/mcp/domain-check.ts | 2 +- apps/sim/lib/mcp/middleware.ts | 2 +- apps/sim/lib/mcp/pubsub.test.ts | 2 - apps/sim/lib/mcp/service.ts | 3 +- apps/sim/lib/mcp/storage/memory-cache.test.ts | 6 +- apps/sim/lib/messaging/email/mailer.test.ts | 4 +- .../lib/messaging/email/unsubscribe.test.ts | 16 +- apps/sim/lib/messaging/email/utils.test.ts | 12 +- apps/sim/lib/mothership/inbox/executor.ts | 2 +- apps/sim/lib/mothership/inbox/lifecycle.ts | 2 +- .../lib/notifications/inactivity-polling.ts | 2 +- apps/sim/lib/oauth/oauth.test.ts | 4 +- apps/sim/lib/oauth/oauth.ts | 2 +- apps/sim/lib/og/capture-preview.ts | 2 +- apps/sim/lib/table/__tests__/sql.test.ts | 6 +- .../lib/table/__tests__/update-row.test.ts | 4 +- .../sim/lib/table/query-builder/converters.ts | 2 +- .../table/query-builder/use-query-builder.ts | 2 +- apps/sim/lib/table/service.ts | 4 +- apps/sim/lib/tokenization/calculators.ts | 2 +- apps/sim/lib/tokenization/streaming.ts | 2 +- apps/sim/lib/tokenization/utils.ts | 2 +- .../workspace/workspace-file-manager.ts | 2 +- apps/sim/lib/uploads/providers/blob/client.ts | 2 +- apps/sim/lib/uploads/providers/s3/client.ts | 2 +- apps/sim/lib/webhooks/deploy.ts | 2 +- .../lib/webhooks/pending-verification.test.ts | 13 +- apps/sim/lib/webhooks/pending-verification.ts | 2 +- apps/sim/lib/webhooks/polling/orchestrator.ts | 2 +- apps/sim/lib/webhooks/processor.test.ts | 55 +- apps/sim/lib/webhooks/processor.ts | 4 +- .../lib/webhooks/provider-subscriptions.ts | 2 +- apps/sim/lib/webhooks/providers/ashby.ts | 2 +- apps/sim/lib/webhooks/providers/attio.ts | 2 +- apps/sim/lib/webhooks/providers/gong.ts | 2 +- apps/sim/lib/webhooks/providers/linear.ts | 4 +- .../lib/webhooks/providers/microsoft-teams.ts | 2 +- apps/sim/lib/webhooks/providers/monday.ts | 2 +- apps/sim/lib/webhooks/providers/slack.ts | 2 +- .../sim/lib/webhooks/providers/vercel.test.ts | 11 +- .../lib/webhooks/providers/whatsapp.test.ts | 5 +- apps/sim/lib/webhooks/providers/zoom.ts | 2 +- apps/sim/lib/webhooks/utils.server.ts | 2 +- .../lib/workflows/custom-tools/operations.ts | 2 +- apps/sim/lib/workflows/defaults.ts | 2 +- .../lib/workflows/diff/diff-engine.test.ts | 3 - apps/sim/lib/workflows/diff/diff-engine.ts | 4 +- .../workflows/executor/execute-workflow.ts | 4 +- .../workflows/executor/execution-core.test.ts | 33 +- .../executor/human-in-the-loop-manager.ts | 4 +- .../workflows/executor/pause-persistence.ts | 2 +- .../executor/queued-workflow-execution.ts | 2 +- apps/sim/lib/workflows/lifecycle.test.ts | 69 +- .../lib/workflows/operations/import-export.ts | 2 +- .../workflows/operations/socket-operations.ts | 2 +- .../workflows/orchestration/chat-deploy.ts | 2 +- .../persistence/custom-tools-persistence.ts | 2 +- .../workflows/persistence/duplicate.test.ts | 49 +- .../lib/workflows/persistence/duplicate.ts | 2 +- .../lib/workflows/persistence/utils.test.ts | 6 - apps/sim/lib/workflows/persistence/utils.ts | 2 +- .../lib/workflows/sanitization/validation.ts | 2 +- .../lib/workflows/schedules/deploy.test.ts | 3 - apps/sim/lib/workflows/schedules/deploy.ts | 2 +- apps/sim/lib/workflows/schedules/utils.ts | 4 +- apps/sim/lib/workflows/skills/operations.ts | 2 +- .../lib/workflows/triggers/trigger-utils.ts | 2 +- apps/sim/lib/workflows/utils.test.ts | 37 +- apps/sim/lib/workflows/utils.ts | 2 +- apps/sim/lib/workspaces/duplicate.ts | 2 +- apps/sim/lib/workspaces/lifecycle.test.ts | 42 +- .../lib/workspaces/permissions/utils.test.ts | 29 +- apps/sim/providers/anthropic/core.ts | 2 +- apps/sim/providers/azure-openai/index.ts | 2 +- apps/sim/providers/bedrock/index.ts | 2 +- apps/sim/providers/cerebras/index.ts | 2 +- apps/sim/providers/deepseek/index.ts | 2 +- apps/sim/providers/fireworks/index.ts | 2 +- apps/sim/providers/gemini/core.ts | 2 +- apps/sim/providers/google/utils.ts | 2 +- apps/sim/providers/groq/index.ts | 2 +- apps/sim/providers/index.ts | 2 +- apps/sim/providers/mistral/index.ts | 2 +- apps/sim/providers/ollama/index.ts | 2 +- apps/sim/providers/openai/core.ts | 2 +- apps/sim/providers/openrouter/index.ts | 2 +- apps/sim/providers/openrouter/utils.ts | 2 +- apps/sim/providers/vllm/index.ts | 2 +- apps/sim/providers/xai/index.ts | 2 +- apps/sim/serializer/index.test.ts | 3 +- apps/sim/serializer/index.ts | 4 +- .../tests/serializer.extended.test.ts | 3 +- apps/sim/socket/handlers/operations.ts | 2 +- apps/sim/socket/handlers/workflow.test.ts | 9 - apps/sim/socket/index.test.ts | 4 +- apps/sim/socket/middleware/auth.ts | 2 +- .../sim/socket/middleware/permissions.test.ts | 6 +- apps/sim/stores/chat/store.ts | 2 +- apps/sim/stores/notifications/store.ts | 2 +- apps/sim/stores/operation-queue/store.test.ts | 10 - apps/sim/stores/table/store.ts | 2 +- apps/sim/stores/terminal/console/store.ts | 2 +- apps/sim/stores/undo-redo/utils.ts | 2 +- apps/sim/stores/variables/store.ts | 2 +- apps/sim/stores/workflow-diff/store.ts | 2 +- apps/sim/stores/workflows/subblock/store.ts | 2 +- apps/sim/stores/workflows/utils.ts | 2 +- apps/sim/stores/workflows/workflow/store.ts | 4 +- apps/sim/tools/apify/run_actor_async.ts | 2 +- apps/sim/tools/brightdata/discover.ts | 3 +- apps/sim/tools/browser_use/run_task.ts | 2 +- apps/sim/tools/datadog/list_monitors.ts | 5 +- apps/sim/tools/exa/research.ts | 2 +- apps/sim/tools/extend/parser.ts | 2 +- apps/sim/tools/firecrawl/agent.ts | 2 +- apps/sim/tools/firecrawl/crawl.ts | 2 +- apps/sim/tools/firecrawl/extract.ts | 2 +- apps/sim/tools/http/webhook_request.ts | 2 +- apps/sim/tools/incidentio/workflows_create.ts | 5 +- apps/sim/tools/index.test.ts | 14 +- apps/sim/tools/index.ts | 3 +- apps/sim/tools/langsmith/utils.ts | 2 +- apps/sim/tools/mistral/parser.ts | 2 +- apps/sim/tools/notion/query_database.ts | 2 +- apps/sim/tools/params.ts | 2 +- apps/sim/tools/pulse/parser.ts | 2 +- apps/sim/tools/reducto/parser.ts | 2 +- apps/sim/tools/sharepoint/create_list.ts | 2 +- apps/sim/tools/sharepoint/read_page.ts | 2 +- apps/sim/tools/supabase/utils.test.ts | 5 +- apps/sim/tools/textract/parser.ts | 2 +- apps/sim/tools/tinybird/query.ts | 2 +- apps/sim/tools/utils.test.ts | 16 +- apps/sim/triggers/generic/webhook.ts | 2 +- bun.lock | 11 + packages/testing/src/index.ts | 39 +- packages/testing/src/mocks/api.mock.ts | 198 --- packages/testing/src/mocks/audit.mock.ts | 21 +- .../src/mocks/auth-oauth-utils.mock.ts | 59 + packages/testing/src/mocks/auth.mock.ts | 67 +- .../testing/src/mocks/copilot-http.mock.ts | 85 ++ packages/testing/src/mocks/encryption.mock.ts | 31 + .../src/mocks/execution-preprocessing.mock.ts | 31 + .../testing/src/mocks/feature-flags.mock.ts | 44 + .../testing/src/mocks/hybrid-auth.mock.ts | 92 +- packages/testing/src/mocks/index.ts | 75 +- .../src/mocks/input-validation.mock.ts | 47 + .../src/mocks/knowledge-api-utils.mock.ts | 40 + .../testing/src/mocks/logging-session.mock.ts | 65 + .../testing/src/mocks/permissions.mock.ts | 50 + .../testing/src/mocks/redis-config.mock.ts | 39 + packages/testing/src/mocks/request.mock.ts | 23 +- packages/testing/src/mocks/schema.mock.ts | 1206 +++++++++++++++++ packages/testing/src/mocks/urls.mock.ts | 43 + packages/testing/src/mocks/uuid.mock.ts | 6 - .../src/mocks/workflows-api-utils.mock.ts | 49 + .../src/mocks/workflows-orchestration.mock.ts | 47 + .../mocks/workflows-persistence-utils.mock.ts | 60 + .../testing/src/mocks/workflows-utils.mock.ts | 70 + packages/utils/package.json | 45 + packages/utils/src/errors.test.ts | 78 ++ .../utils/src/errors.ts | 10 + packages/utils/src/formatting.test.ts | 179 +++ .../utils/src}/formatting.ts | 2 +- packages/utils/src/helpers.test.ts | 41 + packages/utils/src/helpers.ts | 10 + packages/utils/src/id.test.ts | 57 + .../utils/uuid.ts => packages/utils/src/id.ts | 0 packages/utils/src/index.ts | 14 + packages/utils/tsconfig.json | 5 + packages/utils/vitest.config.ts | 9 + 784 files changed, 5259 insertions(+), 4635 deletions(-) delete mode 100644 apps/sim/lib/core/utils/helpers.ts delete mode 100644 apps/sim/lib/core/utils/pg-error.test.ts delete mode 100644 packages/testing/src/mocks/api.mock.ts create mode 100644 packages/testing/src/mocks/auth-oauth-utils.mock.ts create mode 100644 packages/testing/src/mocks/copilot-http.mock.ts create mode 100644 packages/testing/src/mocks/encryption.mock.ts create mode 100644 packages/testing/src/mocks/execution-preprocessing.mock.ts create mode 100644 packages/testing/src/mocks/feature-flags.mock.ts create mode 100644 packages/testing/src/mocks/input-validation.mock.ts create mode 100644 packages/testing/src/mocks/knowledge-api-utils.mock.ts create mode 100644 packages/testing/src/mocks/logging-session.mock.ts create mode 100644 packages/testing/src/mocks/permissions.mock.ts create mode 100644 packages/testing/src/mocks/redis-config.mock.ts create mode 100644 packages/testing/src/mocks/schema.mock.ts create mode 100644 packages/testing/src/mocks/urls.mock.ts delete mode 100644 packages/testing/src/mocks/uuid.mock.ts create mode 100644 packages/testing/src/mocks/workflows-api-utils.mock.ts create mode 100644 packages/testing/src/mocks/workflows-orchestration.mock.ts create mode 100644 packages/testing/src/mocks/workflows-persistence-utils.mock.ts create mode 100644 packages/testing/src/mocks/workflows-utils.mock.ts create mode 100644 packages/utils/package.json create mode 100644 packages/utils/src/errors.test.ts rename apps/sim/lib/core/utils/pg-error.ts => packages/utils/src/errors.ts (68%) create mode 100644 packages/utils/src/formatting.test.ts rename {apps/sim/lib/core/utils => packages/utils/src}/formatting.ts (99%) create mode 100644 packages/utils/src/helpers.test.ts create mode 100644 packages/utils/src/helpers.ts create mode 100644 packages/utils/src/id.test.ts rename apps/sim/lib/core/utils/uuid.ts => packages/utils/src/id.ts (100%) create mode 100644 packages/utils/src/index.ts create mode 100644 packages/utils/tsconfig.json create mode 100644 packages/utils/vitest.config.ts diff --git a/.claude/rules/global.md b/.claude/rules/global.md index 4c98edc16cb..cfcb4c7cc29 100644 --- a/.claude/rules/global.md +++ b/.claude/rules/global.md @@ -10,7 +10,7 @@ Use TSDoc for documentation. No `====` separators. No non-TSDoc comments. Never update global styles. Keep all styling local to components. ## ID Generation -Never use `crypto.randomUUID()`, `nanoid`, or the `uuid` package directly. Use the utilities from `@/lib/core/utils/uuid`: +Never use `crypto.randomUUID()`, `nanoid`, or the `uuid` package directly. Use the utilities from `@sim/utils/id`: - `generateId()` — UUID v4, use by default - `generateShortId(size?)` — short URL-safe ID (default 21 chars), for compact identifiers @@ -24,14 +24,14 @@ import { v4 as uuidv4 } from 'uuid' const id = crypto.randomUUID() // ✓ Good -import { generateId, generateShortId } from '@/lib/core/utils/uuid' +import { generateId, generateShortId } from '@sim/utils/id' const uuid = generateId() const shortId = generateShortId() const tiny = generateShortId(8) ``` ## Common Utilities -Use shared helpers from `@/lib/core/utils/helpers` instead of writing inline implementations: +Use shared helpers from `@sim/utils` instead of writing inline implementations: - `sleep(ms)` — async delay. Never write `new Promise(resolve => setTimeout(resolve, ms))` - `toError(value)` — normalize unknown caught values to `Error`. Never write `e instanceof Error ? e : new Error(String(e))` @@ -44,7 +44,8 @@ const msg = error instanceof Error ? error.message : String(error) const err = error instanceof Error ? error : new Error(String(error)) // ✓ Good -import { sleep, toError } from '@/lib/core/utils/helpers' +import { sleep } from '@sim/utils/helpers' +import { toError } from '@sim/utils/errors' await sleep(1000) const msg = toError(error).message const err = toError(error) diff --git a/.claude/rules/sim-testing.md b/.claude/rules/sim-testing.md index 85a7554637b..68a7b8203aa 100644 --- a/.claude/rules/sim-testing.md +++ b/.claude/rules/sim-testing.md @@ -102,10 +102,6 @@ vi.mock('@/lib/workspaces/utils', () => ({ })) ``` -### NEVER use `mockAuth()`, `mockConsoleLogger()`, or `setupCommonApiMocks()` from `@sim/testing` - -These helpers internally use `vi.doMock()` which is slow. Use direct `vi.hoisted()` + `vi.mock()` instead. - ### Mock heavy transitive dependencies If a module under test imports `@/blocks` (200+ files), `@/tools/registry`, or other heavy modules, mock them: @@ -135,38 +131,61 @@ await new Promise(r => setTimeout(r, 1)) vi.useFakeTimers() ``` -## Mock Pattern Reference +## Centralized Mocks (prefer over local declarations) + +`@sim/testing` exports ready-to-use mock modules for common dependencies. Import and pass directly to `vi.mock()` — no `vi.hoisted()` boilerplate needed. Each paired `*MockFns` object exposes the underlying `vi.fn()`s for per-test overrides. + +| Module mocked | Import | Factory form | +|---|---|---| +| `@/app/api/auth/oauth/utils` | `authOAuthUtilsMock`, `authOAuthUtilsMockFns` | `vi.mock('@/app/api/auth/oauth/utils', () => authOAuthUtilsMock)` | +| `@/app/api/knowledge/utils` | `knowledgeApiUtilsMock`, `knowledgeApiUtilsMockFns` | `vi.mock('@/app/api/knowledge/utils', () => knowledgeApiUtilsMock)` | +| `@/app/api/workflows/utils` | `workflowsApiUtilsMock`, `workflowsApiUtilsMockFns` | `vi.mock('@/app/api/workflows/utils', () => workflowsApiUtilsMock)` | +| `@/lib/audit/log` | `auditMock`, `auditMockFns` | `vi.mock('@/lib/audit/log', () => auditMock)` | +| `@/lib/auth` | `authMock`, `authMockFns` | `vi.mock('@/lib/auth', () => authMock)` | +| `@/lib/auth/hybrid` | `hybridAuthMock`, `hybridAuthMockFns` | `vi.mock('@/lib/auth/hybrid', () => hybridAuthMock)` | +| `@/lib/copilot/request/http` | `copilotHttpMock`, `copilotHttpMockFns` | `vi.mock('@/lib/copilot/request/http', () => copilotHttpMock)` | +| `@/lib/core/config/env` | `envMock`, `createEnvMock(overrides)` | `vi.mock('@/lib/core/config/env', () => envMock)` | +| `@/lib/core/config/feature-flags` | `featureFlagsMock` | `vi.mock('@/lib/core/config/feature-flags', () => featureFlagsMock)` | +| `@/lib/core/config/redis` | `redisConfigMock`, `redisConfigMockFns` | `vi.mock('@/lib/core/config/redis', () => redisConfigMock)` | +| `@/lib/core/security/encryption` | `encryptionMock`, `encryptionMockFns` | `vi.mock('@/lib/core/security/encryption', () => encryptionMock)` | +| `@/lib/core/security/input-validation.server` | `inputValidationMock`, `inputValidationMockFns` | `vi.mock('@/lib/core/security/input-validation.server', () => inputValidationMock)` | +| `@/lib/core/utils/request` | `requestUtilsMock`, `requestUtilsMockFns` | `vi.mock('@/lib/core/utils/request', () => requestUtilsMock)` | +| `@/lib/core/utils/urls` | `urlsMock`, `urlsMockFns` | `vi.mock('@/lib/core/utils/urls', () => urlsMock)` | +| `@/lib/execution/preprocessing` | `executionPreprocessingMock`, `executionPreprocessingMockFns` | `vi.mock('@/lib/execution/preprocessing', () => executionPreprocessingMock)` | +| `@/lib/logs/execution/logging-session` | `loggingSessionMock`, `loggingSessionMockFns`, `LoggingSessionMock` | `vi.mock('@/lib/logs/execution/logging-session', () => loggingSessionMock)` | +| `@/lib/workflows/orchestration` | `workflowsOrchestrationMock`, `workflowsOrchestrationMockFns` | `vi.mock('@/lib/workflows/orchestration', () => workflowsOrchestrationMock)` | +| `@/lib/workflows/persistence/utils` | `workflowsPersistenceUtilsMock`, `workflowsPersistenceUtilsMockFns` | `vi.mock('@/lib/workflows/persistence/utils', () => workflowsPersistenceUtilsMock)` | +| `@/lib/workflows/utils` | `workflowsUtilsMock`, `workflowsUtilsMockFns` | `vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock)` | +| `@/lib/workspaces/permissions/utils` | `permissionsMock`, `permissionsMockFns` | `vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock)` | +| `@sim/db/schema` | `schemaMock` | `vi.mock('@sim/db/schema', () => schemaMock)` | ### Auth mocking (API routes) ```typescript -const { mockGetSession } = vi.hoisted(() => ({ - mockGetSession: vi.fn(), -})) +import { authMock, authMockFns } from '@sim/testing' +import { beforeEach, describe, expect, it, vi } from 'vitest' -vi.mock('@/lib/auth', () => ({ - auth: { api: { getSession: vi.fn() } }, - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) -// In tests: -mockGetSession.mockResolvedValue({ user: { id: 'user-1', email: 'test@example.com' } }) -mockGetSession.mockResolvedValue(null) // unauthenticated +import { GET } from '@/app/api/my-route/route' + +beforeEach(() => { + vi.clearAllMocks() + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) +}) ``` +Only define a local `vi.mock('@/lib/auth', ...)` if the module under test consumes exports outside the centralized shape (e.g., `auth.api.verifyOneTimeToken`, `auth.api.resetPassword`). + ### Hybrid auth mocking ```typescript -const { mockCheckSessionOrInternalAuth } = vi.hoisted(() => ({ - mockCheckSessionOrInternalAuth: vi.fn(), -})) +import { hybridAuthMock, hybridAuthMockFns } from '@sim/testing' -vi.mock('@/lib/auth/hybrid', () => ({ - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) // In tests: -mockCheckSessionOrInternalAuth.mockResolvedValue({ +hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: 'user-1', authType: 'session', }) ``` @@ -197,21 +216,23 @@ Always prefer over local test data. | Category | Utilities | |----------|-----------| -| **Mocks** | `loggerMock`, `databaseMock`, `drizzleOrmMock`, `setupGlobalFetchMock()` | +| **Module mocks** | See "Centralized Mocks" table above | +| **Logger helpers** | `loggerMock`, `createMockLogger()`, `getLoggerCalls()`, `clearLoggerMocks()` | +| **Database helpers** | `databaseMock`, `drizzleOrmMock`, `createMockDb()`, `createMockSql()`, `createMockSqlOperators()` | +| **Fetch helpers** | `setupGlobalFetchMock()`, `createMockFetch()`, `createMockResponse()`, `mockFetchError()` | | **Factories** | `createSession()`, `createWorkflowRecord()`, `createBlock()`, `createExecutionContext()` | | **Builders** | `WorkflowBuilder`, `ExecutionContextBuilder` | | **Assertions** | `expectWorkflowAccessGranted()`, `expectBlockExecuted()` | -| **Requests** | `createMockRequest()`, `createEnvMock()` | +| **Requests** | `createMockRequest()`, `createMockFormDataRequest()` | ## Rules Summary 1. `@vitest-environment node` unless DOM is required -2. `vi.hoisted()` + `vi.mock()` + static imports — never `vi.resetModules()` + `vi.doMock()` + dynamic imports -3. `vi.mock()` calls before importing mocked modules -4. `@sim/testing` utilities over local mocks +2. Prefer centralized mocks from `@sim/testing` (see table above) over local `vi.hoisted()` + `vi.mock()` boilerplate +3. `vi.hoisted()` + `vi.mock()` + static imports — never `vi.resetModules()` + `vi.doMock()` + dynamic imports +4. `vi.mock()` calls before importing mocked modules 5. `beforeEach(() => vi.clearAllMocks())` to reset state — no redundant `afterEach` 6. No `vi.importActual()` — mock everything explicitly -7. No `mockAuth()`, `mockConsoleLogger()`, `setupCommonApiMocks()` — use direct mocks -8. Mock heavy deps (`@/blocks`, `@/tools/registry`, `@/triggers`) in tests that don't need them -9. Use absolute imports in test files -10. Avoid real timers — use 1ms delays or `vi.useFakeTimers()` +7. Mock heavy deps (`@/blocks`, `@/tools/registry`, `@/triggers`) in tests that don't need them +8. Use absolute imports in test files +9. Avoid real timers — use 1ms delays or `vi.useFakeTimers()` diff --git a/.cursor/rules/global.mdc b/.cursor/rules/global.mdc index 991244503f3..78f0cb106b3 100644 --- a/.cursor/rules/global.mdc +++ b/.cursor/rules/global.mdc @@ -17,7 +17,7 @@ Use TSDoc for documentation. No `====` separators. No non-TSDoc comments. Never update global styles. Keep all styling local to components. ## ID Generation -Never use `crypto.randomUUID()`, `nanoid`, or the `uuid` package directly. Use the utilities from `@/lib/core/utils/uuid`: +Never use `crypto.randomUUID()`, `nanoid`, or the `uuid` package directly. Use the utilities from `@sim/utils/id`: - `generateId()` — UUID v4, use by default - `generateShortId(size?)` — short URL-safe ID (default 21 chars), for compact identifiers @@ -31,14 +31,14 @@ import { v4 as uuidv4 } from 'uuid' const id = crypto.randomUUID() // ✓ Good -import { generateId, generateShortId } from '@/lib/core/utils/uuid' +import { generateId, generateShortId } from '@sim/utils/id' const uuid = generateId() const shortId = generateShortId() const tiny = generateShortId(8) ``` ## Common Utilities -Use shared helpers from `@/lib/core/utils/helpers` instead of writing inline implementations: +Use shared helpers from `@sim/utils` instead of writing inline implementations: - `sleep(ms)` — async delay. Never write `new Promise(resolve => setTimeout(resolve, ms))` - `toError(value)` — normalize unknown caught values to `Error`. Never write `e instanceof Error ? e : new Error(String(e))` @@ -51,7 +51,8 @@ const msg = error instanceof Error ? error.message : String(error) const err = error instanceof Error ? error : new Error(String(error)) // ✓ Good -import { sleep, toError } from '@/lib/core/utils/helpers' +import { sleep } from '@sim/utils/helpers' +import { toError } from '@sim/utils/errors' await sleep(1000) const msg = toError(error).message const err = toError(error) diff --git a/.cursor/rules/sim-testing.mdc b/.cursor/rules/sim-testing.mdc index ec140388e84..41b66b3693c 100644 --- a/.cursor/rules/sim-testing.mdc +++ b/.cursor/rules/sim-testing.mdc @@ -3,6 +3,7 @@ description: Testing patterns with Vitest and @sim/testing globs: ["apps/sim/**/*.test.ts", "apps/sim/**/*.test.tsx"] --- + # Testing Patterns Use Vitest. Test files: `feature.ts` → `feature.test.ts` @@ -101,10 +102,6 @@ vi.mock('@/lib/workspaces/utils', () => ({ })) ``` -### NEVER use `mockAuth()`, `mockConsoleLogger()`, or `setupCommonApiMocks()` from `@sim/testing` - -These helpers internally use `vi.doMock()` which is slow. Use direct `vi.hoisted()` + `vi.mock()` instead. - ### Mock heavy transitive dependencies If a module under test imports `@/blocks` (200+ files), `@/tools/registry`, or other heavy modules, mock them: @@ -134,38 +131,61 @@ await new Promise(r => setTimeout(r, 1)) vi.useFakeTimers() ``` -## Mock Pattern Reference +## Centralized Mocks (prefer over local declarations) + +`@sim/testing` exports ready-to-use mock modules for common dependencies. Import and pass directly to `vi.mock()` — no `vi.hoisted()` boilerplate needed. Each paired `*MockFns` object exposes the underlying `vi.fn()`s for per-test overrides. + +| Module mocked | Import | Factory form | +|---|---|---| +| `@/app/api/auth/oauth/utils` | `authOAuthUtilsMock`, `authOAuthUtilsMockFns` | `vi.mock('@/app/api/auth/oauth/utils', () => authOAuthUtilsMock)` | +| `@/app/api/knowledge/utils` | `knowledgeApiUtilsMock`, `knowledgeApiUtilsMockFns` | `vi.mock('@/app/api/knowledge/utils', () => knowledgeApiUtilsMock)` | +| `@/app/api/workflows/utils` | `workflowsApiUtilsMock`, `workflowsApiUtilsMockFns` | `vi.mock('@/app/api/workflows/utils', () => workflowsApiUtilsMock)` | +| `@/lib/audit/log` | `auditMock`, `auditMockFns` | `vi.mock('@/lib/audit/log', () => auditMock)` | +| `@/lib/auth` | `authMock`, `authMockFns` | `vi.mock('@/lib/auth', () => authMock)` | +| `@/lib/auth/hybrid` | `hybridAuthMock`, `hybridAuthMockFns` | `vi.mock('@/lib/auth/hybrid', () => hybridAuthMock)` | +| `@/lib/copilot/request/http` | `copilotHttpMock`, `copilotHttpMockFns` | `vi.mock('@/lib/copilot/request/http', () => copilotHttpMock)` | +| `@/lib/core/config/env` | `envMock`, `createEnvMock(overrides)` | `vi.mock('@/lib/core/config/env', () => envMock)` | +| `@/lib/core/config/feature-flags` | `featureFlagsMock` | `vi.mock('@/lib/core/config/feature-flags', () => featureFlagsMock)` | +| `@/lib/core/config/redis` | `redisConfigMock`, `redisConfigMockFns` | `vi.mock('@/lib/core/config/redis', () => redisConfigMock)` | +| `@/lib/core/security/encryption` | `encryptionMock`, `encryptionMockFns` | `vi.mock('@/lib/core/security/encryption', () => encryptionMock)` | +| `@/lib/core/security/input-validation.server` | `inputValidationMock`, `inputValidationMockFns` | `vi.mock('@/lib/core/security/input-validation.server', () => inputValidationMock)` | +| `@/lib/core/utils/request` | `requestUtilsMock`, `requestUtilsMockFns` | `vi.mock('@/lib/core/utils/request', () => requestUtilsMock)` | +| `@/lib/core/utils/urls` | `urlsMock`, `urlsMockFns` | `vi.mock('@/lib/core/utils/urls', () => urlsMock)` | +| `@/lib/execution/preprocessing` | `executionPreprocessingMock`, `executionPreprocessingMockFns` | `vi.mock('@/lib/execution/preprocessing', () => executionPreprocessingMock)` | +| `@/lib/logs/execution/logging-session` | `loggingSessionMock`, `loggingSessionMockFns`, `LoggingSessionMock` | `vi.mock('@/lib/logs/execution/logging-session', () => loggingSessionMock)` | +| `@/lib/workflows/orchestration` | `workflowsOrchestrationMock`, `workflowsOrchestrationMockFns` | `vi.mock('@/lib/workflows/orchestration', () => workflowsOrchestrationMock)` | +| `@/lib/workflows/persistence/utils` | `workflowsPersistenceUtilsMock`, `workflowsPersistenceUtilsMockFns` | `vi.mock('@/lib/workflows/persistence/utils', () => workflowsPersistenceUtilsMock)` | +| `@/lib/workflows/utils` | `workflowsUtilsMock`, `workflowsUtilsMockFns` | `vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock)` | +| `@/lib/workspaces/permissions/utils` | `permissionsMock`, `permissionsMockFns` | `vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock)` | +| `@sim/db/schema` | `schemaMock` | `vi.mock('@sim/db/schema', () => schemaMock)` | ### Auth mocking (API routes) ```typescript -const { mockGetSession } = vi.hoisted(() => ({ - mockGetSession: vi.fn(), -})) +import { authMock, authMockFns } from '@sim/testing' +import { beforeEach, describe, expect, it, vi } from 'vitest' -vi.mock('@/lib/auth', () => ({ - auth: { api: { getSession: vi.fn() } }, - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) -// In tests: -mockGetSession.mockResolvedValue({ user: { id: 'user-1', email: 'test@example.com' } }) -mockGetSession.mockResolvedValue(null) // unauthenticated +import { GET } from '@/app/api/my-route/route' + +beforeEach(() => { + vi.clearAllMocks() + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) +}) ``` +Only define a local `vi.mock('@/lib/auth', ...)` if the module under test consumes exports outside the centralized shape (e.g., `auth.api.verifyOneTimeToken`, `auth.api.resetPassword`). + ### Hybrid auth mocking ```typescript -const { mockCheckSessionOrInternalAuth } = vi.hoisted(() => ({ - mockCheckSessionOrInternalAuth: vi.fn(), -})) +import { hybridAuthMock, hybridAuthMockFns } from '@sim/testing' -vi.mock('@/lib/auth/hybrid', () => ({ - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) // In tests: -mockCheckSessionOrInternalAuth.mockResolvedValue({ +hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: 'user-1', authType: 'session', }) ``` @@ -196,21 +216,23 @@ Always prefer over local test data. | Category | Utilities | |----------|-----------| -| **Mocks** | `loggerMock`, `databaseMock`, `drizzleOrmMock`, `setupGlobalFetchMock()` | +| **Module mocks** | See "Centralized Mocks" table above | +| **Logger helpers** | `loggerMock`, `createMockLogger()`, `getLoggerCalls()`, `clearLoggerMocks()` | +| **Database helpers** | `databaseMock`, `drizzleOrmMock`, `createMockDb()`, `createMockSql()`, `createMockSqlOperators()` | +| **Fetch helpers** | `setupGlobalFetchMock()`, `createMockFetch()`, `createMockResponse()`, `mockFetchError()` | | **Factories** | `createSession()`, `createWorkflowRecord()`, `createBlock()`, `createExecutionContext()` | | **Builders** | `WorkflowBuilder`, `ExecutionContextBuilder` | | **Assertions** | `expectWorkflowAccessGranted()`, `expectBlockExecuted()` | -| **Requests** | `createMockRequest()`, `createEnvMock()` | +| **Requests** | `createMockRequest()`, `createMockFormDataRequest()` | ## Rules Summary 1. `@vitest-environment node` unless DOM is required -2. `vi.hoisted()` + `vi.mock()` + static imports — never `vi.resetModules()` + `vi.doMock()` + dynamic imports -3. `vi.mock()` calls before importing mocked modules -4. `@sim/testing` utilities over local mocks +2. Prefer centralized mocks from `@sim/testing` (see table above) over local `vi.hoisted()` + `vi.mock()` boilerplate +3. `vi.hoisted()` + `vi.mock()` + static imports — never `vi.resetModules()` + `vi.doMock()` + dynamic imports +4. `vi.mock()` calls before importing mocked modules 5. `beforeEach(() => vi.clearAllMocks())` to reset state — no redundant `afterEach` 6. No `vi.importActual()` — mock everything explicitly -7. No `mockAuth()`, `mockConsoleLogger()`, `setupCommonApiMocks()` — use direct mocks -8. Mock heavy deps (`@/blocks`, `@/tools/registry`, `@/triggers`) in tests that don't need them -9. Use absolute imports in test files -10. Avoid real timers — use 1ms delays or `vi.useFakeTimers()` +7. Mock heavy deps (`@/blocks`, `@/tools/registry`, `@/triggers`) in tests that don't need them +8. Use absolute imports in test files +9. Avoid real timers — use 1ms delays or `vi.useFakeTimers()` diff --git a/AGENTS.md b/AGENTS.md index bc54c6f912c..5e21c7e009c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,7 +7,7 @@ You are a professional software engineer. All code must follow best practices: a - **Logging**: Import `createLogger` from `@sim/logger`. Use `logger.info`, `logger.warn`, `logger.error` instead of `console.log` - **Comments**: Use TSDoc for documentation. No `====` separators. No non-TSDoc comments - **Styling**: Never update global styles. Keep all styling local to components -- **ID Generation**: Never use `crypto.randomUUID()`, `nanoid`, or `uuid` package. Use `generateId()` (UUID v4) or `generateShortId()` (compact) from `@/lib/core/utils/uuid` +- **ID Generation**: Never use `crypto.randomUUID()`, `nanoid`, or `uuid` package. Use `generateId()` (UUID v4) or `generateShortId()` (compact) from `@sim/utils/id` - **Package Manager**: Use `bun` and `bunx`, not `npm` and `npx` ## Architecture diff --git a/CLAUDE.md b/CLAUDE.md index 965ae7fd7b3..1ca9bf41a25 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -7,8 +7,8 @@ You are a professional software engineer. All code must follow best practices: a - **Logging**: Import `createLogger` from `@sim/logger`. Use `logger.info`, `logger.warn`, `logger.error` instead of `console.log` - **Comments**: Use TSDoc for documentation. No `====` separators. No non-TSDoc comments - **Styling**: Never update global styles. Keep all styling local to components -- **ID Generation**: Never use `crypto.randomUUID()`, `nanoid`, or `uuid` package. Use `generateId()` (UUID v4) or `generateShortId()` (compact) from `@/lib/core/utils/uuid` -- **Common Utilities**: Use shared helpers from `@/lib/core/utils/helpers` instead of inline implementations. `sleep(ms)` for delays, `toError(e)` to normalize caught values. +- **ID Generation**: Never use `crypto.randomUUID()`, `nanoid`, or `uuid` package. Use `generateId()` (UUID v4) or `generateShortId()` (compact) from `@sim/utils/id` +- **Common Utilities**: Use shared helpers from `@sim/utils` instead of inline implementations. `sleep(ms)` from `@sim/utils/helpers` for delays, `toError(e)` from `@sim/utils/errors` to normalize caught values. - **Package Manager**: Use `bun` and `bunx`, not `npm` and `npx` ## Architecture diff --git a/apps/sim/app/academy/components/sandbox-canvas-provider.tsx b/apps/sim/app/academy/components/sandbox-canvas-provider.tsx index 893bb1eaf03..1a176e9ac9b 100644 --- a/apps/sim/app/academy/components/sandbox-canvas-provider.tsx +++ b/apps/sim/app/academy/components/sandbox-canvas-provider.tsx @@ -2,6 +2,7 @@ import { useCallback, useEffect, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { sleep } from '@sim/utils/helpers' import type { Edge } from 'reactflow' import { buildMockExecutionPlan } from '@/lib/academy/mock-execution' import type { @@ -12,7 +13,6 @@ import type { } from '@/lib/academy/types' import { validateExercise } from '@/lib/academy/validation' import { cn } from '@/lib/core/utils/cn' -import { sleep } from '@/lib/core/utils/helpers' import { getEffectiveBlockOutputs } from '@/lib/workflows/blocks/block-outputs' import { getQueryClient } from '@/app/_shell/providers/get-query-client' import { GlobalCommandsProvider } from '@/app/workspace/[workspaceId]/providers/global-commands-provider' diff --git a/apps/sim/app/api/a2a/agents/route.ts b/apps/sim/app/api/a2a/agents/route.ts index e1f82e81047..0ff2d6e017d 100644 --- a/apps/sim/app/api/a2a/agents/route.ts +++ b/apps/sim/app/api/a2a/agents/route.ts @@ -7,13 +7,13 @@ import { db } from '@sim/db' import { a2aAgent, workflow } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { generateSkillsFromWorkflow } from '@/lib/a2a/agent-card' import { A2A_DEFAULT_CAPABILITIES } from '@/lib/a2a/constants' import { sanitizeAgentName } from '@/lib/a2a/utils' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { captureServerEvent } from '@/lib/posthog/server' import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' import { hasValidStartBlockInState } from '@/lib/workflows/triggers/trigger-utils' diff --git a/apps/sim/app/api/a2a/serve/[agentId]/route.ts b/apps/sim/app/api/a2a/serve/[agentId]/route.ts index 911884c1d12..768017e4f4b 100644 --- a/apps/sim/app/api/a2a/serve/[agentId]/route.ts +++ b/apps/sim/app/api/a2a/serve/[agentId]/route.ts @@ -2,6 +2,7 @@ import type { Artifact, Message, PushNotificationConfig, TaskState } from '@a2a- import { db } from '@sim/db' import { a2aAgent, a2aPushNotificationConfig, a2aTask, workflow } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { A2A_DEFAULT_TIMEOUT, A2A_MAX_HISTORY_LENGTH } from '@/lib/a2a/constants' @@ -18,7 +19,6 @@ import { validateUrlWithDNS } from '@/lib/core/security/input-validation.server' import { getClientIp } from '@/lib/core/utils/request' import { SSE_HEADERS } from '@/lib/core/utils/sse' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { markExecutionCancelled } from '@/lib/execution/cancellation' import { checkWorkspaceAccess } from '@/lib/workspaces/permissions/utils' import { getWorkspaceBilledAccountUserId } from '@/lib/workspaces/utils' diff --git a/apps/sim/app/api/a2a/serve/[agentId]/utils.ts b/apps/sim/app/api/a2a/serve/[agentId]/utils.ts index e3fdd88f5ca..46425475d67 100644 --- a/apps/sim/app/api/a2a/serve/[agentId]/utils.ts +++ b/apps/sim/app/api/a2a/serve/[agentId]/utils.ts @@ -1,7 +1,7 @@ import type { Artifact, Message, PushNotificationConfig, Task, TaskState } from '@a2a-js/sdk' +import { generateId } from '@sim/utils/id' import { generateInternalToken } from '@/lib/auth/internal' import { getInternalApiBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' /** A2A v0.3 JSON-RPC method names */ export const A2A_METHODS = { diff --git a/apps/sim/app/api/academy/certificates/route.ts b/apps/sim/app/api/academy/certificates/route.ts index 0164e1424e3..aefca60a9ee 100644 --- a/apps/sim/app/api/academy/certificates/route.ts +++ b/apps/sim/app/api/academy/certificates/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { academyCertificate, user } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -9,7 +10,6 @@ import type { CertificateMetadata } from '@/lib/academy/types' import { getSession } from '@/lib/auth' import type { TokenBucketConfig } from '@/lib/core/rate-limiter' import { RateLimiter } from '@/lib/core/rate-limiter' -import { generateShortId } from '@/lib/core/utils/uuid' const logger = createLogger('AcademyCertificatesAPI') diff --git a/apps/sim/app/api/auth/oauth/connections/route.test.ts b/apps/sim/app/api/auth/oauth/connections/route.test.ts index dc6e165a261..b0417d8e9b0 100644 --- a/apps/sim/app/api/auth/oauth/connections/route.test.ts +++ b/apps/sim/app/api/auth/oauth/connections/route.test.ts @@ -3,40 +3,35 @@ * * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { authMock, authMockFns, createMockRequest } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetSession, mockDb, mockLogger, mockParseProvider, mockJwtDecode, mockEq } = vi.hoisted( - () => { - const db = { - select: vi.fn().mockReturnThis(), - from: vi.fn().mockReturnThis(), - where: vi.fn().mockReturnThis(), - limit: vi.fn(), - } - const logger = { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - trace: vi.fn(), - fatal: vi.fn(), - child: vi.fn(), - } - return { - mockGetSession: vi.fn(), - mockDb: db, - mockLogger: logger, - mockParseProvider: vi.fn(), - mockJwtDecode: vi.fn(), - mockEq: vi.fn((field: unknown, value: unknown) => ({ field, value, type: 'eq' })), - } +const { mockDb, mockLogger, mockParseProvider, mockJwtDecode, mockEq } = vi.hoisted(() => { + const db = { + select: vi.fn().mockReturnThis(), + from: vi.fn().mockReturnThis(), + where: vi.fn().mockReturnThis(), + limit: vi.fn(), } -) + const logger = { + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + debug: vi.fn(), + trace: vi.fn(), + fatal: vi.fn(), + child: vi.fn(), + } + return { + mockDb: db, + mockLogger: logger, + mockParseProvider: vi.fn(), + mockJwtDecode: vi.fn(), + mockEq: vi.fn((field: unknown, value: unknown) => ({ field, value, type: 'eq' })), + } +}) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/db', () => ({ db: mockDb, @@ -78,7 +73,7 @@ describe('OAuth Connections API Route', () => { }) it('should return connections successfully', async () => { - mockGetSession.mockResolvedValueOnce({ + authMockFns.mockGetSession.mockResolvedValueOnce({ user: { id: 'user-123' }, }) @@ -134,7 +129,7 @@ describe('OAuth Connections API Route', () => { }) it('should handle unauthenticated user', async () => { - mockGetSession.mockResolvedValueOnce(null) + authMockFns.mockGetSession.mockResolvedValueOnce(null) const req = createMockRequest('GET') @@ -147,7 +142,7 @@ describe('OAuth Connections API Route', () => { }) it('should handle user with no connections', async () => { - mockGetSession.mockResolvedValueOnce({ + authMockFns.mockGetSession.mockResolvedValueOnce({ user: { id: 'user-123' }, }) @@ -170,7 +165,7 @@ describe('OAuth Connections API Route', () => { }) it('should handle database error', async () => { - mockGetSession.mockResolvedValueOnce({ + authMockFns.mockGetSession.mockResolvedValueOnce({ user: { id: 'user-123' }, }) @@ -189,7 +184,7 @@ describe('OAuth Connections API Route', () => { }) it('should decode ID token for display name', async () => { - mockGetSession.mockResolvedValueOnce({ + authMockFns.mockGetSession.mockResolvedValueOnce({ user: { id: 'user-123' }, }) diff --git a/apps/sim/app/api/auth/oauth/credentials/route.test.ts b/apps/sim/app/api/auth/oauth/credentials/route.test.ts index bb303924f01..7c21745e544 100644 --- a/apps/sim/app/api/auth/oauth/credentials/route.test.ts +++ b/apps/sim/app/api/auth/oauth/credentials/route.test.ts @@ -4,10 +4,18 @@ * @vitest-environment node */ +import { + hybridAuthMock, + hybridAuthMockFns, + permissionsMock, + requestUtilsMock, + schemaMock, + workflowsUtilsMock, +} from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockCheckSessionOrInternalAuth, mockLogger } = vi.hoisted(() => { +const { mockLogger } = vi.hoisted(() => { const logger = { info: vi.fn(), warn: vi.fn(), @@ -18,56 +26,23 @@ const { mockCheckSessionOrInternalAuth, mockLogger } = vi.hoisted(() => { child: vi.fn(), } return { - mockCheckSessionOrInternalAuth: vi.fn(), mockLogger: logger, } }) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) -vi.mock('@/lib/core/utils/request', () => ({ - generateRequestId: vi.fn().mockReturnValue('mock-request-id'), -})) +vi.mock('@/lib/core/utils/request', () => requestUtilsMock) vi.mock('@/lib/credentials/oauth', () => ({ syncWorkspaceOAuthCredentialsForUser: vi.fn(), })) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: vi.fn(), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - checkWorkspaceAccess: vi.fn(), -})) +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) -vi.mock('@sim/db/schema', () => ({ - account: { - userId: 'userId', - providerId: 'providerId', - id: 'id', - scope: 'scope', - updatedAt: 'updatedAt', - }, - credential: { - id: 'id', - workspaceId: 'workspaceId', - type: 'type', - displayName: 'displayName', - providerId: 'providerId', - accountId: 'accountId', - }, - credentialMember: { - id: 'id', - credentialId: 'credentialId', - userId: 'userId', - status: 'status', - }, - user: { email: 'email', id: 'id' }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('@sim/logger', () => ({ createLogger: vi.fn().mockReturnValue(mockLogger), @@ -86,7 +61,7 @@ describe('OAuth Credentials API Route', () => { }) it('should handle unauthenticated user', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: false, error: 'Authentication required', }) @@ -102,7 +77,7 @@ describe('OAuth Credentials API Route', () => { }) it('should handle missing provider parameter', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-123', authType: 'session', @@ -119,7 +94,7 @@ describe('OAuth Credentials API Route', () => { }) it('should handle no credentials found', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-123', authType: 'session', @@ -135,7 +110,7 @@ describe('OAuth Credentials API Route', () => { }) it('should return empty credentials when no workspace context', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-123', authType: 'session', diff --git a/apps/sim/app/api/auth/oauth/disconnect/route.test.ts b/apps/sim/app/api/auth/oauth/disconnect/route.test.ts index 35bec861936..0f0ad680e49 100644 --- a/apps/sim/app/api/auth/oauth/disconnect/route.test.ts +++ b/apps/sim/app/api/auth/oauth/disconnect/route.test.ts @@ -3,11 +3,18 @@ * * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + auditMock, + authMock, + authMockFns, + createMockRequest, + requestUtilsMock, + schemaMock, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetSession, mockDb, mockSelectChain, mockLogger, mockSyncAllWebhooksForCredentialSet } = - vi.hoisted(() => { +const { mockDb, mockSelectChain, mockLogger, mockSyncAllWebhooksForCredentialSet } = vi.hoisted( + () => { const selectChain = { from: vi.fn().mockReturnThis(), innerJoin: vi.fn().mockReturnThis(), @@ -28,32 +35,21 @@ const { mockGetSession, mockDb, mockSelectChain, mockLogger, mockSyncAllWebhooks child: vi.fn(), } return { - mockGetSession: vi.fn(), mockDb: db, mockSelectChain: selectChain, mockLogger: logger, mockSyncAllWebhooksForCredentialSet: vi.fn().mockResolvedValue({}), } - }) + } +) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/db', () => ({ db: mockDb, })) -vi.mock('@sim/db/schema', () => ({ - account: { userId: 'userId', providerId: 'providerId' }, - credentialSetMember: { - id: 'id', - credentialSetId: 'credentialSetId', - userId: 'userId', - status: 'status', - }, - credentialSet: { id: 'id', providerId: 'providerId' }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...conditions: unknown[]) => ({ conditions, type: 'and' })), @@ -66,28 +62,13 @@ vi.mock('@sim/logger', () => ({ createLogger: vi.fn().mockReturnValue(mockLogger), })) -vi.mock('@/lib/core/utils/request', () => ({ - generateRequestId: vi.fn().mockReturnValue('test-request-id'), -})) +vi.mock('@/lib/core/utils/request', () => requestUtilsMock) vi.mock('@/lib/webhooks/utils.server', () => ({ syncAllWebhooksForCredentialSet: mockSyncAllWebhooksForCredentialSet, })) -vi.mock('@/lib/audit/log', () => ({ - recordAudit: vi.fn(), - AuditAction: { - CREDENTIAL_SET_CREATED: 'credential_set.created', - CREDENTIAL_SET_UPDATED: 'credential_set.updated', - CREDENTIAL_SET_DELETED: 'credential_set.deleted', - OAUTH_CONNECTED: 'oauth.connected', - OAUTH_DISCONNECTED: 'oauth.disconnected', - }, - AuditResourceType: { - CREDENTIAL_SET: 'credential_set', - OAUTH_CONNECTION: 'oauth_connection', - }, -})) +vi.mock('@/lib/audit/log', () => auditMock) import { POST } from '@/app/api/auth/oauth/disconnect/route' @@ -102,7 +83,7 @@ describe('OAuth Disconnect API Route', () => { }) it('should disconnect provider successfully', async () => { - mockGetSession.mockResolvedValueOnce({ + authMockFns.mockGetSession.mockResolvedValueOnce({ user: { id: 'user-123' }, }) @@ -122,7 +103,7 @@ describe('OAuth Disconnect API Route', () => { }) it('should disconnect specific provider ID successfully', async () => { - mockGetSession.mockResolvedValueOnce({ + authMockFns.mockGetSession.mockResolvedValueOnce({ user: { id: 'user-123' }, }) @@ -143,7 +124,7 @@ describe('OAuth Disconnect API Route', () => { }) it('should handle unauthenticated user', async () => { - mockGetSession.mockResolvedValueOnce(null) + authMockFns.mockGetSession.mockResolvedValueOnce(null) const req = createMockRequest('POST', { provider: 'google', @@ -158,7 +139,7 @@ describe('OAuth Disconnect API Route', () => { }) it('should handle missing provider', async () => { - mockGetSession.mockResolvedValueOnce({ + authMockFns.mockGetSession.mockResolvedValueOnce({ user: { id: 'user-123' }, }) @@ -173,7 +154,7 @@ describe('OAuth Disconnect API Route', () => { }) it('should handle database error', async () => { - mockGetSession.mockResolvedValueOnce({ + authMockFns.mockGetSession.mockResolvedValueOnce({ user: { id: 'user-123' }, }) diff --git a/apps/sim/app/api/auth/oauth/token/route.test.ts b/apps/sim/app/api/auth/oauth/token/route.test.ts index 7970a9b5180..e589a1fbe45 100644 --- a/apps/sim/app/api/auth/oauth/token/route.test.ts +++ b/apps/sim/app/api/auth/oauth/token/route.test.ts @@ -3,20 +3,17 @@ * * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + authOAuthUtilsMock, + authOAuthUtilsMockFns, + createMockRequest, + hybridAuthMock, + hybridAuthMockFns, + requestUtilsMock, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockGetUserId, - mockGetCredential, - mockRefreshTokenIfNeeded, - mockGetOAuthToken, - mockResolveOAuthAccountId, - mockGetServiceAccountToken, - mockAuthorizeCredentialUse, - mockCheckSessionOrInternalAuth, - mockLogger, -} = vi.hoisted(() => { +const { mockAuthorizeCredentialUse, mockLogger } = vi.hoisted(() => { const logger = { info: vi.fn(), warn: vi.fn(), @@ -27,26 +24,12 @@ const { child: vi.fn(), } return { - mockGetUserId: vi.fn(), - mockGetCredential: vi.fn(), - mockRefreshTokenIfNeeded: vi.fn(), - mockGetOAuthToken: vi.fn(), - mockResolveOAuthAccountId: vi.fn(), - mockGetServiceAccountToken: vi.fn(), mockAuthorizeCredentialUse: vi.fn(), - mockCheckSessionOrInternalAuth: vi.fn(), mockLogger: logger, } }) -vi.mock('@/app/api/auth/oauth/utils', () => ({ - getUserId: mockGetUserId, - getCredential: mockGetCredential, - refreshTokenIfNeeded: mockRefreshTokenIfNeeded, - getOAuthToken: mockGetOAuthToken, - resolveOAuthAccountId: mockResolveOAuthAccountId, - getServiceAccountToken: mockGetServiceAccountToken, -})) +vi.mock('@/app/api/auth/oauth/utils', () => authOAuthUtilsMock) vi.mock('@sim/logger', () => ({ createLogger: vi.fn().mockReturnValue(mockLogger), @@ -56,23 +39,16 @@ vi.mock('@/lib/auth/credential-access', () => ({ authorizeCredentialUse: mockAuthorizeCredentialUse, })) -vi.mock('@/lib/core/utils/request', () => ({ - generateRequestId: vi.fn().mockReturnValue('test-request-id'), -})) +vi.mock('@/lib/core/utils/request', () => requestUtilsMock) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkHybridAuth: vi.fn(), - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, - checkInternalAuth: vi.fn(), -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) import { GET, POST } from '@/app/api/auth/oauth/token/route' describe('OAuth Token API Routes', () => { beforeEach(() => { vi.clearAllMocks() - mockResolveOAuthAccountId.mockResolvedValue(null) + authOAuthUtilsMockFns.mockResolveOAuthAccountId.mockResolvedValue(null) }) /** @@ -86,14 +62,14 @@ describe('OAuth Token API Routes', () => { requesterUserId: 'test-user-id', credentialOwnerUserId: 'owner-user-id', }) - mockGetCredential.mockResolvedValueOnce({ + authOAuthUtilsMockFns.mockGetCredential.mockResolvedValueOnce({ id: 'credential-id', accessToken: 'test-token', refreshToken: 'refresh-token', accessTokenExpiresAt: new Date(Date.now() + 3600 * 1000), providerId: 'google', }) - mockRefreshTokenIfNeeded.mockResolvedValueOnce({ + authOAuthUtilsMockFns.mockRefreshTokenIfNeeded.mockResolvedValueOnce({ accessToken: 'fresh-token', refreshed: false, }) @@ -109,8 +85,8 @@ describe('OAuth Token API Routes', () => { expect(data).toHaveProperty('accessToken', 'fresh-token') expect(mockAuthorizeCredentialUse).toHaveBeenCalled() - expect(mockGetCredential).toHaveBeenCalled() - expect(mockRefreshTokenIfNeeded).toHaveBeenCalled() + expect(authOAuthUtilsMockFns.mockGetCredential).toHaveBeenCalled() + expect(authOAuthUtilsMockFns.mockRefreshTokenIfNeeded).toHaveBeenCalled() }) it('should handle workflowId for server-side authentication', async () => { @@ -120,14 +96,14 @@ describe('OAuth Token API Routes', () => { requesterUserId: 'workflow-owner-id', credentialOwnerUserId: 'workflow-owner-id', }) - mockGetCredential.mockResolvedValueOnce({ + authOAuthUtilsMockFns.mockGetCredential.mockResolvedValueOnce({ id: 'credential-id', accessToken: 'test-token', refreshToken: 'refresh-token', accessTokenExpiresAt: new Date(Date.now() + 3600 * 1000), providerId: 'google', }) - mockRefreshTokenIfNeeded.mockResolvedValueOnce({ + authOAuthUtilsMockFns.mockRefreshTokenIfNeeded.mockResolvedValueOnce({ accessToken: 'fresh-token', refreshed: false, }) @@ -144,7 +120,7 @@ describe('OAuth Token API Routes', () => { expect(data).toHaveProperty('accessToken', 'fresh-token') expect(mockAuthorizeCredentialUse).toHaveBeenCalled() - expect(mockGetCredential).toHaveBeenCalled() + expect(authOAuthUtilsMockFns.mockGetCredential).toHaveBeenCalled() }) it('should handle missing credentialId', async () => { @@ -199,7 +175,7 @@ describe('OAuth Token API Routes', () => { requesterUserId: 'test-user-id', credentialOwnerUserId: 'owner-user-id', }) - mockGetCredential.mockResolvedValueOnce(undefined) + authOAuthUtilsMockFns.mockGetCredential.mockResolvedValueOnce(undefined) const req = createMockRequest('POST', { credentialId: 'nonexistent-credential-id', @@ -219,14 +195,16 @@ describe('OAuth Token API Routes', () => { requesterUserId: 'test-user-id', credentialOwnerUserId: 'owner-user-id', }) - mockGetCredential.mockResolvedValueOnce({ + authOAuthUtilsMockFns.mockGetCredential.mockResolvedValueOnce({ id: 'credential-id', accessToken: 'test-token', refreshToken: 'refresh-token', accessTokenExpiresAt: new Date(Date.now() - 3600 * 1000), // Expired providerId: 'google', }) - mockRefreshTokenIfNeeded.mockRejectedValueOnce(new Error('Refresh failure')) + authOAuthUtilsMockFns.mockRefreshTokenIfNeeded.mockRejectedValueOnce( + new Error('Refresh failure') + ) const req = createMockRequest('POST', { credentialId: 'credential-id', @@ -241,7 +219,7 @@ describe('OAuth Token API Routes', () => { describe('credentialAccountUserId + providerId path', () => { it('should reject unauthenticated requests', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: false, error: 'Authentication required', }) @@ -256,11 +234,11 @@ describe('OAuth Token API Routes', () => { expect(response.status).toBe(401) expect(data).toHaveProperty('error', 'User not authenticated') - expect(mockGetOAuthToken).not.toHaveBeenCalled() + expect(authOAuthUtilsMockFns.mockGetOAuthToken).not.toHaveBeenCalled() }) it('should reject internal JWT authentication', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, authType: 'internal_jwt', userId: 'test-user-id', @@ -276,11 +254,11 @@ describe('OAuth Token API Routes', () => { expect(response.status).toBe(401) expect(data).toHaveProperty('error', 'User not authenticated') - expect(mockGetOAuthToken).not.toHaveBeenCalled() + expect(authOAuthUtilsMockFns.mockGetOAuthToken).not.toHaveBeenCalled() }) it('should reject requests for other users credentials', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, authType: 'session', userId: 'attacker-user-id', @@ -296,16 +274,16 @@ describe('OAuth Token API Routes', () => { expect(response.status).toBe(403) expect(data).toHaveProperty('error', 'Unauthorized') - expect(mockGetOAuthToken).not.toHaveBeenCalled() + expect(authOAuthUtilsMockFns.mockGetOAuthToken).not.toHaveBeenCalled() }) it('should allow session-authenticated users to access their own credentials', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, authType: 'session', userId: 'test-user-id', }) - mockGetOAuthToken.mockResolvedValueOnce('valid-access-token') + authOAuthUtilsMockFns.mockGetOAuthToken.mockResolvedValueOnce('valid-access-token') const req = createMockRequest('POST', { credentialAccountUserId: 'test-user-id', @@ -317,16 +295,19 @@ describe('OAuth Token API Routes', () => { expect(response.status).toBe(200) expect(data).toHaveProperty('accessToken', 'valid-access-token') - expect(mockGetOAuthToken).toHaveBeenCalledWith('test-user-id', 'google') + expect(authOAuthUtilsMockFns.mockGetOAuthToken).toHaveBeenCalledWith( + 'test-user-id', + 'google' + ) }) it('should return 404 when credential not found for user', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, authType: 'session', userId: 'test-user-id', }) - mockGetOAuthToken.mockResolvedValueOnce(null) + authOAuthUtilsMockFns.mockGetOAuthToken.mockResolvedValueOnce(null) const req = createMockRequest('POST', { credentialAccountUserId: 'test-user-id', @@ -353,14 +334,14 @@ describe('OAuth Token API Routes', () => { requesterUserId: 'test-user-id', credentialOwnerUserId: 'test-user-id', }) - mockGetCredential.mockResolvedValueOnce({ + authOAuthUtilsMockFns.mockGetCredential.mockResolvedValueOnce({ id: 'credential-id', accessToken: 'test-token', refreshToken: 'refresh-token', accessTokenExpiresAt: new Date(Date.now() + 3600 * 1000), providerId: 'google', }) - mockRefreshTokenIfNeeded.mockResolvedValueOnce({ + authOAuthUtilsMockFns.mockRefreshTokenIfNeeded.mockResolvedValueOnce({ accessToken: 'fresh-token', refreshed: false, }) @@ -376,8 +357,8 @@ describe('OAuth Token API Routes', () => { expect(data).toHaveProperty('accessToken', 'fresh-token') expect(mockAuthorizeCredentialUse).toHaveBeenCalled() - expect(mockGetCredential).toHaveBeenCalled() - expect(mockRefreshTokenIfNeeded).toHaveBeenCalled() + expect(authOAuthUtilsMockFns.mockGetCredential).toHaveBeenCalled() + expect(authOAuthUtilsMockFns.mockRefreshTokenIfNeeded).toHaveBeenCalled() }) it('should handle missing credentialId', async () => { @@ -415,7 +396,7 @@ describe('OAuth Token API Routes', () => { requesterUserId: 'test-user-id', credentialOwnerUserId: 'test-user-id', }) - mockGetCredential.mockResolvedValueOnce(undefined) + authOAuthUtilsMockFns.mockGetCredential.mockResolvedValueOnce(undefined) const req = new Request( 'http://localhost:3000/api/auth/oauth/token?credentialId=nonexistent-credential-id' @@ -435,7 +416,7 @@ describe('OAuth Token API Routes', () => { requesterUserId: 'test-user-id', credentialOwnerUserId: 'test-user-id', }) - mockGetCredential.mockResolvedValueOnce({ + authOAuthUtilsMockFns.mockGetCredential.mockResolvedValueOnce({ id: 'credential-id', accessToken: null, refreshToken: 'refresh-token', @@ -460,14 +441,16 @@ describe('OAuth Token API Routes', () => { requesterUserId: 'test-user-id', credentialOwnerUserId: 'test-user-id', }) - mockGetCredential.mockResolvedValueOnce({ + authOAuthUtilsMockFns.mockGetCredential.mockResolvedValueOnce({ id: 'credential-id', accessToken: 'test-token', refreshToken: 'refresh-token', accessTokenExpiresAt: new Date(Date.now() - 3600 * 1000), // Expired providerId: 'google', }) - mockRefreshTokenIfNeeded.mockRejectedValueOnce(new Error('Refresh failure')) + authOAuthUtilsMockFns.mockRefreshTokenIfNeeded.mockRejectedValueOnce( + new Error('Refresh failure') + ) const req = new Request( 'http://localhost:3000/api/auth/oauth/token?credentialId=credential-id' diff --git a/apps/sim/app/api/auth/oauth/utils.test.ts b/apps/sim/app/api/auth/oauth/utils.test.ts index 2e102c2f915..7f67d37673a 100644 --- a/apps/sim/app/api/auth/oauth/utils.test.ts +++ b/apps/sim/app/api/auth/oauth/utils.test.ts @@ -4,18 +4,13 @@ * @vitest-environment node */ -import { databaseMock, loggerMock } from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -vi.mock('@sim/db', () => databaseMock) - vi.mock('@/lib/oauth/oauth', () => ({ refreshOAuthToken: vi.fn(), OAUTH_PROVIDERS: {}, })) -vi.mock('@sim/logger', () => loggerMock) - import { db } from '@sim/db' import { refreshOAuthToken } from '@/lib/oauth' import { diff --git a/apps/sim/app/api/auth/oauth/utils.ts b/apps/sim/app/api/auth/oauth/utils.ts index 920c969b939..38b84a59777 100644 --- a/apps/sim/app/api/auth/oauth/utils.ts +++ b/apps/sim/app/api/auth/oauth/utils.ts @@ -2,9 +2,9 @@ import { createSign } from 'crypto' import { db } from '@sim/db' import { account, credential, credentialSetMember } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, desc, eq, inArray } from 'drizzle-orm' import { decryptSecret } from '@/lib/core/security/encryption' -import { toError } from '@/lib/core/utils/helpers' import { refreshOAuthToken } from '@/lib/oauth' import { getMicrosoftRefreshTokenExpiry, diff --git a/apps/sim/app/api/auth/shopify/authorize/route.ts b/apps/sim/app/api/auth/shopify/authorize/route.ts index 0fec2c90c00..518a99e1e12 100644 --- a/apps/sim/app/api/auth/shopify/authorize/route.ts +++ b/apps/sim/app/api/auth/shopify/authorize/route.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { env } from '@/lib/core/config/env' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { isSameOrigin } from '@/lib/core/utils/validation' import { getScopesForService } from '@/lib/oauth/utils' diff --git a/apps/sim/app/api/auth/socket-token/route.ts b/apps/sim/app/api/auth/socket-token/route.ts index 0228fe58c30..2eccea62193 100644 --- a/apps/sim/app/api/auth/socket-token/route.ts +++ b/apps/sim/app/api/auth/socket-token/route.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { headers } from 'next/headers' import { NextResponse } from 'next/server' import { auth } from '@/lib/auth' import { isAuthDisabled } from '@/lib/core/config/feature-flags' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('SocketTokenAPI') diff --git a/apps/sim/app/api/billing/switch-plan/route.ts b/apps/sim/app/api/billing/switch-plan/route.ts index 4c763caa8c9..ba3f3c0df55 100644 --- a/apps/sim/app/api/billing/switch-plan/route.ts +++ b/apps/sim/app/api/billing/switch-plan/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { subscription as subscriptionTable } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -18,7 +19,6 @@ import { isOrgScopedSubscription, } from '@/lib/billing/subscriptions/utils' import { isBillingEnabled } from '@/lib/core/config/feature-flags' -import { toError } from '@/lib/core/utils/helpers' import { captureServerEvent } from '@/lib/posthog/server' const logger = createLogger('SwitchPlan') diff --git a/apps/sim/app/api/billing/update-cost/route.ts b/apps/sim/app/api/billing/update-cost/route.ts index 733be3edd6a..cd3097bda4e 100644 --- a/apps/sim/app/api/billing/update-cost/route.ts +++ b/apps/sim/app/api/billing/update-cost/route.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -7,7 +8,6 @@ import { checkAndBillOverageThreshold } from '@/lib/billing/threshold-billing' import { checkInternalApiKey } from '@/lib/copilot/request/http' import { isBillingEnabled } from '@/lib/core/config/feature-flags' import { type AtomicClaimResult, billingIdempotency } from '@/lib/core/idempotency/service' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' const logger = createLogger('BillingUpdateCostAPI') diff --git a/apps/sim/app/api/chat/[identifier]/otp/route.test.ts b/apps/sim/app/api/chat/[identifier]/otp/route.test.ts index 7904dc1c3ab..b15147c5397 100644 --- a/apps/sim/app/api/chat/[identifier]/otp/route.test.ts +++ b/apps/sim/app/api/chat/[identifier]/otp/route.test.ts @@ -3,6 +3,13 @@ * * @vitest-environment node */ +import { + redisConfigMock, + redisConfigMockFns, + schemaMock, + workflowsApiUtilsMock, + workflowsApiUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -12,7 +19,6 @@ const { mockRedisDel, mockRedisTtl, mockRedisEval, - mockGetRedisClient, mockRedisClient, mockDbSelect, mockDbInsert, @@ -21,8 +27,6 @@ const { mockSendEmail, mockRenderOTPEmail, mockAddCorsHeaders, - mockCreateSuccessResponse, - mockCreateErrorResponse, mockSetChatAuthCookie, mockGenerateRequestId, mockGetStorageMethod, @@ -41,7 +45,6 @@ const { ttl: mockRedisTtl, eval: mockRedisEval, } - const mockGetRedisClient = vi.fn() const mockDbSelect = vi.fn() const mockDbInsert = vi.fn() const mockDbDelete = vi.fn() @@ -49,8 +52,6 @@ const { const mockSendEmail = vi.fn() const mockRenderOTPEmail = vi.fn() const mockAddCorsHeaders = vi.fn() - const mockCreateSuccessResponse = vi.fn() - const mockCreateErrorResponse = vi.fn() const mockSetChatAuthCookie = vi.fn() const mockGenerateRequestId = vi.fn() const mockGetStorageMethod = vi.fn() @@ -63,7 +64,6 @@ const { mockRedisDel, mockRedisTtl, mockRedisEval, - mockGetRedisClient, mockRedisClient, mockDbSelect, mockDbInsert, @@ -72,8 +72,6 @@ const { mockSendEmail, mockRenderOTPEmail, mockAddCorsHeaders, - mockCreateSuccessResponse, - mockCreateErrorResponse, mockSetChatAuthCookie, mockGenerateRequestId, mockGetStorageMethod, @@ -82,9 +80,11 @@ const { } }) -vi.mock('@/lib/core/config/redis', () => ({ - getRedisClient: mockGetRedisClient, -})) +const mockGetRedisClient = redisConfigMockFns.mockGetRedisClient +const mockCreateSuccessResponse = workflowsApiUtilsMockFns.mockCreateSuccessResponse +const mockCreateErrorResponse = workflowsApiUtilsMockFns.mockCreateErrorResponse + +vi.mock('@/lib/core/config/redis', () => redisConfigMock) vi.mock('@sim/db', () => ({ db: { @@ -103,25 +103,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - chat: { - id: 'id', - identifier: 'identifier', - authType: 'authType', - allowedEmails: 'allowedEmails', - title: 'title', - isActive: 'isActive', - archivedAt: 'archivedAt', - }, - verification: { - id: 'id', - identifier: 'identifier', - value: 'value', - expiresAt: 'expiresAt', - createdAt: 'createdAt', - updatedAt: 'updatedAt', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ eq: vi.fn((field: string, value: string) => ({ field, value, type: 'eq' })), @@ -160,19 +142,7 @@ vi.mock('@/app/api/chat/utils', () => ({ setChatAuthCookie: mockSetChatAuthCookie, })) -vi.mock('@/app/api/workflows/utils', () => ({ - createSuccessResponse: mockCreateSuccessResponse, - createErrorResponse: mockCreateErrorResponse, -})) - -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue({ - info: vi.fn(), - error: vi.fn(), - warn: vi.fn(), - debug: vi.fn(), - }), -})) +vi.mock('@/app/api/workflows/utils', () => workflowsApiUtilsMock) vi.mock('@/lib/core/config/env', () => ({ env: { diff --git a/apps/sim/app/api/chat/[identifier]/otp/route.ts b/apps/sim/app/api/chat/[identifier]/otp/route.ts index 2c0ccde08ee..594949ba8d8 100644 --- a/apps/sim/app/api/chat/[identifier]/otp/route.ts +++ b/apps/sim/app/api/chat/[identifier]/otp/route.ts @@ -2,6 +2,7 @@ import { randomInt } from 'crypto' import { db } from '@sim/db' import { chat, verification } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, gt, isNull } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { z } from 'zod' @@ -10,7 +11,6 @@ import { getRedisClient } from '@/lib/core/config/redis' import { addCorsHeaders, isEmailAllowed } from '@/lib/core/security/deployment' import { getStorageMethod } from '@/lib/core/storage' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { sendEmail } from '@/lib/messaging/email/mailer' import { setChatAuthCookie } from '@/app/api/chat/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/chat/[identifier]/route.test.ts b/apps/sim/app/api/chat/[identifier]/route.test.ts index dac5048fc86..3e364253ae0 100644 --- a/apps/sim/app/api/chat/[identifier]/route.test.ts +++ b/apps/sim/app/api/chat/[identifier]/route.test.ts @@ -3,8 +3,16 @@ * * @vitest-environment node */ -import { loggerMock, requestUtilsMock } from '@sim/testing' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { + encryptionMock, + executionPreprocessingMock, + executionPreprocessingMockFns, + loggingSessionMock, + requestUtilsMock, + workflowsApiUtilsMock, + workflowsApiUtilsMockFns, +} from '@sim/testing' +import { beforeEach, describe, expect, it, vi } from 'vitest' /** * Creates a mock NextRequest with cookies support for testing. @@ -57,30 +65,17 @@ const { mockValidateChatAuth, mockSetChatAuthCookie, mockValidateAuthToken, - mockCreateErrorResponse, - mockCreateSuccessResponse, } = vi.hoisted(() => ({ mockDbSelect: vi.fn(), mockAddCorsHeaders: vi.fn().mockImplementation((response: Response) => response), mockValidateChatAuth: vi.fn().mockResolvedValue({ authorized: true }), mockSetChatAuthCookie: vi.fn(), mockValidateAuthToken: vi.fn().mockReturnValue(false), - mockCreateErrorResponse: vi - .fn() - .mockImplementation((message: string, status: number, code?: string) => { - return new Response( - JSON.stringify({ - error: code || 'Error', - message, - }), - { status } - ) - }), - mockCreateSuccessResponse: vi.fn().mockImplementation((data: unknown) => { - return new Response(JSON.stringify(data), { status: 200 }) - }), })) +const mockCreateErrorResponse = workflowsApiUtilsMockFns.mockCreateErrorResponse +const mockCreateSuccessResponse = workflowsApiUtilsMockFns.mockCreateSuccessResponse + vi.mock('@sim/db', () => ({ db: { select: mockDbSelect }, chat: {}, @@ -99,42 +94,11 @@ vi.mock('@/app/api/chat/utils', () => ({ setChatAuthCookie: mockSetChatAuthCookie, })) -vi.mock('@sim/logger', () => loggerMock) +vi.mock('@/app/api/workflows/utils', () => workflowsApiUtilsMock) -vi.mock('@/app/api/workflows/utils', () => ({ - createErrorResponse: mockCreateErrorResponse, - createSuccessResponse: mockCreateSuccessResponse, -})) +vi.mock('@/lib/execution/preprocessing', () => executionPreprocessingMock) -vi.mock('@/lib/execution/preprocessing', () => ({ - preprocessExecution: vi.fn().mockResolvedValue({ - success: true, - actorUserId: 'test-user-id', - workflowRecord: { - id: 'test-workflow-id', - userId: 'test-user-id', - isDeployed: true, - workspaceId: 'test-workspace-id', - variables: {}, - }, - userSubscription: { - plan: 'pro', - status: 'active', - }, - rateLimitInfo: { - allowed: true, - remaining: 100, - resetAt: new Date(), - }, - }), -})) - -vi.mock('@/lib/logs/execution/logging-session', () => ({ - LoggingSession: vi.fn().mockImplementation(() => ({ - safeStart: vi.fn().mockResolvedValue(undefined), - safeCompleteWithError: vi.fn().mockResolvedValue(undefined), - })), -})) +vi.mock('@/lib/logs/execution/logging-session', () => loggingSessionMock) vi.mock('@/lib/workflows/streaming/streaming', () => ({ createStreamingResponse: vi.fn().mockImplementation(async () => createMockStream()), @@ -155,9 +119,7 @@ vi.mock('@/lib/core/utils/sse', () => ({ vi.mock('@/lib/core/utils/request', () => requestUtilsMock) -vi.mock('@/lib/core/security/encryption', () => ({ - decryptSecret: vi.fn().mockResolvedValue({ decrypted: 'test-password' }), -})) +vi.mock('@/lib/core/security/encryption', () => encryptionMock) import { preprocessExecution } from '@/lib/execution/preprocessing' import { createStreamingResponse } from '@/lib/workflows/streaming/streaming' @@ -202,6 +164,27 @@ describe('Chat Identifier API Route', () => { beforeEach(() => { vi.clearAllMocks() + executionPreprocessingMockFns.mockPreprocessExecution.mockResolvedValue({ + success: true, + actorUserId: 'test-user-id', + workflowRecord: { + id: 'test-workflow-id', + userId: 'test-user-id', + isDeployed: true, + workspaceId: 'test-workspace-id', + variables: {}, + }, + userSubscription: { + plan: 'pro', + status: 'active', + }, + rateLimitInfo: { + allowed: true, + remaining: 100, + resetAt: new Date(), + }, + }) + mockAddCorsHeaders.mockImplementation((response: Response) => response) mockValidateChatAuth.mockResolvedValue({ authorized: true }) mockValidateAuthToken.mockReturnValue(false) @@ -238,10 +221,6 @@ describe('Chat Identifier API Route', () => { }) }) - afterEach(() => { - vi.clearAllMocks() - }) - describe('GET endpoint', () => { it('should return chat info for a valid identifier', async () => { const req = createMockNextRequest('GET') diff --git a/apps/sim/app/api/chat/[identifier]/route.ts b/apps/sim/app/api/chat/[identifier]/route.ts index de826d8c7e9..1a8d3b548d6 100644 --- a/apps/sim/app/api/chat/[identifier]/route.ts +++ b/apps/sim/app/api/chat/[identifier]/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { chat, workflow } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { addCorsHeaders, validateAuthToken } from '@/lib/core/security/deployment' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { preprocessExecution } from '@/lib/execution/preprocessing' import { LoggingSession } from '@/lib/logs/execution/logging-session' import { ChatFiles } from '@/lib/uploads' diff --git a/apps/sim/app/api/chat/manage/[id]/route.test.ts b/apps/sim/app/api/chat/manage/[id]/route.test.ts index 63fad11f3a6..cb80ea64a8c 100644 --- a/apps/sim/app/api/chat/manage/[id]/route.test.ts +++ b/apps/sim/app/api/chat/manage/[id]/route.test.ts @@ -3,52 +3,43 @@ * * @vitest-environment node */ -import { auditMock } from '@sim/testing' +import { + auditMock, + authMock, + authMockFns, + encryptionMock, + encryptionMockFns, + schemaMock, + workflowsApiUtilsMock, + workflowsApiUtilsMockFns, + workflowsOrchestrationMock, + workflowsOrchestrationMockFns, + workflowsPersistenceUtilsMock, + workflowsPersistenceUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' - -const { - mockGetSession, - mockSelect, - mockFrom, - mockWhere, - mockLimit, - mockUpdate, - mockSet, - mockCreateSuccessResponse, - mockCreateErrorResponse, - mockEncryptSecret, - mockCheckChatAccess, - mockDeployWorkflow, - mockPerformChatUndeploy, - mockLogger, -} = vi.hoisted(() => { - const logger = { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - trace: vi.fn(), - fatal: vi.fn(), - child: vi.fn(), - } - return { - mockGetSession: vi.fn(), - mockSelect: vi.fn(), - mockFrom: vi.fn(), - mockWhere: vi.fn(), - mockLimit: vi.fn(), - mockUpdate: vi.fn(), - mockSet: vi.fn(), - mockCreateSuccessResponse: vi.fn(), - mockCreateErrorResponse: vi.fn(), - mockEncryptSecret: vi.fn(), - mockCheckChatAccess: vi.fn(), - mockDeployWorkflow: vi.fn(), - mockPerformChatUndeploy: vi.fn(), - mockLogger: logger, - } -}) +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const { mockSelect, mockFrom, mockWhere, mockLimit, mockUpdate, mockSet, mockCheckChatAccess } = + vi.hoisted(() => { + return { + mockSelect: vi.fn(), + mockFrom: vi.fn(), + mockWhere: vi.fn(), + mockLimit: vi.fn(), + mockUpdate: vi.fn(), + mockSet: vi.fn(), + mockCheckChatAccess: vi.fn(), + } + }) + +const mockCreateSuccessResponse = workflowsApiUtilsMockFns.mockCreateSuccessResponse +const mockCreateErrorResponse = workflowsApiUtilsMockFns.mockCreateErrorResponse +const mockEncryptSecret = encryptionMockFns.mockEncryptSecret +const mockDeployWorkflow = workflowsPersistenceUtilsMockFns.mockDeployWorkflow +const mockPerformChatUndeploy = workflowsOrchestrationMockFns.mockPerformChatUndeploy +const mockNotifySocketDeploymentChanged = + workflowsOrchestrationMockFns.mockNotifySocketDeploymentChanged vi.mock('@/lib/audit/log', () => auditMock) vi.mock('@/lib/core/config/feature-flags', () => ({ @@ -56,41 +47,24 @@ vi.mock('@/lib/core/config/feature-flags', () => ({ isHosted: false, isProd: false, })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue(mockLogger), -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/db', () => ({ db: { select: mockSelect, update: mockUpdate, }, })) -vi.mock('@sim/db/schema', () => ({ - chat: { id: 'id', identifier: 'identifier', userId: 'userId', archivedAt: 'archivedAt' }, -})) -vi.mock('@/app/api/workflows/utils', () => ({ - createSuccessResponse: mockCreateSuccessResponse, - createErrorResponse: mockCreateErrorResponse, -})) -vi.mock('@/lib/core/security/encryption', () => ({ - encryptSecret: mockEncryptSecret, -})) +vi.mock('@sim/db/schema', () => schemaMock) +vi.mock('@/app/api/workflows/utils', () => workflowsApiUtilsMock) +vi.mock('@/lib/core/security/encryption', () => encryptionMock) vi.mock('@/lib/core/utils/urls', () => ({ getEmailDomain: vi.fn().mockReturnValue('localhost:3000'), })) vi.mock('@/app/api/chat/utils', () => ({ checkChatAccess: mockCheckChatAccess, })) -vi.mock('@/lib/workflows/persistence/utils', () => ({ - deployWorkflow: mockDeployWorkflow, -})) -vi.mock('@/lib/workflows/orchestration', () => ({ - performChatUndeploy: mockPerformChatUndeploy, - notifySocketDeploymentChanged: vi.fn().mockResolvedValue(undefined), -})) +vi.mock('@/lib/workflows/persistence/utils', () => workflowsPersistenceUtilsMock) +vi.mock('@/lib/workflows/orchestration', () => workflowsOrchestrationMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...conditions: unknown[]) => ({ type: 'and', conditions })), eq: vi.fn((field: unknown, value: unknown) => ({ field, value, type: 'eq' })), @@ -126,15 +100,12 @@ describe('Chat Edit API Route', () => { mockEncryptSecret.mockResolvedValue({ encrypted: 'encrypted-password' }) mockDeployWorkflow.mockResolvedValue({ success: true, version: 1 }) - }) - - afterEach(() => { - vi.clearAllMocks() + mockNotifySocketDeploymentChanged.mockResolvedValue(undefined) }) describe('GET', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = new NextRequest('http://localhost:3000/api/chat/manage/chat-123') const response = await GET(req, { params: Promise.resolve({ id: 'chat-123' }) }) @@ -145,7 +116,7 @@ describe('Chat Edit API Route', () => { }) it('should return 404 when chat not found or access denied', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -161,7 +132,7 @@ describe('Chat Edit API Route', () => { }) it('should return chat details when user has access', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -191,7 +162,7 @@ describe('Chat Edit API Route', () => { describe('PATCH', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = new NextRequest('http://localhost:3000/api/chat/manage/chat-123', { method: 'PATCH', @@ -205,7 +176,7 @@ describe('Chat Edit API Route', () => { }) it('should return 404 when chat not found or access denied', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -224,7 +195,7 @@ describe('Chat Edit API Route', () => { }) it('should update chat when user has access', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -257,7 +228,7 @@ describe('Chat Edit API Route', () => { }) it('should handle identifier conflicts', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -286,7 +257,7 @@ describe('Chat Edit API Route', () => { }) it('should validate password requirement for password auth', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -313,7 +284,7 @@ describe('Chat Edit API Route', () => { }) it('should keep the existing password when updating a password-protected chat', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -353,7 +324,7 @@ describe('Chat Edit API Route', () => { }) it('should allow access when user has workspace admin permission', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'admin-user-id' }, }) @@ -384,7 +355,7 @@ describe('Chat Edit API Route', () => { describe('DELETE', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = new NextRequest('http://localhost:3000/api/chat/manage/chat-123', { method: 'DELETE', @@ -397,7 +368,7 @@ describe('Chat Edit API Route', () => { }) it('should return 404 when chat not found or access denied', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -415,7 +386,7 @@ describe('Chat Edit API Route', () => { }) it('should delete chat when user has access', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -441,7 +412,7 @@ describe('Chat Edit API Route', () => { }) it('should allow deletion when user has workspace admin permission', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'admin-user-id' }, }) diff --git a/apps/sim/app/api/chat/route.test.ts b/apps/sim/app/api/chat/route.test.ts index 88fbe2d22e1..ecb1cb80b0c 100644 --- a/apps/sim/app/api/chat/route.test.ts +++ b/apps/sim/app/api/chat/route.test.ts @@ -3,31 +3,31 @@ * * @vitest-environment node */ -import { createEnvMock } from '@sim/testing' +import { + authMock, + authMockFns, + createEnvMock, + schemaMock, + workflowsApiUtilsMock, + workflowsApiUtilsMockFns, + workflowsOrchestrationMock, + workflowsOrchestrationMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' - -const { - mockSelect, - mockFrom, - mockWhere, - mockLimit, - mockCreateSuccessResponse, - mockCreateErrorResponse, - mockCheckWorkflowAccessForChatCreation, - mockPerformChatDeploy, - mockGetSession, -} = vi.hoisted(() => ({ - mockSelect: vi.fn(), - mockFrom: vi.fn(), - mockWhere: vi.fn(), - mockLimit: vi.fn(), - mockCreateSuccessResponse: vi.fn(), - mockCreateErrorResponse: vi.fn(), - mockCheckWorkflowAccessForChatCreation: vi.fn(), - mockPerformChatDeploy: vi.fn(), - mockGetSession: vi.fn(), -})) +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const { mockSelect, mockFrom, mockWhere, mockLimit, mockCheckWorkflowAccessForChatCreation } = + vi.hoisted(() => ({ + mockSelect: vi.fn(), + mockFrom: vi.fn(), + mockWhere: vi.fn(), + mockLimit: vi.fn(), + mockCheckWorkflowAccessForChatCreation: vi.fn(), + })) + +const mockCreateSuccessResponse = workflowsApiUtilsMockFns.mockCreateSuccessResponse +const mockCreateErrorResponse = workflowsApiUtilsMockFns.mockCreateErrorResponse +const mockPerformChatDeploy = workflowsOrchestrationMockFns.mockPerformChatDeploy vi.mock('@sim/db', () => ({ db: { @@ -35,10 +35,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - chat: { userId: 'userId', identifier: 'identifier', archivedAt: 'archivedAt' }, - workflow: { id: 'id', userId: 'userId', isDeployed: 'isDeployed' }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...conditions: unknown[]) => ({ type: 'and', conditions })), @@ -46,22 +43,15 @@ vi.mock('drizzle-orm', () => ({ isNull: vi.fn((field: unknown) => ({ type: 'isNull', field })), })) -vi.mock('@/app/api/workflows/utils', () => ({ - createSuccessResponse: mockCreateSuccessResponse, - createErrorResponse: mockCreateErrorResponse, -})) +vi.mock('@/app/api/workflows/utils', () => workflowsApiUtilsMock) vi.mock('@/app/api/chat/utils', () => ({ checkWorkflowAccessForChatCreation: mockCheckWorkflowAccessForChatCreation, })) -vi.mock('@/lib/workflows/orchestration', () => ({ - performChatDeploy: mockPerformChatDeploy, -})) +vi.mock('@/lib/workflows/orchestration', () => workflowsOrchestrationMock) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@/lib/core/config/env', () => createEnvMock({ @@ -101,13 +91,9 @@ describe('Chat API Route', () => { }) }) - afterEach(() => { - vi.clearAllMocks() - }) - describe('GET', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = new NextRequest('http://localhost:3000/api/chat') const response = await GET(req) @@ -117,7 +103,7 @@ describe('Chat API Route', () => { }) it('should return chat deployments for authenticated user', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -133,7 +119,7 @@ describe('Chat API Route', () => { }) it('should handle errors when fetching deployments', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -149,7 +135,7 @@ describe('Chat API Route', () => { describe('POST', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = new NextRequest('http://localhost:3000/api/chat', { method: 'POST', @@ -162,7 +148,7 @@ describe('Chat API Route', () => { }) it('should validate request data', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -178,7 +164,7 @@ describe('Chat API Route', () => { }) it('should reject if identifier already exists', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -206,7 +192,7 @@ describe('Chat API Route', () => { }) it('should reject if workflow not found', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -237,7 +223,7 @@ describe('Chat API Route', () => { }) it('should allow chat deployment when user owns workflow directly', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id', email: 'user@example.com' }, }) @@ -275,7 +261,7 @@ describe('Chat API Route', () => { }) it('passes chat customizations and outputConfigs through in the API request shape', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id', email: 'user@example.com' }, }) @@ -319,7 +305,7 @@ describe('Chat API Route', () => { }) it('should allow chat deployment when user has workspace admin permission', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id', email: 'user@example.com' }, }) @@ -356,7 +342,7 @@ describe('Chat API Route', () => { }) it('should reject when workflow is in workspace but user lacks admin permission', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -390,7 +376,7 @@ describe('Chat API Route', () => { }) it('should handle workspace permission check errors gracefully', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id' }, }) @@ -418,7 +404,7 @@ describe('Chat API Route', () => { }) it('should call performChatDeploy for undeployed workflow', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-id', email: 'user@example.com' }, }) diff --git a/apps/sim/app/api/chat/utils.test.ts b/apps/sim/app/api/chat/utils.test.ts index de604854f07..4f8dd64c0e6 100644 --- a/apps/sim/app/api/chat/utils.test.ts +++ b/apps/sim/app/api/chat/utils.test.ts @@ -3,12 +3,17 @@ * * @vitest-environment node */ -import { databaseMock, loggerMock, requestUtilsMock } from '@sim/testing' +import { + encryptionMock, + encryptionMockFns, + loggingSessionMock, + requestUtilsMock, + workflowsUtilsMock, +} from '@sim/testing' import type { NextResponse } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' const { - mockDecryptSecret, mockMergeSubblockStateWithValues, mockMergeSubBlockValues, mockValidateAuthToken, @@ -16,7 +21,6 @@ const { mockAddCorsHeaders, mockIsEmailAllowed, } = vi.hoisted(() => ({ - mockDecryptSecret: vi.fn(), mockMergeSubblockStateWithValues: vi.fn().mockReturnValue({}), mockMergeSubBlockValues: vi.fn().mockReturnValue({}), mockValidateAuthToken: vi.fn().mockReturnValue(false), @@ -25,16 +29,9 @@ const { mockIsEmailAllowed: vi.fn(), })) -vi.mock('@sim/db', () => databaseMock) -vi.mock('@sim/logger', () => loggerMock) +const mockDecryptSecret = encryptionMockFns.mockDecryptSecret -vi.mock('@/lib/logs/execution/logging-session', () => ({ - LoggingSession: vi.fn().mockImplementation(() => ({ - safeStart: vi.fn().mockResolvedValue(undefined), - safeComplete: vi.fn().mockResolvedValue(undefined), - safeCompleteWithError: vi.fn().mockResolvedValue(undefined), - })), -})) +vi.mock('@/lib/logs/execution/logging-session', () => loggingSessionMock) vi.mock('@/executor', () => ({ Executor: vi.fn(), @@ -49,9 +46,7 @@ vi.mock('@/lib/workflows/subblocks', () => ({ mergeSubBlockValues: mockMergeSubBlockValues, })) -vi.mock('@/lib/core/security/encryption', () => ({ - decryptSecret: mockDecryptSecret, -})) +vi.mock('@/lib/core/security/encryption', () => encryptionMock) vi.mock('@/lib/core/utils/request', () => requestUtilsMock) @@ -68,9 +63,7 @@ vi.mock('@/lib/core/config/feature-flags', () => ({ isProd: false, })) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: vi.fn(), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) import { decryptSecret } from '@/lib/core/security/encryption' import { setChatAuthCookie, validateChatAuth } from '@/app/api/chat/utils' diff --git a/apps/sim/app/api/copilot/api-keys/route.test.ts b/apps/sim/app/api/copilot/api-keys/route.test.ts index 81f3a64d57d..86d4a0cb77e 100644 --- a/apps/sim/app/api/copilot/api-keys/route.test.ts +++ b/apps/sim/app/api/copilot/api-keys/route.test.ts @@ -3,33 +3,22 @@ * * @vitest-environment node */ +import { authMock, authMockFns, createEnvMock } from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetSession, mockFetch } = vi.hoisted(() => ({ - mockGetSession: vi.fn(), +const { mockFetch } = vi.hoisted(() => ({ mockFetch: vi.fn(), })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@/lib/copilot/constants', () => ({ SIM_AGENT_API_URL_DEFAULT: 'https://agent.sim.example.com', SIM_AGENT_API_URL: 'https://agent.sim.example.com', })) -vi.mock('@/lib/core/config/env', () => ({ - env: { - COPILOT_API_KEY: 'test-api-key', - }, - getEnv: vi.fn(), - isTruthy: (value: string | boolean | number | undefined) => - typeof value === 'string' ? value.toLowerCase() === 'true' || value === '1' : Boolean(value), - isFalsy: (value: string | boolean | number | undefined) => - typeof value === 'string' ? value.toLowerCase() === 'false' || value === '0' : value === false, -})) +vi.mock('@/lib/core/config/env', () => createEnvMock({ COPILOT_API_KEY: 'test-api-key' })) import { DELETE, GET } from '@/app/api/copilot/api-keys/route' @@ -41,7 +30,7 @@ describe('Copilot API Keys API Route', () => { describe('GET', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const request = new NextRequest('http://localhost:3000/api/copilot/api-keys') const response = await GET(request) @@ -52,7 +41,9 @@ describe('Copilot API Keys API Route', () => { }) it('should return list of API keys with masked values', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) const mockApiKeys = [ { @@ -90,7 +81,9 @@ describe('Copilot API Keys API Route', () => { }) it('should return empty array when user has no API keys', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockFetch.mockResolvedValueOnce({ ok: true, @@ -106,7 +99,9 @@ describe('Copilot API Keys API Route', () => { }) it('should forward userId to Sim Agent', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockFetch.mockResolvedValueOnce({ ok: true, @@ -130,7 +125,9 @@ describe('Copilot API Keys API Route', () => { }) it('should return error when Sim Agent returns non-ok response', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockFetch.mockResolvedValueOnce({ ok: false, @@ -147,7 +144,9 @@ describe('Copilot API Keys API Route', () => { }) it('should return 500 when Sim Agent returns invalid response', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockFetch.mockResolvedValueOnce({ ok: true, @@ -163,7 +162,9 @@ describe('Copilot API Keys API Route', () => { }) it('should handle network errors gracefully', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockFetch.mockRejectedValueOnce(new Error('Network error')) @@ -176,7 +177,9 @@ describe('Copilot API Keys API Route', () => { }) it('should handle API keys with empty apiKey string', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) const mockApiKeys = [ { @@ -202,7 +205,9 @@ describe('Copilot API Keys API Route', () => { }) it('should handle JSON parsing errors from Sim Agent', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockFetch.mockResolvedValueOnce({ ok: true, @@ -220,7 +225,7 @@ describe('Copilot API Keys API Route', () => { describe('DELETE', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const request = new NextRequest('http://localhost:3000/api/copilot/api-keys?id=key-123') const response = await DELETE(request) @@ -231,7 +236,9 @@ describe('Copilot API Keys API Route', () => { }) it('should return 400 when id parameter is missing', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) const request = new NextRequest('http://localhost:3000/api/copilot/api-keys') const response = await DELETE(request) @@ -242,7 +249,9 @@ describe('Copilot API Keys API Route', () => { }) it('should successfully delete an API key', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockFetch.mockResolvedValueOnce({ ok: true, @@ -270,7 +279,9 @@ describe('Copilot API Keys API Route', () => { }) it('should return error when Sim Agent returns non-ok response', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockFetch.mockResolvedValueOnce({ ok: false, @@ -287,7 +298,9 @@ describe('Copilot API Keys API Route', () => { }) it('should return 500 when Sim Agent returns invalid response', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockFetch.mockResolvedValueOnce({ ok: true, @@ -303,7 +316,9 @@ describe('Copilot API Keys API Route', () => { }) it('should handle network errors gracefully', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockFetch.mockRejectedValueOnce(new Error('Network error')) @@ -316,7 +331,9 @@ describe('Copilot API Keys API Route', () => { }) it('should handle JSON parsing errors from Sim Agent on delete', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockFetch.mockResolvedValueOnce({ ok: true, diff --git a/apps/sim/app/api/copilot/chat/abort/route.ts b/apps/sim/app/api/copilot/chat/abort/route.ts index f49168b8820..75e60f2078c 100644 --- a/apps/sim/app/api/copilot/chat/abort/route.ts +++ b/apps/sim/app/api/copilot/chat/abort/route.ts @@ -1,11 +1,11 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { NextResponse } from 'next/server' import { getLatestRunForStream } from '@/lib/copilot/async-runs/repository' import { SIM_AGENT_API_URL } from '@/lib/copilot/constants' import { authenticateCopilotRequestSessionOnly } from '@/lib/copilot/request/http' import { abortActiveStream, waitForPendingChatStream } from '@/lib/copilot/request/session' import { env } from '@/lib/core/config/env' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('CopilotChatAbortAPI') const GO_EXPLICIT_ABORT_TIMEOUT_MS = 3000 diff --git a/apps/sim/app/api/copilot/chat/delete/route.test.ts b/apps/sim/app/api/copilot/chat/delete/route.test.ts index 0493b3ffe89..4f887690210 100644 --- a/apps/sim/app/api/copilot/chat/delete/route.test.ts +++ b/apps/sim/app/api/copilot/chat/delete/route.test.ts @@ -3,19 +3,17 @@ * * @vitest-environment node */ +import { authMock, authMockFns, schemaMock } from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const { mockDelete, mockWhere, mockGetSession, mockGetAccessibleCopilotChat } = vi.hoisted(() => ({ +const { mockDelete, mockWhere, mockGetAccessibleCopilotChat } = vi.hoisted(() => ({ mockDelete: vi.fn(), mockWhere: vi.fn(), - mockGetSession: vi.fn(), mockGetAccessibleCopilotChat: vi.fn(), })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/db', () => ({ db: { @@ -23,13 +21,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - copilotChats: { - id: 'id', - userId: 'userId', - workspaceId: 'workspaceId', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...conditions: unknown[]) => ({ conditions, type: 'and' })), @@ -58,7 +50,7 @@ describe('Copilot Chat Delete API Route', () => { beforeEach(() => { vi.clearAllMocks() - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const mockReturning = vi.fn().mockResolvedValue([{ workspaceId: 'ws-1' }]) mockWhere.mockReturnValue({ returning: mockReturning }) @@ -72,7 +64,7 @@ describe('Copilot Chat Delete API Route', () => { describe('DELETE', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('DELETE', { chatId: 'chat-123', @@ -86,7 +78,7 @@ describe('Copilot Chat Delete API Route', () => { }) it('should successfully delete a chat', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('DELETE', { chatId: 'chat-123', @@ -103,7 +95,7 @@ describe('Copilot Chat Delete API Route', () => { }) it('should return 500 for invalid request body - missing chatId', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('DELETE', {}) @@ -115,7 +107,7 @@ describe('Copilot Chat Delete API Route', () => { }) it('should return 500 for invalid request body - chatId is not a string', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('DELETE', { chatId: 12345, @@ -129,7 +121,7 @@ describe('Copilot Chat Delete API Route', () => { }) it('should handle database errors gracefully', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockWhere.mockRejectedValueOnce(new Error('Database connection failed')) @@ -145,7 +137,7 @@ describe('Copilot Chat Delete API Route', () => { }) it('should handle JSON parsing errors in request body', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = new NextRequest('http://localhost:3000/api/copilot/chat/delete', { method: 'DELETE', @@ -163,7 +155,7 @@ describe('Copilot Chat Delete API Route', () => { }) it('should delete chat even if it does not exist (idempotent)', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockGetAccessibleCopilotChat.mockResolvedValueOnce(null) @@ -179,7 +171,7 @@ describe('Copilot Chat Delete API Route', () => { }) it('should delete chat with empty string chatId (validation should fail)', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('DELETE', { chatId: '', diff --git a/apps/sim/app/api/copilot/chat/queries.ts b/apps/sim/app/api/copilot/chat/queries.ts index 25274224be8..8252c493413 100644 --- a/apps/sim/app/api/copilot/chat/queries.ts +++ b/apps/sim/app/api/copilot/chat/queries.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { copilotChats } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, desc, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getLatestRunForStream } from '@/lib/copilot/async-runs/repository' @@ -16,7 +17,6 @@ import { import { readFilePreviewSessions } from '@/lib/copilot/request/session' import { readEvents } from '@/lib/copilot/request/session/buffer' import { toStreamBatchEvent } from '@/lib/copilot/request/session/types' -import { toError } from '@/lib/core/utils/helpers' import { authorizeWorkflowByWorkspacePermission } from '@/lib/workflows/utils' import { assertActiveWorkspaceAccess } from '@/lib/workspaces/permissions/utils' diff --git a/apps/sim/app/api/copilot/chat/stop/route.test.ts b/apps/sim/app/api/copilot/chat/stop/route.test.ts index 21c32e38a76..ed92e2481c5 100644 --- a/apps/sim/app/api/copilot/chat/stop/route.test.ts +++ b/apps/sim/app/api/copilot/chat/stop/route.test.ts @@ -1,11 +1,11 @@ /** * @vitest-environment node */ +import { authMock, authMockFns, schemaMock } from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' const { - mockGetSession, mockSelect, mockFrom, mockWhereSelect, @@ -17,7 +17,6 @@ const { mockPublishStatusChanged, mockSql, } = vi.hoisted(() => ({ - mockGetSession: vi.fn(), mockSelect: vi.fn(), mockFrom: vi.fn(), mockWhereSelect: vi.fn(), @@ -30,9 +29,7 @@ const { mockSql: vi.fn((strings: TemplateStringsArray, ...values: unknown[]) => ({ strings, values })), })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/db', () => ({ db: { @@ -41,15 +38,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - copilotChats: { - id: 'id', - userId: 'userId', - workspaceId: 'workspaceId', - messages: 'messages', - conversationId: 'conversationId', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...conditions: unknown[]) => ({ conditions, type: 'and' })), @@ -77,7 +66,7 @@ describe('copilot chat stop route', () => { beforeEach(() => { vi.clearAllMocks() - mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) mockLimit.mockResolvedValue([ { @@ -96,7 +85,7 @@ describe('copilot chat stop route', () => { }) it('returns 401 when unauthenticated', async () => { - mockGetSession.mockResolvedValueOnce(null) + authMockFns.mockGetSession.mockResolvedValueOnce(null) const response = await POST( createRequest({ diff --git a/apps/sim/app/api/copilot/chat/stop/route.ts b/apps/sim/app/api/copilot/chat/stop/route.ts index 05e5935aa40..40070b64e0d 100644 --- a/apps/sim/app/api/copilot/chat/stop/route.ts +++ b/apps/sim/app/api/copilot/chat/stop/route.ts @@ -1,13 +1,13 @@ import { db } from '@sim/db' import { copilotChats } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { normalizeMessage, type PersistedMessage } from '@/lib/copilot/chat/persisted-message' import { taskPubSub } from '@/lib/copilot/tasks' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('CopilotChatStopAPI') diff --git a/apps/sim/app/api/copilot/chat/stream/route.test.ts b/apps/sim/app/api/copilot/chat/stream/route.test.ts index 3105f9216ce..5f24bc2e1e7 100644 --- a/apps/sim/app/api/copilot/chat/stream/route.test.ts +++ b/apps/sim/app/api/copilot/chat/stream/route.test.ts @@ -2,6 +2,7 @@ * @vitest-environment node */ +import { copilotHttpMock, copilotHttpMockFns } from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' import { @@ -9,19 +10,13 @@ import { MothershipStreamV1EventType, } from '@/lib/copilot/generated/mothership-stream-v1' -const { - getLatestRunForStream, - readEvents, - readFilePreviewSessions, - checkForReplayGap, - authenticateCopilotRequestSessionOnly, -} = vi.hoisted(() => ({ - getLatestRunForStream: vi.fn(), - readEvents: vi.fn(), - readFilePreviewSessions: vi.fn(), - checkForReplayGap: vi.fn(), - authenticateCopilotRequestSessionOnly: vi.fn(), -})) +const { getLatestRunForStream, readEvents, readFilePreviewSessions, checkForReplayGap } = + vi.hoisted(() => ({ + getLatestRunForStream: vi.fn(), + readEvents: vi.fn(), + readFilePreviewSessions: vi.fn(), + checkForReplayGap: vi.fn(), + })) vi.mock('@/lib/copilot/async-runs/repository', () => ({ getLatestRunForStream, @@ -48,9 +43,7 @@ vi.mock('@/lib/copilot/request/session', () => ({ }, })) -vi.mock('@/lib/copilot/request/http', () => ({ - authenticateCopilotRequestSessionOnly, -})) +vi.mock('@/lib/copilot/request/http', () => copilotHttpMock) import { GET } from './route' @@ -72,7 +65,7 @@ async function readAllChunks(response: Response): Promise { describe('copilot chat stream replay route', () => { beforeEach(() => { vi.clearAllMocks() - authenticateCopilotRequestSessionOnly.mockResolvedValue({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValue({ userId: 'user-1', isAuthenticated: true, }) diff --git a/apps/sim/app/api/copilot/chat/stream/route.ts b/apps/sim/app/api/copilot/chat/stream/route.ts index a0965b189e2..b88eec2915c 100644 --- a/apps/sim/app/api/copilot/chat/stream/route.ts +++ b/apps/sim/app/api/copilot/chat/stream/route.ts @@ -1,4 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' import { type NextRequest, NextResponse } from 'next/server' import { getLatestRunForStream } from '@/lib/copilot/async-runs/repository' import { @@ -15,7 +17,6 @@ import { SSE_RESPONSE_HEADERS, } from '@/lib/copilot/request/session' import { toStreamBatchEvent } from '@/lib/copilot/request/session/types' -import { sleep, toError } from '@/lib/core/utils/helpers' export const maxDuration = 3600 diff --git a/apps/sim/app/api/copilot/chat/update-messages/route.test.ts b/apps/sim/app/api/copilot/chat/update-messages/route.test.ts index 512a05cfd84..14d2fa199d1 100644 --- a/apps/sim/app/api/copilot/chat/update-messages/route.test.ts +++ b/apps/sim/app/api/copilot/chat/update-messages/route.test.ts @@ -3,32 +3,22 @@ * * @vitest-environment node */ +import { authMock, authMockFns, schemaMock } from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockSelect, - mockFrom, - mockWhere, - mockLimit, - mockUpdate, - mockSet, - mockUpdateWhere, - mockGetSession, -} = vi.hoisted(() => ({ - mockSelect: vi.fn(), - mockFrom: vi.fn(), - mockWhere: vi.fn(), - mockLimit: vi.fn(), - mockUpdate: vi.fn(), - mockSet: vi.fn(), - mockUpdateWhere: vi.fn(), - mockGetSession: vi.fn(), -})) +const { mockSelect, mockFrom, mockWhere, mockLimit, mockUpdate, mockSet, mockUpdateWhere } = + vi.hoisted(() => ({ + mockSelect: vi.fn(), + mockFrom: vi.fn(), + mockWhere: vi.fn(), + mockLimit: vi.fn(), + mockUpdate: vi.fn(), + mockSet: vi.fn(), + mockUpdateWhere: vi.fn(), + })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/db', () => ({ db: { @@ -37,14 +27,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - copilotChats: { - id: 'id', - userId: 'userId', - messages: 'messages', - updatedAt: 'updatedAt', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...conditions: unknown[]) => ({ conditions, type: 'and' })), @@ -65,7 +48,7 @@ describe('Copilot Chat Update Messages API Route', () => { beforeEach(() => { vi.clearAllMocks() - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) mockSelect.mockReturnValue({ from: mockFrom }) mockFrom.mockReturnValue({ where: mockWhere }) @@ -82,7 +65,7 @@ describe('Copilot Chat Update Messages API Route', () => { describe('POST', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('POST', { chatId: 'chat-123', @@ -104,7 +87,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should return 400 for invalid request body - missing chatId', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('POST', { messages: [ @@ -125,7 +108,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should return 400 for invalid request body - missing messages', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('POST', { chatId: 'chat-123', @@ -139,7 +122,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should return 400 for invalid message structure - missing required fields', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('POST', { chatId: 'chat-123', @@ -158,7 +141,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should return 400 for invalid message role', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('POST', { chatId: 'chat-123', @@ -180,7 +163,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should return 404 when chat is not found', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockLimit.mockResolvedValueOnce([]) @@ -204,7 +187,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should return 404 when chat belongs to different user', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockLimit.mockResolvedValueOnce([]) @@ -228,7 +211,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should successfully update chat messages', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const existingChat = { id: 'chat-123', @@ -275,7 +258,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should successfully update chat messages with optional fields', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const existingChat = { id: 'chat-456', @@ -361,7 +344,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should handle empty messages array', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const existingChat = { id: 'chat-789', @@ -391,7 +374,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should handle database errors during chat lookup', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockLimit.mockRejectedValueOnce(new Error('Database connection failed')) @@ -415,7 +398,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should handle database errors during update operation', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const existingChat = { id: 'chat-123', @@ -448,7 +431,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should handle JSON parsing errors in request body', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = new NextRequest('http://localhost:3000/api/copilot/chat/update-messages', { method: 'POST', @@ -466,7 +449,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should handle large message arrays', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const existingChat = { id: 'chat-large', @@ -503,7 +486,7 @@ describe('Copilot Chat Update Messages API Route', () => { }) it('should handle messages with both user and assistant roles', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const existingChat = { id: 'chat-mixed', diff --git a/apps/sim/app/api/copilot/chats/route.test.ts b/apps/sim/app/api/copilot/chats/route.test.ts index 3dbbf2791f8..4262b41e1d1 100644 --- a/apps/sim/app/api/copilot/chats/route.test.ts +++ b/apps/sim/app/api/copilot/chats/route.test.ts @@ -3,26 +3,15 @@ * * @vitest-environment node */ +import { copilotHttpMock, copilotHttpMockFns, schemaMock } from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockSelectDistinctOn, - mockFrom, - mockLeftJoin, - mockWhere, - mockOrderBy, - mockAuthenticate, - mockCreateUnauthorizedResponse, - mockCreateInternalServerErrorResponse, -} = vi.hoisted(() => ({ +const { mockSelectDistinctOn, mockFrom, mockLeftJoin, mockWhere, mockOrderBy } = vi.hoisted(() => ({ mockSelectDistinctOn: vi.fn(), mockFrom: vi.fn(), mockLeftJoin: vi.fn(), mockWhere: vi.fn(), mockOrderBy: vi.fn(), - mockAuthenticate: vi.fn(), - mockCreateUnauthorizedResponse: vi.fn(), - mockCreateInternalServerErrorResponse: vi.fn(), })) vi.mock('@sim/db', () => ({ @@ -31,31 +20,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - copilotChats: { - id: 'id', - title: 'title', - workflowId: 'workflowId', - workspaceId: 'workspaceId', - userId: 'userId', - updatedAt: 'updatedAt', - }, - workflow: { - id: 'id', - workspaceId: 'workspaceId', - archivedAt: 'archivedAt', - }, - workspace: { - id: 'id', - archivedAt: 'archivedAt', - }, - permissions: { - id: 'id', - entityType: 'entityType', - entityId: 'entityId', - userId: 'userId', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...conditions: unknown[]) => ({ conditions, type: 'and' })), @@ -66,11 +31,7 @@ vi.mock('drizzle-orm', () => ({ sql: vi.fn(), })) -vi.mock('@/lib/copilot/request/http', () => ({ - authenticateCopilotRequestSessionOnly: mockAuthenticate, - createUnauthorizedResponse: mockCreateUnauthorizedResponse, - createInternalServerErrorResponse: mockCreateInternalServerErrorResponse, -})) +vi.mock('@/lib/copilot/request/http', () => copilotHttpMock) import { GET } from '@/app/api/copilot/chats/route' @@ -83,13 +44,6 @@ describe('Copilot Chats List API Route', () => { mockLeftJoin.mockReturnValue({ leftJoin: mockLeftJoin, where: mockWhere }) mockWhere.mockReturnValue({ orderBy: mockOrderBy }) mockOrderBy.mockResolvedValue([]) - - mockCreateUnauthorizedResponse.mockReturnValue( - new Response(JSON.stringify({ error: 'Unauthorized' }), { status: 401 }) - ) - mockCreateInternalServerErrorResponse.mockImplementation( - (message: string) => new Response(JSON.stringify({ error: message }), { status: 500 }) - ) }) afterEach(() => { @@ -98,7 +52,7 @@ describe('Copilot Chats List API Route', () => { describe('GET', () => { it('should return 401 when user is not authenticated', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: null, isAuthenticated: false, }) @@ -112,7 +66,7 @@ describe('Copilot Chats List API Route', () => { }) it('should return empty chats array when user has no chats', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -131,7 +85,7 @@ describe('Copilot Chats List API Route', () => { }) it('should return list of chats for authenticated user', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -165,7 +119,7 @@ describe('Copilot Chats List API Route', () => { }) it('should return chats ordered by updatedAt descending', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -202,7 +156,7 @@ describe('Copilot Chats List API Route', () => { }) it('should handle chats with null workflowId', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -226,7 +180,7 @@ describe('Copilot Chats List API Route', () => { }) it('should handle database errors gracefully', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -242,7 +196,7 @@ describe('Copilot Chats List API Route', () => { }) it('should only return chats belonging to authenticated user', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -265,7 +219,7 @@ describe('Copilot Chats List API Route', () => { }) it('should return 401 when userId is null despite isAuthenticated being true', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: null, isAuthenticated: true, }) diff --git a/apps/sim/app/api/copilot/checkpoints/revert/route.test.ts b/apps/sim/app/api/copilot/checkpoints/revert/route.test.ts index fe4fb76f4d1..4526de0940a 100644 --- a/apps/sim/app/api/copilot/checkpoints/revert/route.test.ts +++ b/apps/sim/app/api/copilot/checkpoints/revert/route.test.ts @@ -3,6 +3,13 @@ * * @vitest-environment node */ +import { + authMock, + authMockFns, + schemaMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -13,8 +20,6 @@ const { mockThen, mockDelete, mockDeleteWhere, - mockAuthorize, - mockGetSession, mockGetAccessibleCopilotChat, } = vi.hoisted(() => ({ mockSelect: vi.fn(), @@ -23,14 +28,10 @@ const { mockThen: vi.fn(), mockDelete: vi.fn(), mockDeleteWhere: vi.fn(), - mockAuthorize: vi.fn(), - mockGetSession: vi.fn(), mockGetAccessibleCopilotChat: vi.fn(), })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@/lib/core/utils/urls', () => ({ getBaseUrl: vi.fn(() => 'http://localhost:3000'), @@ -39,9 +40,7 @@ vi.mock('@/lib/core/utils/urls', () => ({ getEmailDomain: vi.fn(() => 'localhost:3000'), })) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: mockAuthorize, -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) vi.mock('@/lib/copilot/chat/lifecycle', () => ({ getAccessibleCopilotChat: mockGetAccessibleCopilotChat, @@ -54,18 +53,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - workflowCheckpoints: { - id: 'id', - userId: 'userId', - workflowId: 'workflowId', - workflowState: 'workflowState', - }, - workflow: { - id: 'id', - userId: 'userId', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...conditions: unknown[]) => ({ conditions, type: 'and' })), @@ -83,9 +71,9 @@ describe('Copilot Checkpoints Revert API Route', () => { thenResults = [] - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) - mockAuthorize.mockResolvedValue({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: true, status: 200, }) @@ -134,12 +122,12 @@ describe('Copilot Checkpoints Revert API Route', () => { /** Helper to set authenticated state */ function setAuthenticated(user = { id: 'user-123', email: 'test@example.com' }) { - mockGetSession.mockResolvedValue({ user }) + authMockFns.mockGetSession.mockResolvedValue({ user }) } /** Helper to set unauthenticated state */ function setUnauthenticated() { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) } describe('POST', () => { @@ -273,7 +261,7 @@ describe('Copilot Checkpoints Revert API Route', () => { thenResults.push(mockCheckpoint) // Checkpoint found thenResults.push(mockWorkflow) // Workflow found but different user - mockAuthorize.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: false, status: 403, }) diff --git a/apps/sim/app/api/copilot/checkpoints/route.test.ts b/apps/sim/app/api/copilot/checkpoints/route.test.ts index e1b3a1f4e81..7521958259a 100644 --- a/apps/sim/app/api/copilot/checkpoints/route.test.ts +++ b/apps/sim/app/api/copilot/checkpoints/route.test.ts @@ -3,6 +3,13 @@ * * @vitest-environment node */ +import { + authMock, + authMockFns, + schemaMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -15,9 +22,7 @@ const { mockInsert, mockValues, mockReturning, - mockGetSession, mockGetAccessibleCopilotChat, - mockAuthorizeWorkflowByWorkspacePermission, } = vi.hoisted(() => ({ mockSelect: vi.fn(), mockFrom: vi.fn(), @@ -27,14 +32,10 @@ const { mockInsert: vi.fn(), mockValues: vi.fn(), mockReturning: vi.fn(), - mockGetSession: vi.fn(), mockGetAccessibleCopilotChat: vi.fn(), - mockAuthorizeWorkflowByWorkspacePermission: vi.fn(), })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/db', () => ({ db: { @@ -43,18 +44,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - copilotChats: { id: 'id', userId: 'userId' }, - workflowCheckpoints: { - id: 'id', - userId: 'userId', - workflowId: 'workflowId', - chatId: 'chatId', - messageId: 'messageId', - createdAt: 'createdAt', - updatedAt: 'updatedAt', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...conditions: unknown[]) => ({ conditions, type: 'and' })), @@ -66,9 +56,7 @@ vi.mock('@/lib/copilot/chat/lifecycle', () => ({ getAccessibleCopilotChat: mockGetAccessibleCopilotChat, })) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: mockAuthorizeWorkflowByWorkspacePermission, -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) import { GET, POST } from './route' @@ -84,7 +72,7 @@ describe('Copilot Checkpoints API Route', () => { beforeEach(() => { vi.clearAllMocks() - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) mockSelect.mockReturnValue({ from: mockFrom }) mockFrom.mockReturnValue({ where: mockWhere }) @@ -101,7 +89,9 @@ describe('Copilot Checkpoints API Route', () => { userId: 'user-123', workflowId: 'workflow-123', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: true }) + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ + allowed: true, + }) }) afterEach(() => { @@ -110,7 +100,7 @@ describe('Copilot Checkpoints API Route', () => { describe('POST', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('POST', { workflowId: 'workflow-123', @@ -126,7 +116,7 @@ describe('Copilot Checkpoints API Route', () => { }) it('should return 500 for invalid request body', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('POST', { workflowId: 'workflow-123', @@ -140,7 +130,7 @@ describe('Copilot Checkpoints API Route', () => { }) it('should return 400 when chat not found or unauthorized', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockGetAccessibleCopilotChat.mockResolvedValueOnce(null) const req = createMockRequest('POST', { @@ -157,7 +147,7 @@ describe('Copilot Checkpoints API Route', () => { }) it('should return 400 for invalid workflow state JSON', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('POST', { workflowId: 'workflow-123', @@ -173,7 +163,7 @@ describe('Copilot Checkpoints API Route', () => { }) it('should successfully create a checkpoint', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const checkpoint = { id: 'checkpoint-123', @@ -222,7 +212,7 @@ describe('Copilot Checkpoints API Route', () => { }) it('should create checkpoint without messageId', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const checkpoint = { id: 'checkpoint-123', @@ -251,7 +241,7 @@ describe('Copilot Checkpoints API Route', () => { }) it('should handle database errors during checkpoint creation', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockReturning.mockRejectedValue(new Error('Database insert failed')) @@ -269,7 +259,7 @@ describe('Copilot Checkpoints API Route', () => { }) it('should handle database errors during chat lookup', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockGetAccessibleCopilotChat.mockRejectedValueOnce(new Error('Database query failed')) @@ -289,7 +279,7 @@ describe('Copilot Checkpoints API Route', () => { describe('GET', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = new NextRequest('http://localhost:3000/api/copilot/checkpoints?chatId=chat-123') @@ -301,7 +291,7 @@ describe('Copilot Checkpoints API Route', () => { }) it('should return 400 when chatId is missing', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = new NextRequest('http://localhost:3000/api/copilot/checkpoints') @@ -313,7 +303,7 @@ describe('Copilot Checkpoints API Route', () => { }) it('should return checkpoints for authenticated user and chat', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const mockCheckpoints = [ { @@ -374,7 +364,7 @@ describe('Copilot Checkpoints API Route', () => { }) it('should handle database errors when fetching checkpoints', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockOrderBy.mockRejectedValue(new Error('Database query failed')) @@ -388,7 +378,7 @@ describe('Copilot Checkpoints API Route', () => { }) it('should return empty array when no checkpoints found', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockOrderBy.mockResolvedValue([]) diff --git a/apps/sim/app/api/copilot/confirm/route.test.ts b/apps/sim/app/api/copilot/confirm/route.test.ts index a81e39c2821..880d26b52d8 100644 --- a/apps/sim/app/api/copilot/confirm/route.test.ts +++ b/apps/sim/app/api/copilot/confirm/route.test.ts @@ -1,36 +1,17 @@ /** * @vitest-environment node */ +import { copilotHttpMock, copilotHttpMockFns } from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' const { - authenticateCopilotRequestSessionOnly, - createBadRequestResponse, - createInternalServerErrorResponse, - createNotFoundResponse, - createRequestTracker, - createUnauthorizedResponse, getAsyncToolCall, getRunSegment, upsertAsyncToolCall, completeAsyncToolCall, publishToolConfirmation, } = vi.hoisted(() => ({ - authenticateCopilotRequestSessionOnly: vi.fn(), - createBadRequestResponse: vi.fn((message: string) => - Response.json({ error: message }, { status: 400 }) - ), - createInternalServerErrorResponse: vi.fn((message: string) => - Response.json({ error: message }, { status: 500 }) - ), - createNotFoundResponse: vi.fn((message: string) => - Response.json({ error: message }, { status: 404 }) - ), - createRequestTracker: vi.fn(() => ({ requestId: 'req-1', getDuration: () => 1 })), - createUnauthorizedResponse: vi.fn(() => - Response.json({ error: 'Unauthorized' }, { status: 401 }) - ), getAsyncToolCall: vi.fn(), getRunSegment: vi.fn(), upsertAsyncToolCall: vi.fn(), @@ -38,14 +19,7 @@ const { publishToolConfirmation: vi.fn(), })) -vi.mock('@/lib/copilot/request/http', () => ({ - authenticateCopilotRequestSessionOnly, - createBadRequestResponse, - createInternalServerErrorResponse, - createNotFoundResponse, - createRequestTracker, - createUnauthorizedResponse, -})) +vi.mock('@/lib/copilot/request/http', () => copilotHttpMock) vi.mock('@/lib/copilot/async-runs/repository', () => ({ getAsyncToolCall, @@ -71,7 +45,7 @@ describe('Copilot Confirm API Route', () => { beforeEach(() => { vi.clearAllMocks() - authenticateCopilotRequestSessionOnly.mockResolvedValue({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValue({ userId: 'user-1', isAuthenticated: true, }) @@ -90,7 +64,7 @@ describe('Copilot Confirm API Route', () => { } it('returns 401 when the session is unauthenticated', async () => { - authenticateCopilotRequestSessionOnly.mockResolvedValue({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValue({ userId: null, isAuthenticated: false, }) diff --git a/apps/sim/app/api/copilot/confirm/route.ts b/apps/sim/app/api/copilot/confirm/route.ts index ac1669d7c33..3e88151ffe5 100644 --- a/apps/sim/app/api/copilot/confirm/route.ts +++ b/apps/sim/app/api/copilot/confirm/route.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { @@ -22,7 +23,6 @@ import { createRequestTracker, createUnauthorizedResponse, } from '@/lib/copilot/request/http' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('CopilotConfirmAPI') diff --git a/apps/sim/app/api/copilot/feedback/route.test.ts b/apps/sim/app/api/copilot/feedback/route.test.ts index 3f3a28598a6..9fef1ea2046 100644 --- a/apps/sim/app/api/copilot/feedback/route.test.ts +++ b/apps/sim/app/api/copilot/feedback/route.test.ts @@ -3,34 +3,20 @@ * * @vitest-environment node */ +import { copilotHttpMock, copilotHttpMockFns, schemaMock } from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockInsert, - mockValues, - mockReturning, - mockSelect, - mockFrom, - mockWhere, - mockAuthenticate, - mockCreateUnauthorizedResponse, - mockCreateBadRequestResponse, - mockCreateInternalServerErrorResponse, - mockCreateRequestTracker, -} = vi.hoisted(() => ({ - mockInsert: vi.fn(), - mockValues: vi.fn(), - mockReturning: vi.fn(), - mockSelect: vi.fn(), - mockFrom: vi.fn(), - mockWhere: vi.fn(), - mockAuthenticate: vi.fn(), - mockCreateUnauthorizedResponse: vi.fn(), - mockCreateBadRequestResponse: vi.fn(), - mockCreateInternalServerErrorResponse: vi.fn(), - mockCreateRequestTracker: vi.fn(), -})) +const { mockInsert, mockValues, mockReturning, mockSelect, mockFrom, mockWhere } = vi.hoisted( + () => ({ + mockInsert: vi.fn(), + mockValues: vi.fn(), + mockReturning: vi.fn(), + mockSelect: vi.fn(), + mockFrom: vi.fn(), + mockWhere: vi.fn(), + }) +) vi.mock('@sim/db', () => ({ db: { @@ -39,31 +25,13 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - copilotFeedback: { - feedbackId: 'feedbackId', - userId: 'userId', - chatId: 'chatId', - userQuery: 'userQuery', - agentResponse: 'agentResponse', - isPositive: 'isPositive', - feedback: 'feedback', - workflowYaml: 'workflowYaml', - createdAt: 'createdAt', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ eq: vi.fn((field: unknown, value: unknown) => ({ field, value, type: 'eq' })), })) -vi.mock('@/lib/copilot/request/http', () => ({ - authenticateCopilotRequestSessionOnly: mockAuthenticate, - createUnauthorizedResponse: mockCreateUnauthorizedResponse, - createBadRequestResponse: mockCreateBadRequestResponse, - createInternalServerErrorResponse: mockCreateInternalServerErrorResponse, - createRequestTracker: mockCreateRequestTracker, -})) +vi.mock('@/lib/copilot/request/http', () => copilotHttpMock) import { GET, POST } from '@/app/api/copilot/feedback/route' @@ -85,20 +53,6 @@ describe('Copilot Feedback API Route', () => { mockSelect.mockReturnValue({ from: mockFrom }) mockFrom.mockReturnValue({ where: mockWhere }) mockWhere.mockResolvedValue([]) - - mockCreateRequestTracker.mockReturnValue({ - requestId: 'test-request-id', - getDuration: vi.fn().mockReturnValue(100), - }) - mockCreateUnauthorizedResponse.mockReturnValue( - new Response(JSON.stringify({ error: 'Unauthorized' }), { status: 401 }) - ) - mockCreateBadRequestResponse.mockImplementation( - (message: string) => new Response(JSON.stringify({ error: message }), { status: 400 }) - ) - mockCreateInternalServerErrorResponse.mockImplementation( - (message: string) => new Response(JSON.stringify({ error: message }), { status: 500 }) - ) }) afterEach(() => { @@ -107,7 +61,7 @@ describe('Copilot Feedback API Route', () => { describe('POST', () => { it('should return 401 when user is not authenticated', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: null, isAuthenticated: false, }) @@ -127,7 +81,7 @@ describe('Copilot Feedback API Route', () => { }) it('should successfully submit positive feedback', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -162,7 +116,7 @@ describe('Copilot Feedback API Route', () => { }) it('should successfully submit negative feedback with text', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -197,7 +151,7 @@ describe('Copilot Feedback API Route', () => { }) it('should successfully submit feedback with workflow YAML', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -248,7 +202,7 @@ edges: }) it('should return 400 for invalid chatId format', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -268,7 +222,7 @@ edges: }) it('should return 400 for empty userQuery', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -288,7 +242,7 @@ edges: }) it('should return 400 for empty agentResponse', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -308,7 +262,7 @@ edges: }) it('should return 400 for missing isPositiveFeedback', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -327,7 +281,7 @@ edges: }) it('should handle database errors gracefully', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -349,7 +303,7 @@ edges: }) it('should handle JSON parsing errors in request body', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -370,7 +324,7 @@ edges: describe('GET', () => { it('should return 401 when user is not authenticated', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: null, isAuthenticated: false, }) @@ -384,7 +338,7 @@ edges: }) it('should return empty feedback array when no feedback exists', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -401,7 +355,7 @@ edges: }) it('should only return feedback records for the authenticated user', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -438,7 +392,7 @@ edges: }) it('should handle database errors gracefully', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -454,7 +408,7 @@ edges: }) it('should return metadata with response', async () => { - mockAuthenticate.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) diff --git a/apps/sim/app/api/copilot/models/route.ts b/apps/sim/app/api/copilot/models/route.ts index 5aaa7a44a75..73eaeee1979 100644 --- a/apps/sim/app/api/copilot/models/route.ts +++ b/apps/sim/app/api/copilot/models/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { SIM_AGENT_API_URL } from '@/lib/copilot/constants' import { authenticateCopilotRequestSessionOnly } from '@/lib/copilot/request/http' -import { toError } from '@/lib/core/utils/helpers' interface AvailableModel { id: string diff --git a/apps/sim/app/api/copilot/stats/route.test.ts b/apps/sim/app/api/copilot/stats/route.test.ts index ca6e97704f0..5f78d803472 100644 --- a/apps/sim/app/api/copilot/stats/route.test.ts +++ b/apps/sim/app/api/copilot/stats/route.test.ts @@ -3,54 +3,22 @@ * * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { copilotHttpMock, copilotHttpMockFns, createEnvMock, createMockRequest } from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockAuthenticateCopilotRequestSessionOnly, - mockCreateUnauthorizedResponse, - mockCreateBadRequestResponse, - mockCreateInternalServerErrorResponse, - mockCreateRequestTracker, - mockFetch, -} = vi.hoisted(() => ({ - mockAuthenticateCopilotRequestSessionOnly: vi.fn(), - mockCreateUnauthorizedResponse: vi.fn(), - mockCreateBadRequestResponse: vi.fn(), - mockCreateInternalServerErrorResponse: vi.fn(), - mockCreateRequestTracker: vi.fn(), +const { mockFetch } = vi.hoisted(() => ({ mockFetch: vi.fn(), })) -vi.mock('@/lib/copilot/request/http', () => ({ - authenticateCopilotRequestSessionOnly: mockAuthenticateCopilotRequestSessionOnly, - createUnauthorizedResponse: mockCreateUnauthorizedResponse, - createBadRequestResponse: mockCreateBadRequestResponse, - createInternalServerErrorResponse: mockCreateInternalServerErrorResponse, - createRequestTracker: mockCreateRequestTracker, -})) +vi.mock('@/lib/copilot/request/http', () => copilotHttpMock) vi.mock('@/lib/copilot/constants', () => ({ SIM_AGENT_API_URL_DEFAULT: 'https://agent.sim.example.com', SIM_AGENT_API_URL: 'https://agent.sim.example.com', })) -vi.mock('@/lib/core/config/env', () => ({ - env: { - COPILOT_API_KEY: 'test-api-key', - }, - getEnv: vi.fn((key: string) => { - const vals: Record = { - COPILOT_API_KEY: 'test-api-key', - } - return vals[key] - }), - isTruthy: (value: string | boolean | number | undefined) => - typeof value === 'string' ? value.toLowerCase() === 'true' || value === '1' : Boolean(value), - isFalsy: (value: string | boolean | number | undefined) => - typeof value === 'string' ? value.toLowerCase() === 'false' || value === '0' : value === false, -})) +vi.mock('@/lib/core/config/env', () => createEnvMock({ COPILOT_API_KEY: 'test-api-key' })) import { POST } from '@/app/api/copilot/stats/route' @@ -58,20 +26,6 @@ describe('Copilot Stats API Route', () => { beforeEach(() => { vi.clearAllMocks() global.fetch = mockFetch - - mockCreateUnauthorizedResponse.mockReturnValue( - new Response(JSON.stringify({ error: 'Unauthorized' }), { status: 401 }) - ) - mockCreateBadRequestResponse.mockImplementation( - (message: string) => new Response(JSON.stringify({ error: message }), { status: 400 }) - ) - mockCreateInternalServerErrorResponse.mockImplementation( - (message: string) => new Response(JSON.stringify({ error: message }), { status: 500 }) - ) - mockCreateRequestTracker.mockReturnValue({ - requestId: 'test-request-id', - getDuration: vi.fn().mockReturnValue(100), - }) }) afterEach(() => { @@ -80,7 +34,7 @@ describe('Copilot Stats API Route', () => { describe('POST', () => { it('should return 401 when user is not authenticated', async () => { - mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: null, isAuthenticated: false, }) @@ -99,7 +53,7 @@ describe('Copilot Stats API Route', () => { }) it('should successfully forward stats to Sim Agent', async () => { - mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -139,7 +93,7 @@ describe('Copilot Stats API Route', () => { }) it('should return 400 for invalid request body - missing messageId', async () => { - mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -157,7 +111,7 @@ describe('Copilot Stats API Route', () => { }) it('should return 400 for invalid request body - missing diffCreated', async () => { - mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -175,7 +129,7 @@ describe('Copilot Stats API Route', () => { }) it('should return 400 for invalid request body - missing diffAccepted', async () => { - mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -193,7 +147,7 @@ describe('Copilot Stats API Route', () => { }) it('should return 400 when upstream Sim Agent returns error', async () => { - mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -217,7 +171,7 @@ describe('Copilot Stats API Route', () => { }) it('should handle upstream error with message field', async () => { - mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -241,7 +195,7 @@ describe('Copilot Stats API Route', () => { }) it('should handle upstream error with no JSON response', async () => { - mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -265,7 +219,7 @@ describe('Copilot Stats API Route', () => { }) it('should handle network errors gracefully', async () => { - mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -286,7 +240,7 @@ describe('Copilot Stats API Route', () => { }) it('should handle JSON parsing errors in request body', async () => { - mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) @@ -307,7 +261,7 @@ describe('Copilot Stats API Route', () => { }) it('should forward stats with diffCreated=false and diffAccepted=false', async () => { - mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValueOnce({ userId: 'user-123', isAuthenticated: true, }) diff --git a/apps/sim/app/api/creators/route.ts b/apps/sim/app/api/creators/route.ts index 6dedd133af1..07671d38ef6 100644 --- a/apps/sim/app/api/creators/route.ts +++ b/apps/sim/app/api/creators/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { member, templateCreators } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import type { CreatorProfileDetails } from '@/app/_types/creator-profile' const logger = createLogger('CreatorProfilesAPI') diff --git a/apps/sim/app/api/credential-sets/[id]/invite/route.ts b/apps/sim/app/api/credential-sets/[id]/invite/route.ts index b9b0ccc4a95..874b0b31550 100644 --- a/apps/sim/app/api/credential-sets/[id]/invite/route.ts +++ b/apps/sim/app/api/credential-sets/[id]/invite/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { credentialSet, credentialSetInvitation, member, organization, user } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -9,7 +10,6 @@ import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { hasCredentialSetsAccess } from '@/lib/billing' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { sendEmail } from '@/lib/messaging/email/mailer' const logger = createLogger('CredentialSetInvite') diff --git a/apps/sim/app/api/credential-sets/[id]/members/route.ts b/apps/sim/app/api/credential-sets/[id]/members/route.ts index 8ec89923bbe..49959b85334 100644 --- a/apps/sim/app/api/credential-sets/[id]/members/route.ts +++ b/apps/sim/app/api/credential-sets/[id]/members/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { account, credentialSet, credentialSetMember, member, user } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, inArray } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { hasCredentialSetsAccess } from '@/lib/billing' -import { generateId } from '@/lib/core/utils/uuid' import { syncAllWebhooksForCredentialSet } from '@/lib/webhooks/utils.server' const logger = createLogger('CredentialSetMembers') diff --git a/apps/sim/app/api/credential-sets/invite/[token]/route.ts b/apps/sim/app/api/credential-sets/invite/[token]/route.ts index fc3759b0e27..a72b879128b 100644 --- a/apps/sim/app/api/credential-sets/invite/[token]/route.ts +++ b/apps/sim/app/api/credential-sets/invite/[token]/route.ts @@ -6,11 +6,11 @@ import { organization, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' -import { generateId } from '@/lib/core/utils/uuid' import { syncAllWebhooksForCredentialSet } from '@/lib/webhooks/utils.server' const logger = createLogger('CredentialSetInviteToken') diff --git a/apps/sim/app/api/credential-sets/memberships/route.ts b/apps/sim/app/api/credential-sets/memberships/route.ts index 926714b98f9..ec6ba4b41d9 100644 --- a/apps/sim/app/api/credential-sets/memberships/route.ts +++ b/apps/sim/app/api/credential-sets/memberships/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { credentialSet, credentialSetMember, organization } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' -import { generateId } from '@/lib/core/utils/uuid' import { syncAllWebhooksForCredentialSet } from '@/lib/webhooks/utils.server' const logger = createLogger('CredentialSetMemberships') diff --git a/apps/sim/app/api/credential-sets/route.ts b/apps/sim/app/api/credential-sets/route.ts index c120e84b421..bfd73c78f50 100644 --- a/apps/sim/app/api/credential-sets/route.ts +++ b/apps/sim/app/api/credential-sets/route.ts @@ -1,13 +1,13 @@ import { db } from '@sim/db' import { credentialSet, credentialSetMember, member, organization, user } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, count, desc, eq } from 'drizzle-orm' import { NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { hasCredentialSetsAccess } from '@/lib/billing' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('CredentialSets') diff --git a/apps/sim/app/api/credentials/[id]/members/route.ts b/apps/sim/app/api/credentials/[id]/members/route.ts index c89657fe89f..220f12b04b0 100644 --- a/apps/sim/app/api/credentials/[id]/members/route.ts +++ b/apps/sim/app/api/credentials/[id]/members/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { credential, credentialMember, user } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { generateId } from '@/lib/core/utils/uuid' import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('CredentialMembersAPI') diff --git a/apps/sim/app/api/credentials/[id]/route.ts b/apps/sim/app/api/credentials/[id]/route.ts index c3a61569051..f0429234488 100644 --- a/apps/sim/app/api/credentials/[id]/route.ts +++ b/apps/sim/app/api/credentials/[id]/route.ts @@ -1,13 +1,13 @@ import { db } from '@sim/db' import { credential, credentialMember, environment, workspaceEnvironment } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { encryptSecret } from '@/lib/core/security/encryption' -import { generateId } from '@/lib/core/utils/uuid' import { getCredentialActorContext } from '@/lib/credentials/access' import { syncPersonalEnvCredentialsForUser, diff --git a/apps/sim/app/api/credentials/draft/route.ts b/apps/sim/app/api/credentials/draft/route.ts index e00be23b0d0..504a6f0d334 100644 --- a/apps/sim/app/api/credentials/draft/route.ts +++ b/apps/sim/app/api/credentials/draft/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { credential, credentialMember, pendingCredentialDraft } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, lt } from 'drizzle-orm' import { NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { generateId } from '@/lib/core/utils/uuid' import { checkWorkspaceAccess } from '@/lib/workspaces/permissions/utils' const logger = createLogger('CredentialDraftAPI') diff --git a/apps/sim/app/api/credentials/route.ts b/apps/sim/app/api/credentials/route.ts index 0b210325064..3ed44d4a863 100644 --- a/apps/sim/app/api/credentials/route.ts +++ b/apps/sim/app/api/credentials/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { account, credential, credentialMember, workspace } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -8,7 +9,6 @@ import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { encryptSecret } from '@/lib/core/security/encryption' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { getWorkspaceMemberUserIds } from '@/lib/credentials/environment' import { syncWorkspaceOAuthCredentialsForUser } from '@/lib/credentials/oauth' import { getServiceConfigByProviderId } from '@/lib/oauth' diff --git a/apps/sim/app/api/cron/cleanup-stale-executions/route.ts b/apps/sim/app/api/cron/cleanup-stale-executions/route.ts index 2b52a3ea43e..4983927241f 100644 --- a/apps/sim/app/api/cron/cleanup-stale-executions/route.ts +++ b/apps/sim/app/api/cron/cleanup-stale-executions/route.ts @@ -1,12 +1,12 @@ import { asyncJobs, db } from '@sim/db' import { workflowExecutionLogs } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq, inArray, lt, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' import { JOB_RETENTION_HOURS, JOB_STATUS } from '@/lib/core/async-jobs' import { getMaxExecutionTimeout } from '@/lib/core/execution-limits' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('CleanupStaleExecutions') diff --git a/apps/sim/app/api/environment/route.ts b/apps/sim/app/api/environment/route.ts index f8167e92ac2..39659a6d3d8 100644 --- a/apps/sim/app/api/environment/route.ts +++ b/apps/sim/app/api/environment/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { environment } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -8,7 +9,6 @@ import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { decryptSecret, encryptSecret } from '@/lib/core/security/encryption' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { syncPersonalEnvCredentialsForUser } from '@/lib/credentials/environment' import type { EnvironmentVariable } from '@/lib/environment/api' diff --git a/apps/sim/app/api/files/delete/route.test.ts b/apps/sim/app/api/files/delete/route.test.ts index 85ea1913565..063e489675a 100644 --- a/apps/sim/app/api/files/delete/route.test.ts +++ b/apps/sim/app/api/files/delete/route.test.ts @@ -1,13 +1,10 @@ /** * @vitest-environment node */ +import { authMock, authMockFns, hybridAuthMock, hybridAuthMockFns, schemaMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' const mocks = vi.hoisted(() => { - const mockGetSession = vi.fn() - const mockCheckHybridAuth = vi.fn() - const mockCheckSessionOrInternalAuth = vi.fn() - const mockCheckInternalAuth = vi.fn() const mockVerifyFileAccess = vi.fn() const mockVerifyWorkspaceFileAccess = vi.fn() const mockDeleteFile = vi.fn() @@ -18,10 +15,6 @@ const mocks = vi.hoisted(() => { const mockDownloadFile = vi.fn() return { - mockGetSession, - mockCheckHybridAuth, - mockCheckSessionOrInternalAuth, - mockCheckInternalAuth, mockVerifyFileAccess, mockVerifyWorkspaceFileAccess, mockDeleteFile, @@ -33,29 +26,7 @@ const mocks = vi.hoisted(() => { } }) -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})) - -vi.mock('@sim/db/schema', () => ({ - workflowFolder: { - id: 'id', - userId: 'userId', - parentId: 'parentId', - updatedAt: 'updatedAt', - workspaceId: 'workspaceId', - sortOrder: 'sortOrder', - createdAt: 'createdAt', - }, - workflow: { id: 'id', folderId: 'folderId', userId: 'userId', updatedAt: 'updatedAt' }, - account: { userId: 'userId', providerId: 'providerId' }, - user: { email: 'email', id: 'id' }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...conditions: unknown[]) => ({ conditions, type: 'and' })), @@ -82,7 +53,7 @@ vi.mock('drizzle-orm', () => ({ sql: vi.fn((strings: unknown, ...values: unknown[]) => ({ type: 'sql', sql: strings, values })), })) -vi.mock('@/lib/core/utils/uuid', () => ({ +vi.mock('@sim/utils/id', () => ({ generateId: vi.fn(() => 'test-uuid'), generateShortId: vi.fn(() => 'mock-short-id'), isValidUuid: vi.fn((v: string) => @@ -90,16 +61,9 @@ vi.mock('@/lib/core/utils/uuid', () => ({ ), })) -vi.mock('@/lib/auth', () => ({ - getSession: mocks.mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkHybridAuth: mocks.mockCheckHybridAuth, - checkSessionOrInternalAuth: mocks.mockCheckSessionOrInternalAuth, - checkInternalAuth: mocks.mockCheckInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) vi.mock('@/app/api/files/authorization', () => ({ verifyFileAccess: mocks.mockVerifyFileAccess, @@ -151,8 +115,8 @@ describe('File Delete API Route', () => { randomUUID: vi.fn().mockReturnValue('mock-uuid-1234-5678'), }) - mocks.mockGetSession.mockResolvedValue({ user: { id: 'test-user-id' } }) - mocks.mockCheckSessionOrInternalAuth.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'test-user-id' } }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: 'test-user-id', error: undefined, diff --git a/apps/sim/app/api/files/parse/route.test.ts b/apps/sim/app/api/files/parse/route.test.ts index 02baaffb6c0..0414692a5fb 100644 --- a/apps/sim/app/api/files/parse/route.test.ts +++ b/apps/sim/app/api/files/parse/route.test.ts @@ -3,7 +3,12 @@ * * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + createMockRequest, + hybridAuthMock, + hybridAuthMockFns, + inputValidationMock, +} from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' @@ -23,9 +28,6 @@ const { mockFsWriteFile, mockJoin, mockGetSession, - mockCheckInternalAuth, - mockCheckHybridAuth, - mockCheckSessionOrInternalAuth, actualPath, } = vi.hoisted(() => { // eslint-disable-next-line @typescript-eslint/no-require-imports @@ -57,9 +59,6 @@ const { return actualPath.join(...args) }), mockGetSession: vi.fn(), - mockCheckInternalAuth: vi.fn(), - mockCheckHybridAuth: vi.fn(), - mockCheckSessionOrInternalAuth: vi.fn(), actualPath, } }) @@ -105,17 +104,9 @@ vi.mock('@/lib/auth', () => ({ signUp: vi.fn(), })) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkInternalAuth: mockCheckInternalAuth, - checkHybridAuth: mockCheckHybridAuth, - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) -vi.mock('@/lib/core/security/input-validation.server', () => ({ - secureFetchWithPinnedIP: vi.fn(), - validateUrlWithDNS: vi.fn(), -})) +vi.mock('@/lib/core/security/input-validation.server', () => inputValidationMock) vi.mock('@/lib/core/utils/logging', () => ({ sanitizeUrlForLog: vi.fn((url: string) => url), @@ -165,19 +156,19 @@ function setupFileApiMocks( mockGetSession.mockResolvedValue(null) } - mockCheckInternalAuth.mockResolvedValue({ + hybridAuthMockFns.mockCheckInternalAuth.mockResolvedValue({ success: authenticated, userId: authenticated ? 'test-user-id' : undefined, error: authenticated ? undefined : 'Unauthorized', }) - mockCheckHybridAuth.mockResolvedValue({ + hybridAuthMockFns.mockCheckHybridAuth.mockResolvedValue({ success: authenticated, userId: authenticated ? 'test-user-id' : undefined, error: authenticated ? undefined : 'Unauthorized', }) - mockCheckSessionOrInternalAuth.mockResolvedValue({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: authenticated, userId: authenticated ? 'test-user-id' : undefined, error: authenticated ? undefined : 'Unauthorized', diff --git a/apps/sim/app/api/files/presigned/route.test.ts b/apps/sim/app/api/files/presigned/route.test.ts index a752403a059..9f6a6ca4c7c 100644 --- a/apps/sim/app/api/files/presigned/route.test.ts +++ b/apps/sim/app/api/files/presigned/route.test.ts @@ -4,11 +4,11 @@ * @vitest-environment node */ +import { authMock, authMockFns } from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const { - mockGetSession, mockVerifyFileAccess, mockVerifyWorkspaceFileAccess, mockUseBlobStorage, @@ -25,7 +25,6 @@ const { mockGetStorageProviderUploads, mockIsUsingCloudStorageUploads, } = vi.hoisted(() => ({ - mockGetSession: vi.fn(), mockVerifyFileAccess: vi.fn().mockResolvedValue(true), mockVerifyWorkspaceFileAccess: vi.fn().mockResolvedValue(true), mockUseBlobStorage: { value: false }, @@ -46,9 +45,7 @@ const { mockIsUsingCloudStorageUploads: vi.fn(), })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@/app/api/files/authorization', () => ({ verifyFileAccess: mockVerifyFileAccess, @@ -108,9 +105,9 @@ function setupFileApiMocks( const { authenticated = true, storageProvider = 's3', cloudEnabled = true } = options if (authenticated) { - mockGetSession.mockResolvedValue({ user: defaultMockUser }) + authMockFns.mockGetSession.mockResolvedValue({ user: defaultMockUser }) } else { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) } const useBlobStorage = storageProvider === 'blob' && cloudEnabled diff --git a/apps/sim/app/api/files/serve/[...path]/route.test.ts b/apps/sim/app/api/files/serve/[...path]/route.test.ts index 6a102b60340..408470b70f8 100644 --- a/apps/sim/app/api/files/serve/[...path]/route.test.ts +++ b/apps/sim/app/api/files/serve/[...path]/route.test.ts @@ -3,11 +3,11 @@ * * @vitest-environment node */ +import { hybridAuthMock, hybridAuthMockFns } from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' const { - mockCheckSessionOrInternalAuth, mockVerifyFileAccess, mockReadFile, mockIsUsingCloudStorage, @@ -27,7 +27,6 @@ const { } } return { - mockCheckSessionOrInternalAuth: vi.fn(), mockVerifyFileAccess: vi.fn(), mockReadFile: vi.fn(), mockIsUsingCloudStorage: vi.fn(), @@ -48,10 +47,7 @@ vi.mock('fs/promises', () => ({ stat: vi.fn().mockResolvedValue({ isFile: () => true, size: 100 }), })) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) vi.mock('@/app/api/files/authorization', () => ({ verifyFileAccess: mockVerifyFileAccess, @@ -103,7 +99,7 @@ describe('File Serve API Route', () => { beforeEach(() => { vi.clearAllMocks() - mockCheckSessionOrInternalAuth.mockResolvedValue({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: 'test-user-id', }) diff --git a/apps/sim/app/api/files/upload/route.test.ts b/apps/sim/app/api/files/upload/route.test.ts index 5f3d9064c9f..f38c673332a 100644 --- a/apps/sim/app/api/files/upload/route.test.ts +++ b/apps/sim/app/api/files/upload/route.test.ts @@ -3,14 +3,11 @@ * * @vitest-environment node */ +import { authMock, authMockFns, hybridAuthMock, hybridAuthMockFns, schemaMock } from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const mocks = vi.hoisted(() => { - const mockGetSession = vi.fn() - const mockCheckHybridAuth = vi.fn() - const mockCheckSessionOrInternalAuth = vi.fn() - const mockCheckInternalAuth = vi.fn() const mockVerifyFileAccess = vi.fn() const mockVerifyWorkspaceFileAccess = vi.fn() const mockVerifyKBFileAccess = vi.fn() @@ -24,10 +21,6 @@ const mocks = vi.hoisted(() => { const mockStorageUploadFile = vi.fn() return { - mockGetSession, - mockCheckHybridAuth, - mockCheckSessionOrInternalAuth, - mockCheckInternalAuth, mockVerifyFileAccess, mockVerifyWorkspaceFileAccess, mockVerifyKBFileAccess, @@ -42,29 +35,7 @@ const mocks = vi.hoisted(() => { } }) -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})) - -vi.mock('@sim/db/schema', () => ({ - workflowFolder: { - id: 'id', - userId: 'userId', - parentId: 'parentId', - updatedAt: 'updatedAt', - workspaceId: 'workspaceId', - sortOrder: 'sortOrder', - createdAt: 'createdAt', - }, - workflow: { id: 'id', folderId: 'folderId', userId: 'userId', updatedAt: 'updatedAt' }, - account: { userId: 'userId', providerId: 'providerId' }, - user: { email: 'email', id: 'id' }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...conditions: unknown[]) => ({ conditions, type: 'and' })), @@ -91,7 +62,7 @@ vi.mock('drizzle-orm', () => ({ sql: vi.fn((strings: unknown, ...values: unknown[]) => ({ type: 'sql', sql: strings, values })), })) -vi.mock('@/lib/core/utils/uuid', () => ({ +vi.mock('@sim/utils/id', () => ({ generateId: vi.fn(() => 'test-uuid'), generateShortId: vi.fn(() => 'mock-short-id'), isValidUuid: vi.fn((v: string) => @@ -99,16 +70,9 @@ vi.mock('@/lib/core/utils/uuid', () => ({ ), })) -vi.mock('@/lib/auth', () => ({ - getSession: mocks.mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkHybridAuth: mocks.mockCheckHybridAuth, - checkSessionOrInternalAuth: mocks.mockCheckSessionOrInternalAuth, - checkInternalAuth: mocks.mockCheckInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) vi.mock('@/app/api/files/authorization', () => ({ verifyFileAccess: mocks.mockVerifyFileAccess, @@ -160,12 +124,12 @@ function setupFileApiMocks( }) if (authenticated) { - mocks.mockGetSession.mockResolvedValue({ user: { id: 'test-user-id' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'test-user-id' } }) } else { - mocks.mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) } - mocks.mockCheckHybridAuth.mockResolvedValue({ + hybridAuthMockFns.mockCheckHybridAuth.mockResolvedValue({ success: authenticated, userId: authenticated ? 'test-user-id' : undefined, error: authenticated ? undefined : 'Unauthorized', @@ -367,7 +331,7 @@ describe('File Upload Security Tests', () => { beforeEach(() => { vi.clearAllMocks() - mocks.mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'test-user-id' }, }) @@ -529,7 +493,7 @@ describe('File Upload Security Tests', () => { describe('Authentication Requirements', () => { it('should reject uploads without authentication', async () => { - mocks.mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const formData = new FormData() const file = new File(['test content'], 'test.pdf', { type: 'application/pdf' }) diff --git a/apps/sim/app/api/folders/[id]/duplicate/route.ts b/apps/sim/app/api/folders/[id]/duplicate/route.ts index be6cea9d429..9225390746d 100644 --- a/apps/sim/app/api/folders/[id]/duplicate/route.ts +++ b/apps/sim/app/api/folders/[id]/duplicate/route.ts @@ -1,13 +1,13 @@ import { db } from '@sim/db' import { workflow, workflowFolder } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull, min } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { duplicateWorkflow } from '@/lib/workflows/persistence/duplicate' import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' diff --git a/apps/sim/app/api/folders/[id]/route.test.ts b/apps/sim/app/api/folders/[id]/route.test.ts index ee13e3a6c3f..f920c7cb59b 100644 --- a/apps/sim/app/api/folders/[id]/route.test.ts +++ b/apps/sim/app/api/folders/[id]/route.test.ts @@ -3,17 +3,22 @@ * * @vitest-environment node */ -import { auditMock, createMockRequest, type MockUser } from '@sim/testing' +import { + auditMock, + authMock, + authMockFns, + createMockRequest, + type MockUser, + permissionsMock, + permissionsMockFns, + workflowsOrchestrationMock, + workflowsOrchestrationMockFns, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockGetSession, - mockGetUserEntityPermissions, - mockLogger, - mockDbRef, - mockPerformDeleteFolder, - mockCheckForCircularReference, -} = vi.hoisted(() => { +const { mockLogger, mockDbRef } = vi.hoisted(() => { const logger = { info: vi.fn(), warn: vi.fn(), @@ -24,36 +29,28 @@ const { child: vi.fn(), } return { - mockGetSession: vi.fn(), - mockGetUserEntityPermissions: vi.fn(), mockLogger: logger, mockDbRef: { current: null as any }, - mockPerformDeleteFolder: vi.fn(), - mockCheckForCircularReference: vi.fn(), } }) +const mockPerformDeleteFolder = workflowsOrchestrationMockFns.mockPerformDeleteFolder + +const mockGetUserEntityPermissions = permissionsMockFns.mockGetUserEntityPermissions + vi.mock('@/lib/audit/log', () => auditMock) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/logger', () => ({ createLogger: vi.fn().mockReturnValue(mockLogger), })) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - getUserEntityPermissions: mockGetUserEntityPermissions, -})) +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) vi.mock('@sim/db', () => ({ get db() { return mockDbRef.current }, })) -vi.mock('@/lib/workflows/orchestration', () => ({ - performDeleteFolder: mockPerformDeleteFolder, -})) -vi.mock('@/lib/workflows/utils', () => ({ - checkForCircularReference: mockCheckForCircularReference, -})) +vi.mock('@/lib/workflows/orchestration', () => workflowsOrchestrationMock) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) import { DELETE, PUT } from '@/app/api/folders/[id]/route' @@ -146,11 +143,11 @@ function createFolderDbMock(options: FolderDbMockOptions = {}) { } function mockAuthenticatedUser(user?: MockUser) { - mockGetSession.mockResolvedValue({ user: user || TEST_USER }) + authMockFns.mockGetSession.mockResolvedValue({ user: user || TEST_USER }) } function mockUnauthenticated() { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) } describe('Individual Folder API Route', () => { @@ -163,7 +160,7 @@ describe('Individual Folder API Route', () => { success: true, deletedItems: { folders: 1, workflows: 0 }, }) - mockCheckForCircularReference.mockResolvedValue(false) + workflowsUtilsMockFns.mockCheckForCircularReference.mockResolvedValue(false) }) describe('PUT /api/folders/[id]', () => { @@ -398,7 +395,7 @@ describe('Individual Folder API Route', () => { }, }) - mockCheckForCircularReference.mockResolvedValue(true) + workflowsUtilsMockFns.mockCheckForCircularReference.mockResolvedValue(true) const req = createMockRequest('PUT', { name: 'Updated Folder 3', @@ -412,7 +409,10 @@ describe('Individual Folder API Route', () => { const data = await response.json() expect(data).toHaveProperty('error', 'Cannot create circular folder reference') - expect(mockCheckForCircularReference).toHaveBeenCalledWith('folder-3', 'folder-1') + expect(workflowsUtilsMockFns.mockCheckForCircularReference).toHaveBeenCalledWith( + 'folder-3', + 'folder-1' + ) }) }) diff --git a/apps/sim/app/api/folders/route.test.ts b/apps/sim/app/api/folders/route.test.ts index b31b527a745..1f5ba3272aa 100644 --- a/apps/sim/app/api/folders/route.test.ts +++ b/apps/sim/app/api/folders/route.test.ts @@ -3,11 +3,18 @@ * * @vitest-environment node */ -import { auditMock, createMockRequest } from '@sim/testing' +import { + auditMock, + authMock, + authMockFns, + createMockRequest, + permissionsMock, + permissionsMockFns, +} from '@sim/testing' import { drizzleOrmMock } from '@sim/testing/mocks' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetSession, mockGetUserEntityPermissions, mockLogger } = vi.hoisted(() => { +const { mockLogger } = vi.hoisted(() => { const logger = { info: vi.fn(), warn: vi.fn(), @@ -18,26 +25,22 @@ const { mockGetSession, mockGetUserEntityPermissions, mockLogger } = vi.hoisted( child: vi.fn(), } return { - mockGetSession: vi.fn(), - mockGetUserEntityPermissions: vi.fn(), mockLogger: logger, } }) +const mockGetUserEntityPermissions = permissionsMockFns.mockGetUserEntityPermissions + vi.mock('@/lib/audit/log', () => auditMock) vi.mock('drizzle-orm', () => ({ ...drizzleOrmMock, min: vi.fn((field) => ({ type: 'min', field })), })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/logger', () => ({ createLogger: vi.fn().mockReturnValue(mockLogger), })) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - getUserEntityPermissions: mockGetUserEntityPermissions, -})) +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) import { db } from '@sim/db' import { GET, POST } from '@/app/api/folders/route' @@ -131,11 +134,11 @@ describe('Folders API Route', () => { const mockTransaction = mockDb.transaction function mockAuthenticatedUser() { - mockGetSession.mockResolvedValue({ user: defaultMockUser }) + authMockFns.mockGetSession.mockResolvedValue({ user: defaultMockUser }) } function mockUnauthenticated() { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) } beforeEach(() => { diff --git a/apps/sim/app/api/folders/route.ts b/apps/sim/app/api/folders/route.ts index 37e0ae8d1d8..4b0612fcb98 100644 --- a/apps/sim/app/api/folders/route.ts +++ b/apps/sim/app/api/folders/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { workflow, workflowFolder } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, asc, eq, isNotNull, isNull, min } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' -import { generateId } from '@/lib/core/utils/uuid' import { captureServerEvent } from '@/lib/posthog/server' import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' diff --git a/apps/sim/app/api/form/[identifier]/route.ts b/apps/sim/app/api/form/[identifier]/route.ts index 2ecc89fcfbb..8cb11dabc19 100644 --- a/apps/sim/app/api/form/[identifier]/route.ts +++ b/apps/sim/app/api/form/[identifier]/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { form, workflow, workflowBlocks } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { addCorsHeaders, validateAuthToken } from '@/lib/core/security/deployment' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { preprocessExecution } from '@/lib/execution/preprocessing' import { LoggingSession } from '@/lib/logs/execution/logging-session' import { executeWorkflow } from '@/lib/workflows/executor/execute-workflow' diff --git a/apps/sim/app/api/form/route.ts b/apps/sim/app/api/form/route.ts index b42d804203e..500e5b4bb47 100644 --- a/apps/sim/app/api/form/route.ts +++ b/apps/sim/app/api/form/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { form } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { z } from 'zod' @@ -9,7 +10,6 @@ import { getSession } from '@/lib/auth' import { isDev } from '@/lib/core/config/feature-flags' import { encryptSecret } from '@/lib/core/security/encryption' import { getEmailDomain } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { notifySocketDeploymentChanged } from '@/lib/workflows/orchestration' import { deployWorkflow } from '@/lib/workflows/persistence/utils' import { diff --git a/apps/sim/app/api/form/utils.test.ts b/apps/sim/app/api/form/utils.test.ts index d88146cb69f..9c36ccc6e92 100644 --- a/apps/sim/app/api/form/utils.test.ts +++ b/apps/sim/app/api/form/utils.test.ts @@ -3,30 +3,25 @@ * * @vitest-environment node */ -import { databaseMock, loggerMock } from '@sim/testing' +import { encryptionMock, encryptionMockFns, workflowsUtilsMock } from '@sim/testing' import type { NextResponse } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' const { - mockDecryptSecret, mockValidateAuthToken, mockSetDeploymentAuthCookie, mockAddCorsHeaders, mockIsEmailAllowed, } = vi.hoisted(() => ({ - mockDecryptSecret: vi.fn(), mockValidateAuthToken: vi.fn().mockReturnValue(false), mockSetDeploymentAuthCookie: vi.fn(), mockAddCorsHeaders: vi.fn((response: unknown) => response), mockIsEmailAllowed: vi.fn(), })) -vi.mock('@sim/db', () => databaseMock) -vi.mock('@sim/logger', () => loggerMock) +const mockDecryptSecret = encryptionMockFns.mockDecryptSecret -vi.mock('@/lib/core/security/encryption', () => ({ - decryptSecret: mockDecryptSecret, -})) +vi.mock('@/lib/core/security/encryption', () => encryptionMock) vi.mock('@/lib/core/security/deployment', () => ({ validateAuthToken: mockValidateAuthToken, @@ -41,9 +36,7 @@ vi.mock('@/lib/core/config/feature-flags', () => ({ isProd: false, })) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: vi.fn(), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) import { decryptSecret } from '@/lib/core/security/encryption' import { diff --git a/apps/sim/app/api/function/execute/route.test.ts b/apps/sim/app/api/function/execute/route.test.ts index 766bbb88fad..a11387064d8 100644 --- a/apps/sim/app/api/function/execute/route.test.ts +++ b/apps/sim/app/api/function/execute/route.test.ts @@ -3,12 +3,17 @@ * * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + createMockRequest, + featureFlagsMock, + hybridAuthMock, + hybridAuthMockFns, + workflowsUtilsMock, +} from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockCheckInternalAuth, mockExecuteInE2B, mockExecuteInIsolatedVM } = vi.hoisted(() => ({ - mockCheckInternalAuth: vi.fn(), +const { mockExecuteInE2B, mockExecuteInIsolatedVM } = vi.hoisted(() => ({ mockExecuteInE2B: vi.fn(), mockExecuteInIsolatedVM: vi.fn(), })) @@ -17,10 +22,7 @@ vi.mock('@/lib/execution/isolated-vm', () => ({ executeInIsolatedVM: mockExecuteInIsolatedVM, })) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkInternalAuth: mockCheckInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) vi.mock('@/lib/execution/e2b', () => ({ executeInE2B: mockExecuteInE2B, @@ -43,18 +45,9 @@ vi.mock('@/lib/uploads/contexts/workspace/workspace-file-manager', () => ({ uploadWorkspaceFile: vi.fn(), })) -vi.mock('@/lib/workflows/utils', () => ({ - getWorkflowById: vi.fn(), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) -vi.mock('@/lib/core/config/feature-flags', () => ({ - isHosted: false, - isE2bEnabled: false, - isProd: false, - isDev: false, - isTest: true, - isEmailVerificationEnabled: false, -})) +vi.mock('@/lib/core/config/feature-flags', () => featureFlagsMock) import { validateProxyUrl } from '@/lib/core/security/input-validation' import { POST } from '@/app/api/function/execute/route' @@ -147,7 +140,7 @@ describe('Function Execute API Route', () => { beforeEach(() => { vi.clearAllMocks() - mockCheckInternalAuth.mockResolvedValue({ + hybridAuthMockFns.mockCheckInternalAuth.mockResolvedValue({ success: true, userId: 'user-123', authType: 'internal_jwt', @@ -164,7 +157,7 @@ describe('Function Execute API Route', () => { describe('Security Tests', () => { it('should reject unauthorized requests', async () => { - mockCheckInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckInternalAuth.mockResolvedValueOnce({ success: false, error: 'Unauthorized', }) diff --git a/apps/sim/app/api/jobs/[jobId]/route.test.ts b/apps/sim/app/api/jobs/[jobId]/route.test.ts index 6ebce09fa67..0643a494a11 100644 --- a/apps/sim/app/api/jobs/[jobId]/route.test.ts +++ b/apps/sim/app/api/jobs/[jobId]/route.test.ts @@ -1,51 +1,35 @@ /** * @vitest-environment node */ +import { + hybridAuthMock, + hybridAuthMockFns, + requestUtilsMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import type { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockCheckHybridAuth, - mockGetJobQueue, - mockVerifyWorkflowAccess, - mockGetWorkflowById, - mockGetJob, -} = vi.hoisted(() => ({ - mockCheckHybridAuth: vi.fn(), +const { mockGetJobQueue, mockVerifyWorkflowAccess, mockGetJob } = vi.hoisted(() => ({ mockGetJobQueue: vi.fn(), mockVerifyWorkflowAccess: vi.fn(), - mockGetWorkflowById: vi.fn(), mockGetJob: vi.fn(), })) -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})) - -vi.mock('@/lib/auth/hybrid', () => ({ - checkHybridAuth: mockCheckHybridAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) vi.mock('@/lib/core/async-jobs', () => ({ getJobQueue: mockGetJobQueue, })) -vi.mock('@/lib/core/utils/request', () => ({ - generateRequestId: vi.fn().mockReturnValue('request-1'), -})) +vi.mock('@/lib/core/utils/request', () => requestUtilsMock) vi.mock('@/socket/middleware/permissions', () => ({ verifyWorkflowAccess: mockVerifyWorkflowAccess, })) -vi.mock('@/lib/workflows/utils', () => ({ - getWorkflowById: mockGetWorkflowById, -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) import { GET } from './route' @@ -61,7 +45,7 @@ describe('GET /api/jobs/[jobId]', () => { beforeEach(() => { vi.clearAllMocks() - mockCheckHybridAuth.mockResolvedValue({ + hybridAuthMockFns.mockCheckHybridAuth.mockResolvedValue({ success: true, userId: 'user-1', apiKeyType: undefined, @@ -69,7 +53,7 @@ describe('GET /api/jobs/[jobId]', () => { }) mockVerifyWorkflowAccess.mockResolvedValue({ hasAccess: true }) - mockGetWorkflowById.mockResolvedValue({ + workflowsUtilsMockFns.mockGetWorkflowById.mockResolvedValue({ id: 'workflow-1', workspaceId: 'workspace-1', }) diff --git a/apps/sim/app/api/jobs/[jobId]/route.ts b/apps/sim/app/api/jobs/[jobId]/route.ts index 8dcfd8bafd2..65d9cba2dcf 100644 --- a/apps/sim/app/api/jobs/[jobId]/route.ts +++ b/apps/sim/app/api/jobs/[jobId]/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' import { getJobQueue } from '@/lib/core/async-jobs' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { createErrorResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/documents/route.test.ts b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/documents/route.test.ts index 132ddfb1ba8..68ddcf270f9 100644 --- a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/documents/route.test.ts +++ b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/documents/route.test.ts @@ -1,10 +1,18 @@ /** * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + auditMock, + createMockRequest, + hybridAuthMock, + hybridAuthMockFns, + knowledgeApiUtilsMock, + knowledgeApiUtilsMockFns, + schemaMock, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockCheckSession, mockCheckAccess, mockCheckWriteAccess, mockDbChain } = vi.hoisted(() => { +const { mockDbChain } = vi.hoisted(() => { const chain = { select: vi.fn().mockReturnThis(), from: vi.fn().mockReturnThis(), @@ -15,49 +23,20 @@ const { mockCheckSession, mockCheckAccess, mockCheckWriteAccess, mockDbChain } = set: vi.fn().mockReturnThis(), returning: vi.fn().mockResolvedValue([]), } - return { - mockCheckSession: vi.fn(), - mockCheckAccess: vi.fn(), - mockCheckWriteAccess: vi.fn(), - mockDbChain: chain, - } + return { mockDbChain: chain } }) +const mockCheckAccess = knowledgeApiUtilsMockFns.mockCheckKnowledgeBaseAccess +const mockCheckWriteAccess = knowledgeApiUtilsMockFns.mockCheckKnowledgeBaseWriteAccess + vi.mock('@sim/db', () => ({ db: mockDbChain })) -vi.mock('@sim/db/schema', () => ({ - document: { - id: 'id', - connectorId: 'connectorId', - deletedAt: 'deletedAt', - filename: 'filename', - externalId: 'externalId', - sourceUrl: 'sourceUrl', - enabled: 'enabled', - userExcluded: 'userExcluded', - uploadedAt: 'uploadedAt', - processingStatus: 'processingStatus', - }, - knowledgeConnector: { - id: 'id', - knowledgeBaseId: 'knowledgeBaseId', - deletedAt: 'deletedAt', - }, -})) -vi.mock('@/app/api/knowledge/utils', () => ({ - checkKnowledgeBaseAccess: mockCheckAccess, - checkKnowledgeBaseWriteAccess: mockCheckWriteAccess, -})) -vi.mock('@/lib/auth/hybrid', () => ({ - checkSessionOrInternalAuth: mockCheckSession, -})) +vi.mock('@sim/db/schema', () => schemaMock) +vi.mock('@/app/api/knowledge/utils', () => knowledgeApiUtilsMock) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) vi.mock('@/lib/core/utils/request', () => ({ generateRequestId: vi.fn().mockReturnValue('test-req-id'), })) -vi.mock('@/lib/audit/log', () => ({ - recordAudit: vi.fn(), - AuditAction: {}, - AuditResourceType: {}, -})) +vi.mock('@/lib/audit/log', () => auditMock) import { GET, PATCH } from '@/app/api/knowledge/[id]/connectors/[connectorId]/documents/route' @@ -78,7 +57,10 @@ describe('Connector Documents API Route', () => { describe('GET', () => { it('returns 401 when unauthenticated', async () => { - mockCheckSession.mockResolvedValue({ success: false, userId: null }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: false, + userId: null, + }) const req = createMockRequest('GET') const response = await GET(req as never, { params: mockParams }) @@ -87,7 +69,10 @@ describe('Connector Documents API Route', () => { }) it('returns 404 when connector not found', async () => { - mockCheckSession.mockResolvedValue({ success: true, userId: 'user-1' }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: 'user-1', + }) mockCheckAccess.mockResolvedValue({ hasAccess: true }) mockDbChain.limit.mockResolvedValueOnce([]) @@ -98,7 +83,10 @@ describe('Connector Documents API Route', () => { }) it('returns documents list on success', async () => { - mockCheckSession.mockResolvedValue({ success: true, userId: 'user-1' }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: 'user-1', + }) mockCheckAccess.mockResolvedValue({ hasAccess: true }) const doc = { id: 'doc-1', filename: 'test.txt', userExcluded: false } @@ -118,7 +106,10 @@ describe('Connector Documents API Route', () => { }) it('includes excluded documents when includeExcluded=true', async () => { - mockCheckSession.mockResolvedValue({ success: true, userId: 'user-1' }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: 'user-1', + }) mockCheckAccess.mockResolvedValue({ hasAccess: true }) mockDbChain.limit.mockResolvedValueOnce([{ id: 'conn-456' }]) @@ -142,7 +133,10 @@ describe('Connector Documents API Route', () => { describe('PATCH', () => { it('returns 401 when unauthenticated', async () => { - mockCheckSession.mockResolvedValue({ success: false, userId: null }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: false, + userId: null, + }) const req = createMockRequest('PATCH', { operation: 'restore', documentIds: ['doc-1'] }) const response = await PATCH(req as never, { params: mockParams }) @@ -151,7 +145,10 @@ describe('Connector Documents API Route', () => { }) it('returns 400 for invalid body', async () => { - mockCheckSession.mockResolvedValue({ success: true, userId: 'user-1' }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: 'user-1', + }) mockCheckWriteAccess.mockResolvedValue({ hasAccess: true }) mockDbChain.limit.mockResolvedValueOnce([{ id: 'conn-456' }]) @@ -162,7 +159,10 @@ describe('Connector Documents API Route', () => { }) it('returns 404 when connector not found', async () => { - mockCheckSession.mockResolvedValue({ success: true, userId: 'user-1' }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: 'user-1', + }) mockCheckWriteAccess.mockResolvedValue({ hasAccess: true }) mockDbChain.limit.mockResolvedValueOnce([]) @@ -173,7 +173,7 @@ describe('Connector Documents API Route', () => { }) it('returns success for restore operation', async () => { - mockCheckSession.mockResolvedValue({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: 'user-1', userName: 'Test', @@ -195,7 +195,7 @@ describe('Connector Documents API Route', () => { }) it('returns success for exclude operation', async () => { - mockCheckSession.mockResolvedValue({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: 'user-1', userName: 'Test', diff --git a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/route.test.ts b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/route.test.ts index 0ed9a961600..83d6de59e26 100644 --- a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/route.test.ts +++ b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/route.test.ts @@ -1,69 +1,50 @@ /** * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + auditMock, + authOAuthUtilsMock, + createMockRequest, + hybridAuthMock, + hybridAuthMockFns, + knowledgeApiUtilsMock, + knowledgeApiUtilsMockFns, + requestUtilsMock, + schemaMock, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockCheckSession, mockCheckAccess, mockCheckWriteAccess, mockDbChain, mockValidateConfig } = - vi.hoisted(() => { - const chain = { - select: vi.fn().mockReturnThis(), - from: vi.fn().mockReturnThis(), - where: vi.fn().mockReturnThis(), - orderBy: vi.fn().mockReturnThis(), - limit: vi.fn().mockResolvedValue([]), - execute: vi.fn().mockResolvedValue(undefined), - transaction: vi.fn(), - insert: vi.fn().mockReturnThis(), - values: vi.fn().mockResolvedValue(undefined), - update: vi.fn().mockReturnThis(), - delete: vi.fn().mockReturnThis(), - set: vi.fn().mockReturnThis(), - returning: vi.fn().mockResolvedValue([]), - } - return { - mockCheckSession: vi.fn(), - mockCheckAccess: vi.fn(), - mockCheckWriteAccess: vi.fn(), - mockDbChain: chain, - mockValidateConfig: vi.fn(), - } - }) +const { mockDbChain, mockValidateConfig } = vi.hoisted(() => { + const chain = { + select: vi.fn().mockReturnThis(), + from: vi.fn().mockReturnThis(), + where: vi.fn().mockReturnThis(), + orderBy: vi.fn().mockReturnThis(), + limit: vi.fn().mockResolvedValue([]), + execute: vi.fn().mockResolvedValue(undefined), + transaction: vi.fn(), + insert: vi.fn().mockReturnThis(), + values: vi.fn().mockResolvedValue(undefined), + update: vi.fn().mockReturnThis(), + delete: vi.fn().mockReturnThis(), + set: vi.fn().mockReturnThis(), + returning: vi.fn().mockResolvedValue([]), + } + return { + mockDbChain: chain, + mockValidateConfig: vi.fn(), + } +}) + +const mockCheckAccess = knowledgeApiUtilsMockFns.mockCheckKnowledgeBaseAccess +const mockCheckWriteAccess = knowledgeApiUtilsMockFns.mockCheckKnowledgeBaseWriteAccess vi.mock('@sim/db', () => ({ db: mockDbChain })) -vi.mock('@sim/db/schema', () => ({ - document: { - id: 'id', - connectorId: 'connectorId', - fileUrl: 'fileUrl', - archivedAt: 'archivedAt', - deletedAt: 'deletedAt', - }, - embedding: { documentId: 'documentId' }, - knowledgeBase: { id: 'id', userId: 'userId' }, - knowledgeConnector: { - id: 'id', - knowledgeBaseId: 'knowledgeBaseId', - archivedAt: 'archivedAt', - deletedAt: 'deletedAt', - connectorType: 'connectorType', - credentialId: 'credentialId', - }, - knowledgeConnectorSyncLog: { connectorId: 'connectorId', startedAt: 'startedAt' }, -})) -vi.mock('@/app/api/knowledge/utils', () => ({ - checkKnowledgeBaseAccess: mockCheckAccess, - checkKnowledgeBaseWriteAccess: mockCheckWriteAccess, -})) -vi.mock('@/lib/auth/hybrid', () => ({ - checkSessionOrInternalAuth: mockCheckSession, -})) -vi.mock('@/lib/core/utils/request', () => ({ - generateRequestId: vi.fn().mockReturnValue('test-req-id'), -})) -vi.mock('@/app/api/auth/oauth/utils', () => ({ - refreshAccessTokenIfNeeded: vi.fn(), -})) +vi.mock('@sim/db/schema', () => schemaMock) +vi.mock('@/app/api/knowledge/utils', () => knowledgeApiUtilsMock) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) +vi.mock('@/lib/core/utils/request', () => requestUtilsMock) +vi.mock('@/app/api/auth/oauth/utils', () => authOAuthUtilsMock) vi.mock('@/connectors/registry', () => ({ CONNECTOR_REGISTRY: { jira: { validateConfig: mockValidateConfig }, @@ -75,11 +56,7 @@ vi.mock('@/lib/knowledge/tags/service', () => ({ vi.mock('@/lib/knowledge/documents/service', () => ({ deleteDocumentStorageFiles: vi.fn().mockResolvedValue(undefined), })) -vi.mock('@/lib/audit/log', () => ({ - recordAudit: vi.fn(), - AuditAction: {}, - AuditResourceType: {}, -})) +vi.mock('@/lib/audit/log', () => auditMock) import { DELETE, GET, PATCH } from '@/app/api/knowledge/[id]/connectors/[connectorId]/route' @@ -105,7 +82,10 @@ describe('Knowledge Connector By ID API Route', () => { describe('GET', () => { it('returns 401 when unauthenticated', async () => { - mockCheckSession.mockResolvedValue({ success: false, userId: null }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: false, + userId: null, + }) const req = createMockRequest('GET') const response = await GET(req, { params: mockParams }) @@ -114,7 +94,10 @@ describe('Knowledge Connector By ID API Route', () => { }) it('returns 404 when KB not found', async () => { - mockCheckSession.mockResolvedValue({ success: true, userId: 'user-1' }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: 'user-1', + }) mockCheckAccess.mockResolvedValue({ hasAccess: false, notFound: true }) const req = createMockRequest('GET') @@ -124,7 +107,10 @@ describe('Knowledge Connector By ID API Route', () => { }) it('returns 404 when connector not found', async () => { - mockCheckSession.mockResolvedValue({ success: true, userId: 'user-1' }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: 'user-1', + }) mockCheckAccess.mockResolvedValue({ hasAccess: true }) mockDbChain.limit.mockResolvedValueOnce([]) @@ -135,7 +121,10 @@ describe('Knowledge Connector By ID API Route', () => { }) it('returns connector with sync logs on success', async () => { - mockCheckSession.mockResolvedValue({ success: true, userId: 'user-1' }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: 'user-1', + }) mockCheckAccess.mockResolvedValue({ hasAccess: true }) const mockConnector = { id: 'conn-456', connectorType: 'jira', status: 'active' } @@ -156,7 +145,10 @@ describe('Knowledge Connector By ID API Route', () => { describe('PATCH', () => { it('returns 401 when unauthenticated', async () => { - mockCheckSession.mockResolvedValue({ success: false, userId: null }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: false, + userId: null, + }) const req = createMockRequest('PATCH', { status: 'paused' }) const response = await PATCH(req, { params: mockParams }) @@ -165,7 +157,10 @@ describe('Knowledge Connector By ID API Route', () => { }) it('returns 400 for invalid body', async () => { - mockCheckSession.mockResolvedValue({ success: true, userId: 'user-1' }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: 'user-1', + }) mockCheckWriteAccess.mockResolvedValue({ hasAccess: true }) const req = createMockRequest('PATCH', { syncIntervalMinutes: 'not a number' }) @@ -177,7 +172,10 @@ describe('Knowledge Connector By ID API Route', () => { }) it('returns 404 when connector not found during sourceConfig validation', async () => { - mockCheckSession.mockResolvedValue({ success: true, userId: 'user-1' }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: 'user-1', + }) mockCheckWriteAccess.mockResolvedValue({ hasAccess: true }) mockDbChain.limit.mockResolvedValueOnce([]) @@ -188,7 +186,7 @@ describe('Knowledge Connector By ID API Route', () => { }) it('returns 200 and updates status', async () => { - mockCheckSession.mockResolvedValue({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: 'user-1', userName: 'Test', @@ -214,7 +212,10 @@ describe('Knowledge Connector By ID API Route', () => { describe('DELETE', () => { it('returns 401 when unauthenticated', async () => { - mockCheckSession.mockResolvedValue({ success: false, userId: null }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: false, + userId: null, + }) const req = createMockRequest('DELETE') const response = await DELETE(req, { params: mockParams }) @@ -223,7 +224,7 @@ describe('Knowledge Connector By ID API Route', () => { }) it('returns 200 on successful hard-delete', async () => { - mockCheckSession.mockResolvedValue({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: 'user-1', userName: 'Test', diff --git a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/sync/route.test.ts b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/sync/route.test.ts index af517a61bb4..cceda25a880 100644 --- a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/sync/route.test.ts +++ b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/sync/route.test.ts @@ -1,10 +1,18 @@ /** * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + auditMock, + createMockRequest, + hybridAuthMock, + hybridAuthMockFns, + knowledgeApiUtilsMock, + knowledgeApiUtilsMockFns, + schemaMock, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockCheckSession, mockCheckWriteAccess, mockDispatchSync, mockDbChain } = vi.hoisted(() => { +const { mockDispatchSync, mockDbChain } = vi.hoisted(() => { const chain = { select: vi.fn().mockReturnThis(), from: vi.fn().mockReturnThis(), @@ -15,39 +23,24 @@ const { mockCheckSession, mockCheckWriteAccess, mockDispatchSync, mockDbChain } set: vi.fn().mockReturnThis(), } return { - mockCheckSession: vi.fn(), - mockCheckWriteAccess: vi.fn(), mockDispatchSync: vi.fn().mockResolvedValue(undefined), mockDbChain: chain, } }) +const mockCheckWriteAccess = knowledgeApiUtilsMockFns.mockCheckKnowledgeBaseWriteAccess + vi.mock('@sim/db', () => ({ db: mockDbChain })) -vi.mock('@sim/db/schema', () => ({ - knowledgeConnector: { - id: 'id', - knowledgeBaseId: 'knowledgeBaseId', - deletedAt: 'deletedAt', - status: 'status', - }, -})) -vi.mock('@/app/api/knowledge/utils', () => ({ - checkKnowledgeBaseWriteAccess: mockCheckWriteAccess, -})) -vi.mock('@/lib/auth/hybrid', () => ({ - checkSessionOrInternalAuth: mockCheckSession, -})) +vi.mock('@sim/db/schema', () => schemaMock) +vi.mock('@/app/api/knowledge/utils', () => knowledgeApiUtilsMock) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) vi.mock('@/lib/core/utils/request', () => ({ generateRequestId: vi.fn().mockReturnValue('test-req-id'), })) vi.mock('@/lib/knowledge/connectors/sync-engine', () => ({ dispatchSync: mockDispatchSync, })) -vi.mock('@/lib/audit/log', () => ({ - recordAudit: vi.fn(), - AuditAction: {}, - AuditResourceType: {}, -})) +vi.mock('@/lib/audit/log', () => auditMock) import { POST } from '@/app/api/knowledge/[id]/connectors/[connectorId]/sync/route' @@ -66,7 +59,10 @@ describe('Connector Manual Sync API Route', () => { }) it('returns 401 when unauthenticated', async () => { - mockCheckSession.mockResolvedValue({ success: false, userId: null }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: false, + userId: null, + }) const req = createMockRequest('POST') const response = await POST(req as never, { params: mockParams }) @@ -75,7 +71,10 @@ describe('Connector Manual Sync API Route', () => { }) it('returns 404 when connector not found', async () => { - mockCheckSession.mockResolvedValue({ success: true, userId: 'user-1' }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: 'user-1', + }) mockCheckWriteAccess.mockResolvedValue({ hasAccess: true }) mockDbChain.limit.mockResolvedValueOnce([]) @@ -86,7 +85,10 @@ describe('Connector Manual Sync API Route', () => { }) it('returns 409 when connector is syncing', async () => { - mockCheckSession.mockResolvedValue({ success: true, userId: 'user-1' }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: 'user-1', + }) mockCheckWriteAccess.mockResolvedValue({ hasAccess: true }) mockDbChain.limit.mockResolvedValueOnce([{ id: 'conn-456', status: 'syncing' }]) @@ -97,7 +99,7 @@ describe('Connector Manual Sync API Route', () => { }) it('dispatches sync on valid request', async () => { - mockCheckSession.mockResolvedValue({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: 'user-1', userName: 'Test', diff --git a/apps/sim/app/api/knowledge/[id]/connectors/route.ts b/apps/sim/app/api/knowledge/[id]/connectors/route.ts index 34da8e03276..41df290d871 100644 --- a/apps/sim/app/api/knowledge/[id]/connectors/route.ts +++ b/apps/sim/app/api/knowledge/[id]/connectors/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { knowledgeBase, knowledgeBaseTagDefinitions, knowledgeConnector } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, desc, eq, isNull, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -9,7 +10,6 @@ import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' import { hasLiveSyncAccess } from '@/lib/billing/core/subscription' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { dispatchSync } from '@/lib/knowledge/connectors/sync-engine' import { allocateTagSlots } from '@/lib/knowledge/constants' import { createTagDefinition } from '@/lib/knowledge/tags/service' diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/[chunkId]/route.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/[chunkId]/route.ts index b992ca4b4fe..630db09774f 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/[chunkId]/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/[chunkId]/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { generateId } from '@/lib/core/utils/uuid' import { deleteChunk, updateChunk } from '@/lib/knowledge/chunks/service' import { checkChunkAccess } from '@/app/api/knowledge/utils' diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.test.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.test.ts index d3612f1bc4d..92fa814ece1 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.test.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.test.ts @@ -3,11 +3,17 @@ * * @vitest-environment node */ -import { auditMock, createMockRequest } from '@sim/testing' +import { + auditMock, + authMock, + authMockFns, + createMockRequest, + knowledgeApiUtilsMock, + schemaMock, +} from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetSession, mockDbChain } = vi.hoisted(() => { - const mockGetSession = vi.fn() +const { mockDbChain } = vi.hoisted(() => { const mockDbChain = { select: vi.fn().mockReturnThis(), from: vi.fn().mockReturnThis(), @@ -18,95 +24,18 @@ const { mockGetSession, mockDbChain } = vi.hoisted(() => { delete: vi.fn().mockReturnThis(), transaction: vi.fn(), } - return { mockGetSession, mockDbChain } + return { mockDbChain } }) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/db', () => ({ db: mockDbChain, })) -vi.mock('@sim/db/schema', () => ({ - knowledgeBase: { - id: 'kb_id', - userId: 'user_id', - name: 'kb_name', - description: 'description', - tokenCount: 'token_count', - embeddingModel: 'embedding_model', - embeddingDimension: 'embedding_dimension', - chunkingConfig: 'chunking_config', - workspaceId: 'workspace_id', - createdAt: 'created_at', - updatedAt: 'updated_at', - deletedAt: 'deleted_at', - }, - document: { - id: 'doc_id', - knowledgeBaseId: 'kb_id', - filename: 'filename', - fileUrl: 'file_url', - fileSize: 'file_size', - mimeType: 'mime_type', - chunkCount: 'chunk_count', - tokenCount: 'token_count', - characterCount: 'character_count', - processingStatus: 'processing_status', - processingStartedAt: 'processing_started_at', - processingCompletedAt: 'processing_completed_at', - processingError: 'processing_error', - enabled: 'enabled', - tag1: 'tag1', - tag2: 'tag2', - tag3: 'tag3', - tag4: 'tag4', - tag5: 'tag5', - tag6: 'tag6', - tag7: 'tag7', - uploadedAt: 'uploaded_at', - deletedAt: 'deleted_at', - }, - embedding: { - id: 'embedding_id', - documentId: 'doc_id', - knowledgeBaseId: 'kb_id', - chunkIndex: 'chunk_index', - content: 'content', - embedding: 'embedding', - tokenCount: 'token_count', - characterCount: 'character_count', - tag1: 'tag1', - tag2: 'tag2', - tag3: 'tag3', - tag4: 'tag4', - tag5: 'tag5', - tag6: 'tag6', - tag7: 'tag7', - createdAt: 'created_at', - }, - permissions: { - id: 'permission_id', - userId: 'user_id', - entityType: 'entity_type', - entityId: 'entity_id', - permissionType: 'permission_type', - createdAt: 'created_at', - updatedAt: 'updated_at', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) -vi.mock('@/app/api/knowledge/utils', () => ({ - checkKnowledgeBaseAccess: vi.fn(), - checkKnowledgeBaseWriteAccess: vi.fn(), - checkDocumentAccess: vi.fn(), - checkDocumentWriteAccess: vi.fn(), - checkChunkAccess: vi.fn(), - generateEmbeddings: vi.fn(), - processDocumentAsync: vi.fn(), -})) +vi.mock('@/app/api/knowledge/utils', () => knowledgeApiUtilsMock) vi.mock('@/lib/knowledge/documents/service', () => ({ updateDocument: vi.fn(), @@ -192,7 +121,9 @@ describe('Document By ID API Route', () => { const mockParams = Promise.resolve({ id: 'kb-123', documentId: 'doc-123' }) it('should retrieve document successfully for authenticated user', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentAccess).mockResolvedValue({ hasAccess: true, document: mockDocument, @@ -211,7 +142,7 @@ describe('Document By ID API Route', () => { }) it('should return unauthorized for unauthenticated user', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('GET') const response = await GET(req, { params: mockParams }) @@ -222,7 +153,9 @@ describe('Document By ID API Route', () => { }) it('should return not found for non-existent document', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentAccess).mockResolvedValue({ hasAccess: false, notFound: true, @@ -238,7 +171,9 @@ describe('Document By ID API Route', () => { }) it('should return unauthorized for document without access', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentAccess).mockResolvedValue({ hasAccess: false, reason: 'Access denied', @@ -253,7 +188,9 @@ describe('Document By ID API Route', () => { }) it('should handle database errors', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentAccess).mockRejectedValue(new Error('Database error')) const req = createMockRequest('GET') @@ -275,7 +212,9 @@ describe('Document By ID API Route', () => { } it('should update document successfully', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: true, document: mockDocument, @@ -305,7 +244,9 @@ describe('Document By ID API Route', () => { }) it('should validate update data', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: true, document: mockDocument, @@ -338,7 +279,9 @@ describe('Document By ID API Route', () => { processingStartedAt: new Date(Date.now() - 200000), // 200 seconds ago } - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: true, document: processingDocument, @@ -367,7 +310,9 @@ describe('Document By ID API Route', () => { }) it('should reject marking failed for non-processing document', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: true, document: { ...mockDocument, processingStatus: 'completed' }, @@ -389,7 +334,9 @@ describe('Document By ID API Route', () => { processingStartedAt: new Date(Date.now() - 60000), // 60 seconds ago } - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: true, document: recentProcessingDocument, @@ -419,7 +366,9 @@ describe('Document By ID API Route', () => { processingError: 'Previous processing failed', } - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: true, document: failedDocument, @@ -454,7 +403,9 @@ describe('Document By ID API Route', () => { }) it('should reject retry for non-failed document', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: true, document: { ...mockDocument, processingStatus: 'completed' }, @@ -475,7 +426,7 @@ describe('Document By ID API Route', () => { const validUpdateData = { filename: 'updated-document.pdf' } it('should return unauthorized for unauthenticated user', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('PUT', validUpdateData) const response = await PUT(req, { params: mockParams }) @@ -486,7 +437,9 @@ describe('Document By ID API Route', () => { }) it('should return not found for non-existent document', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: false, notFound: true, @@ -502,7 +455,9 @@ describe('Document By ID API Route', () => { }) it('should handle database errors during update', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: true, document: mockDocument, @@ -524,7 +479,9 @@ describe('Document By ID API Route', () => { const mockParams = Promise.resolve({ id: 'kb-123', documentId: 'doc-123' }) it('should delete document successfully', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: true, document: mockDocument, @@ -547,7 +504,7 @@ describe('Document By ID API Route', () => { }) it('should return unauthorized for unauthenticated user', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('DELETE') const response = await DELETE(req, { params: mockParams }) @@ -558,7 +515,9 @@ describe('Document By ID API Route', () => { }) it('should return not found for non-existent document', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: false, notFound: true, @@ -574,7 +533,9 @@ describe('Document By ID API Route', () => { }) it('should return unauthorized for document without access', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: false, reason: 'Access denied', @@ -589,7 +550,9 @@ describe('Document By ID API Route', () => { }) it('should handle database errors during deletion', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkDocumentWriteAccess).mockResolvedValue({ hasAccess: true, document: mockDocument, diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/tag-definitions/route.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/tag-definitions/route.ts index b60638907b4..8f8cdaaf537 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/tag-definitions/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/tag-definitions/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { generateId } from '@/lib/core/utils/uuid' import { SUPPORTED_FIELD_TYPES } from '@/lib/knowledge/constants' import { cleanupUnusedTagDefinitions, diff --git a/apps/sim/app/api/knowledge/[id]/documents/route.test.ts b/apps/sim/app/api/knowledge/[id]/documents/route.test.ts index 2be0e79bc52..52b8519d6aa 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/route.test.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/route.test.ts @@ -3,11 +3,17 @@ * * @vitest-environment node */ -import { auditMock, createMockRequest } from '@sim/testing' +import { + auditMock, + authMock, + authMockFns, + createMockRequest, + knowledgeApiUtilsMock, + schemaMock, +} from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetSession, mockDbChain } = vi.hoisted(() => { - const mockGetSession = vi.fn() +const { mockDbChain } = vi.hoisted(() => { const mockDbChain = { select: vi.fn().mockReturnThis(), from: vi.fn().mockReturnThis(), @@ -21,95 +27,18 @@ const { mockGetSession, mockDbChain } = vi.hoisted(() => { set: vi.fn().mockReturnThis(), transaction: vi.fn(), } - return { mockGetSession, mockDbChain } + return { mockDbChain } }) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/db', () => ({ db: mockDbChain, })) -vi.mock('@sim/db/schema', () => ({ - knowledgeBase: { - id: 'kb_id', - userId: 'user_id', - name: 'kb_name', - description: 'description', - tokenCount: 'token_count', - embeddingModel: 'embedding_model', - embeddingDimension: 'embedding_dimension', - chunkingConfig: 'chunking_config', - workspaceId: 'workspace_id', - createdAt: 'created_at', - updatedAt: 'updated_at', - deletedAt: 'deleted_at', - }, - document: { - id: 'doc_id', - knowledgeBaseId: 'kb_id', - filename: 'filename', - fileUrl: 'file_url', - fileSize: 'file_size', - mimeType: 'mime_type', - chunkCount: 'chunk_count', - tokenCount: 'token_count', - characterCount: 'character_count', - processingStatus: 'processing_status', - processingStartedAt: 'processing_started_at', - processingCompletedAt: 'processing_completed_at', - processingError: 'processing_error', - enabled: 'enabled', - tag1: 'tag1', - tag2: 'tag2', - tag3: 'tag3', - tag4: 'tag4', - tag5: 'tag5', - tag6: 'tag6', - tag7: 'tag7', - uploadedAt: 'uploaded_at', - deletedAt: 'deleted_at', - }, - embedding: { - id: 'embedding_id', - documentId: 'doc_id', - knowledgeBaseId: 'kb_id', - chunkIndex: 'chunk_index', - content: 'content', - embedding: 'embedding', - tokenCount: 'token_count', - characterCount: 'character_count', - tag1: 'tag1', - tag2: 'tag2', - tag3: 'tag3', - tag4: 'tag4', - tag5: 'tag5', - tag6: 'tag6', - tag7: 'tag7', - createdAt: 'created_at', - }, - permissions: { - id: 'permission_id', - userId: 'user_id', - entityType: 'entity_type', - entityId: 'entity_id', - permissionType: 'permission_type', - createdAt: 'created_at', - updatedAt: 'updated_at', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) -vi.mock('@/app/api/knowledge/utils', () => ({ - checkKnowledgeBaseAccess: vi.fn(), - checkKnowledgeBaseWriteAccess: vi.fn(), - checkDocumentAccess: vi.fn(), - checkDocumentWriteAccess: vi.fn(), - checkChunkAccess: vi.fn(), - generateEmbeddings: vi.fn(), - processDocumentAsync: vi.fn(), -})) +vi.mock('@/app/api/knowledge/utils', () => knowledgeApiUtilsMock) vi.mock('@/lib/knowledge/documents/service', () => ({ getDocuments: vi.fn(), @@ -201,7 +130,9 @@ describe('Knowledge Base Documents API Route', () => { const mockParams = Promise.resolve({ id: 'kb-123' }) it('should retrieve documents successfully for authenticated user', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({ hasAccess: true, knowledgeBase: { id: 'kb-123', userId: 'user-123' }, @@ -239,7 +170,9 @@ describe('Knowledge Base Documents API Route', () => { }) it('should return documents with default filter', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({ hasAccess: true, knowledgeBase: { id: 'kb-123', userId: 'user-123' }, @@ -272,7 +205,9 @@ describe('Knowledge Base Documents API Route', () => { }) it('should filter documents by enabled status when requested', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({ hasAccess: true, knowledgeBase: { id: 'kb-123', userId: 'user-123' }, @@ -307,7 +242,7 @@ describe('Knowledge Base Documents API Route', () => { }) it('should return unauthorized for unauthenticated user', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('GET') const response = await GET(req, { params: mockParams }) @@ -318,7 +253,9 @@ describe('Knowledge Base Documents API Route', () => { }) it('should return not found for non-existent knowledge base', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({ hasAccess: false, notFound: true, @@ -333,7 +270,9 @@ describe('Knowledge Base Documents API Route', () => { }) it('should return unauthorized for knowledge base without access', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({ hasAccess: false }) const req = createMockRequest('GET') @@ -345,7 +284,9 @@ describe('Knowledge Base Documents API Route', () => { }) it('should handle database errors', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({ hasAccess: true, knowledgeBase: { id: 'kb-123', userId: 'user-123' }, @@ -371,7 +312,9 @@ describe('Knowledge Base Documents API Route', () => { } it('should create single document successfully', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: true, knowledgeBase: { id: 'kb-123', userId: 'user-123' }, @@ -415,7 +358,9 @@ describe('Knowledge Base Documents API Route', () => { }) it('should validate single document data', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: true, knowledgeBase: { id: 'kb-123', userId: 'user-123' }, @@ -463,7 +408,9 @@ describe('Knowledge Base Documents API Route', () => { } it('should create bulk documents successfully', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: true, knowledgeBase: { id: 'kb-123', userId: 'user-123' }, @@ -513,7 +460,9 @@ describe('Knowledge Base Documents API Route', () => { }) it('should validate bulk document data', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: true, knowledgeBase: { id: 'kb-123', userId: 'user-123' }, @@ -545,7 +494,9 @@ describe('Knowledge Base Documents API Route', () => { }) it('should handle processing errors gracefully', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: true, knowledgeBase: { id: 'kb-123', userId: 'user-123' }, @@ -589,7 +540,7 @@ describe('Knowledge Base Documents API Route', () => { } it('should return unauthorized for unauthenticated user', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('POST', validDocumentData) const response = await POST(req, { params: mockParams }) @@ -600,7 +551,9 @@ describe('Knowledge Base Documents API Route', () => { }) it('should return not found for non-existent knowledge base', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: false, notFound: true, @@ -615,7 +568,9 @@ describe('Knowledge Base Documents API Route', () => { }) it('should return unauthorized for knowledge base without access', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: false }) const req = createMockRequest('POST', validDocumentData) @@ -627,7 +582,9 @@ describe('Knowledge Base Documents API Route', () => { }) it('should handle database errors during creation', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: true, knowledgeBase: { id: 'kb-123', userId: 'user-123' }, diff --git a/apps/sim/app/api/knowledge/[id]/documents/route.ts b/apps/sim/app/api/knowledge/[id]/documents/route.ts index b5614aec41d..02e5793a691 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/route.ts @@ -1,10 +1,10 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { bulkDocumentOperation, bulkDocumentOperationByFilter, diff --git a/apps/sim/app/api/knowledge/[id]/documents/upsert/route.ts b/apps/sim/app/api/knowledge/[id]/documents/upsert/route.ts index 8d5ee153918..38b735dd090 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/upsert/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/upsert/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { document } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createDocumentRecords, deleteDocument, diff --git a/apps/sim/app/api/knowledge/[id]/next-available-slot/route.ts b/apps/sim/app/api/knowledge/[id]/next-available-slot/route.ts index a2e5572f8bc..77ddad14d4d 100644 --- a/apps/sim/app/api/knowledge/[id]/next-available-slot/route.ts +++ b/apps/sim/app/api/knowledge/[id]/next-available-slot/route.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' -import { generateId } from '@/lib/core/utils/uuid' import { getNextAvailableSlot, getTagDefinitions } from '@/lib/knowledge/tags/service' import { checkKnowledgeBaseAccess } from '@/app/api/knowledge/utils' diff --git a/apps/sim/app/api/knowledge/[id]/route.test.ts b/apps/sim/app/api/knowledge/[id]/route.test.ts index 7ae829211d5..879b649f68a 100644 --- a/apps/sim/app/api/knowledge/[id]/route.test.ts +++ b/apps/sim/app/api/knowledge/[id]/route.test.ts @@ -3,11 +3,17 @@ * * @vitest-environment node */ -import { auditMock, createMockRequest } from '@sim/testing' +import { + auditMock, + authMock, + authMockFns, + createMockRequest, + knowledgeApiUtilsMock, + schemaMock, +} from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetSession, mockDbChain } = vi.hoisted(() => { - const mockGetSession = vi.fn() +const { mockDbChain } = vi.hoisted(() => { const mockDbChain = { select: vi.fn().mockReturnThis(), from: vi.fn().mockReturnThis(), @@ -16,85 +22,16 @@ const { mockGetSession, mockDbChain } = vi.hoisted(() => { update: vi.fn().mockReturnThis(), set: vi.fn().mockReturnThis(), } - return { mockGetSession, mockDbChain } + return { mockDbChain } }) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/db', () => ({ db: mockDbChain, })) -vi.mock('@sim/db/schema', () => ({ - knowledgeBase: { - id: 'kb_id', - userId: 'user_id', - name: 'kb_name', - description: 'description', - tokenCount: 'token_count', - embeddingModel: 'embedding_model', - embeddingDimension: 'embedding_dimension', - chunkingConfig: 'chunking_config', - workspaceId: 'workspace_id', - createdAt: 'created_at', - updatedAt: 'updated_at', - deletedAt: 'deleted_at', - }, - document: { - id: 'doc_id', - knowledgeBaseId: 'kb_id', - filename: 'filename', - fileUrl: 'file_url', - fileSize: 'file_size', - mimeType: 'mime_type', - chunkCount: 'chunk_count', - tokenCount: 'token_count', - characterCount: 'character_count', - processingStatus: 'processing_status', - processingStartedAt: 'processing_started_at', - processingCompletedAt: 'processing_completed_at', - processingError: 'processing_error', - enabled: 'enabled', - tag1: 'tag1', - tag2: 'tag2', - tag3: 'tag3', - tag4: 'tag4', - tag5: 'tag5', - tag6: 'tag6', - tag7: 'tag7', - uploadedAt: 'uploaded_at', - deletedAt: 'deleted_at', - }, - embedding: { - id: 'embedding_id', - documentId: 'doc_id', - knowledgeBaseId: 'kb_id', - chunkIndex: 'chunk_index', - content: 'content', - embedding: 'embedding', - tokenCount: 'token_count', - characterCount: 'character_count', - tag1: 'tag1', - tag2: 'tag2', - tag3: 'tag3', - tag4: 'tag4', - tag5: 'tag5', - tag6: 'tag6', - tag7: 'tag7', - createdAt: 'created_at', - }, - permissions: { - id: 'permission_id', - userId: 'user_id', - entityType: 'entity_type', - entityId: 'entity_id', - permissionType: 'permission_type', - createdAt: 'created_at', - updatedAt: 'updated_at', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('@/lib/audit/log', () => auditMock) @@ -108,10 +45,7 @@ vi.mock('@/lib/knowledge/service', async (importOriginal) => { } }) -vi.mock('@/app/api/knowledge/utils', () => ({ - checkKnowledgeBaseAccess: vi.fn(), - checkKnowledgeBaseWriteAccess: vi.fn(), -})) +vi.mock('@/app/api/knowledge/utils', () => knowledgeApiUtilsMock) import { deleteKnowledgeBase, @@ -162,7 +96,9 @@ describe('Knowledge Base By ID API Route', () => { const mockParams = Promise.resolve({ id: 'kb-123' }) it('should retrieve knowledge base successfully for authenticated user', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseAccess).mockResolvedValueOnce({ hasAccess: true, @@ -184,7 +120,7 @@ describe('Knowledge Base By ID API Route', () => { }) it('should return unauthorized for unauthenticated user', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('GET') const response = await GET(req, { params: mockParams }) @@ -195,7 +131,9 @@ describe('Knowledge Base By ID API Route', () => { }) it('should return not found for non-existent knowledge base', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseAccess).mockResolvedValueOnce({ hasAccess: false, @@ -211,7 +149,9 @@ describe('Knowledge Base By ID API Route', () => { }) it('should return unauthorized for knowledge base owned by different user', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseAccess).mockResolvedValueOnce({ hasAccess: false, @@ -227,7 +167,9 @@ describe('Knowledge Base By ID API Route', () => { }) it('should return not found when service returns null', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseAccess).mockResolvedValueOnce({ hasAccess: true, @@ -245,7 +187,9 @@ describe('Knowledge Base By ID API Route', () => { }) it('should handle database errors', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseAccess).mockRejectedValueOnce(new Error('Database error')) @@ -266,7 +210,9 @@ describe('Knowledge Base By ID API Route', () => { } it('should update knowledge base successfully', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) resetMocks() @@ -299,7 +245,7 @@ describe('Knowledge Base By ID API Route', () => { }) it('should return unauthorized for unauthenticated user', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('PUT', validUpdateData) const response = await PUT(req, { params: mockParams }) @@ -310,7 +256,9 @@ describe('Knowledge Base By ID API Route', () => { }) it('should return not found for non-existent knowledge base', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) resetMocks() @@ -328,7 +276,9 @@ describe('Knowledge Base By ID API Route', () => { }) it('should validate update data', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) resetMocks() @@ -351,7 +301,9 @@ describe('Knowledge Base By ID API Route', () => { }) it('should handle database errors during update', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValueOnce({ hasAccess: true, @@ -373,7 +325,9 @@ describe('Knowledge Base By ID API Route', () => { const mockParams = Promise.resolve({ id: 'kb-123' }) it('should delete knowledge base successfully', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) resetMocks() @@ -396,7 +350,7 @@ describe('Knowledge Base By ID API Route', () => { }) it('should return unauthorized for unauthenticated user', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('DELETE') const response = await DELETE(req, { params: mockParams }) @@ -407,7 +361,9 @@ describe('Knowledge Base By ID API Route', () => { }) it('should return not found for non-existent knowledge base', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) resetMocks() @@ -425,7 +381,9 @@ describe('Knowledge Base By ID API Route', () => { }) it('should return unauthorized for knowledge base owned by different user', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) resetMocks() @@ -443,7 +401,9 @@ describe('Knowledge Base By ID API Route', () => { }) it('should handle database errors during delete', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValueOnce({ hasAccess: true, diff --git a/apps/sim/app/api/knowledge/[id]/tag-definitions/[tagId]/route.ts b/apps/sim/app/api/knowledge/[id]/tag-definitions/[tagId]/route.ts index bb6f8d9b46e..c78bc753513 100644 --- a/apps/sim/app/api/knowledge/[id]/tag-definitions/[tagId]/route.ts +++ b/apps/sim/app/api/knowledge/[id]/tag-definitions/[tagId]/route.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { deleteTagDefinition } from '@/lib/knowledge/tags/service' import { checkKnowledgeBaseWriteAccess } from '@/app/api/knowledge/utils' diff --git a/apps/sim/app/api/knowledge/[id]/tag-definitions/route.ts b/apps/sim/app/api/knowledge/[id]/tag-definitions/route.ts index 57ad6c9fb2f..69ce37b7ad5 100644 --- a/apps/sim/app/api/knowledge/[id]/tag-definitions/route.ts +++ b/apps/sim/app/api/knowledge/[id]/tag-definitions/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { AuthType, checkSessionOrInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { SUPPORTED_FIELD_TYPES } from '@/lib/knowledge/constants' import { createTagDefinition, getTagDefinitions } from '@/lib/knowledge/tags/service' import { checkKnowledgeBaseWriteAccess } from '@/app/api/knowledge/utils' diff --git a/apps/sim/app/api/knowledge/[id]/tag-usage/route.ts b/apps/sim/app/api/knowledge/[id]/tag-usage/route.ts index 3ba49402445..03517068dc9 100644 --- a/apps/sim/app/api/knowledge/[id]/tag-usage/route.ts +++ b/apps/sim/app/api/knowledge/[id]/tag-usage/route.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' -import { generateId } from '@/lib/core/utils/uuid' import { getTagUsage } from '@/lib/knowledge/tags/service' import { checkKnowledgeBaseAccess } from '@/app/api/knowledge/utils' diff --git a/apps/sim/app/api/knowledge/route.test.ts b/apps/sim/app/api/knowledge/route.test.ts index 362047b646b..47969406ac1 100644 --- a/apps/sim/app/api/knowledge/route.test.ts +++ b/apps/sim/app/api/knowledge/route.test.ts @@ -3,11 +3,10 @@ * * @vitest-environment node */ -import { auditMock, createMockRequest } from '@sim/testing' +import { auditMock, authMock, authMockFns, createMockRequest, schemaMock } from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetSession, mockDbChain } = vi.hoisted(() => { - const mockGetSession = vi.fn() +const { mockDbChain } = vi.hoisted(() => { const mockDbChain = { select: vi.fn().mockReturnThis(), from: vi.fn().mockReturnThis(), @@ -19,85 +18,16 @@ const { mockGetSession, mockDbChain } = vi.hoisted(() => { insert: vi.fn().mockReturnThis(), values: vi.fn().mockResolvedValue(undefined), } - return { mockGetSession, mockDbChain } + return { mockDbChain } }) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/db', () => ({ db: mockDbChain, })) -vi.mock('@sim/db/schema', () => ({ - knowledgeBase: { - id: 'kb_id', - userId: 'user_id', - name: 'kb_name', - description: 'description', - tokenCount: 'token_count', - embeddingModel: 'embedding_model', - embeddingDimension: 'embedding_dimension', - chunkingConfig: 'chunking_config', - workspaceId: 'workspace_id', - createdAt: 'created_at', - updatedAt: 'updated_at', - deletedAt: 'deleted_at', - }, - document: { - id: 'doc_id', - knowledgeBaseId: 'kb_id', - filename: 'filename', - fileUrl: 'file_url', - fileSize: 'file_size', - mimeType: 'mime_type', - chunkCount: 'chunk_count', - tokenCount: 'token_count', - characterCount: 'character_count', - processingStatus: 'processing_status', - processingStartedAt: 'processing_started_at', - processingCompletedAt: 'processing_completed_at', - processingError: 'processing_error', - enabled: 'enabled', - tag1: 'tag1', - tag2: 'tag2', - tag3: 'tag3', - tag4: 'tag4', - tag5: 'tag5', - tag6: 'tag6', - tag7: 'tag7', - uploadedAt: 'uploaded_at', - deletedAt: 'deleted_at', - }, - embedding: { - id: 'embedding_id', - documentId: 'doc_id', - knowledgeBaseId: 'kb_id', - chunkIndex: 'chunk_index', - content: 'content', - embedding: 'embedding', - tokenCount: 'token_count', - characterCount: 'character_count', - tag1: 'tag1', - tag2: 'tag2', - tag3: 'tag3', - tag4: 'tag4', - tag5: 'tag5', - tag6: 'tag6', - tag7: 'tag7', - createdAt: 'created_at', - }, - permissions: { - id: 'permission_id', - userId: 'user_id', - entityType: 'entity_type', - entityId: 'entity_id', - permissionType: 'permission_type', - createdAt: 'created_at', - updatedAt: 'updated_at', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('@/lib/audit/log', () => auditMock) @@ -131,7 +61,7 @@ describe('Knowledge Base API Route', () => { describe('GET /api/knowledge', () => { it('should return unauthorized for unauthenticated user', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('GET') const response = await GET(req) @@ -142,7 +72,9 @@ describe('Knowledge Base API Route', () => { }) it('should handle database errors', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockDbChain.orderBy.mockRejectedValue(new Error('Database error')) const req = createMockRequest('GET') @@ -167,7 +99,9 @@ describe('Knowledge Base API Route', () => { } it('should create knowledge base successfully', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) const req = createMockRequest('POST', validKnowledgeBaseData) const response = await POST(req) @@ -181,7 +115,7 @@ describe('Knowledge Base API Route', () => { }) it('should return unauthorized for unauthenticated user', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('POST', validKnowledgeBaseData) const response = await POST(req) @@ -192,7 +126,9 @@ describe('Knowledge Base API Route', () => { }) it('should validate required fields', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) const req = createMockRequest('POST', { description: 'Missing name' }) const response = await POST(req) @@ -204,7 +140,9 @@ describe('Knowledge Base API Route', () => { }) it('should require workspaceId', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) const req = createMockRequest('POST', { name: 'Test KB' }) const response = await POST(req) @@ -216,7 +154,9 @@ describe('Knowledge Base API Route', () => { }) it('should validate chunking config constraints', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) const invalidData = { name: 'Test KB', @@ -237,7 +177,9 @@ describe('Knowledge Base API Route', () => { }) it('should use default values for optional fields', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) const minimalData = { name: 'Test KB', workspaceId: 'test-workspace-id' } const req = createMockRequest('POST', minimalData) @@ -255,7 +197,9 @@ describe('Knowledge Base API Route', () => { }) it('should handle database errors during creation', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123', email: 'test@example.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'user-123', email: 'test@example.com' }, + }) mockDbChain.values.mockRejectedValue(new Error('Database error')) const req = createMockRequest('POST', validKnowledgeBaseData) diff --git a/apps/sim/app/api/knowledge/search/route.test.ts b/apps/sim/app/api/knowledge/search/route.test.ts index 30027bca10b..313d57e1535 100644 --- a/apps/sim/app/api/knowledge/search/route.test.ts +++ b/apps/sim/app/api/knowledge/search/route.test.ts @@ -5,14 +5,22 @@ * * @vitest-environment node */ -import { createEnvMock, createMockRequest, requestUtilsMock } from '@sim/testing' +import { + createEnvMock, + createMockRequest, + hybridAuthMock, + hybridAuthMockFns, + knowledgeApiUtilsMock, + knowledgeApiUtilsMockFns, + requestUtilsMock, + schemaMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const { mockDbChain, - mockCheckSessionOrInternalAuth, - mockAuthorizeWorkflowByWorkspacePermission, - mockCheckKnowledgeBaseAccess, mockGetDocumentTagDefinitions, mockHandleTagOnlySearch, mockHandleVectorOnlySearch, @@ -32,9 +40,6 @@ const { groupBy: vi.fn().mockReturnThis(), having: vi.fn().mockReturnThis(), }, - mockCheckSessionOrInternalAuth: vi.fn(), - mockAuthorizeWorkflowByWorkspacePermission: vi.fn(), - mockCheckKnowledgeBaseAccess: vi.fn(), mockGetDocumentTagDefinitions: vi.fn(), mockHandleTagOnlySearch: vi.fn(), mockHandleVectorOnlySearch: vi.fn(), @@ -44,6 +49,8 @@ const { mockGetDocumentNamesByIds: vi.fn(), })) +const mockCheckKnowledgeBaseAccess = knowledgeApiUtilsMockFns.mockCheckKnowledgeBaseAccess + vi.mock('drizzle-orm', () => ({ and: vi.fn().mockImplementation((...args) => ({ and: args })), eq: vi.fn().mockImplementation((a, b) => ({ eq: [a, b] })), @@ -56,87 +63,15 @@ vi.mock('drizzle-orm', () => ({ })), })) -vi.mock('@sim/db/schema', () => ({ - knowledgeBase: { - id: 'kb_id', - userId: 'user_id', - name: 'kb_name', - description: 'description', - tokenCount: 'token_count', - embeddingModel: 'embedding_model', - embeddingDimension: 'embedding_dimension', - chunkingConfig: 'chunking_config', - workspaceId: 'workspace_id', - createdAt: 'created_at', - updatedAt: 'updated_at', - deletedAt: 'deleted_at', - }, - document: { - id: 'doc_id', - knowledgeBaseId: 'kb_id', - filename: 'filename', - fileUrl: 'file_url', - fileSize: 'file_size', - mimeType: 'mime_type', - chunkCount: 'chunk_count', - tokenCount: 'token_count', - characterCount: 'character_count', - processingStatus: 'processing_status', - processingStartedAt: 'processing_started_at', - processingCompletedAt: 'processing_completed_at', - processingError: 'processing_error', - enabled: 'enabled', - tag1: 'tag1', - tag2: 'tag2', - tag3: 'tag3', - tag4: 'tag4', - tag5: 'tag5', - tag6: 'tag6', - tag7: 'tag7', - uploadedAt: 'uploaded_at', - deletedAt: 'deleted_at', - }, - embedding: { - id: 'embedding_id', - documentId: 'doc_id', - knowledgeBaseId: 'kb_id', - chunkIndex: 'chunk_index', - content: 'content', - embedding: 'embedding', - tokenCount: 'token_count', - characterCount: 'character_count', - tag1: 'tag1', - tag2: 'tag2', - tag3: 'tag3', - tag4: 'tag4', - tag5: 'tag5', - tag6: 'tag6', - tag7: 'tag7', - createdAt: 'created_at', - }, - permissions: { - id: 'permission_id', - userId: 'user_id', - entityType: 'entity_type', - entityId: 'entity_id', - permissionType: 'permission_type', - createdAt: 'created_at', - updatedAt: 'updated_at', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('@sim/db', () => ({ db: mockDbChain, })) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: mockAuthorizeWorkflowByWorkspacePermission, -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) vi.mock('@/lib/core/config/env', () => createEnvMock({ OPENAI_API_KEY: 'test-api-key' })) @@ -163,9 +98,7 @@ vi.mock('@/providers/utils', () => ({ }), })) -vi.mock('@/app/api/knowledge/utils', () => ({ - checkKnowledgeBaseAccess: mockCheckKnowledgeBaseAccess, -})) +vi.mock('@/app/api/knowledge/utils', () => knowledgeApiUtilsMock) vi.mock('@/lib/knowledge/tags/service', () => ({ getDocumentTagDefinitions: mockGetDocumentTagDefinitions, @@ -240,12 +173,12 @@ describe('Knowledge Search API Route', () => { doc2: 'Document 2', }) mockGetDocumentTagDefinitions.mockClear() - mockCheckSessionOrInternalAuth.mockClear().mockResolvedValue({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockClear().mockResolvedValue({ success: true, userId: 'user-123', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockClear().mockResolvedValue({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockClear().mockResolvedValue({ allowed: true, status: 200, }) @@ -400,15 +333,17 @@ describe('Knowledge Search API Route', () => { expect(response.status).toBe(200) expect(data.success).toBe(true) - expect(mockAuthorizeWorkflowByWorkspacePermission).toHaveBeenCalledWith({ - workflowId: 'workflow-123', - userId: 'user-123', - action: 'read', - }) + expect(workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission).toHaveBeenCalledWith( + { + workflowId: 'workflow-123', + userId: 'user-123', + action: 'read', + } + ) }) it.concurrent('should return unauthorized for unauthenticated request', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: false, error: 'Unauthorized', }) @@ -427,7 +362,7 @@ describe('Knowledge Search API Route', () => { workflowId: 'nonexistent-workflow', } - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: false, status: 404, message: 'Workflow not found', diff --git a/apps/sim/app/api/knowledge/search/utils.test.ts b/apps/sim/app/api/knowledge/search/utils.test.ts index ccbdfdb8dde..9fd4fa34538 100644 --- a/apps/sim/app/api/knowledge/search/utils.test.ts +++ b/apps/sim/app/api/knowledge/search/utils.test.ts @@ -4,13 +4,11 @@ * * @vitest-environment node */ -import { createEnvMock, databaseMock, loggerMock } from '@sim/testing' +import { createEnvMock } from '@sim/testing' import { mockNextFetchResponse } from '@sim/testing/mocks' import { beforeEach, describe, expect, it, vi } from 'vitest' vi.mock('drizzle-orm') -vi.mock('@sim/logger', () => loggerMock) -vi.mock('@sim/db', () => databaseMock) vi.mock('@/lib/knowledge/documents/utils', () => ({ retryWithExponentialBackoff: (fn: any) => fn(), })) diff --git a/apps/sim/app/api/mcp/copilot/route.ts b/apps/sim/app/api/mcp/copilot/route.ts index 422bee8e780..77235c3ff55 100644 --- a/apps/sim/app/api/mcp/copilot/route.ts +++ b/apps/sim/app/api/mcp/copilot/route.ts @@ -13,6 +13,8 @@ import { import { db } from '@sim/db' import { userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { validateOAuthAccessToken } from '@/lib/auth/oauth-token' @@ -26,9 +28,7 @@ import { prepareExecutionContext } from '@/lib/copilot/tools/handlers/context' import { DIRECT_TOOL_DEFS, SUBAGENT_TOOL_DEFS } from '@/lib/copilot/tools/mcp/definitions' import { env } from '@/lib/core/config/env' import { RateLimiter } from '@/lib/core/rate-limiter' -import { toError } from '@/lib/core/utils/helpers' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { authorizeWorkflowByWorkspacePermission, resolveWorkflowIdForUser, diff --git a/apps/sim/app/api/mcp/events/route.test.ts b/apps/sim/app/api/mcp/events/route.test.ts index ca9be354ce7..4d1c0b2638d 100644 --- a/apps/sim/app/api/mcp/events/route.test.ts +++ b/apps/sim/app/api/mcp/events/route.test.ts @@ -3,26 +3,25 @@ * * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + authMock, + authMockFns, + createMockRequest, + permissionsMock, + permissionsMockFns, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetSession, mockGetUserEntityPermissions } = vi.hoisted(() => ({ - mockGetSession: vi.fn(), - mockGetUserEntityPermissions: vi.fn(), -})) +const mockGetUserEntityPermissions = permissionsMockFns.mockGetUserEntityPermissions -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - getUserEntityPermissions: mockGetUserEntityPermissions, -})) +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) vi.mock('@/lib/events/sse-endpoint', () => ({ createWorkspaceSSE: (_config: any) => { return async (request: any) => { - const session = await mockGetSession() + const session = await authMockFns.mockGetSession() if (!session?.user?.id) { return new Response('Unauthorized', { status: 401 }) } @@ -72,7 +71,7 @@ describe('MCP Events SSE Endpoint', () => { }) it('returns 401 when session is missing', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const request = createMockRequest( 'GET', @@ -89,7 +88,7 @@ describe('MCP Events SSE Endpoint', () => { }) it('returns 400 when workspaceId is missing', async () => { - mockGetSession.mockResolvedValue({ user: defaultMockUser }) + authMockFns.mockGetSession.mockResolvedValue({ user: defaultMockUser }) const request = createMockRequest('GET', undefined, {}, 'http://localhost:3000/api/mcp/events') @@ -101,7 +100,7 @@ describe('MCP Events SSE Endpoint', () => { }) it('returns 403 when user lacks workspace access', async () => { - mockGetSession.mockResolvedValue({ user: defaultMockUser }) + authMockFns.mockGetSession.mockResolvedValue({ user: defaultMockUser }) mockGetUserEntityPermissions.mockResolvedValue(null) const request = createMockRequest( @@ -120,7 +119,7 @@ describe('MCP Events SSE Endpoint', () => { }) it('returns SSE stream when authorized', async () => { - mockGetSession.mockResolvedValue({ user: defaultMockUser }) + authMockFns.mockGetSession.mockResolvedValue({ user: defaultMockUser }) mockGetUserEntityPermissions.mockResolvedValue({ read: true }) const request = createMockRequest( diff --git a/apps/sim/app/api/mcp/serve/[serverId]/route.test.ts b/apps/sim/app/api/mcp/serve/[serverId]/route.test.ts index 6113799bda7..bc45762809c 100644 --- a/apps/sim/app/api/mcp/serve/[serverId]/route.test.ts +++ b/apps/sim/app/api/mcp/serve/[serverId]/route.test.ts @@ -3,12 +3,17 @@ * * @vitest-environment node */ +import { + hybridAuthMock, + hybridAuthMockFns, + permissionsMock, + permissionsMockFns, + schemaMock, +} from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const { - mockCheckHybridAuth, - mockGetUserEntityPermissions, mockGenerateInternalToken, mockDbSelect, mockDbFrom, @@ -17,8 +22,6 @@ const { mockDbLimit, fetchMock, } = vi.hoisted(() => ({ - mockCheckHybridAuth: vi.fn(), - mockGetUserEntityPermissions: vi.fn(), mockGenerateInternalToken: vi.fn(), mockDbSelect: vi.fn(), mockDbFrom: vi.fn(), @@ -28,6 +31,8 @@ const { fetchMock: vi.fn(), })) +const mockGetUserEntityPermissions = permissionsMockFns.mockGetUserEntityPermissions + vi.mock('drizzle-orm', () => ({ and: vi.fn(), eq: vi.fn(), @@ -40,44 +45,11 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - workflowMcpServer: { - id: 'id', - name: 'name', - workspaceId: 'workspaceId', - isPublic: 'isPublic', - createdBy: 'createdBy', - deletedAt: 'deletedAt', - }, - workflowMcpTool: { - serverId: 'serverId', - toolName: 'toolName', - toolDescription: 'toolDescription', - parameterSchema: 'parameterSchema', - workflowId: 'workflowId', - archivedAt: 'archivedAt', - }, - workflow: { - id: 'id', - isDeployed: 'isDeployed', - archivedAt: 'archivedAt', - }, - workspace: { - id: 'id', - archivedAt: 'archivedAt', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkHybridAuth: mockCheckHybridAuth, - checkSessionOrInternalAuth: vi.fn(), - checkInternalAuth: vi.fn(), -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - getUserEntityPermissions: mockGetUserEntityPermissions, -})) +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) vi.mock('@/lib/auth/internal', () => ({ generateInternalToken: mockGenerateInternalToken, @@ -120,7 +92,10 @@ describe('MCP Serve Route', () => { createdBy: 'owner-1', }, ]) - mockCheckHybridAuth.mockResolvedValueOnce({ success: false, error: 'Unauthorized' }) + hybridAuthMockFns.mockCheckHybridAuth.mockResolvedValueOnce({ + success: false, + error: 'Unauthorized', + }) const req = new NextRequest('http://localhost:3000/api/mcp/serve/server-1', { method: 'POST', @@ -141,7 +116,10 @@ describe('MCP Serve Route', () => { createdBy: 'owner-1', }, ]) - mockCheckHybridAuth.mockResolvedValueOnce({ success: false, error: 'Unauthorized' }) + hybridAuthMockFns.mockCheckHybridAuth.mockResolvedValueOnce({ + success: false, + error: 'Unauthorized', + }) const req = new NextRequest('http://localhost:3000/api/mcp/serve/server-1') const response = await GET(req, { params: Promise.resolve({ serverId: 'server-1' }) }) @@ -163,7 +141,7 @@ describe('MCP Serve Route', () => { .mockResolvedValueOnce([{ toolName: 'tool_a', workflowId: 'wf-1' }]) .mockResolvedValueOnce([{ isDeployed: true }]) - mockCheckHybridAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckHybridAuth.mockResolvedValueOnce({ success: true, userId: 'user-1', authType: 'api_key', @@ -212,7 +190,7 @@ describe('MCP Serve Route', () => { .mockResolvedValueOnce([{ toolName: 'tool_a', workflowId: 'wf-1' }]) .mockResolvedValueOnce([{ isDeployed: true }]) - mockCheckHybridAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckHybridAuth.mockResolvedValueOnce({ success: true, userId: 'user-1', authType: 'session', diff --git a/apps/sim/app/api/mcp/servers/[id]/refresh/route.ts b/apps/sim/app/api/mcp/servers/[id]/refresh/route.ts index 7ddc8019d0e..002cd96764e 100644 --- a/apps/sim/app/api/mcp/servers/[id]/refresh/route.ts +++ b/apps/sim/app/api/mcp/servers/[id]/refresh/route.ts @@ -1,9 +1,9 @@ import { db } from '@sim/db' import { mcpServers, workflow, workflowBlocks } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq, isNull } from 'drizzle-orm' import type { NextRequest } from 'next/server' -import { toError } from '@/lib/core/utils/helpers' import { withMcpAuth } from '@/lib/mcp/middleware' import { mcpService } from '@/lib/mcp/service' import type { McpServerStatusConfig, McpTool, McpToolSchema } from '@/lib/mcp/types' diff --git a/apps/sim/app/api/mcp/servers/[id]/route.ts b/apps/sim/app/api/mcp/servers/[id]/route.ts index 93c4b3aca20..b13a1897855 100644 --- a/apps/sim/app/api/mcp/servers/[id]/route.ts +++ b/apps/sim/app/api/mcp/servers/[id]/route.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { mcpServers } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq, isNull } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' -import { toError } from '@/lib/core/utils/helpers' import { McpDnsResolutionError, McpDomainNotAllowedError, diff --git a/apps/sim/app/api/mcp/servers/route.ts b/apps/sim/app/api/mcp/servers/route.ts index b6ea4988035..13fb23a6702 100644 --- a/apps/sim/app/api/mcp/servers/route.ts +++ b/apps/sim/app/api/mcp/servers/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { mcpServers } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { McpDnsResolutionError, McpDomainNotAllowedError, diff --git a/apps/sim/app/api/mcp/servers/test-connection/route.ts b/apps/sim/app/api/mcp/servers/test-connection/route.ts index 2b4297d37ff..648730f0f4f 100644 --- a/apps/sim/app/api/mcp/servers/test-connection/route.ts +++ b/apps/sim/app/api/mcp/servers/test-connection/route.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import type { NextRequest } from 'next/server' -import { toError } from '@/lib/core/utils/helpers' import { McpClient } from '@/lib/mcp/client' import { McpDnsResolutionError, diff --git a/apps/sim/app/api/mcp/tools/stored/route.ts b/apps/sim/app/api/mcp/tools/stored/route.ts index 8cb84a1362a..12792c8d5ff 100644 --- a/apps/sim/app/api/mcp/tools/stored/route.ts +++ b/apps/sim/app/api/mcp/tools/stored/route.ts @@ -1,9 +1,9 @@ import { db } from '@sim/db' import { workflow, workflowBlocks } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' -import { toError } from '@/lib/core/utils/helpers' import { withMcpAuth } from '@/lib/mcp/middleware' import type { McpToolSchema, StoredMcpTool } from '@/lib/mcp/types' import { createMcpErrorResponse, createMcpSuccessResponse } from '@/lib/mcp/utils' diff --git a/apps/sim/app/api/mcp/workflow-servers/[id]/route.ts b/apps/sim/app/api/mcp/workflow-servers/[id]/route.ts index 57c1330a452..49699160995 100644 --- a/apps/sim/app/api/mcp/workflow-servers/[id]/route.ts +++ b/apps/sim/app/api/mcp/workflow-servers/[id]/route.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { workflowMcpServer, workflowMcpTool } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq, isNull } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' -import { toError } from '@/lib/core/utils/helpers' import { getParsedBody, withMcpAuth } from '@/lib/mcp/middleware' import { mcpPubSub } from '@/lib/mcp/pubsub' import { createMcpErrorResponse, createMcpSuccessResponse } from '@/lib/mcp/utils' diff --git a/apps/sim/app/api/mcp/workflow-servers/[id]/tools/[toolId]/route.ts b/apps/sim/app/api/mcp/workflow-servers/[id]/tools/[toolId]/route.ts index 9d157b6a13c..e45ff5dc0dd 100644 --- a/apps/sim/app/api/mcp/workflow-servers/[id]/tools/[toolId]/route.ts +++ b/apps/sim/app/api/mcp/workflow-servers/[id]/tools/[toolId]/route.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { workflowMcpServer, workflowMcpTool } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq, isNull } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' -import { toError } from '@/lib/core/utils/helpers' import { getParsedBody, withMcpAuth } from '@/lib/mcp/middleware' import { mcpPubSub } from '@/lib/mcp/pubsub' import { createMcpErrorResponse, createMcpSuccessResponse } from '@/lib/mcp/utils' diff --git a/apps/sim/app/api/mcp/workflow-servers/[id]/tools/route.ts b/apps/sim/app/api/mcp/workflow-servers/[id]/tools/route.ts index 0e4e9608fda..783e05655de 100644 --- a/apps/sim/app/api/mcp/workflow-servers/[id]/tools/route.ts +++ b/apps/sim/app/api/mcp/workflow-servers/[id]/tools/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { workflow, workflowMcpServer, workflowMcpTool } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { getParsedBody, withMcpAuth } from '@/lib/mcp/middleware' import { mcpPubSub } from '@/lib/mcp/pubsub' import { createMcpErrorResponse, createMcpSuccessResponse } from '@/lib/mcp/utils' diff --git a/apps/sim/app/api/mcp/workflow-servers/route.ts b/apps/sim/app/api/mcp/workflow-servers/route.ts index 27a0032cd2f..089d2f9b713 100644 --- a/apps/sim/app/api/mcp/workflow-servers/route.ts +++ b/apps/sim/app/api/mcp/workflow-servers/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { workflow, workflowMcpServer, workflowMcpTool } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, eq, inArray, isNull, sql } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { getParsedBody, withMcpAuth } from '@/lib/mcp/middleware' import { mcpPubSub } from '@/lib/mcp/pubsub' import { createMcpErrorResponse, createMcpSuccessResponse } from '@/lib/mcp/utils' diff --git a/apps/sim/app/api/memory/route.ts b/apps/sim/app/api/memory/route.ts index 82ffffe6963..64bceae92b2 100644 --- a/apps/sim/app/api/memory/route.ts +++ b/apps/sim/app/api/memory/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { memory } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull, like } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { checkWorkspaceAccess } from '@/lib/workspaces/permissions/utils' const logger = createLogger('MemoryAPI') diff --git a/apps/sim/app/api/mothership/chats/[chatId]/route.ts b/apps/sim/app/api/mothership/chats/[chatId]/route.ts index 6be661ac09a..91704f28fed 100644 --- a/apps/sim/app/api/mothership/chats/[chatId]/route.ts +++ b/apps/sim/app/api/mothership/chats/[chatId]/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { copilotChats } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -19,7 +20,6 @@ import { readEvents } from '@/lib/copilot/request/session/buffer' import { readFilePreviewSessions } from '@/lib/copilot/request/session/file-preview-session' import { type StreamBatchEvent, toStreamBatchEvent } from '@/lib/copilot/request/session/types' import { taskPubSub } from '@/lib/copilot/tasks' -import { toError } from '@/lib/core/utils/helpers' import { captureServerEvent } from '@/lib/posthog/server' const logger = createLogger('MothershipChatAPI') diff --git a/apps/sim/app/api/mothership/execute/route.ts b/apps/sim/app/api/mothership/execute/route.ts index 3337838ce1e..25c4618dbf6 100644 --- a/apps/sim/app/api/mothership/execute/route.ts +++ b/apps/sim/app/api/mothership/execute/route.ts @@ -1,4 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' @@ -6,8 +8,6 @@ import { buildIntegrationToolSchemas } from '@/lib/copilot/chat/payload' import { generateWorkspaceContext } from '@/lib/copilot/chat/workspace-context' import { runHeadlessCopilotLifecycle } from '@/lib/copilot/request/lifecycle/headless' import { requestExplicitStreamAbort } from '@/lib/copilot/request/session/explicit-abort' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { assertActiveWorkspaceAccess, getUserEntityPermissions, diff --git a/apps/sim/app/api/notifications/poll/route.ts b/apps/sim/app/api/notifications/poll/route.ts index 010f9ccffcc..200b541ff69 100644 --- a/apps/sim/app/api/notifications/poll/route.ts +++ b/apps/sim/app/api/notifications/poll/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' import { acquireLock, releaseLock } from '@/lib/core/config/redis' -import { generateShortId } from '@/lib/core/utils/uuid' import { pollInactivityAlerts } from '@/lib/notifications/inactivity-polling' const logger = createLogger('InactivityAlertPoll') diff --git a/apps/sim/app/api/organizations/[id]/invitations/[invitationId]/route.ts b/apps/sim/app/api/organizations/[id]/invitations/[invitationId]/route.ts index 269efb6a32c..51ce6ac9099 100644 --- a/apps/sim/app/api/organizations/[id]/invitations/[invitationId]/route.ts +++ b/apps/sim/app/api/organizations/[id]/invitations/[invitationId]/route.ts @@ -14,6 +14,7 @@ import { workspaceInvitation, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, inArray, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -27,7 +28,6 @@ import { ENTITLED_SUBSCRIPTION_STATUSES } from '@/lib/billing/subscriptions/util import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-handlers' import { enqueueOutboxEvent } from '@/lib/core/outbox/service' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { syncWorkspaceEnvCredentials } from '@/lib/credentials/environment' import { sendEmail } from '@/lib/messaging/email/mailer' diff --git a/apps/sim/app/api/organizations/[id]/invitations/route.ts b/apps/sim/app/api/organizations/[id]/invitations/route.ts index 5a85cfbb4f0..1ecb244d291 100644 --- a/apps/sim/app/api/organizations/[id]/invitations/route.ts +++ b/apps/sim/app/api/organizations/[id]/invitations/route.ts @@ -9,6 +9,7 @@ import { workspaceInvitation, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, inArray, isNull, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { @@ -23,7 +24,6 @@ import { validateSeatAvailability, } from '@/lib/billing/validation/seat-management' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { sendEmail } from '@/lib/messaging/email/mailer' import { quickValidateEmail } from '@/lib/messaging/email/validation' import { hasWorkspaceAdminAccess } from '@/lib/workspaces/permissions/utils' diff --git a/apps/sim/app/api/organizations/[id]/members/route.ts b/apps/sim/app/api/organizations/[id]/members/route.ts index ad4e4001c82..063699d12bc 100644 --- a/apps/sim/app/api/organizations/[id]/members/route.ts +++ b/apps/sim/app/api/organizations/[id]/members/route.ts @@ -8,6 +8,7 @@ import { userStats, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, inArray } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getEmailSubject, renderInvitationEmail } from '@/components/emails' @@ -16,7 +17,6 @@ import { getSession } from '@/lib/auth' import { ENTITLED_SUBSCRIPTION_STATUSES } from '@/lib/billing/subscriptions/utils' import { validateSeatAvailability } from '@/lib/billing/validation/seat-management' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { sendEmail } from '@/lib/messaging/email/mailer' import { quickValidateEmail } from '@/lib/messaging/email/validation' diff --git a/apps/sim/app/api/permission-groups/[id]/members/bulk/route.ts b/apps/sim/app/api/permission-groups/[id]/members/bulk/route.ts index f0be70d26b3..8617746a553 100644 --- a/apps/sim/app/api/permission-groups/[id]/members/bulk/route.ts +++ b/apps/sim/app/api/permission-groups/[id]/members/bulk/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { member, permissionGroup, permissionGroupMember } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, inArray } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { hasAccessControlAccess } from '@/lib/billing' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('PermissionGroupBulkMembers') diff --git a/apps/sim/app/api/permission-groups/[id]/members/route.ts b/apps/sim/app/api/permission-groups/[id]/members/route.ts index 5b5fdc65df7..83cd4a0b17a 100644 --- a/apps/sim/app/api/permission-groups/[id]/members/route.ts +++ b/apps/sim/app/api/permission-groups/[id]/members/route.ts @@ -1,13 +1,13 @@ import { db } from '@sim/db' import { member, permissionGroup, permissionGroupMember, user } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { hasAccessControlAccess } from '@/lib/billing' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('PermissionGroupMembers') diff --git a/apps/sim/app/api/permission-groups/route.ts b/apps/sim/app/api/permission-groups/route.ts index dd5c09e5453..1d5e4d6a42c 100644 --- a/apps/sim/app/api/permission-groups/route.ts +++ b/apps/sim/app/api/permission-groups/route.ts @@ -1,13 +1,13 @@ import { db } from '@sim/db' import { member, organization, permissionGroup, permissionGroupMember, user } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, count, desc, eq } from 'drizzle-orm' import { NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { hasAccessControlAccess } from '@/lib/billing' -import { generateId } from '@/lib/core/utils/uuid' import { DEFAULT_PERMISSION_GROUP_CONFIG, type PermissionGroupConfig, diff --git a/apps/sim/app/api/providers/route.ts b/apps/sim/app/api/providers/route.ts index 417be50c89e..7e6522fee14 100644 --- a/apps/sim/app/api/providers/route.ts +++ b/apps/sim/app/api/providers/route.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { account } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { checkWorkspaceAccess } from '@/lib/workspaces/permissions/utils' import { diff --git a/apps/sim/app/api/resume/[workflowId]/[executionId]/[contextId]/route.ts b/apps/sim/app/api/resume/[workflowId]/[executionId]/[contextId]/route.ts index c97e5e5568b..4dc5af81f5f 100644 --- a/apps/sim/app/api/resume/[workflowId]/[executionId]/[contextId]/route.ts +++ b/apps/sim/app/api/resume/[workflowId]/[executionId]/[contextId]/route.ts @@ -1,12 +1,12 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { AuthType } from '@/lib/auth/hybrid' import { getJobQueue } from '@/lib/core/async-jobs' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { SSE_HEADERS } from '@/lib/core/utils/sse' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { setExecutionMeta } from '@/lib/execution/event-buffer' import { preprocessExecution } from '@/lib/execution/preprocessing' import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' diff --git a/apps/sim/app/api/schedules/[id]/route.test.ts b/apps/sim/app/api/schedules/[id]/route.test.ts index c970e41714e..68809d2e79d 100644 --- a/apps/sim/app/api/schedules/[id]/route.test.ts +++ b/apps/sim/app/api/schedules/[id]/route.test.ts @@ -3,38 +3,24 @@ * * @vitest-environment node */ -import { auditMock, databaseMock, loggerMock, requestUtilsMock } from '@sim/testing' +import { + auditMock, + authMock, + authMockFns, + databaseMock, + requestUtilsMock, + schemaMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetSession, mockAuthorizeWorkflowByWorkspacePermission } = vi.hoisted(() => ({ - mockGetSession: vi.fn(), - mockAuthorizeWorkflowByWorkspacePermission: vi.fn(), -})) - -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: mockAuthorizeWorkflowByWorkspacePermission, -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) -vi.mock('@sim/db', () => databaseMock) - -vi.mock('@sim/db/schema', () => ({ - workflow: { id: 'id', userId: 'userId', workspaceId: 'workspaceId' }, - workflowSchedule: { - id: 'id', - workflowId: 'workflowId', - status: 'status', - cronExpression: 'cronExpression', - timezone: 'timezone', - sourceType: 'sourceType', - sourceWorkspaceId: 'sourceWorkspaceId', - archivedAt: 'archivedAt', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn(), @@ -44,8 +30,6 @@ vi.mock('drizzle-orm', () => ({ vi.mock('@/lib/core/utils/request', () => requestUtilsMock) -vi.mock('@sim/logger', () => loggerMock) - vi.mock('@/lib/audit/log', () => auditMock) import { PUT } from './route' @@ -85,8 +69,8 @@ function mockDbChain(selectResults: unknown[][]) { describe('Schedule PUT API (Reactivate)', () => { beforeEach(() => { vi.clearAllMocks() - mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: true, status: 200, workflow: { id: 'wf-1', workspaceId: 'ws-1' }, @@ -100,7 +84,7 @@ describe('Schedule PUT API (Reactivate)', () => { describe('Authentication', () => { it('returns 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const res = await PUT(createRequest({ action: 'reactivate' }), createParams('sched-1')) @@ -150,7 +134,7 @@ describe('Schedule PUT API (Reactivate)', () => { }) it('returns 404 when workflow does not exist for schedule', async () => { - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: false, status: 404, workflow: null, @@ -169,7 +153,7 @@ describe('Schedule PUT API (Reactivate)', () => { describe('Authorization', () => { it('returns 403 when user is not workflow owner', async () => { - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: false, status: 403, workflow: { id: 'wf-1', workspaceId: null }, @@ -190,7 +174,7 @@ describe('Schedule PUT API (Reactivate)', () => { }) it('returns 403 for workspace member with only read permission', async () => { - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: false, status: 403, workflow: { id: 'wf-1', workspaceId: 'ws-1' }, diff --git a/apps/sim/app/api/schedules/execute/route.test.ts b/apps/sim/app/api/schedules/execute/route.test.ts index aa1fba6d7b6..d2531cf76b8 100644 --- a/apps/sim/app/api/schedules/execute/route.test.ts +++ b/apps/sim/app/api/schedules/execute/route.test.ts @@ -3,6 +3,7 @@ * * @vitest-environment node */ +import { workflowsUtilsMock, workflowsUtilsMockFns } from '@sim/testing' import type { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' @@ -72,12 +73,7 @@ vi.mock('@/lib/core/async-jobs', () => ({ shouldExecuteInline: vi.fn().mockReturnValue(false), })) -vi.mock('@/lib/workflows/utils', () => ({ - getWorkflowById: vi.fn().mockResolvedValue({ - id: 'workflow-1', - workspaceId: 'workspace-1', - }), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...conditions: unknown[]) => ({ type: 'and', conditions })), @@ -120,7 +116,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@/lib/core/utils/uuid', () => ({ +vi.mock('@sim/utils/id', () => ({ generateId: vi.fn(() => 'schedule-execution-1'), generateShortId: vi.fn(() => 'mock-short-id'), isValidUuid: vi.fn((v: string) => @@ -184,6 +180,10 @@ function createMockRequest(): NextRequest { describe('Scheduled Workflow Execution API Route', () => { beforeEach(() => { vi.clearAllMocks() + workflowsUtilsMockFns.mockGetWorkflowById.mockResolvedValue({ + id: 'workflow-1', + workspaceId: 'workspace-1', + }) mockFeatureFlags.isTriggerDevEnabled = false mockFeatureFlags.isHosted = false mockFeatureFlags.isProd = false diff --git a/apps/sim/app/api/schedules/execute/route.ts b/apps/sim/app/api/schedules/execute/route.ts index 719f47df52e..d4c17f95a62 100644 --- a/apps/sim/app/api/schedules/execute/route.ts +++ b/apps/sim/app/api/schedules/execute/route.ts @@ -1,12 +1,12 @@ import { db, workflowDeploymentVersion, workflowSchedule } from '@sim/db' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, eq, isNull, lt, lte, ne, not, or, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' import { getJobQueue, shouldExecuteInline } from '@/lib/core/async-jobs' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { executeJobInline, executeScheduleJob, diff --git a/apps/sim/app/api/schedules/route.test.ts b/apps/sim/app/api/schedules/route.test.ts index 434bc2fa8d0..046beb3205b 100644 --- a/apps/sim/app/api/schedules/route.test.ts +++ b/apps/sim/app/api/schedules/route.test.ts @@ -3,38 +3,23 @@ * * @vitest-environment node */ -import { databaseMock, loggerMock, requestUtilsMock } from '@sim/testing' +import { + authMock, + authMockFns, + databaseMock, + requestUtilsMock, + schemaMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetSession, mockAuthorizeWorkflowByWorkspacePermission } = vi.hoisted(() => ({ - mockGetSession: vi.fn(), - mockAuthorizeWorkflowByWorkspacePermission: vi.fn(), -})) - -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: mockAuthorizeWorkflowByWorkspacePermission, -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) -vi.mock('@sim/db', () => databaseMock) - -vi.mock('@sim/db/schema', () => ({ - workflow: { id: 'id', userId: 'userId', workspaceId: 'workspaceId' }, - workflowSchedule: { - workflowId: 'workflowId', - blockId: 'blockId', - deploymentVersionId: 'deploymentVersionId', - }, - workflowDeploymentVersion: { - id: 'id', - workflowId: 'workflowId', - isActive: 'isActive', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ eq: vi.fn(), @@ -45,8 +30,6 @@ vi.mock('drizzle-orm', () => ({ vi.mock('@/lib/core/utils/request', () => requestUtilsMock) -vi.mock('@sim/logger', () => loggerMock) - import { GET } from '@/app/api/schedules/route' function createRequest(url: string): NextRequest { @@ -74,8 +57,8 @@ function mockDbChain(results: any[]) { describe('Schedule GET API', () => { beforeEach(() => { vi.clearAllMocks() - mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: true, status: 200, workflow: { id: 'wf-1', workspaceId: 'ws-1' }, @@ -120,7 +103,7 @@ describe('Schedule GET API', () => { }) it('requires authentication', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const res = await GET(createRequest('http://test/api/schedules?workflowId=wf-1')) @@ -134,7 +117,7 @@ describe('Schedule GET API', () => { }) it('returns 404 for non-existent workflow', async () => { - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: false, status: 404, message: 'Workflow not found', @@ -149,7 +132,7 @@ describe('Schedule GET API', () => { }) it('denies access for unauthorized user', async () => { - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: false, status: 403, message: 'Unauthorized: Access denied to read this workflow', diff --git a/apps/sim/app/api/schedules/route.ts b/apps/sim/app/api/schedules/route.ts index a2f14f109a8..2f12c23863c 100644 --- a/apps/sim/app/api/schedules/route.ts +++ b/apps/sim/app/api/schedules/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { workflow, workflowDeploymentVersion, workflowSchedule } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { captureServerEvent } from '@/lib/posthog/server' import { validateCronExpression } from '@/lib/workflows/schedules/utils' import { authorizeWorkflowByWorkspacePermission } from '@/lib/workflows/utils' diff --git a/apps/sim/app/api/stars/route.ts b/apps/sim/app/api/stars/route.ts index 97106b13842..9f10c5db9f6 100644 --- a/apps/sim/app/api/stars/route.ts +++ b/apps/sim/app/api/stars/route.ts @@ -1,6 +1,9 @@ +import { createLogger } from '@sim/logger' import { NextResponse } from 'next/server' import { env } from '@/lib/core/config/env' +const logger = createLogger('StarsRoute') + function formatStarCount(num: number): string { if (num < 1000) return String(num) const formatted = (Math.round(num / 100) / 10).toFixed(1) @@ -22,14 +25,14 @@ export async function GET() { }) if (!response.ok) { - console.warn('GitHub API request failed:', response.status) + logger.warn('GitHub API request failed:', response.status) return NextResponse.json({ stars: formatStarCount(19400) }) } const data = await response.json() return NextResponse.json({ stars: formatStarCount(Number(data?.stargazers_count ?? 19400)) }) } catch (error) { - console.warn('Error fetching GitHub stars:', error) + logger.warn('Error fetching GitHub stars:', error) return NextResponse.json({ stars: formatStarCount(19400) }) } } diff --git a/apps/sim/app/api/superuser/import-workflow/route.ts b/apps/sim/app/api/superuser/import-workflow/route.ts index 960723d31ed..cbdb7e7d2cd 100644 --- a/apps/sim/app/api/superuser/import-workflow/route.ts +++ b/apps/sim/app/api/superuser/import-workflow/route.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { copilotChats, workflow, workspace } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' -import { generateId } from '@/lib/core/utils/uuid' import { verifyEffectiveSuperUser } from '@/lib/templates/permissions' import { parseWorkflowJson } from '@/lib/workflows/operations/import-export' import { diff --git a/apps/sim/app/api/table/[tableId]/import-csv/route.test.ts b/apps/sim/app/api/table/[tableId]/import-csv/route.test.ts index 9e2f31edc9a..522c508e4e6 100644 --- a/apps/sim/app/api/table/[tableId]/import-csv/route.test.ts +++ b/apps/sim/app/api/table/[tableId]/import-csv/route.test.ts @@ -1,32 +1,22 @@ /** * @vitest-environment node */ +import { hybridAuthMock, hybridAuthMockFns, requestUtilsMock } from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' import type { TableDefinition } from '@/lib/table' -const { - mockCheckSessionOrInternalAuth, - mockCheckAccess, - mockBatchInsertRows, - mockReplaceTableRows, -} = vi.hoisted(() => ({ - mockCheckSessionOrInternalAuth: vi.fn(), +const { mockCheckAccess, mockBatchInsertRows, mockReplaceTableRows } = vi.hoisted(() => ({ mockCheckAccess: vi.fn(), mockBatchInsertRows: vi.fn(), mockReplaceTableRows: vi.fn(), })) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) -vi.mock('@/lib/core/utils/request', () => ({ - generateRequestId: vi.fn().mockReturnValue('req-test-123'), -})) +vi.mock('@/lib/core/utils/request', () => requestUtilsMock) -vi.mock('@/lib/core/utils/uuid', () => ({ +vi.mock('@sim/utils/id', () => ({ generateId: vi.fn().mockReturnValue('deadbeefcafef00d'), generateShortId: vi.fn().mockReturnValue('short-id'), })) @@ -118,7 +108,7 @@ async function callPost(form: FormData, { tableId }: { tableId: string } = { tab describe('POST /api/table/[tableId]/import-csv', () => { beforeEach(() => { vi.clearAllMocks() - mockCheckSessionOrInternalAuth.mockResolvedValue({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: 'user-1', authType: 'session', @@ -131,7 +121,7 @@ describe('POST /api/table/[tableId]/import-csv', () => { }) it('returns 401 when the user is not authenticated', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: false, error: 'Authentication required', }) diff --git a/apps/sim/app/api/table/[tableId]/import-csv/route.ts b/apps/sim/app/api/table/[tableId]/import-csv/route.ts index 3ad21468fec..20ef2dac2c4 100644 --- a/apps/sim/app/api/table/[tableId]/import-csv/route.ts +++ b/apps/sim/app/api/table/[tableId]/import-csv/route.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { batchInsertRows, buildAutoMapping, diff --git a/apps/sim/app/api/table/[tableId]/rows/[rowId]/route.ts b/apps/sim/app/api/table/[tableId]/rows/[rowId]/route.ts index 66790f68af7..6ed71100944 100644 --- a/apps/sim/app/api/table/[tableId]/rows/[rowId]/route.ts +++ b/apps/sim/app/api/table/[tableId]/rows/[rowId]/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { userTableRows } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import type { RowData } from '@/lib/table' import { deleteRow, updateRow } from '@/lib/table' diff --git a/apps/sim/app/api/table/[tableId]/rows/route.ts b/apps/sim/app/api/table/[tableId]/rows/route.ts index 24def621927..762cc84ef7b 100644 --- a/apps/sim/app/api/table/[tableId]/rows/route.ts +++ b/apps/sim/app/api/table/[tableId]/rows/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { userTableRows } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import type { Filter, RowData, Sort, TableSchema } from '@/lib/table' import { diff --git a/apps/sim/app/api/table/[tableId]/rows/upsert/route.ts b/apps/sim/app/api/table/[tableId]/rows/upsert/route.ts index de510c7fdd9..174bb71cea7 100644 --- a/apps/sim/app/api/table/[tableId]/rows/upsert/route.ts +++ b/apps/sim/app/api/table/[tableId]/rows/upsert/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import type { RowData } from '@/lib/table' import { upsertRow } from '@/lib/table' diff --git a/apps/sim/app/api/table/import-csv/route.ts b/apps/sim/app/api/table/import-csv/route.ts index 0fe52910fbd..3539cdeafb9 100644 --- a/apps/sim/app/api/table/import-csv/route.ts +++ b/apps/sim/app/api/table/import-csv/route.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { batchInsertRows, CSV_MAX_BATCH_SIZE, diff --git a/apps/sim/app/api/templates/[id]/star/route.ts b/apps/sim/app/api/templates/[id]/star/route.ts index c57ba28eaf9..8cc52518da4 100644 --- a/apps/sim/app/api/templates/[id]/star/route.ts +++ b/apps/sim/app/api/templates/[id]/star/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { templateStars, templates } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('TemplateStarAPI') diff --git a/apps/sim/app/api/templates/[id]/use/route.ts b/apps/sim/app/api/templates/[id]/use/route.ts index a4c797381c1..d18187df7ee 100644 --- a/apps/sim/app/api/templates/[id]/use/route.ts +++ b/apps/sim/app/api/templates/[id]/use/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { templates, workflow, workflowDeploymentVersion } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { generateRequestId } from '@/lib/core/utils/request' import { getInternalApiBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { canAccessTemplate, verifyTemplateOwnership } from '@/lib/templates/permissions' import { type RegenerateStateInput, diff --git a/apps/sim/app/api/templates/approved/sanitized/route.ts b/apps/sim/app/api/templates/approved/sanitized/route.ts index 6d481e8a704..67755e77c7f 100644 --- a/apps/sim/app/api/templates/approved/sanitized/route.ts +++ b/apps/sim/app/api/templates/approved/sanitized/route.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { templates } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalApiKey } from '@/lib/copilot/request/http' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' diff --git a/apps/sim/app/api/templates/route.ts b/apps/sim/app/api/templates/route.ts index 0a9f9d02b72..a1b22b15de6 100644 --- a/apps/sim/app/api/templates/route.ts +++ b/apps/sim/app/api/templates/route.ts @@ -7,13 +7,13 @@ import { workflowDeploymentVersion, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, desc, eq, ilike, or, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { canAccessTemplate, verifyEffectiveSuperUser } from '@/lib/templates/permissions' import { extractRequiredCredentials, diff --git a/apps/sim/app/api/tools/a2a/send-message/route.ts b/apps/sim/app/api/tools/a2a/send-message/route.ts index 0f4fa0445e2..eb4bc5b056e 100644 --- a/apps/sim/app/api/tools/a2a/send-message/route.ts +++ b/apps/sim/app/api/tools/a2a/send-message/route.ts @@ -1,13 +1,13 @@ import type { DataPart, FilePart, Message, Part, Task, TextPart } from '@a2a-js/sdk' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { createA2AClient, extractTextContent, isTerminalState } from '@/lib/a2a/utils' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' import { validateUrlWithDNS } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/asana/create-task/route.ts b/apps/sim/app/api/tools/asana/create-task/route.ts index ddcdacdb5cc..4212cb2e547 100644 --- a/apps/sim/app/api/tools/asana/create-task/route.ts +++ b/apps/sim/app/api/tools/asana/create-task/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateAlphanumericId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/asana/update-task/route.ts b/apps/sim/app/api/tools/asana/update-task/route.ts index 8831ed1d856..5d2b8a15b10 100644 --- a/apps/sim/app/api/tools/asana/update-task/route.ts +++ b/apps/sim/app/api/tools/asana/update-task/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateAlphanumericId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/cloudwatch/utils.ts b/apps/sim/app/api/tools/cloudwatch/utils.ts index 4c074955298..5d4b4dd9a6a 100644 --- a/apps/sim/app/api/tools/cloudwatch/utils.ts +++ b/apps/sim/app/api/tools/cloudwatch/utils.ts @@ -5,8 +5,8 @@ import { GetQueryResultsCommand, type ResultField, } from '@aws-sdk/client-cloudwatch-logs' +import { sleep } from '@sim/utils/helpers' import { DEFAULT_EXECUTION_TIMEOUT_MS } from '@/lib/core/execution-limits' -import { sleep } from '@/lib/core/utils/helpers' interface AwsCredentials { region: string diff --git a/apps/sim/app/api/tools/crowdstrike/query/route.test.ts b/apps/sim/app/api/tools/crowdstrike/query/route.test.ts index 3e0b88d02de..a0d6269641b 100644 --- a/apps/sim/app/api/tools/crowdstrike/query/route.test.ts +++ b/apps/sim/app/api/tools/crowdstrike/query/route.test.ts @@ -1,18 +1,14 @@ /** * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { createMockRequest, hybridAuthMock, hybridAuthMockFns } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { fetchMock, mockCheckInternalAuth } = vi.hoisted(() => ({ +const { fetchMock } = vi.hoisted(() => ({ fetchMock: vi.fn(), - mockCheckInternalAuth: vi.fn(), })) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkInternalAuth: mockCheckInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) import { POST } from '@/app/api/tools/crowdstrike/query/route' @@ -72,7 +68,7 @@ describe('CrowdStrike query route', () => { vi.clearAllMocks() vi.stubGlobal('fetch', fetchMock) - mockCheckInternalAuth.mockResolvedValue({ + hybridAuthMockFns.mockCheckInternalAuth.mockResolvedValue({ success: true, userId: 'user-123', authType: 'internal_jwt', diff --git a/apps/sim/app/api/tools/crowdstrike/query/route.ts b/apps/sim/app/api/tools/crowdstrike/query/route.ts index 63ad81e2899..19ee157f3b1 100644 --- a/apps/sim/app/api/tools/crowdstrike/query/route.ts +++ b/apps/sim/app/api/tools/crowdstrike/query/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import type { CrowdStrikeAggregateQuery, CrowdStrikeCloud, diff --git a/apps/sim/app/api/tools/custom/route.test.ts b/apps/sim/app/api/tools/custom/route.test.ts index 3781fc1c169..63769178a96 100644 --- a/apps/sim/app/api/tools/custom/route.test.ts +++ b/apps/sim/app/api/tools/custom/route.test.ts @@ -3,7 +3,19 @@ * * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + authMock, + authMockFns, + createMockRequest, + hybridAuthMock, + hybridAuthMockFns, + permissionsMock, + permissionsMockFns, + requestUtilsMock, + schemaMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' @@ -18,22 +30,8 @@ const { mockSet, mockDelete, mockLimit, - mockCheckSessionOrInternalAuth, - mockGetSession, - mockGetUserEntityPermissions, mockUpsertCustomTools, - mockAuthorizeWorkflowByWorkspacePermission, - mockLogger, } = vi.hoisted(() => { - const logger = { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - trace: vi.fn(), - fatal: vi.fn(), - child: vi.fn(), - } return { mockSelect: vi.fn(), mockFrom: vi.fn(), @@ -45,15 +43,12 @@ const { mockSet: vi.fn(), mockDelete: vi.fn(), mockLimit: vi.fn(), - mockCheckSessionOrInternalAuth: vi.fn(), - mockGetSession: vi.fn(), - mockGetUserEntityPermissions: vi.fn(), mockUpsertCustomTools: vi.fn(), - mockAuthorizeWorkflowByWorkspacePermission: vi.fn(), - mockLogger: logger, } }) +const mockGetUserEntityPermissions = permissionsMockFns.mockGetUserEntityPermissions + const sampleTools = [ { id: 'tool-1', @@ -163,36 +158,13 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - customTools: { - id: 'id', - workspaceId: 'workspaceId', - userId: 'userId', - title: 'title', - }, - workflow: { - id: 'id', - workspaceId: 'workspaceId', - userId: 'userId', - }, -})) - -vi.mock('@/lib/auth', () => ({ - getSession: (...args: unknown[]) => mockGetSession(...args), -})) +vi.mock('@sim/db/schema', () => schemaMock) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkSessionOrInternalAuth: (...args: unknown[]) => mockCheckSessionOrInternalAuth(...args), -})) +vi.mock('@/lib/auth', () => authMock) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - getUserEntityPermissions: (...args: unknown[]) => mockGetUserEntityPermissions(...args), -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue(mockLogger), -})) +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) vi.mock('drizzle-orm', () => ({ eq: vi.fn().mockImplementation((field: unknown, value: unknown) => ({ @@ -217,18 +189,13 @@ vi.mock('drizzle-orm', () => ({ desc: vi.fn().mockImplementation((field: unknown) => ({ field, operator: 'desc' })), })) -vi.mock('@/lib/core/utils/request', () => ({ - generateRequestId: vi.fn().mockReturnValue('test-request-id'), -})) +vi.mock('@/lib/core/utils/request', () => requestUtilsMock) vi.mock('@/lib/workflows/custom-tools/operations', () => ({ upsertCustomTools: (...args: unknown[]) => mockUpsertCustomTools(...args), })) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: (...args: unknown[]) => - mockAuthorizeWorkflowByWorkspacePermission(...args), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) import { DELETE, GET, POST } from '@/app/api/tools/custom/route' @@ -270,15 +237,15 @@ describe('Custom Tools API Routes', () => { mockSet.mockReturnValue({ where: mockWhere }) mockDelete.mockReturnValue({ where: mockWhere }) - mockGetSession.mockResolvedValue(mockSession) - mockCheckSessionOrInternalAuth.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue(mockSession) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: 'user-123', authType: 'session', }) mockGetUserEntityPermissions.mockResolvedValue('admin') mockUpsertCustomTools.mockResolvedValue(sampleTools) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: true, status: 200, workflow: { workspaceId: 'workspace-123' }, @@ -316,7 +283,7 @@ describe('Custom Tools API Routes', () => { 'http://localhost:3000/api/tools/custom?workspaceId=workspace-123' ) - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: false, error: 'Unauthorized', }) @@ -346,7 +313,7 @@ describe('Custom Tools API Routes', () => { */ describe('POST /api/tools/custom', () => { it('should reject unauthorized requests', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: false, error: 'Unauthorized', }) @@ -421,7 +388,7 @@ describe('Custom Tools API Routes', () => { }) it('should prevent unauthorized deletion of user-scoped tool', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-456', authType: 'session', @@ -441,7 +408,7 @@ describe('Custom Tools API Routes', () => { }) it('should reject unauthorized requests', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: false, error: 'Unauthorized', }) diff --git a/apps/sim/app/api/tools/dynamodb/introspect/route.ts b/apps/sim/app/api/tools/dynamodb/introspect/route.ts index bad2d517ca7..56fdea89898 100644 --- a/apps/sim/app/api/tools/dynamodb/introspect/route.ts +++ b/apps/sim/app/api/tools/dynamodb/introspect/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createRawDynamoDBClient, describeTable, listTables } from '@/app/api/tools/dynamodb/utils' const logger = createLogger('DynamoDBIntrospectAPI') diff --git a/apps/sim/app/api/tools/iam/add-user-to-group/route.ts b/apps/sim/app/api/tools/iam/add-user-to-group/route.ts index 88dc2e67501..5f69ced16de 100644 --- a/apps/sim/app/api/tools/iam/add-user-to-group/route.ts +++ b/apps/sim/app/api/tools/iam/add-user-to-group/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { addUserToGroup, createIAMClient } from '../utils' const logger = createLogger('IAMAddUserToGroupAPI') diff --git a/apps/sim/app/api/tools/iam/attach-role-policy/route.ts b/apps/sim/app/api/tools/iam/attach-role-policy/route.ts index 0360769c098..010b64faf53 100644 --- a/apps/sim/app/api/tools/iam/attach-role-policy/route.ts +++ b/apps/sim/app/api/tools/iam/attach-role-policy/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { attachRolePolicy, createIAMClient } from '../utils' const logger = createLogger('IAMAttachRolePolicyAPI') diff --git a/apps/sim/app/api/tools/iam/attach-user-policy/route.ts b/apps/sim/app/api/tools/iam/attach-user-policy/route.ts index 6ae4037ceb6..636d5e613d5 100644 --- a/apps/sim/app/api/tools/iam/attach-user-policy/route.ts +++ b/apps/sim/app/api/tools/iam/attach-user-policy/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { attachUserPolicy, createIAMClient } from '../utils' const logger = createLogger('IAMAttachUserPolicyAPI') diff --git a/apps/sim/app/api/tools/iam/create-access-key/route.ts b/apps/sim/app/api/tools/iam/create-access-key/route.ts index f8a82d794b7..6b247a12d78 100644 --- a/apps/sim/app/api/tools/iam/create-access-key/route.ts +++ b/apps/sim/app/api/tools/iam/create-access-key/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createAccessKey, createIAMClient } from '../utils' const logger = createLogger('IAMCreateAccessKeyAPI') diff --git a/apps/sim/app/api/tools/iam/create-role/route.ts b/apps/sim/app/api/tools/iam/create-role/route.ts index 0cd765c2012..a58f136ede9 100644 --- a/apps/sim/app/api/tools/iam/create-role/route.ts +++ b/apps/sim/app/api/tools/iam/create-role/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, createRole } from '../utils' const logger = createLogger('IAMCreateRoleAPI') diff --git a/apps/sim/app/api/tools/iam/create-user/route.ts b/apps/sim/app/api/tools/iam/create-user/route.ts index 42db82145fe..941972be5c5 100644 --- a/apps/sim/app/api/tools/iam/create-user/route.ts +++ b/apps/sim/app/api/tools/iam/create-user/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, createUser } from '../utils' const logger = createLogger('IAMCreateUserAPI') diff --git a/apps/sim/app/api/tools/iam/delete-access-key/route.ts b/apps/sim/app/api/tools/iam/delete-access-key/route.ts index 65486f5e5fa..50801563691 100644 --- a/apps/sim/app/api/tools/iam/delete-access-key/route.ts +++ b/apps/sim/app/api/tools/iam/delete-access-key/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, deleteAccessKey } from '../utils' const logger = createLogger('IAMDeleteAccessKeyAPI') diff --git a/apps/sim/app/api/tools/iam/delete-role/route.ts b/apps/sim/app/api/tools/iam/delete-role/route.ts index 488bb300483..4c0361868a1 100644 --- a/apps/sim/app/api/tools/iam/delete-role/route.ts +++ b/apps/sim/app/api/tools/iam/delete-role/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, deleteRole } from '../utils' const logger = createLogger('IAMDeleteRoleAPI') diff --git a/apps/sim/app/api/tools/iam/delete-user/route.ts b/apps/sim/app/api/tools/iam/delete-user/route.ts index 5d6d9e980c9..a9e484ace56 100644 --- a/apps/sim/app/api/tools/iam/delete-user/route.ts +++ b/apps/sim/app/api/tools/iam/delete-user/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, deleteUser } from '../utils' const logger = createLogger('IAMDeleteUserAPI') diff --git a/apps/sim/app/api/tools/iam/detach-role-policy/route.ts b/apps/sim/app/api/tools/iam/detach-role-policy/route.ts index 3e4af87dc98..e7bd77c1811 100644 --- a/apps/sim/app/api/tools/iam/detach-role-policy/route.ts +++ b/apps/sim/app/api/tools/iam/detach-role-policy/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, detachRolePolicy } from '../utils' const logger = createLogger('IAMDetachRolePolicyAPI') diff --git a/apps/sim/app/api/tools/iam/detach-user-policy/route.ts b/apps/sim/app/api/tools/iam/detach-user-policy/route.ts index 9972a2b78bb..5bbf0f6956b 100644 --- a/apps/sim/app/api/tools/iam/detach-user-policy/route.ts +++ b/apps/sim/app/api/tools/iam/detach-user-policy/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, detachUserPolicy } from '../utils' const logger = createLogger('IAMDetachUserPolicyAPI') diff --git a/apps/sim/app/api/tools/iam/get-role/route.ts b/apps/sim/app/api/tools/iam/get-role/route.ts index a7a0f20273b..3086f3f00fd 100644 --- a/apps/sim/app/api/tools/iam/get-role/route.ts +++ b/apps/sim/app/api/tools/iam/get-role/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, getRole } from '../utils' const logger = createLogger('IAMGetRoleAPI') diff --git a/apps/sim/app/api/tools/iam/get-user/route.ts b/apps/sim/app/api/tools/iam/get-user/route.ts index 148baf28834..22964c75a26 100644 --- a/apps/sim/app/api/tools/iam/get-user/route.ts +++ b/apps/sim/app/api/tools/iam/get-user/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, getUser } from '../utils' const logger = createLogger('IAMGetUserAPI') diff --git a/apps/sim/app/api/tools/iam/list-groups/route.ts b/apps/sim/app/api/tools/iam/list-groups/route.ts index 6512f71f84a..0d37da698c9 100644 --- a/apps/sim/app/api/tools/iam/list-groups/route.ts +++ b/apps/sim/app/api/tools/iam/list-groups/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, listGroups } from '../utils' const logger = createLogger('IAMListGroupsAPI') diff --git a/apps/sim/app/api/tools/iam/list-policies/route.ts b/apps/sim/app/api/tools/iam/list-policies/route.ts index ecd2c892c94..5e361bd66b8 100644 --- a/apps/sim/app/api/tools/iam/list-policies/route.ts +++ b/apps/sim/app/api/tools/iam/list-policies/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, listPolicies } from '../utils' const logger = createLogger('IAMListPoliciesAPI') diff --git a/apps/sim/app/api/tools/iam/list-roles/route.ts b/apps/sim/app/api/tools/iam/list-roles/route.ts index fac48e83475..a1b9a5676f7 100644 --- a/apps/sim/app/api/tools/iam/list-roles/route.ts +++ b/apps/sim/app/api/tools/iam/list-roles/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, listRoles } from '../utils' const logger = createLogger('IAMListRolesAPI') diff --git a/apps/sim/app/api/tools/iam/list-users/route.ts b/apps/sim/app/api/tools/iam/list-users/route.ts index 17668a8737c..13b99298574 100644 --- a/apps/sim/app/api/tools/iam/list-users/route.ts +++ b/apps/sim/app/api/tools/iam/list-users/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, listUsers } from '../utils' const logger = createLogger('IAMListUsersAPI') diff --git a/apps/sim/app/api/tools/iam/remove-user-from-group/route.ts b/apps/sim/app/api/tools/iam/remove-user-from-group/route.ts index d50c699e92e..5f3a537d3d0 100644 --- a/apps/sim/app/api/tools/iam/remove-user-from-group/route.ts +++ b/apps/sim/app/api/tools/iam/remove-user-from-group/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createIAMClient, removeUserFromGroup } from '../utils' const logger = createLogger('IAMRemoveUserFromGroupAPI') diff --git a/apps/sim/app/api/tools/image/route.ts b/apps/sim/app/api/tools/image/route.ts index 9fba35ad721..c83ef413d09 100644 --- a/apps/sim/app/api/tools/image/route.ts +++ b/apps/sim/app/api/tools/image/route.ts @@ -1,11 +1,11 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { secureFetchWithPinnedIP, validateUrlWithDNS, } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' const logger = createLogger('ImageProxyAPI') diff --git a/apps/sim/app/api/tools/jira/update/route.ts b/apps/sim/app/api/tools/jira/update/route.ts index 74ccc0f42a9..86986a7ccbc 100644 --- a/apps/sim/app/api/tools/jira/update/route.ts +++ b/apps/sim/app/api/tools/jira/update/route.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage, toAdf } from '@/tools/jira/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/jira/write/route.ts b/apps/sim/app/api/tools/jira/write/route.ts index b54d24993b2..5cbd748fec7 100644 --- a/apps/sim/app/api/tools/jira/write/route.ts +++ b/apps/sim/app/api/tools/jira/write/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage, toAdf } from '@/tools/jira/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/jsm/approvals/route.ts b/apps/sim/app/api/tools/jsm/approvals/route.ts index 387f1b6dc83..aab4fd51db4 100644 --- a/apps/sim/app/api/tools/jsm/approvals/route.ts +++ b/apps/sim/app/api/tools/jsm/approvals/route.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { @@ -7,7 +8,6 @@ import { validateJiraCloudId, validateJiraIssueKey, } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/comment/route.ts b/apps/sim/app/api/tools/jsm/comment/route.ts index 7a1758c5125..3a651d36504 100644 --- a/apps/sim/app/api/tools/jsm/comment/route.ts +++ b/apps/sim/app/api/tools/jsm/comment/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/comments/route.ts b/apps/sim/app/api/tools/jsm/comments/route.ts index 43bbd8eefcf..7ecfce61857 100644 --- a/apps/sim/app/api/tools/jsm/comments/route.ts +++ b/apps/sim/app/api/tools/jsm/comments/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/customers/route.ts b/apps/sim/app/api/tools/jsm/customers/route.ts index 67cff52bd04..c60b2176ed5 100644 --- a/apps/sim/app/api/tools/jsm/customers/route.ts +++ b/apps/sim/app/api/tools/jsm/customers/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/answers/route.ts b/apps/sim/app/api/tools/jsm/forms/answers/route.ts index 5d529f0c076..dbcb90d39b4 100644 --- a/apps/sim/app/api/tools/jsm/forms/answers/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/answers/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/attach/route.ts b/apps/sim/app/api/tools/jsm/forms/attach/route.ts index 2e33cc7afe2..4cea4451ca8 100644 --- a/apps/sim/app/api/tools/jsm/forms/attach/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/attach/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/copy/route.ts b/apps/sim/app/api/tools/jsm/forms/copy/route.ts index 0f65f9de63a..534b6d2e78c 100644 --- a/apps/sim/app/api/tools/jsm/forms/copy/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/copy/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/delete/route.ts b/apps/sim/app/api/tools/jsm/forms/delete/route.ts index 28ff73a017d..6849cfbff11 100644 --- a/apps/sim/app/api/tools/jsm/forms/delete/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/delete/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/externalise/route.ts b/apps/sim/app/api/tools/jsm/forms/externalise/route.ts index 5922bfc68b3..a9f9ee9cb77 100644 --- a/apps/sim/app/api/tools/jsm/forms/externalise/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/externalise/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/get/route.ts b/apps/sim/app/api/tools/jsm/forms/get/route.ts index 35ca42a6687..4582e626526 100644 --- a/apps/sim/app/api/tools/jsm/forms/get/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/get/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/internalise/route.ts b/apps/sim/app/api/tools/jsm/forms/internalise/route.ts index 8d8aae7201b..755686c36ea 100644 --- a/apps/sim/app/api/tools/jsm/forms/internalise/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/internalise/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/issue/route.ts b/apps/sim/app/api/tools/jsm/forms/issue/route.ts index 0d504359db0..754d209ea39 100644 --- a/apps/sim/app/api/tools/jsm/forms/issue/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/issue/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/reopen/route.ts b/apps/sim/app/api/tools/jsm/forms/reopen/route.ts index 333d9c347b4..7f734bc5f4e 100644 --- a/apps/sim/app/api/tools/jsm/forms/reopen/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/reopen/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/save/route.ts b/apps/sim/app/api/tools/jsm/forms/save/route.ts index 7869ac80246..82a3a94403d 100644 --- a/apps/sim/app/api/tools/jsm/forms/save/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/save/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/structure/route.ts b/apps/sim/app/api/tools/jsm/forms/structure/route.ts index 51fdb78e4f6..56497ef9511 100644 --- a/apps/sim/app/api/tools/jsm/forms/structure/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/structure/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/submit/route.ts b/apps/sim/app/api/tools/jsm/forms/submit/route.ts index d2c92b6e600..a54a8f0080b 100644 --- a/apps/sim/app/api/tools/jsm/forms/submit/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/submit/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/forms/templates/route.ts b/apps/sim/app/api/tools/jsm/forms/templates/route.ts index a79703b703e..1021f5d0f6e 100644 --- a/apps/sim/app/api/tools/jsm/forms/templates/route.ts +++ b/apps/sim/app/api/tools/jsm/forms/templates/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmFormsApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/organization/route.ts b/apps/sim/app/api/tools/jsm/organization/route.ts index a2bfd2ca40d..54e52091360 100644 --- a/apps/sim/app/api/tools/jsm/organization/route.ts +++ b/apps/sim/app/api/tools/jsm/organization/route.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { @@ -6,7 +7,6 @@ import { validateEnum, validateJiraCloudId, } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/organizations/route.ts b/apps/sim/app/api/tools/jsm/organizations/route.ts index b963de9f55e..2677ecb840a 100644 --- a/apps/sim/app/api/tools/jsm/organizations/route.ts +++ b/apps/sim/app/api/tools/jsm/organizations/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/participants/route.ts b/apps/sim/app/api/tools/jsm/participants/route.ts index 6188181400e..004d3225e61 100644 --- a/apps/sim/app/api/tools/jsm/participants/route.ts +++ b/apps/sim/app/api/tools/jsm/participants/route.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { @@ -6,7 +7,6 @@ import { validateJiraCloudId, validateJiraIssueKey, } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/queues/route.ts b/apps/sim/app/api/tools/jsm/queues/route.ts index b70f8924cd1..c700415a0c9 100644 --- a/apps/sim/app/api/tools/jsm/queues/route.ts +++ b/apps/sim/app/api/tools/jsm/queues/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/request/route.ts b/apps/sim/app/api/tools/jsm/request/route.ts index 924d9fa6cb3..bd28305b3ff 100644 --- a/apps/sim/app/api/tools/jsm/request/route.ts +++ b/apps/sim/app/api/tools/jsm/request/route.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { @@ -6,7 +7,6 @@ import { validateJiraCloudId, validateJiraIssueKey, } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/requests/route.ts b/apps/sim/app/api/tools/jsm/requests/route.ts index 511e482490b..beff44d69ec 100644 --- a/apps/sim/app/api/tools/jsm/requests/route.ts +++ b/apps/sim/app/api/tools/jsm/requests/route.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { @@ -6,7 +7,6 @@ import { validateEnum, validateJiraCloudId, } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/requesttypefields/route.ts b/apps/sim/app/api/tools/jsm/requesttypefields/route.ts index da14d3e3dc1..aba218ccfb0 100644 --- a/apps/sim/app/api/tools/jsm/requesttypefields/route.ts +++ b/apps/sim/app/api/tools/jsm/requesttypefields/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/requesttypes/route.ts b/apps/sim/app/api/tools/jsm/requesttypes/route.ts index 2f2513eabfe..3f90b906e59 100644 --- a/apps/sim/app/api/tools/jsm/requesttypes/route.ts +++ b/apps/sim/app/api/tools/jsm/requesttypes/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/servicedesks/route.ts b/apps/sim/app/api/tools/jsm/servicedesks/route.ts index 74d60f9623f..209f06e9e8c 100644 --- a/apps/sim/app/api/tools/jsm/servicedesks/route.ts +++ b/apps/sim/app/api/tools/jsm/servicedesks/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/sla/route.ts b/apps/sim/app/api/tools/jsm/sla/route.ts index 7484a9d8527..083034f5b14 100644 --- a/apps/sim/app/api/tools/jsm/sla/route.ts +++ b/apps/sim/app/api/tools/jsm/sla/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/transition/route.ts b/apps/sim/app/api/tools/jsm/transition/route.ts index 39ac559c8e7..75231994c71 100644 --- a/apps/sim/app/api/tools/jsm/transition/route.ts +++ b/apps/sim/app/api/tools/jsm/transition/route.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { @@ -6,7 +7,6 @@ import { validateJiraCloudId, validateJiraIssueKey, } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/jsm/transitions/route.ts b/apps/sim/app/api/tools/jsm/transitions/route.ts index ed017b0a5c4..c736eabc64d 100644 --- a/apps/sim/app/api/tools/jsm/transitions/route.ts +++ b/apps/sim/app/api/tools/jsm/transitions/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getJiraCloudId, parseAtlassianErrorMessage } from '@/tools/jira/utils' import { getJsmApiBaseUrl, getJsmHeaders } from '@/tools/jsm/utils' diff --git a/apps/sim/app/api/tools/microsoft-teams/channels/route.ts b/apps/sim/app/api/tools/microsoft-teams/channels/route.ts index 5d2ca796499..f985ac00ea9 100644 --- a/apps/sim/app/api/tools/microsoft-teams/channels/route.ts +++ b/apps/sim/app/api/tools/microsoft-teams/channels/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/microsoft-teams/chats/route.ts b/apps/sim/app/api/tools/microsoft-teams/chats/route.ts index 26ad9f8b33c..718d55ca999 100644 --- a/apps/sim/app/api/tools/microsoft-teams/chats/route.ts +++ b/apps/sim/app/api/tools/microsoft-teams/chats/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/microsoft-teams/teams/route.ts b/apps/sim/app/api/tools/microsoft-teams/teams/route.ts index 7045af36358..787f3b9649f 100644 --- a/apps/sim/app/api/tools/microsoft-teams/teams/route.ts +++ b/apps/sim/app/api/tools/microsoft-teams/teams/route.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' diff --git a/apps/sim/app/api/tools/mongodb/delete/route.ts b/apps/sim/app/api/tools/mongodb/delete/route.ts index 5325aa57446..6202e0e6e5c 100644 --- a/apps/sim/app/api/tools/mongodb/delete/route.ts +++ b/apps/sim/app/api/tools/mongodb/delete/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createMongoDBConnection, sanitizeCollectionName, validateFilter } from '../utils' const logger = createLogger('MongoDBDeleteAPI') diff --git a/apps/sim/app/api/tools/mongodb/execute/route.ts b/apps/sim/app/api/tools/mongodb/execute/route.ts index 9ae06a07871..54c1289af8f 100644 --- a/apps/sim/app/api/tools/mongodb/execute/route.ts +++ b/apps/sim/app/api/tools/mongodb/execute/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createMongoDBConnection, sanitizeCollectionName, validatePipeline } from '../utils' const logger = createLogger('MongoDBExecuteAPI') diff --git a/apps/sim/app/api/tools/mongodb/insert/route.ts b/apps/sim/app/api/tools/mongodb/insert/route.ts index 94957ae5630..9461159d0ea 100644 --- a/apps/sim/app/api/tools/mongodb/insert/route.ts +++ b/apps/sim/app/api/tools/mongodb/insert/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createMongoDBConnection, sanitizeCollectionName } from '../utils' const logger = createLogger('MongoDBInsertAPI') diff --git a/apps/sim/app/api/tools/mongodb/introspect/route.ts b/apps/sim/app/api/tools/mongodb/introspect/route.ts index d6c4b6e5f7f..c22ff8f0c8a 100644 --- a/apps/sim/app/api/tools/mongodb/introspect/route.ts +++ b/apps/sim/app/api/tools/mongodb/introspect/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createMongoDBConnection, executeIntrospect } from '../utils' const logger = createLogger('MongoDBIntrospectAPI') diff --git a/apps/sim/app/api/tools/mongodb/query/route.ts b/apps/sim/app/api/tools/mongodb/query/route.ts index 24829c660b1..4ab2535fb73 100644 --- a/apps/sim/app/api/tools/mongodb/query/route.ts +++ b/apps/sim/app/api/tools/mongodb/query/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createMongoDBConnection, sanitizeCollectionName, validateFilter } from '../utils' const logger = createLogger('MongoDBQueryAPI') diff --git a/apps/sim/app/api/tools/mongodb/update/route.ts b/apps/sim/app/api/tools/mongodb/update/route.ts index 47022203ee7..43eb7931b8f 100644 --- a/apps/sim/app/api/tools/mongodb/update/route.ts +++ b/apps/sim/app/api/tools/mongodb/update/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createMongoDBConnection, sanitizeCollectionName, validateFilter } from '../utils' const logger = createLogger('MongoDBUpdateAPI') diff --git a/apps/sim/app/api/tools/mysql/delete/route.ts b/apps/sim/app/api/tools/mysql/delete/route.ts index b1871cff38a..b4125aa4334 100644 --- a/apps/sim/app/api/tools/mysql/delete/route.ts +++ b/apps/sim/app/api/tools/mysql/delete/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { buildDeleteQuery, createMySQLConnection, executeQuery } from '@/app/api/tools/mysql/utils' const logger = createLogger('MySQLDeleteAPI') diff --git a/apps/sim/app/api/tools/mysql/execute/route.ts b/apps/sim/app/api/tools/mysql/execute/route.ts index 1e8e1685ba3..4b235dd0700 100644 --- a/apps/sim/app/api/tools/mysql/execute/route.ts +++ b/apps/sim/app/api/tools/mysql/execute/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createMySQLConnection, executeQuery, validateQuery } from '@/app/api/tools/mysql/utils' const logger = createLogger('MySQLExecuteAPI') diff --git a/apps/sim/app/api/tools/mysql/insert/route.ts b/apps/sim/app/api/tools/mysql/insert/route.ts index 862a3332c25..bcb1b869806 100644 --- a/apps/sim/app/api/tools/mysql/insert/route.ts +++ b/apps/sim/app/api/tools/mysql/insert/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { buildInsertQuery, createMySQLConnection, executeQuery } from '@/app/api/tools/mysql/utils' const logger = createLogger('MySQLInsertAPI') diff --git a/apps/sim/app/api/tools/mysql/introspect/route.ts b/apps/sim/app/api/tools/mysql/introspect/route.ts index 792b012d126..fda8dc82b68 100644 --- a/apps/sim/app/api/tools/mysql/introspect/route.ts +++ b/apps/sim/app/api/tools/mysql/introspect/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createMySQLConnection, executeIntrospect } from '@/app/api/tools/mysql/utils' const logger = createLogger('MySQLIntrospectAPI') diff --git a/apps/sim/app/api/tools/mysql/query/route.ts b/apps/sim/app/api/tools/mysql/query/route.ts index 5e1105053fc..e6084340ea4 100644 --- a/apps/sim/app/api/tools/mysql/query/route.ts +++ b/apps/sim/app/api/tools/mysql/query/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createMySQLConnection, executeQuery, validateQuery } from '@/app/api/tools/mysql/utils' const logger = createLogger('MySQLQueryAPI') diff --git a/apps/sim/app/api/tools/mysql/update/route.ts b/apps/sim/app/api/tools/mysql/update/route.ts index 0eff371d83c..aa87d5c169b 100644 --- a/apps/sim/app/api/tools/mysql/update/route.ts +++ b/apps/sim/app/api/tools/mysql/update/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { buildUpdateQuery, createMySQLConnection, executeQuery } from '@/app/api/tools/mysql/utils' const logger = createLogger('MySQLUpdateAPI') diff --git a/apps/sim/app/api/tools/neo4j/create/route.ts b/apps/sim/app/api/tools/neo4j/create/route.ts index 83c1b16c6d4..6a4717fde47 100644 --- a/apps/sim/app/api/tools/neo4j/create/route.ts +++ b/apps/sim/app/api/tools/neo4j/create/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { convertNeo4jTypesToJSON, createNeo4jDriver, diff --git a/apps/sim/app/api/tools/neo4j/delete/route.ts b/apps/sim/app/api/tools/neo4j/delete/route.ts index 5b4c42d7da2..a36e9218124 100644 --- a/apps/sim/app/api/tools/neo4j/delete/route.ts +++ b/apps/sim/app/api/tools/neo4j/delete/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createNeo4jDriver, validateCypherQuery } from '@/app/api/tools/neo4j/utils' const logger = createLogger('Neo4jDeleteAPI') diff --git a/apps/sim/app/api/tools/neo4j/execute/route.ts b/apps/sim/app/api/tools/neo4j/execute/route.ts index 70eb498b5b2..456da1f8b3f 100644 --- a/apps/sim/app/api/tools/neo4j/execute/route.ts +++ b/apps/sim/app/api/tools/neo4j/execute/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { convertNeo4jTypesToJSON, createNeo4jDriver, diff --git a/apps/sim/app/api/tools/neo4j/introspect/route.ts b/apps/sim/app/api/tools/neo4j/introspect/route.ts index 36604473fb6..beba37b8c7c 100644 --- a/apps/sim/app/api/tools/neo4j/introspect/route.ts +++ b/apps/sim/app/api/tools/neo4j/introspect/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createNeo4jDriver } from '@/app/api/tools/neo4j/utils' import type { Neo4jNodeSchema, Neo4jRelationshipSchema } from '@/tools/neo4j/types' diff --git a/apps/sim/app/api/tools/neo4j/merge/route.ts b/apps/sim/app/api/tools/neo4j/merge/route.ts index e4865aeabf4..20f3e64c936 100644 --- a/apps/sim/app/api/tools/neo4j/merge/route.ts +++ b/apps/sim/app/api/tools/neo4j/merge/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { convertNeo4jTypesToJSON, createNeo4jDriver, diff --git a/apps/sim/app/api/tools/neo4j/query/route.ts b/apps/sim/app/api/tools/neo4j/query/route.ts index 7c6d8983675..40f8e9d4c45 100644 --- a/apps/sim/app/api/tools/neo4j/query/route.ts +++ b/apps/sim/app/api/tools/neo4j/query/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { convertNeo4jTypesToJSON, createNeo4jDriver, diff --git a/apps/sim/app/api/tools/neo4j/update/route.ts b/apps/sim/app/api/tools/neo4j/update/route.ts index 5d90e17a568..6ce96713f8a 100644 --- a/apps/sim/app/api/tools/neo4j/update/route.ts +++ b/apps/sim/app/api/tools/neo4j/update/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { convertNeo4jTypesToJSON, createNeo4jDriver, diff --git a/apps/sim/app/api/tools/onedrive/files/route.ts b/apps/sim/app/api/tools/onedrive/files/route.ts index 16baea2e23d..d2613a334e3 100644 --- a/apps/sim/app/api/tools/onedrive/files/route.ts +++ b/apps/sim/app/api/tools/onedrive/files/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { account } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' -import { generateId } from '@/lib/core/utils/uuid' import { refreshAccessTokenIfNeeded, resolveOAuthAccountId } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/onedrive/folder/route.ts b/apps/sim/app/api/tools/onedrive/folder/route.ts index 2ab90355b7c..fd373641ec0 100644 --- a/apps/sim/app/api/tools/onedrive/folder/route.ts +++ b/apps/sim/app/api/tools/onedrive/folder/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { account } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' -import { generateId } from '@/lib/core/utils/uuid' import { refreshAccessTokenIfNeeded, resolveOAuthAccountId } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/onedrive/folders/route.ts b/apps/sim/app/api/tools/onedrive/folders/route.ts index 5cf6981f801..9a35dc108f6 100644 --- a/apps/sim/app/api/tools/onedrive/folders/route.ts +++ b/apps/sim/app/api/tools/onedrive/folders/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { account } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' -import { generateId } from '@/lib/core/utils/uuid' import { refreshAccessTokenIfNeeded, resolveOAuthAccountId } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/onepassword/create-item/route.ts b/apps/sim/app/api/tools/onepassword/create-item/route.ts index 497e71b1991..21a17c5bb36 100644 --- a/apps/sim/app/api/tools/onepassword/create-item/route.ts +++ b/apps/sim/app/api/tools/onepassword/create-item/route.ts @@ -1,9 +1,9 @@ import type { ItemCreateParams } from '@1password/sdk' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { connectRequest, createOnePasswordClient, diff --git a/apps/sim/app/api/tools/onepassword/delete-item/route.ts b/apps/sim/app/api/tools/onepassword/delete-item/route.ts index c2be6e8f1eb..0507a6add39 100644 --- a/apps/sim/app/api/tools/onepassword/delete-item/route.ts +++ b/apps/sim/app/api/tools/onepassword/delete-item/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { connectRequest, createOnePasswordClient, resolveCredentials } from '../utils' const logger = createLogger('OnePasswordDeleteItemAPI') diff --git a/apps/sim/app/api/tools/onepassword/get-item/route.ts b/apps/sim/app/api/tools/onepassword/get-item/route.ts index 92065228e81..f0986e58937 100644 --- a/apps/sim/app/api/tools/onepassword/get-item/route.ts +++ b/apps/sim/app/api/tools/onepassword/get-item/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { connectRequest, createOnePasswordClient, diff --git a/apps/sim/app/api/tools/onepassword/get-vault/route.ts b/apps/sim/app/api/tools/onepassword/get-vault/route.ts index 09b2b227fe2..5b01c9aa674 100644 --- a/apps/sim/app/api/tools/onepassword/get-vault/route.ts +++ b/apps/sim/app/api/tools/onepassword/get-vault/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { connectRequest, createOnePasswordClient, diff --git a/apps/sim/app/api/tools/onepassword/list-items/route.ts b/apps/sim/app/api/tools/onepassword/list-items/route.ts index 6f4d4c6eb9d..1009be87435 100644 --- a/apps/sim/app/api/tools/onepassword/list-items/route.ts +++ b/apps/sim/app/api/tools/onepassword/list-items/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { connectRequest, createOnePasswordClient, diff --git a/apps/sim/app/api/tools/onepassword/list-vaults/route.ts b/apps/sim/app/api/tools/onepassword/list-vaults/route.ts index e24d8567abc..d99c48db48f 100644 --- a/apps/sim/app/api/tools/onepassword/list-vaults/route.ts +++ b/apps/sim/app/api/tools/onepassword/list-vaults/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { connectRequest, createOnePasswordClient, diff --git a/apps/sim/app/api/tools/onepassword/replace-item/route.ts b/apps/sim/app/api/tools/onepassword/replace-item/route.ts index 48b84918b5f..cac00a6f22a 100644 --- a/apps/sim/app/api/tools/onepassword/replace-item/route.ts +++ b/apps/sim/app/api/tools/onepassword/replace-item/route.ts @@ -1,9 +1,9 @@ import type { Item } from '@1password/sdk' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { connectRequest, createOnePasswordClient, diff --git a/apps/sim/app/api/tools/onepassword/resolve-secret/route.ts b/apps/sim/app/api/tools/onepassword/resolve-secret/route.ts index e327da13d68..ea696f1f874 100644 --- a/apps/sim/app/api/tools/onepassword/resolve-secret/route.ts +++ b/apps/sim/app/api/tools/onepassword/resolve-secret/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createOnePasswordClient, resolveCredentials } from '../utils' const logger = createLogger('OnePasswordResolveSecretAPI') diff --git a/apps/sim/app/api/tools/onepassword/update-item/route.ts b/apps/sim/app/api/tools/onepassword/update-item/route.ts index 1bfca62a68b..d85c3daefee 100644 --- a/apps/sim/app/api/tools/onepassword/update-item/route.ts +++ b/apps/sim/app/api/tools/onepassword/update-item/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { connectRequest, createOnePasswordClient, diff --git a/apps/sim/app/api/tools/onepassword/utils.ts b/apps/sim/app/api/tools/onepassword/utils.ts index 07f4a43d11e..8fb53d59d50 100644 --- a/apps/sim/app/api/tools/onepassword/utils.ts +++ b/apps/sim/app/api/tools/onepassword/utils.ts @@ -10,9 +10,9 @@ import type { Website, } from '@1password/sdk' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import * as ipaddr from 'ipaddr.js' import { secureFetchWithPinnedIP } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' /** Connect-format field type strings returned by normalization. */ type ConnectFieldType = diff --git a/apps/sim/app/api/tools/outlook/folders/route.ts b/apps/sim/app/api/tools/outlook/folders/route.ts index 26fa0e9da80..ffb2833fb80 100644 --- a/apps/sim/app/api/tools/outlook/folders/route.ts +++ b/apps/sim/app/api/tools/outlook/folders/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { account } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq } from 'drizzle-orm' import { NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { validateAlphanumericId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { refreshAccessTokenIfNeeded, resolveOAuthAccountId } from '@/app/api/auth/oauth/utils' diff --git a/apps/sim/app/api/tools/postgresql/delete/route.ts b/apps/sim/app/api/tools/postgresql/delete/route.ts index 05309cda907..8099febb5fa 100644 --- a/apps/sim/app/api/tools/postgresql/delete/route.ts +++ b/apps/sim/app/api/tools/postgresql/delete/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createPostgresConnection, executeDelete } from '@/app/api/tools/postgresql/utils' const logger = createLogger('PostgreSQLDeleteAPI') diff --git a/apps/sim/app/api/tools/postgresql/execute/route.ts b/apps/sim/app/api/tools/postgresql/execute/route.ts index 1dba7c11414..e898926280b 100644 --- a/apps/sim/app/api/tools/postgresql/execute/route.ts +++ b/apps/sim/app/api/tools/postgresql/execute/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createPostgresConnection, executeQuery, diff --git a/apps/sim/app/api/tools/postgresql/insert/route.ts b/apps/sim/app/api/tools/postgresql/insert/route.ts index 01073a96577..7030bd622a2 100644 --- a/apps/sim/app/api/tools/postgresql/insert/route.ts +++ b/apps/sim/app/api/tools/postgresql/insert/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createPostgresConnection, executeInsert } from '@/app/api/tools/postgresql/utils' const logger = createLogger('PostgreSQLInsertAPI') diff --git a/apps/sim/app/api/tools/postgresql/introspect/route.ts b/apps/sim/app/api/tools/postgresql/introspect/route.ts index cf376bef9de..e7e476cefa2 100644 --- a/apps/sim/app/api/tools/postgresql/introspect/route.ts +++ b/apps/sim/app/api/tools/postgresql/introspect/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createPostgresConnection, executeIntrospect } from '@/app/api/tools/postgresql/utils' const logger = createLogger('PostgreSQLIntrospectAPI') diff --git a/apps/sim/app/api/tools/postgresql/query/route.ts b/apps/sim/app/api/tools/postgresql/query/route.ts index 72e73489a5b..f41d2b8598c 100644 --- a/apps/sim/app/api/tools/postgresql/query/route.ts +++ b/apps/sim/app/api/tools/postgresql/query/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createPostgresConnection, executeQuery } from '@/app/api/tools/postgresql/utils' const logger = createLogger('PostgreSQLQueryAPI') diff --git a/apps/sim/app/api/tools/postgresql/update/route.ts b/apps/sim/app/api/tools/postgresql/update/route.ts index 4eb2cc9d4da..e7241f0f980 100644 --- a/apps/sim/app/api/tools/postgresql/update/route.ts +++ b/apps/sim/app/api/tools/postgresql/update/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createPostgresConnection, executeUpdate } from '@/app/api/tools/postgresql/utils' const logger = createLogger('PostgreSQLUpdateAPI') diff --git a/apps/sim/app/api/tools/rds/delete/route.ts b/apps/sim/app/api/tools/rds/delete/route.ts index 92b2c9d0b93..318a0f3c9e8 100644 --- a/apps/sim/app/api/tools/rds/delete/route.ts +++ b/apps/sim/app/api/tools/rds/delete/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createRdsClient, executeDelete } from '@/app/api/tools/rds/utils' const logger = createLogger('RDSDeleteAPI') diff --git a/apps/sim/app/api/tools/rds/execute/route.ts b/apps/sim/app/api/tools/rds/execute/route.ts index af6304f98da..5dfdd9ebdc2 100644 --- a/apps/sim/app/api/tools/rds/execute/route.ts +++ b/apps/sim/app/api/tools/rds/execute/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createRdsClient, executeStatement } from '@/app/api/tools/rds/utils' const logger = createLogger('RDSExecuteAPI') diff --git a/apps/sim/app/api/tools/rds/insert/route.ts b/apps/sim/app/api/tools/rds/insert/route.ts index 7fba5fcbb7c..f80680db656 100644 --- a/apps/sim/app/api/tools/rds/insert/route.ts +++ b/apps/sim/app/api/tools/rds/insert/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createRdsClient, executeInsert } from '@/app/api/tools/rds/utils' const logger = createLogger('RDSInsertAPI') diff --git a/apps/sim/app/api/tools/rds/introspect/route.ts b/apps/sim/app/api/tools/rds/introspect/route.ts index 2e8aa42a8ef..e08ed73cf13 100644 --- a/apps/sim/app/api/tools/rds/introspect/route.ts +++ b/apps/sim/app/api/tools/rds/introspect/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createRdsClient, executeIntrospect, type RdsEngine } from '@/app/api/tools/rds/utils' const logger = createLogger('RDSIntrospectAPI') diff --git a/apps/sim/app/api/tools/rds/query/route.ts b/apps/sim/app/api/tools/rds/query/route.ts index 21a73291073..0793083c903 100644 --- a/apps/sim/app/api/tools/rds/query/route.ts +++ b/apps/sim/app/api/tools/rds/query/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createRdsClient, executeStatement, validateQuery } from '@/app/api/tools/rds/utils' const logger = createLogger('RDSQueryAPI') diff --git a/apps/sim/app/api/tools/rds/update/route.ts b/apps/sim/app/api/tools/rds/update/route.ts index 1e2826e4ac7..2dd8418ac7d 100644 --- a/apps/sim/app/api/tools/rds/update/route.ts +++ b/apps/sim/app/api/tools/rds/update/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createRdsClient, executeUpdate } from '@/app/api/tools/rds/utils' const logger = createLogger('RDSUpdateAPI') diff --git a/apps/sim/app/api/tools/search/route.ts b/apps/sim/app/api/tools/search/route.ts index b45213115d8..ca56c9045ef 100644 --- a/apps/sim/app/api/tools/search/route.ts +++ b/apps/sim/app/api/tools/search/route.ts @@ -1,10 +1,10 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' import { SEARCH_TOOL_COST } from '@/lib/billing/constants' import { env } from '@/lib/core/config/env' -import { generateId } from '@/lib/core/utils/uuid' import { executeTool } from '@/tools' const logger = createLogger('search') diff --git a/apps/sim/app/api/tools/secrets_manager/create-secret/route.ts b/apps/sim/app/api/tools/secrets_manager/create-secret/route.ts index 7cb4a60160b..7f57a9c36b3 100644 --- a/apps/sim/app/api/tools/secrets_manager/create-secret/route.ts +++ b/apps/sim/app/api/tools/secrets_manager/create-secret/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSecret, createSecretsManagerClient } from '../utils' const logger = createLogger('SecretsManagerCreateSecretAPI') diff --git a/apps/sim/app/api/tools/secrets_manager/delete-secret/route.ts b/apps/sim/app/api/tools/secrets_manager/delete-secret/route.ts index 21a35e64af7..82a7229a0ec 100644 --- a/apps/sim/app/api/tools/secrets_manager/delete-secret/route.ts +++ b/apps/sim/app/api/tools/secrets_manager/delete-secret/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSecretsManagerClient, deleteSecret } from '../utils' const logger = createLogger('SecretsManagerDeleteSecretAPI') diff --git a/apps/sim/app/api/tools/secrets_manager/get-secret/route.ts b/apps/sim/app/api/tools/secrets_manager/get-secret/route.ts index 22df5b57072..b8ca8a4cecb 100644 --- a/apps/sim/app/api/tools/secrets_manager/get-secret/route.ts +++ b/apps/sim/app/api/tools/secrets_manager/get-secret/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSecretsManagerClient, getSecretValue } from '../utils' const logger = createLogger('SecretsManagerGetSecretAPI') diff --git a/apps/sim/app/api/tools/secrets_manager/list-secrets/route.ts b/apps/sim/app/api/tools/secrets_manager/list-secrets/route.ts index 58617b4864f..dfe225589d5 100644 --- a/apps/sim/app/api/tools/secrets_manager/list-secrets/route.ts +++ b/apps/sim/app/api/tools/secrets_manager/list-secrets/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSecretsManagerClient, listSecrets } from '../utils' const logger = createLogger('SecretsManagerListSecretsAPI') diff --git a/apps/sim/app/api/tools/secrets_manager/update-secret/route.ts b/apps/sim/app/api/tools/secrets_manager/update-secret/route.ts index 5becf7f0dc3..6be86a34552 100644 --- a/apps/sim/app/api/tools/secrets_manager/update-secret/route.ts +++ b/apps/sim/app/api/tools/secrets_manager/update-secret/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSecretsManagerClient, updateSecretValue } from '../utils' const logger = createLogger('SecretsManagerUpdateSecretAPI') diff --git a/apps/sim/app/api/tools/sftp/utils.ts b/apps/sim/app/api/tools/sftp/utils.ts index 094c784ac28..639672ae438 100644 --- a/apps/sim/app/api/tools/sftp/utils.ts +++ b/apps/sim/app/api/tools/sftp/utils.ts @@ -1,6 +1,6 @@ +import { toError } from '@sim/utils/errors' import { type Attributes, Client, type ConnectConfig, type SFTPWrapper } from 'ssh2' import { validateDatabaseHost } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' const S_IFMT = 0o170000 const S_IFDIR = 0o040000 diff --git a/apps/sim/app/api/tools/sharepoint/site/route.ts b/apps/sim/app/api/tools/sharepoint/site/route.ts index 7afc3954fa2..7984e96d7d6 100644 --- a/apps/sim/app/api/tools/sharepoint/site/route.ts +++ b/apps/sim/app/api/tools/sharepoint/site/route.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { account } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' -import { generateId } from '@/lib/core/utils/uuid' import { refreshAccessTokenIfNeeded, resolveOAuthAccountId } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/smtp/send/route.ts b/apps/sim/app/api/tools/smtp/send/route.ts index 796b7114b3c..40f915367fe 100644 --- a/apps/sim/app/api/tools/smtp/send/route.ts +++ b/apps/sim/app/api/tools/smtp/send/route.ts @@ -1,10 +1,10 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import nodemailer from 'nodemailer' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateDatabaseHost } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { RawFileInputArraySchema } from '@/lib/uploads/utils/file-schemas' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' diff --git a/apps/sim/app/api/tools/sqs/send/route.ts b/apps/sim/app/api/tools/sqs/send/route.ts index c9078aecc4b..e0f12c38334 100644 --- a/apps/sim/app/api/tools/sqs/send/route.ts +++ b/apps/sim/app/api/tools/sqs/send/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSqsClient, sendMessage } from '../utils' const logger = createLogger('SQSSendMessageAPI') diff --git a/apps/sim/app/api/tools/ssh/check-command-exists/route.ts b/apps/sim/app/api/tools/ssh/check-command-exists/route.ts index 186b4c390aa..0e2d545f2df 100644 --- a/apps/sim/app/api/tools/ssh/check-command-exists/route.ts +++ b/apps/sim/app/api/tools/ssh/check-command-exists/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSSHConnection, escapeShellArg, executeSSHCommand } from '@/app/api/tools/ssh/utils' const logger = createLogger('SSHCheckCommandExistsAPI') diff --git a/apps/sim/app/api/tools/ssh/check-file-exists/route.ts b/apps/sim/app/api/tools/ssh/check-file-exists/route.ts index e7e65cc633b..2bcce214702 100644 --- a/apps/sim/app/api/tools/ssh/check-file-exists/route.ts +++ b/apps/sim/app/api/tools/ssh/check-file-exists/route.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import type { Client, SFTPWrapper, Stats } from 'ssh2' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSSHConnection, getFileType, diff --git a/apps/sim/app/api/tools/ssh/create-directory/route.ts b/apps/sim/app/api/tools/ssh/create-directory/route.ts index 467c097d4e3..5bca7dcf229 100644 --- a/apps/sim/app/api/tools/ssh/create-directory/route.ts +++ b/apps/sim/app/api/tools/ssh/create-directory/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSSHConnection, escapeShellArg, diff --git a/apps/sim/app/api/tools/ssh/delete-file/route.ts b/apps/sim/app/api/tools/ssh/delete-file/route.ts index 44506996b07..b0cd4374300 100644 --- a/apps/sim/app/api/tools/ssh/delete-file/route.ts +++ b/apps/sim/app/api/tools/ssh/delete-file/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSSHConnection, escapeShellArg, diff --git a/apps/sim/app/api/tools/ssh/download-file/route.ts b/apps/sim/app/api/tools/ssh/download-file/route.ts index 6dbfdf3c5ee..6aa443d6338 100644 --- a/apps/sim/app/api/tools/ssh/download-file/route.ts +++ b/apps/sim/app/api/tools/ssh/download-file/route.ts @@ -1,10 +1,10 @@ import path from 'path' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import type { Client, SFTPWrapper } from 'ssh2' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { getFileExtension, getMimeTypeFromExtension } from '@/lib/uploads/utils/file-utils' import { createSSHConnection, sanitizePath } from '@/app/api/tools/ssh/utils' diff --git a/apps/sim/app/api/tools/ssh/execute-command/route.ts b/apps/sim/app/api/tools/ssh/execute-command/route.ts index 66b5dfb1555..b888e298bee 100644 --- a/apps/sim/app/api/tools/ssh/execute-command/route.ts +++ b/apps/sim/app/api/tools/ssh/execute-command/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSSHConnection, escapeShellArg, diff --git a/apps/sim/app/api/tools/ssh/execute-script/route.ts b/apps/sim/app/api/tools/ssh/execute-script/route.ts index b0158e43fdd..4ba3e6f4f26 100644 --- a/apps/sim/app/api/tools/ssh/execute-script/route.ts +++ b/apps/sim/app/api/tools/ssh/execute-script/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSSHConnection, escapeShellArg, executeSSHCommand } from '@/app/api/tools/ssh/utils' const logger = createLogger('SSHExecuteScriptAPI') diff --git a/apps/sim/app/api/tools/ssh/get-system-info/route.ts b/apps/sim/app/api/tools/ssh/get-system-info/route.ts index 65a25e82e21..6594baa718b 100644 --- a/apps/sim/app/api/tools/ssh/get-system-info/route.ts +++ b/apps/sim/app/api/tools/ssh/get-system-info/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSSHConnection, executeSSHCommand } from '@/app/api/tools/ssh/utils' const logger = createLogger('SSHGetSystemInfoAPI') diff --git a/apps/sim/app/api/tools/ssh/list-directory/route.ts b/apps/sim/app/api/tools/ssh/list-directory/route.ts index 2971ef9202b..d3f6895c574 100644 --- a/apps/sim/app/api/tools/ssh/list-directory/route.ts +++ b/apps/sim/app/api/tools/ssh/list-directory/route.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import type { Client, FileEntry, SFTPWrapper } from 'ssh2' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSSHConnection, getFileType, diff --git a/apps/sim/app/api/tools/ssh/move-rename/route.ts b/apps/sim/app/api/tools/ssh/move-rename/route.ts index 98285041707..1c2a7c96758 100644 --- a/apps/sim/app/api/tools/ssh/move-rename/route.ts +++ b/apps/sim/app/api/tools/ssh/move-rename/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSSHConnection, escapeShellArg, diff --git a/apps/sim/app/api/tools/ssh/read-file-content/route.ts b/apps/sim/app/api/tools/ssh/read-file-content/route.ts index 7493a6cb10c..5bd159e78a3 100644 --- a/apps/sim/app/api/tools/ssh/read-file-content/route.ts +++ b/apps/sim/app/api/tools/ssh/read-file-content/route.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import type { Client, SFTPWrapper } from 'ssh2' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSSHConnection, sanitizePath } from '@/app/api/tools/ssh/utils' const logger = createLogger('SSHReadFileContentAPI') diff --git a/apps/sim/app/api/tools/ssh/upload-file/route.ts b/apps/sim/app/api/tools/ssh/upload-file/route.ts index 2020271465b..941c6db0874 100644 --- a/apps/sim/app/api/tools/ssh/upload-file/route.ts +++ b/apps/sim/app/api/tools/ssh/upload-file/route.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import type { Client, SFTPWrapper } from 'ssh2' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSSHConnection, sanitizePath } from '@/app/api/tools/ssh/utils' const logger = createLogger('SSHUploadFileAPI') diff --git a/apps/sim/app/api/tools/ssh/utils.ts b/apps/sim/app/api/tools/ssh/utils.ts index a5506419cfa..ed3dae88328 100644 --- a/apps/sim/app/api/tools/ssh/utils.ts +++ b/apps/sim/app/api/tools/ssh/utils.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type Attributes, Client, type ConnectConfig } from 'ssh2' import { validateDatabaseHost } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('SSHUtils') diff --git a/apps/sim/app/api/tools/ssh/write-file-content/route.ts b/apps/sim/app/api/tools/ssh/write-file-content/route.ts index 77a180b9dae..e670f9093a3 100644 --- a/apps/sim/app/api/tools/ssh/write-file-content/route.ts +++ b/apps/sim/app/api/tools/ssh/write-file-content/route.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import type { Client, SFTPWrapper } from 'ssh2' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSSHConnection, sanitizePath } from '@/app/api/tools/ssh/utils' const logger = createLogger('SSHWriteFileContentAPI') diff --git a/apps/sim/app/api/tools/sts/assume-role/route.ts b/apps/sim/app/api/tools/sts/assume-role/route.ts index 4903eb8e8e2..ebec8b8de99 100644 --- a/apps/sim/app/api/tools/sts/assume-role/route.ts +++ b/apps/sim/app/api/tools/sts/assume-role/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { assumeRole, createSTSClient } from '../utils' const logger = createLogger('STSAssumeRoleAPI') diff --git a/apps/sim/app/api/tools/sts/get-access-key-info/route.ts b/apps/sim/app/api/tools/sts/get-access-key-info/route.ts index 2375aca7806..536a5d7eb02 100644 --- a/apps/sim/app/api/tools/sts/get-access-key-info/route.ts +++ b/apps/sim/app/api/tools/sts/get-access-key-info/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSTSClient, getAccessKeyInfo } from '../utils' const logger = createLogger('STSGetAccessKeyInfoAPI') diff --git a/apps/sim/app/api/tools/sts/get-caller-identity/route.ts b/apps/sim/app/api/tools/sts/get-caller-identity/route.ts index 1cb5d263c06..c625fb70615 100644 --- a/apps/sim/app/api/tools/sts/get-caller-identity/route.ts +++ b/apps/sim/app/api/tools/sts/get-caller-identity/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSTSClient, getCallerIdentity } from '../utils' const logger = createLogger('STSGetCallerIdentityAPI') diff --git a/apps/sim/app/api/tools/sts/get-session-token/route.ts b/apps/sim/app/api/tools/sts/get-session-token/route.ts index 05fb77bcb32..338c102572f 100644 --- a/apps/sim/app/api/tools/sts/get-session-token/route.ts +++ b/apps/sim/app/api/tools/sts/get-session-token/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' -import { generateId } from '@/lib/core/utils/uuid' import { createSTSClient, getSessionToken } from '../utils' const logger = createLogger('STSGetSessionTokenAPI') diff --git a/apps/sim/app/api/tools/stt/route.ts b/apps/sim/app/api/tools/stt/route.ts index fbbd8abdb93..213bcf112cd 100644 --- a/apps/sim/app/api/tools/stt/route.ts +++ b/apps/sim/app/api/tools/stt/route.ts @@ -1,4 +1,6 @@ import { createLogger } from '@sim/logger' +import { sleep } from '@sim/utils/helpers' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { extractAudioFromVideo, isVideoFile } from '@/lib/audio/extractor' import { checkInternalAuth } from '@/lib/auth/hybrid' @@ -7,8 +9,6 @@ import { secureFetchWithPinnedIP, validateUrlWithDNS, } from '@/lib/core/security/input-validation.server' -import { sleep } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { getMimeTypeFromExtension, isInternalFileUrl } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage, diff --git a/apps/sim/app/api/tools/textract/parse/route.ts b/apps/sim/app/api/tools/textract/parse/route.ts index 3191e428860..f5ce04fce91 100644 --- a/apps/sim/app/api/tools/textract/parse/route.ts +++ b/apps/sim/app/api/tools/textract/parse/route.ts @@ -1,5 +1,6 @@ import crypto from 'crypto' import { createLogger } from '@sim/logger' +import { sleep } from '@sim/utils/helpers' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkInternalAuth } from '@/lib/auth/hybrid' @@ -9,7 +10,6 @@ import { secureFetchWithPinnedIP, validateUrlWithDNS, } from '@/lib/core/security/input-validation.server' -import { sleep } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { RawFileInputSchema } from '@/lib/uploads/utils/file-schemas' import { isInternalFileUrl, processSingleFileToUserFile } from '@/lib/uploads/utils/file-utils' diff --git a/apps/sim/app/api/tools/tts/unified/route.ts b/apps/sim/app/api/tools/tts/unified/route.ts index 5b6ba35198a..7f9db6e26e6 100644 --- a/apps/sim/app/api/tools/tts/unified/route.ts +++ b/apps/sim/app/api/tools/tts/unified/route.ts @@ -1,10 +1,10 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import type { NextRequest } from 'next/server' import { NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { StorageService } from '@/lib/uploads' import type { AzureTtsParams, diff --git a/apps/sim/app/api/tools/video/route.ts b/apps/sim/app/api/tools/video/route.ts index c8cad166824..48c9865be32 100644 --- a/apps/sim/app/api/tools/video/route.ts +++ b/apps/sim/app/api/tools/video/route.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { sleep } from '@sim/utils/helpers' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalAuth } from '@/lib/auth/hybrid' import { getMaxExecutionTimeout } from '@/lib/core/execution-limits' -import { sleep } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' import type { UserFile } from '@/executor/types' import type { VideoRequestBody } from '@/tools/video/types' diff --git a/apps/sim/app/api/users/me/api-keys/route.ts b/apps/sim/app/api/users/me/api-keys/route.ts index 173bc01be7a..ac09226946d 100644 --- a/apps/sim/app/api/users/me/api-keys/route.ts +++ b/apps/sim/app/api/users/me/api-keys/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { apiKey } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { createApiKey, getApiKeyDisplayFormat } from '@/lib/api-key/auth' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' -import { generateShortId } from '@/lib/core/utils/uuid' const logger = createLogger('ApiKeysAPI') diff --git a/apps/sim/app/api/users/me/settings/route.ts b/apps/sim/app/api/users/me/settings/route.ts index 2c45a0e3ccf..fd8aa9e3055 100644 --- a/apps/sim/app/api/users/me/settings/route.ts +++ b/apps/sim/app/api/users/me/settings/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { settings } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import { NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { generateRequestId } from '@/lib/core/utils/request' -import { generateShortId } from '@/lib/core/utils/uuid' const logger = createLogger('UserSettingsAPI') diff --git a/apps/sim/app/api/users/me/subscription/[id]/transfer/route.ts b/apps/sim/app/api/users/me/subscription/[id]/transfer/route.ts index 96af579f452..a9e977d9633 100644 --- a/apps/sim/app/api/users/me/subscription/[id]/transfer/route.ts +++ b/apps/sim/app/api/users/me/subscription/[id]/transfer/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { member, organization, subscription } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { hasPaidSubscription } from '@/lib/billing' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('SubscriptionTransferAPI') diff --git a/apps/sim/app/api/users/me/usage-logs/route.ts b/apps/sim/app/api/users/me/usage-logs/route.ts index 9de44c4d01e..05d0d7cb650 100644 --- a/apps/sim/app/api/users/me/usage-logs/route.ts +++ b/apps/sim/app/api/users/me/usage-logs/route.ts @@ -1,10 +1,10 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' import { getUserUsageLogs, type UsageLogSource } from '@/lib/billing/core/usage-log' import { dollarsToCredits } from '@/lib/billing/credits/conversion' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('UsageLogsAPI') diff --git a/apps/sim/app/api/v1/admin/credits/route.ts b/apps/sim/app/api/v1/admin/credits/route.ts index 41bcdefd063..e4d393e8fb4 100644 --- a/apps/sim/app/api/v1/admin/credits/route.ts +++ b/apps/sim/app/api/v1/admin/credits/route.ts @@ -26,6 +26,7 @@ import { db } from '@sim/db' import { organization, subscription, user, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { and, eq, inArray } from 'drizzle-orm' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' import { addCredits } from '@/lib/billing/credits/balance' @@ -36,7 +37,6 @@ import { getEffectiveSeats, isOrgScopedSubscription, } from '@/lib/billing/subscriptions/utils' -import { generateShortId } from '@/lib/core/utils/uuid' import { withAdminAuth } from '@/app/api/v1/admin/middleware' import { badRequestResponse, diff --git a/apps/sim/app/api/v1/admin/organizations/route.ts b/apps/sim/app/api/v1/admin/organizations/route.ts index f4da57737e6..0a87080fdf9 100644 --- a/apps/sim/app/api/v1/admin/organizations/route.ts +++ b/apps/sim/app/api/v1/admin/organizations/route.ts @@ -24,8 +24,8 @@ import { db } from '@sim/db' import { member, organization, user } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { count, eq } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' import { withAdminAuth } from '@/app/api/v1/admin/middleware' import { badRequestResponse, diff --git a/apps/sim/app/api/v1/admin/outbox/[id]/requeue/route.ts b/apps/sim/app/api/v1/admin/outbox/[id]/requeue/route.ts index 9de5c4696be..0b1693bcdf8 100644 --- a/apps/sim/app/api/v1/admin/outbox/[id]/requeue/route.ts +++ b/apps/sim/app/api/v1/admin/outbox/[id]/requeue/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { outboxEvent } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq } from 'drizzle-orm' import { NextResponse } from 'next/server' import { withAdminAuthParams } from '@/app/api/v1/admin/middleware' @@ -56,16 +57,7 @@ export const POST = withAdminAuthParams<{ id: string }>(async (_request, { param requeued: result[0], }) } catch (error) { - logger.error('Failed to requeue outbox event', { - eventId: id, - error: error instanceof Error ? error.message : error, - }) - return NextResponse.json( - { - success: false, - error: error instanceof Error ? error.message : 'Unknown error', - }, - { status: 500 } - ) + logger.error('Failed to requeue outbox event', { eventId: id, error: toError(error).message }) + return NextResponse.json({ success: false, error: toError(error).message }, { status: 500 }) } }) diff --git a/apps/sim/app/api/v1/admin/outbox/route.ts b/apps/sim/app/api/v1/admin/outbox/route.ts index addcb5bbe67..87acb5d006a 100644 --- a/apps/sim/app/api/v1/admin/outbox/route.ts +++ b/apps/sim/app/api/v1/admin/outbox/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { outboxEvent } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, desc, eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { withAdminAuth } from '@/app/api/v1/admin/middleware' @@ -77,15 +78,7 @@ export const GET = withAdminAuth(async (request: NextRequest) => { counts, }) } catch (error) { - logger.error('Failed to list outbox events', { - error: error instanceof Error ? error.message : error, - }) - return NextResponse.json( - { - success: false, - error: error instanceof Error ? error.message : 'Unknown error', - }, - { status: 500 } - ) + logger.error('Failed to list outbox events', { error: toError(error).message }) + return NextResponse.json({ success: false, error: toError(error).message }, { status: 500 }) } }) diff --git a/apps/sim/app/api/v1/admin/users/[id]/billing/route.ts b/apps/sim/app/api/v1/admin/users/[id]/billing/route.ts index ecc10aab242..537e5b70eab 100644 --- a/apps/sim/app/api/v1/admin/users/[id]/billing/route.ts +++ b/apps/sim/app/api/v1/admin/users/[id]/billing/route.ts @@ -21,10 +21,10 @@ import { db } from '@sim/db' import { member, organization, subscription, user, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { eq, or } from 'drizzle-orm' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' import { isOrgScopedSubscription } from '@/lib/billing/subscriptions/utils' -import { generateShortId } from '@/lib/core/utils/uuid' import { withAdminAuthParams } from '@/app/api/v1/admin/middleware' import { badRequestResponse, diff --git a/apps/sim/app/api/v1/admin/workflows/import/route.ts b/apps/sim/app/api/v1/admin/workflows/import/route.ts index 1d384f0cf6b..5332b8a6afb 100644 --- a/apps/sim/app/api/v1/admin/workflows/import/route.ts +++ b/apps/sim/app/api/v1/admin/workflows/import/route.ts @@ -17,9 +17,9 @@ import { db } from '@sim/db' import { workflow, workspace } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import { NextResponse } from 'next/server' -import { generateId } from '@/lib/core/utils/uuid' import { parseWorkflowJson } from '@/lib/workflows/operations/import-export' import { saveWorkflowToNormalizedTables } from '@/lib/workflows/persistence/utils' import { deduplicateWorkflowName } from '@/lib/workflows/utils' diff --git a/apps/sim/app/api/v1/admin/workspaces/[id]/import/route.ts b/apps/sim/app/api/v1/admin/workspaces/[id]/import/route.ts index adcc927785d..37e13941b72 100644 --- a/apps/sim/app/api/v1/admin/workspaces/[id]/import/route.ts +++ b/apps/sim/app/api/v1/admin/workspaces/[id]/import/route.ts @@ -26,9 +26,9 @@ import { db } from '@sim/db' import { workflow, workflowFolder } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import { NextResponse } from 'next/server' -import { generateId } from '@/lib/core/utils/uuid' import { extractWorkflowName, extractWorkflowsFromZip, diff --git a/apps/sim/app/api/v1/admin/workspaces/[id]/members/route.ts b/apps/sim/app/api/v1/admin/workspaces/[id]/members/route.ts index d9a399268fd..c5af318a5cf 100644 --- a/apps/sim/app/api/v1/admin/workspaces/[id]/members/route.ts +++ b/apps/sim/app/api/v1/admin/workspaces/[id]/members/route.ts @@ -33,8 +33,8 @@ import { db } from '@sim/db' import { permissions, user, workspaceEnvironment } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, count, eq } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' import { syncWorkspaceEnvCredentials } from '@/lib/credentials/environment' import { getWorkspaceById } from '@/lib/workspaces/permissions/utils' import { withAdminAuthParams } from '@/app/api/v1/admin/middleware' diff --git a/apps/sim/app/api/v1/audit-logs/[id]/route.ts b/apps/sim/app/api/v1/audit-logs/[id]/route.ts index 948a034afc0..5124c669a81 100644 --- a/apps/sim/app/api/v1/audit-logs/[id]/route.ts +++ b/apps/sim/app/api/v1/audit-logs/[id]/route.ts @@ -13,9 +13,9 @@ import { db } from '@sim/db' import { auditLog, workspace } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, inArray, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' -import { generateId } from '@/lib/core/utils/uuid' import { validateEnterpriseAuditAccess } from '@/app/api/v1/audit-logs/auth' import { formatAuditLogEntry } from '@/app/api/v1/audit-logs/format' import { createApiResponse, getUserLimits } from '@/app/api/v1/logs/meta' diff --git a/apps/sim/app/api/v1/audit-logs/route.ts b/apps/sim/app/api/v1/audit-logs/route.ts index 046680bde44..e21f6347f40 100644 --- a/apps/sim/app/api/v1/audit-logs/route.ts +++ b/apps/sim/app/api/v1/audit-logs/route.ts @@ -20,9 +20,9 @@ */ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { generateId } from '@/lib/core/utils/uuid' import { validateEnterpriseAuditAccess } from '@/app/api/v1/audit-logs/auth' import { formatAuditLogEntry } from '@/app/api/v1/audit-logs/format' import { diff --git a/apps/sim/app/api/v1/copilot/chat/route.ts b/apps/sim/app/api/v1/copilot/chat/route.ts index 3fed69a78bb..79b09f4e9d3 100644 --- a/apps/sim/app/api/v1/copilot/chat/route.ts +++ b/apps/sim/app/api/v1/copilot/chat/route.ts @@ -1,10 +1,10 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { COPILOT_REQUEST_MODES } from '@/lib/copilot/constants' import { runHeadlessCopilotLifecycle } from '@/lib/copilot/request/lifecycle/headless' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { getWorkflowById, resolveWorkflowIdForUser } from '@/lib/workflows/utils' import { authenticateV1Request } from '@/app/api/v1/auth' diff --git a/apps/sim/app/api/v1/logs/[id]/route.ts b/apps/sim/app/api/v1/logs/[id]/route.ts index e9b33de99ff..8af970e4be9 100644 --- a/apps/sim/app/api/v1/logs/[id]/route.ts +++ b/apps/sim/app/api/v1/logs/[id]/route.ts @@ -1,9 +1,9 @@ import { db } from '@sim/db' import { permissions, workflow, workflowExecutionLogs } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' -import { generateId } from '@/lib/core/utils/uuid' import { createApiResponse, getUserLimits } from '@/app/api/v1/logs/meta' import { checkRateLimit, createRateLimitResponse } from '@/app/api/v1/middleware' diff --git a/apps/sim/app/api/v1/logs/route.ts b/apps/sim/app/api/v1/logs/route.ts index cab370d8141..fc809c09c5e 100644 --- a/apps/sim/app/api/v1/logs/route.ts +++ b/apps/sim/app/api/v1/logs/route.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { permissions, workflow, workflowExecutionLogs } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { generateId } from '@/lib/core/utils/uuid' import { buildLogFilters, getOrderBy } from '@/app/api/v1/logs/filters' import { createApiResponse, getUserLimits } from '@/app/api/v1/logs/meta' import { checkRateLimit, createRateLimitResponse } from '@/app/api/v1/middleware' diff --git a/apps/sim/app/api/v1/tables/[tableId]/rows/[rowId]/route.ts b/apps/sim/app/api/v1/tables/[tableId]/rows/[rowId]/route.ts index af0d8525cc2..00b2420cbb8 100644 --- a/apps/sim/app/api/v1/tables/[tableId]/rows/[rowId]/route.ts +++ b/apps/sim/app/api/v1/tables/[tableId]/rows/[rowId]/route.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { userTableRows } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import type { RowData } from '@/lib/table' import { updateRow } from '@/lib/table' diff --git a/apps/sim/app/api/v1/tables/[tableId]/rows/route.ts b/apps/sim/app/api/v1/tables/[tableId]/rows/route.ts index ee5a91bf436..31d5c1b1608 100644 --- a/apps/sim/app/api/v1/tables/[tableId]/rows/route.ts +++ b/apps/sim/app/api/v1/tables/[tableId]/rows/route.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { userTableRows } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import type { Filter, RowData, Sort, TableSchema } from '@/lib/table' import { diff --git a/apps/sim/app/api/v1/tables/[tableId]/rows/upsert/route.ts b/apps/sim/app/api/v1/tables/[tableId]/rows/upsert/route.ts index 13045436233..8671b61a104 100644 --- a/apps/sim/app/api/v1/tables/[tableId]/rows/upsert/route.ts +++ b/apps/sim/app/api/v1/tables/[tableId]/rows/upsert/route.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import type { RowData } from '@/lib/table' import { upsertRow } from '@/lib/table' diff --git a/apps/sim/app/api/v1/workflows/[id]/route.ts b/apps/sim/app/api/v1/workflows/[id]/route.ts index 15a97f9b9ad..5574d07b0bd 100644 --- a/apps/sim/app/api/v1/workflows/[id]/route.ts +++ b/apps/sim/app/api/v1/workflows/[id]/route.ts @@ -1,9 +1,9 @@ import { db } from '@sim/db' import { workflowBlocks } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' -import { generateId } from '@/lib/core/utils/uuid' import { getActiveWorkflowRecord } from '@/lib/workflows/active-context' import { extractInputFieldsFromBlocks } from '@/lib/workflows/input-format' import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' diff --git a/apps/sim/app/api/v1/workflows/route.ts b/apps/sim/app/api/v1/workflows/route.ts index 718f0afb37f..2691c4b2378 100644 --- a/apps/sim/app/api/v1/workflows/route.ts +++ b/apps/sim/app/api/v1/workflows/route.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { workflow } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, asc, eq, gt, isNull, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { generateId } from '@/lib/core/utils/uuid' import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { createApiResponse, getUserLimits } from '@/app/api/v1/logs/meta' import { checkRateLimit, createRateLimitResponse } from '@/app/api/v1/middleware' diff --git a/apps/sim/app/api/webhooks/agentmail/route.ts b/apps/sim/app/api/webhooks/agentmail/route.ts index 25e87f1de35..997e0cc688f 100644 --- a/apps/sim/app/api/webhooks/agentmail/route.ts +++ b/apps/sim/app/api/webhooks/agentmail/route.ts @@ -8,12 +8,12 @@ import { workspace, } from '@sim/db' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { tasks } from '@trigger.dev/sdk' import { and, eq, gt, ne, sql } from 'drizzle-orm' import { NextResponse } from 'next/server' import { Webhook } from 'svix' import { isTriggerDevEnabled } from '@/lib/core/config/feature-flags' -import { generateId } from '@/lib/core/utils/uuid' import { executeInboxTask } from '@/lib/mothership/inbox/executor' import type { AgentMailWebhookPayload, RejectionReason } from '@/lib/mothership/inbox/types' diff --git a/apps/sim/app/api/webhooks/outbox/process/route.ts b/apps/sim/app/api/webhooks/outbox/process/route.ts index 99b3f02baf6..caf2065768b 100644 --- a/apps/sim/app/api/webhooks/outbox/process/route.ts +++ b/apps/sim/app/api/webhooks/outbox/process/route.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' import { billingOutboxHandlers } from '@/lib/billing/webhooks/outbox-handlers' @@ -33,16 +34,9 @@ export async function GET(request: NextRequest) { result, }) } catch (error) { - logger.error('Outbox processing failed', { - requestId, - error: error instanceof Error ? error.message : error, - }) + logger.error('Outbox processing failed', { requestId, error: toError(error).message }) return NextResponse.json( - { - success: false, - requestId, - error: error instanceof Error ? error.message : 'Unknown error', - }, + { success: false, requestId, error: toError(error).message }, { status: 500 } ) } diff --git a/apps/sim/app/api/webhooks/poll/[provider]/route.ts b/apps/sim/app/api/webhooks/poll/[provider]/route.ts index 053d328b0dd..3934555a978 100644 --- a/apps/sim/app/api/webhooks/poll/[provider]/route.ts +++ b/apps/sim/app/api/webhooks/poll/[provider]/route.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' import { acquireLock, releaseLock } from '@/lib/core/config/redis' -import { generateShortId } from '@/lib/core/utils/uuid' import { pollProvider, VALID_POLLING_PROVIDERS } from '@/lib/webhooks/polling' const logger = createLogger('PollingAPI') diff --git a/apps/sim/app/api/webhooks/route.ts b/apps/sim/app/api/webhooks/route.ts index 0c7174f4294..b9823e24082 100644 --- a/apps/sim/app/api/webhooks/route.ts +++ b/apps/sim/app/api/webhooks/route.ts @@ -1,13 +1,13 @@ import { db } from '@sim/db' import { permissions, webhook, workflow, workflowDeploymentVersion } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId, generateShortId } from '@sim/utils/id' import { and, desc, eq, inArray, isNull, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { PlatformEvents } from '@/lib/core/telemetry' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId, generateShortId } from '@/lib/core/utils/uuid' import { getProviderIdFromServiceId } from '@/lib/oauth' import { captureServerEvent } from '@/lib/posthog/server' import { resolveEnvVarsInObject } from '@/lib/webhooks/env-resolver' diff --git a/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts b/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts index 88073b11cba..3a32df330c2 100644 --- a/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts +++ b/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts @@ -3,22 +3,28 @@ * * @vitest-environment node */ -import { createMockRequest, loggerMock, requestUtilsMock } from '@sim/testing' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { + createMockRequest, + encryptionMock, + executionPreprocessingMock, + executionPreprocessingMockFns, + loggingSessionMock, + requestUtilsMock, + workflowsPersistenceUtilsMock, + workflowsPersistenceUtilsMockFns, + workflowsUtilsMock, +} from '@sim/testing' +import { beforeEach, describe, expect, it, vi } from 'vitest' /** Mock execution dependencies for webhook tests */ function mockExecutionDependencies() { - vi.mock('@/lib/core/security/encryption', () => ({ - decryptSecret: vi.fn().mockResolvedValue({ decrypted: 'decrypted-value' }), - })) + vi.mock('@/lib/core/security/encryption', () => encryptionMock) vi.mock('@/lib/logs/execution/trace-spans/trace-spans', () => ({ buildTraceSpans: vi.fn().mockReturnValue({ traceSpans: [], totalDuration: 100 }), })) - vi.mock('@/lib/workflows/utils', () => ({ - updateWorkflowRunCounts: vi.fn().mockResolvedValue(undefined), - })) + vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) vi.mock('@/serializer', () => ({ Serializer: vi.fn().mockImplementation(() => ({ @@ -170,34 +176,9 @@ vi.mock('@/executor', () => ({ })), })) -vi.mock('@/lib/execution/preprocessing', () => ({ - preprocessExecution: vi.fn().mockResolvedValue({ - success: true, - actorUserId: 'test-user-id', - workflowRecord: { - id: 'test-workflow-id', - userId: 'test-user-id', - isDeployed: true, - workspaceId: 'test-workspace-id', - }, - userSubscription: { - plan: 'pro', - status: 'active', - }, - rateLimitInfo: { - allowed: true, - remaining: 100, - resetAt: new Date(), - }, - }), -})) +vi.mock('@/lib/execution/preprocessing', () => executionPreprocessingMock) -vi.mock('@/lib/logs/execution/logging-session', () => ({ - LoggingSession: vi.fn().mockImplementation(() => ({ - safeStart: vi.fn().mockResolvedValue(undefined), - safeCompleteWithError: vi.fn().mockResolvedValue(undefined), - })), -})) +vi.mock('@/lib/logs/execution/logging-session', () => loggingSessionMock) vi.mock('@/lib/workspaces/utils', () => ({ getWorkspaceBillingSettings: vi.fn().mockResolvedValue(null), @@ -223,16 +204,7 @@ vi.mock('@/lib/core/rate-limiter', () => ({ }, })) -vi.mock('@/lib/workflows/persistence/utils', () => ({ - loadWorkflowFromNormalizedTables: vi.fn().mockResolvedValue({ - blocks: {}, - edges: [], - loops: {}, - parallels: {}, - isFromNormalizedTables: true, - }), - blockExistsInDeployment: vi.fn().mockResolvedValue(true), -})) +vi.mock('@/lib/workflows/persistence/utils', () => workflowsPersistenceUtilsMock) vi.mock('@/lib/webhooks/processor', () => ({ findAllWebhooksForPath: vi.fn().mockImplementation(async (options: { path: string }) => { @@ -381,8 +353,6 @@ vi.mock('drizzle-orm/postgres-js', () => ({ vi.mock('postgres', () => vi.fn().mockReturnValue({})) -vi.mock('@sim/logger', () => loggerMock) - vi.mock('@/lib/core/utils/request', () => requestUtilsMock) process.env.DATABASE_URL = 'postgresql://test:test@localhost:5432/test' @@ -397,6 +367,35 @@ describe('Webhook Trigger API Route', () => { testData.webhooks.length = 0 testData.workflows.length = 0 + executionPreprocessingMockFns.mockPreprocessExecution.mockResolvedValue({ + success: true, + actorUserId: 'test-user-id', + workflowRecord: { + id: 'test-workflow-id', + userId: 'test-user-id', + isDeployed: true, + workspaceId: 'test-workspace-id', + }, + userSubscription: { + plan: 'pro', + status: 'active', + }, + rateLimitInfo: { + allowed: true, + remaining: 100, + resetAt: new Date(), + }, + }) + + workflowsPersistenceUtilsMockFns.mockLoadWorkflowFromNormalizedTables.mockResolvedValue({ + blocks: {}, + edges: [], + loops: {}, + parallels: {}, + isFromNormalizedTables: true, + }) + workflowsPersistenceUtilsMockFns.mockBlockExistsInDeployment.mockResolvedValue(true) + mockExecutionDependencies() mockTriggerDevSdk() @@ -412,10 +411,6 @@ describe('Webhook Trigger API Route', () => { processWebhookMock.mockResolvedValue(new Response('Webhook processed', { status: 200 })) }) - afterEach(() => { - vi.clearAllMocks() - }) - it('should handle 404 for non-existent webhooks', async () => { const req = createMockRequest('POST', { type: 'event.test' }) diff --git a/apps/sim/app/api/workflows/[id]/chat/status/route.test.ts b/apps/sim/app/api/workflows/[id]/chat/status/route.test.ts index 19917b7d8cb..58c2f0d76ed 100644 --- a/apps/sim/app/api/workflows/[id]/chat/status/route.test.ts +++ b/apps/sim/app/api/workflows/[id]/chat/status/route.test.ts @@ -3,19 +3,17 @@ * * @vitest-environment node */ +import { + hybridAuthMock, + hybridAuthMockFns, + schemaMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockCheckSessionOrInternalAuth, - mockAuthorizeWorkflowByWorkspacePermission, - mockDbSelect, - mockDbFrom, - mockDbWhere, - mockDbLimit, -} = vi.hoisted(() => ({ - mockCheckSessionOrInternalAuth: vi.fn(), - mockAuthorizeWorkflowByWorkspacePermission: vi.fn(), +const { mockDbSelect, mockDbFrom, mockDbWhere, mockDbLimit } = vi.hoisted(() => ({ mockDbSelect: vi.fn(), mockDbFrom: vi.fn(), mockDbWhere: vi.fn(), @@ -34,31 +32,11 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - chat: { - id: 'id', - identifier: 'identifier', - title: 'title', - description: 'description', - customizations: 'customizations', - authType: 'authType', - allowedEmails: 'allowedEmails', - outputConfigs: 'outputConfigs', - password: 'password', - isActive: 'isActive', - workflowId: 'workflowId', - archivedAt: 'archivedAt', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: mockAuthorizeWorkflowByWorkspacePermission, -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) import { GET } from '@/app/api/workflows/[id]/chat/status/route' @@ -73,7 +51,7 @@ describe('Workflow Chat Status Route', () => { }) it('returns 401 when unauthenticated', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: false }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: false }) const req = new NextRequest('http://localhost:3000/api/workflows/wf-1/chat/status') const response = await GET(req, { params: Promise.resolve({ id: 'wf-1' }) }) @@ -82,12 +60,12 @@ describe('Workflow Chat Status Route', () => { }) it('returns 403 when user lacks workspace access', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-1', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: false, status: 403, message: 'Access denied', @@ -102,12 +80,12 @@ describe('Workflow Chat Status Route', () => { }) it('returns deployment details when authorized', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-1', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: true, status: 200, workflow: { id: 'wf-1', workspaceId: 'ws-1' }, diff --git a/apps/sim/app/api/workflows/[id]/execute/route.async.test.ts b/apps/sim/app/api/workflows/[id]/execute/route.async.test.ts index 164344640a3..29ebb37e41b 100644 --- a/apps/sim/app/api/workflows/[id]/execute/route.async.test.ts +++ b/apps/sim/app/api/workflows/[id]/execute/route.async.test.ts @@ -2,21 +2,26 @@ * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + createMockRequest, + executionPreprocessingMock, + executionPreprocessingMockFns, + loggingSessionMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockCheckHybridAuth, - mockAuthorizeWorkflowByWorkspacePermission, - mockPreprocessExecution, - mockEnqueue, -} = vi.hoisted(() => ({ +const { mockCheckHybridAuth, mockEnqueue } = vi.hoisted(() => ({ mockCheckHybridAuth: vi.fn(), - mockAuthorizeWorkflowByWorkspacePermission: vi.fn(), - mockPreprocessExecution: vi.fn(), mockEnqueue: vi.fn().mockResolvedValue('job-123'), })) +const mockPreprocessExecution = executionPreprocessingMockFns.mockPreprocessExecution + +const mockAuthorizeWorkflowByWorkspacePermission = + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission + vi.mock('@/lib/auth/hybrid', () => ({ checkHybridAuth: mockCheckHybridAuth, hasExternalApiCredentials: vi.fn().mockReturnValue(true), @@ -27,15 +32,9 @@ vi.mock('@/lib/auth/hybrid', () => ({ }, })) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: mockAuthorizeWorkflowByWorkspacePermission, - createHttpResponseFromBlock: vi.fn(), - workflowHasResponseBlock: vi.fn().mockReturnValue(false), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) -vi.mock('@/lib/execution/preprocessing', () => ({ - preprocessExecution: mockPreprocessExecution, -})) +vi.mock('@/lib/execution/preprocessing', () => executionPreprocessingMock) vi.mock('@/lib/core/async-jobs', () => ({ getJobQueue: vi.fn().mockResolvedValue({ @@ -63,26 +62,13 @@ vi.mock('@/lib/execution/call-chain', () => ({ buildNextCallChain: vi.fn().mockReturnValue(['workflow-1']), })) -vi.mock('@/lib/logs/execution/logging-session', () => ({ - LoggingSession: vi.fn().mockImplementation(() => ({})), -})) +vi.mock('@/lib/logs/execution/logging-session', () => loggingSessionMock) vi.mock('@/background/workflow-execution', () => ({ executeWorkflowJob: vi.fn(), })) -vi.mock('@sim/logger', () => { - const createMockLogger = (): Record => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - withMetadata: vi.fn(() => createMockLogger()), - }) - return { createLogger: vi.fn(() => createMockLogger()) } -}) - -vi.mock('@/lib/core/utils/uuid', () => ({ +vi.mock('@sim/utils/id', () => ({ generateId: vi.fn(() => 'execution-123'), generateShortId: vi.fn(() => 'mock-short-id'), isValidUuid: vi.fn((v: string) => @@ -96,6 +82,8 @@ describe('workflow execute async route', () => { beforeEach(() => { vi.clearAllMocks() + workflowsUtilsMockFns.mockWorkflowHasResponseBlock.mockReturnValue(false) + mockCheckHybridAuth.mockResolvedValue({ success: true, userId: 'session-user-1', diff --git a/apps/sim/app/api/workflows/[id]/execute/route.ts b/apps/sim/app/api/workflows/[id]/execute/route.ts index 307e79cc710..ccbccbc6a60 100644 --- a/apps/sim/app/api/workflows/[id]/execute/route.ts +++ b/apps/sim/app/api/workflows/[id]/execute/route.ts @@ -1,4 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId, isValidUuid } from '@sim/utils/id' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { AuthType, checkHybridAuth, hasExternalApiCredentials } from '@/lib/auth/hybrid' @@ -9,11 +11,9 @@ import { getTimeoutErrorMessage, isTimeoutError, } from '@/lib/core/execution-limits' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { SSE_HEADERS } from '@/lib/core/utils/sse' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId, isValidUuid } from '@/lib/core/utils/uuid' import { buildNextCallChain, parseCallChain, diff --git a/apps/sim/app/api/workflows/[id]/executions/[executionId]/cancel/route.test.ts b/apps/sim/app/api/workflows/[id]/executions/[executionId]/cancel/route.test.ts index 295b17e4e7e..07b7dea3869 100644 --- a/apps/sim/app/api/workflows/[id]/executions/[executionId]/cancel/route.test.ts +++ b/apps/sim/app/api/workflows/[id]/executions/[executionId]/cancel/route.test.ts @@ -2,13 +2,17 @@ * @vitest-environment node */ -import { databaseMock } from '@sim/testing' +import { + databaseMock, + hybridAuthMock, + hybridAuthMockFns, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' const { - mockCheckHybridAuth, - mockAuthorizeWorkflowByWorkspacePermission, mockMarkExecutionCancelled, mockAbortManualExecution, mockCancelPausedExecution, @@ -16,8 +20,6 @@ const { mockWriteEvent, mockCloseWriter, } = vi.hoisted(() => ({ - mockCheckHybridAuth: vi.fn(), - mockAuthorizeWorkflowByWorkspacePermission: vi.fn(), mockMarkExecutionCancelled: vi.fn(), mockAbortManualExecution: vi.fn(), mockCancelPausedExecution: vi.fn(), @@ -26,9 +28,7 @@ const { mockCloseWriter: vi.fn(), })) -vi.mock('@/lib/auth/hybrid', () => ({ - checkHybridAuth: (...args: unknown[]) => mockCheckHybridAuth(...args), -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) vi.mock('@/lib/execution/cancellation', () => ({ markExecutionCancelled: (...args: unknown[]) => mockMarkExecutionCancelled(...args), @@ -44,10 +44,7 @@ vi.mock('@/lib/workflows/executor/human-in-the-loop-manager', () => ({ }, })) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: (params: unknown) => - mockAuthorizeWorkflowByWorkspacePermission(params), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) vi.mock('@/lib/posthog/server', () => ({ captureServerEvent: vi.fn(), @@ -73,8 +70,10 @@ const makeParams = () => ({ params: Promise.resolve({ id: 'wf-1', executionId: ' describe('POST /api/workflows/[id]/executions/[executionId]/cancel', () => { beforeEach(() => { vi.clearAllMocks() - mockCheckHybridAuth.mockResolvedValue({ success: true, userId: 'user-1' }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: true }) + hybridAuthMockFns.mockCheckHybridAuth.mockResolvedValue({ success: true, userId: 'user-1' }) + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ + allowed: true, + }) mockAbortManualExecution.mockReturnValue(false) mockCancelPausedExecution.mockResolvedValue(false) mockSetExecutionMeta.mockResolvedValue(undefined) @@ -185,7 +184,10 @@ describe('POST /api/workflows/[id]/executions/[executionId]/cancel', () => { }) it('returns 401 when auth fails', async () => { - mockCheckHybridAuth.mockResolvedValue({ success: false, error: 'Unauthorized' }) + hybridAuthMockFns.mockCheckHybridAuth.mockResolvedValue({ + success: false, + error: 'Unauthorized', + }) const response = await POST(makeRequest(), makeParams()) @@ -194,7 +196,7 @@ describe('POST /api/workflows/[id]/executions/[executionId]/cancel', () => { it('returns 403 when workflow access is denied', async () => { mockMarkExecutionCancelled.mockResolvedValue({ durablyRecorded: true, reason: 'recorded' }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: false, message: 'Access denied', status: 403, diff --git a/apps/sim/app/api/workflows/[id]/executions/[executionId]/stream/route.ts b/apps/sim/app/api/workflows/[id]/executions/[executionId]/stream/route.ts index f602e08bc57..5c1d7ee7659 100644 --- a/apps/sim/app/api/workflows/[id]/executions/[executionId]/stream/route.ts +++ b/apps/sim/app/api/workflows/[id]/executions/[executionId]/stream/route.ts @@ -1,7 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' -import { sleep, toError } from '@/lib/core/utils/helpers' import { SSE_HEADERS } from '@/lib/core/utils/sse' import { type ExecutionStreamStatus, diff --git a/apps/sim/app/api/workflows/[id]/form/status/route.test.ts b/apps/sim/app/api/workflows/[id]/form/status/route.test.ts index 4e16e491fd0..6aba9e94142 100644 --- a/apps/sim/app/api/workflows/[id]/form/status/route.test.ts +++ b/apps/sim/app/api/workflows/[id]/form/status/route.test.ts @@ -3,19 +3,17 @@ * * @vitest-environment node */ +import { + hybridAuthMock, + hybridAuthMockFns, + schemaMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockCheckSessionOrInternalAuth, - mockAuthorizeWorkflowByWorkspacePermission, - mockDbSelect, - mockDbFrom, - mockDbWhere, - mockDbLimit, -} = vi.hoisted(() => ({ - mockCheckSessionOrInternalAuth: vi.fn(), - mockAuthorizeWorkflowByWorkspacePermission: vi.fn(), +const { mockDbSelect, mockDbFrom, mockDbWhere, mockDbLimit } = vi.hoisted(() => ({ mockDbSelect: vi.fn(), mockDbFrom: vi.fn(), mockDbWhere: vi.fn(), @@ -33,24 +31,11 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - form: { - id: 'id', - identifier: 'identifier', - title: 'title', - workflowId: 'workflowId', - isActive: 'isActive', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: mockAuthorizeWorkflowByWorkspacePermission, -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) import { GET } from '@/app/api/workflows/[id]/form/status/route' @@ -65,7 +50,7 @@ describe('Workflow Form Status Route', () => { }) it('returns 401 when unauthenticated', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: false }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: false }) const req = new NextRequest('http://localhost:3000/api/workflows/wf-1/form/status') const response = await GET(req, { params: Promise.resolve({ id: 'wf-1' }) }) @@ -74,12 +59,12 @@ describe('Workflow Form Status Route', () => { }) it('returns 403 when user lacks workspace access', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-1', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: false, status: 403, message: 'Access denied', @@ -94,12 +79,12 @@ describe('Workflow Form Status Route', () => { }) it('returns deployed form when authorized', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-1', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: true, status: 200, workflow: { id: 'wf-1', workspaceId: 'ws-1' }, diff --git a/apps/sim/app/api/workflows/[id]/route.test.ts b/apps/sim/app/api/workflows/[id]/route.test.ts index 383594b5453..0cfe4076b52 100644 --- a/apps/sim/app/api/workflows/[id]/route.test.ts +++ b/apps/sim/app/api/workflows/[id]/route.test.ts @@ -5,16 +5,30 @@ * @vitest-environment node */ -import { auditMock, envMock, loggerMock, requestUtilsMock, telemetryMock } from '@sim/testing' +import { + auditMock, + authMock, + envMock, + hybridAuthMock, + hybridAuthMockFns, + requestUtilsMock, + telemetryMock, + workflowsOrchestrationMock, + workflowsOrchestrationMockFns, + workflowsPersistenceUtilsMock, + workflowsPersistenceUtilsMockFns, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' - -const mockCheckHybridAuth = vi.fn() -const mockCheckSessionOrInternalAuth = vi.fn() -const mockLoadWorkflowFromNormalizedTables = vi.fn() -const mockGetWorkflowById = vi.fn() -const mockAuthorizeWorkflowByWorkspacePermission = vi.fn() -const mockPerformDeleteWorkflow = vi.fn() +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const mockLoadWorkflowFromNormalizedTables = + workflowsPersistenceUtilsMockFns.mockLoadWorkflowFromNormalizedTables +const mockGetWorkflowById = workflowsUtilsMockFns.mockGetWorkflowById +const mockAuthorizeWorkflowByWorkspacePermission = + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission +const mockPerformDeleteWorkflow = workflowsOrchestrationMockFns.mockPerformDeleteWorkflow const mockDbUpdate = vi.fn() const mockDbSelect = vi.fn() @@ -23,23 +37,23 @@ const mockDbSelect = vi.fn() */ function mockGetSession(session: { user: { id: string } } | null) { if (session) { - mockCheckHybridAuth.mockResolvedValue({ success: true, userId: session.user.id }) - mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: session.user.id }) + hybridAuthMockFns.mockCheckHybridAuth.mockResolvedValue({ + success: true, + userId: session.user.id, + }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ + success: true, + userId: session.user.id, + }) } else { - mockCheckHybridAuth.mockResolvedValue({ success: false }) - mockCheckSessionOrInternalAuth.mockResolvedValue({ success: false }) + hybridAuthMockFns.mockCheckHybridAuth.mockResolvedValue({ success: false }) + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: false }) } } -vi.mock('@/lib/auth', () => ({ - getSession: vi.fn(), -})) +vi.mock('@/lib/auth', () => authMock) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkHybridAuth: (...args: unknown[]) => mockCheckHybridAuth(...args), - checkSessionOrInternalAuth: (...args: unknown[]) => mockCheckSessionOrInternalAuth(...args), -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) vi.mock('@/lib/core/config/env', () => envMock) @@ -47,27 +61,13 @@ vi.mock('@/lib/core/telemetry', () => telemetryMock) vi.mock('@/lib/core/utils/request', () => requestUtilsMock) -vi.mock('@sim/logger', () => loggerMock) - vi.mock('@/lib/audit/log', () => auditMock) -vi.mock('@/lib/workflows/persistence/utils', () => ({ - loadWorkflowFromNormalizedTables: (workflowId: string) => - mockLoadWorkflowFromNormalizedTables(workflowId), -})) +vi.mock('@/lib/workflows/persistence/utils', () => workflowsPersistenceUtilsMock) -vi.mock('@/lib/workflows/utils', () => ({ - getWorkflowById: (workflowId: string) => mockGetWorkflowById(workflowId), - authorizeWorkflowByWorkspacePermission: (params: { - workflowId: string - userId: string - action?: 'read' | 'write' | 'admin' - }) => mockAuthorizeWorkflowByWorkspacePermission(params), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) -vi.mock('@/lib/workflows/orchestration', () => ({ - performDeleteWorkflow: (...args: unknown[]) => mockPerformDeleteWorkflow(...args), -})) +vi.mock('@/lib/workflows/orchestration', () => workflowsOrchestrationMock) vi.mock('@sim/db', () => ({ db: { @@ -90,10 +90,6 @@ describe('Workflow By ID API Route', () => { mockLoadWorkflowFromNormalizedTables.mockResolvedValue(null) }) - afterEach(() => { - vi.clearAllMocks() - }) - describe('GET /api/workflows/[id]', () => { it('should return 401 when user is not authenticated', async () => { mockGetSession(null) diff --git a/apps/sim/app/api/workflows/[id]/state/route.ts b/apps/sim/app/api/workflows/[id]/state/route.ts index 0260a1129d9..05eb9e90483 100644 --- a/apps/sim/app/api/workflows/[id]/state/route.ts +++ b/apps/sim/app/api/workflows/[id]/state/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { workflow } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' import { env } from '@/lib/core/config/env' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { getSocketServerUrl } from '@/lib/core/utils/urls' import { extractAndPersistCustomTools } from '@/lib/workflows/persistence/custom-tools-persistence' diff --git a/apps/sim/app/api/workflows/[id]/variables/route.test.ts b/apps/sim/app/api/workflows/[id]/variables/route.test.ts index 99a07d6f12b..e21f717381d 100644 --- a/apps/sim/app/api/workflows/[id]/variables/route.test.ts +++ b/apps/sim/app/api/workflows/[id]/variables/route.test.ts @@ -4,31 +4,24 @@ * * @vitest-environment node */ -import { auditMock } from '@sim/testing' +import { + auditMock, + hybridAuthMock, + hybridAuthMockFns, + requestUtilsMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockCheckSessionOrInternalAuth, mockAuthorizeWorkflowByWorkspacePermission } = vi.hoisted( - () => ({ - mockCheckSessionOrInternalAuth: vi.fn(), - mockAuthorizeWorkflowByWorkspacePermission: vi.fn(), - }) -) - vi.mock('@/lib/audit/log', () => auditMock) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: mockAuthorizeWorkflowByWorkspacePermission, -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) -vi.mock('@/lib/core/utils/request', () => ({ - generateRequestId: vi.fn().mockReturnValue('mock-request-id-12345678'), -})) +vi.mock('@/lib/core/utils/request', () => requestUtilsMock) import { GET, POST } from '@/app/api/workflows/[id]/variables/route' @@ -39,7 +32,7 @@ describe('Workflow Variables API Route', () => { describe('GET /api/workflows/[id]/variables', () => { it('should return 401 when user is not authenticated', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: false, error: 'Authentication required', }) @@ -55,12 +48,12 @@ describe('Workflow Variables API Route', () => { }) it('should return 404 when workflow does not exist', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-123', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: false, status: 404, message: 'Workflow not found', @@ -88,12 +81,12 @@ describe('Workflow Variables API Route', () => { }, } - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-123', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: true, status: 200, workflow: mockWorkflow, @@ -120,12 +113,12 @@ describe('Workflow Variables API Route', () => { }, } - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-123', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: true, status: 200, workflow: mockWorkflow, @@ -150,12 +143,12 @@ describe('Workflow Variables API Route', () => { variables: {}, } - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-123', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: false, status: 403, message: 'Unauthorized: Access denied to read this workflow', @@ -183,12 +176,12 @@ describe('Workflow Variables API Route', () => { }, } - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-123', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: true, status: 200, workflow: mockWorkflow, @@ -215,12 +208,12 @@ describe('Workflow Variables API Route', () => { variables: {}, } - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-123', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: true, status: 200, workflow: mockWorkflow, @@ -258,12 +251,12 @@ describe('Workflow Variables API Route', () => { variables: {}, } - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-123', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: false, status: 403, message: 'Unauthorized: Access denied to write this workflow', @@ -302,12 +295,12 @@ describe('Workflow Variables API Route', () => { variables: {}, } - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-123', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValueOnce({ allowed: true, status: 200, workflow: mockWorkflow, @@ -332,12 +325,12 @@ describe('Workflow Variables API Route', () => { describe('Error handling', () => { it('should handle database errors gracefully', async () => { - mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValueOnce({ success: true, userId: 'user-123', authType: 'session', }) - mockAuthorizeWorkflowByWorkspacePermission.mockRejectedValueOnce( + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission.mockRejectedValueOnce( new Error('Database connection failed') ) diff --git a/apps/sim/app/api/workflows/route.test.ts b/apps/sim/app/api/workflows/route.test.ts index af669d691c5..ab64bd4742b 100644 --- a/apps/sim/app/api/workflows/route.test.ts +++ b/apps/sim/app/api/workflows/route.test.ts @@ -1,24 +1,29 @@ /** * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + auditMock, + createMockRequest, + hybridAuthMock, + hybridAuthMockFns, + permissionsMock, + permissionsMockFns, + schemaMock, + workflowsApiUtilsMock, + workflowsPersistenceUtilsMock, + workflowsPersistenceUtilsMockFns, +} from '@sim/testing' import { drizzleOrmMock } from '@sim/testing/mocks' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockCheckSessionOrInternalAuth, - mockGetUserEntityPermissions, - mockWorkflowCreated, - mockDbSelect, - mockDbInsert, -} = vi.hoisted(() => ({ - mockCheckSessionOrInternalAuth: vi.fn(), - mockGetUserEntityPermissions: vi.fn(), +const { mockWorkflowCreated, mockDbSelect, mockDbInsert } = vi.hoisted(() => ({ mockWorkflowCreated: vi.fn(), mockDbSelect: vi.fn(), mockDbInsert: vi.fn(), })) +const mockGetUserEntityPermissions = permissionsMockFns.mockGetUserEntityPermissions + vi.mock('drizzle-orm', () => ({ ...drizzleOrmMock, min: vi.fn((field) => ({ type: 'min', field })), @@ -38,55 +43,15 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - workflowFolder: { - id: 'id', - userId: 'userId', - parentId: 'parentId', - updatedAt: 'updatedAt', - workspaceId: 'workspaceId', - sortOrder: 'sortOrder', - createdAt: 'createdAt', - }, - workflow: { - id: 'id', - folderId: 'folderId', - userId: 'userId', - name: 'name', - archivedAt: 'archivedAt', - updatedAt: 'updatedAt', - workspaceId: 'workspaceId', - sortOrder: 'sortOrder', - createdAt: 'createdAt', - }, - permissions: { - entityId: 'entityId', - userId: 'userId', - entityType: 'entityType', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) -vi.mock('@/lib/audit/log', () => ({ - recordAudit: vi.fn(), - AuditAction: { WORKFLOW_CREATED: 'workflow.created' }, - AuditResourceType: { WORKFLOW: 'workflow' }, -})) +vi.mock('@/lib/audit/log', () => auditMock) -vi.mock('@/lib/auth/hybrid', () => ({ - AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' }, - checkHybridAuth: vi.fn(), - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, - checkInternalAuth: vi.fn(), -})) +vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - getUserEntityPermissions: (...args: unknown[]) => mockGetUserEntityPermissions(...args), - workspaceExists: vi.fn(), -})) +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) -vi.mock('@/app/api/workflows/utils', () => ({ - verifyWorkspaceMembership: vi.fn(), -})) +vi.mock('@/app/api/workflows/utils', () => workflowsApiUtilsMock) vi.mock('@/lib/core/telemetry', () => ({ PlatformEvents: { @@ -102,9 +67,7 @@ vi.mock('@/lib/workflows/defaults', () => ({ }), })) -vi.mock('@/lib/workflows/persistence/utils', () => ({ - saveWorkflowToNormalizedTables: vi.fn().mockResolvedValue({ success: true }), -})) +vi.mock('@/lib/workflows/persistence/utils', () => workflowsPersistenceUtilsMock) import { POST } from '@/app/api/workflows/route' @@ -116,13 +79,16 @@ describe('Workflows API Route - POST ordering', () => { randomUUID: vi.fn().mockReturnValue('workflow-new-id'), }) - mockCheckSessionOrInternalAuth.mockResolvedValue({ + hybridAuthMockFns.mockCheckSessionOrInternalAuth.mockResolvedValue({ success: true, userId: 'user-123', userName: 'Test User', userEmail: 'test@example.com', }) mockGetUserEntityPermissions.mockResolvedValue('write') + workflowsPersistenceUtilsMockFns.mockSaveWorkflowToNormalizedTables.mockResolvedValue({ + success: true, + }) }) it('uses top insertion against mixed siblings (folders + workflows)', async () => { diff --git a/apps/sim/app/api/workflows/route.ts b/apps/sim/app/api/workflows/route.ts index f96bd6d352f..2a61e33623a 100644 --- a/apps/sim/app/api/workflows/route.ts +++ b/apps/sim/app/api/workflows/route.ts @@ -1,13 +1,13 @@ import { db } from '@sim/db' import { permissions, workflow, workflowFolder } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, asc, eq, inArray, isNull, min, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { captureServerEvent } from '@/lib/posthog/server' import { getNextWorkflowColor } from '@/lib/workflows/colors' import { buildDefaultWorkflowArtifacts } from '@/lib/workflows/defaults' diff --git a/apps/sim/app/api/workspaces/[id]/_preview/create-preview-route.ts b/apps/sim/app/api/workspaces/[id]/_preview/create-preview-route.ts index 495dd9ead38..a369f9472a9 100644 --- a/apps/sim/app/api/workspaces/[id]/_preview/create-preview-route.ts +++ b/apps/sim/app/api/workspaces/[id]/_preview/create-preview-route.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' -import { toError } from '@/lib/core/utils/helpers' import { MAX_DOCUMENT_PREVIEW_CODE_BYTES } from '@/lib/execution/constants' import { runSandboxTask } from '@/lib/execution/sandbox/run-task' import { verifyWorkspaceMembership } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workspaces/[id]/api-keys/route.ts b/apps/sim/app/api/workspaces/[id]/api-keys/route.ts index 4c156d06f94..261b60c6d2f 100644 --- a/apps/sim/app/api/workspaces/[id]/api-keys/route.ts +++ b/apps/sim/app/api/workspaces/[id]/api-keys/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { apiKey } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { and, eq, inArray } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -9,7 +10,6 @@ import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { PlatformEvents } from '@/lib/core/telemetry' import { generateRequestId } from '@/lib/core/utils/request' -import { generateShortId } from '@/lib/core/utils/uuid' import { captureServerEvent } from '@/lib/posthog/server' import { getUserEntityPermissions, getWorkspaceById } from '@/lib/workspaces/permissions/utils' diff --git a/apps/sim/app/api/workspaces/[id]/byok-keys/route.ts b/apps/sim/app/api/workspaces/[id]/byok-keys/route.ts index 5ccda1fae77..95abedccca6 100644 --- a/apps/sim/app/api/workspaces/[id]/byok-keys/route.ts +++ b/apps/sim/app/api/workspaces/[id]/byok-keys/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { workspaceBYOKKeys } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -8,7 +9,6 @@ import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { decryptSecret, encryptSecret } from '@/lib/core/security/encryption' import { generateRequestId } from '@/lib/core/utils/request' -import { generateShortId } from '@/lib/core/utils/uuid' import { captureServerEvent } from '@/lib/posthog/server' import { getUserEntityPermissions, getWorkspaceById } from '@/lib/workspaces/permissions/utils' diff --git a/apps/sim/app/api/workspaces/[id]/docx/preview/route.test.ts b/apps/sim/app/api/workspaces/[id]/docx/preview/route.test.ts index 17075958685..3b536804dd0 100644 --- a/apps/sim/app/api/workspaces/[id]/docx/preview/route.test.ts +++ b/apps/sim/app/api/workspaces/[id]/docx/preview/route.test.ts @@ -1,23 +1,25 @@ /** * @vitest-environment node */ +import { + authMock, + authMockFns, + workflowsApiUtilsMock, + workflowsApiUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' import { MAX_DOCUMENT_PREVIEW_CODE_BYTES } from '@/lib/execution/constants' -const { mockGetSession, mockVerifyWorkspaceMembership, mockRunSandboxTask } = vi.hoisted(() => ({ - mockGetSession: vi.fn(), - mockVerifyWorkspaceMembership: vi.fn(), +const { mockRunSandboxTask } = vi.hoisted(() => ({ mockRunSandboxTask: vi.fn(), })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +const mockVerifyWorkspaceMembership = workflowsApiUtilsMockFns.mockVerifyWorkspaceMembership -vi.mock('@/app/api/workflows/utils', () => ({ - verifyWorkspaceMembership: mockVerifyWorkspaceMembership, -})) +vi.mock('@/lib/auth', () => authMock) + +vi.mock('@/app/api/workflows/utils', () => workflowsApiUtilsMock) vi.mock('@/lib/execution/sandbox/run-task', () => ({ runSandboxTask: mockRunSandboxTask, @@ -30,7 +32,7 @@ const DOCX_MIME = 'application/vnd.openxmlformats-officedocument.wordprocessingm describe('DOCX preview API route', () => { beforeEach(() => { vi.clearAllMocks() - mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) mockVerifyWorkspaceMembership.mockResolvedValue(true) mockRunSandboxTask.mockResolvedValue(Buffer.from('PK\x03\x04docx')) }) @@ -106,7 +108,7 @@ describe('DOCX preview API route', () => { }) it('returns 401 for unauthenticated requests', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const request = new NextRequest( 'http://localhost:3000/api/workspaces/workspace-1/docx/preview', diff --git a/apps/sim/app/api/workspaces/[id]/environment/route.ts b/apps/sim/app/api/workspaces/[id]/environment/route.ts index 67b1eddeb7a..14d17a4cb27 100644 --- a/apps/sim/app/api/workspaces/[id]/environment/route.ts +++ b/apps/sim/app/api/workspaces/[id]/environment/route.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { workspaceEnvironment } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -8,7 +9,6 @@ import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { encryptSecret } from '@/lib/core/security/encryption' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { syncWorkspaceEnvCredentials } from '@/lib/credentials/environment' import { getPersonalAndWorkspaceEnv } from '@/lib/environment/utils' import { getUserEntityPermissions, getWorkspaceById } from '@/lib/workspaces/permissions/utils' diff --git a/apps/sim/app/api/workspaces/[id]/inbox/senders/route.ts b/apps/sim/app/api/workspaces/[id]/inbox/senders/route.ts index 488f819a48f..21d20c688db 100644 --- a/apps/sim/app/api/workspaces/[id]/inbox/senders/route.ts +++ b/apps/sim/app/api/workspaces/[id]/inbox/senders/route.ts @@ -1,11 +1,11 @@ import { db, mothershipInboxAllowedSender, permissions, user } from '@sim/db' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { hasInboxAccess } from '@/lib/billing/core/subscription' -import { generateId } from '@/lib/core/utils/uuid' import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('InboxSendersAPI') diff --git a/apps/sim/app/api/workspaces/[id]/notifications/[notificationId]/test/route.ts b/apps/sim/app/api/workspaces/[id]/notifications/[notificationId]/test/route.ts index a2cf4ad4848..050e21bfccb 100644 --- a/apps/sim/app/api/workspaces/[id]/notifications/[notificationId]/test/route.ts +++ b/apps/sim/app/api/workspaces/[id]/notifications/[notificationId]/test/route.ts @@ -2,6 +2,8 @@ import { createHmac } from 'crypto' import { db } from '@sim/db' import { account, workspaceNotificationSubscription } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { @@ -12,9 +14,7 @@ import { import { getSession } from '@/lib/auth' import { decryptSecret } from '@/lib/core/security/encryption' import { secureFetchWithValidation } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { sendEmail } from '@/lib/messaging/email/mailer' import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' diff --git a/apps/sim/app/api/workspaces/[id]/notifications/route.ts b/apps/sim/app/api/workspaces/[id]/notifications/route.ts index 3ad7532f8e8..14b9fe56f5d 100644 --- a/apps/sim/app/api/workspaces/[id]/notifications/route.ts +++ b/apps/sim/app/api/workspaces/[id]/notifications/route.ts @@ -1,13 +1,13 @@ import { db } from '@sim/db' import { workflow, workspaceNotificationSubscription } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, inArray } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { encryptSecret } from '@/lib/core/security/encryption' -import { generateId } from '@/lib/core/utils/uuid' import { captureServerEvent } from '@/lib/posthog/server' import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { MAX_EMAIL_RECIPIENTS, MAX_NOTIFICATIONS_PER_TYPE, MAX_WORKFLOW_IDS } from './constants' diff --git a/apps/sim/app/api/workspaces/[id]/pdf/preview/route.test.ts b/apps/sim/app/api/workspaces/[id]/pdf/preview/route.test.ts index e9592f3ed76..095eda1662b 100644 --- a/apps/sim/app/api/workspaces/[id]/pdf/preview/route.test.ts +++ b/apps/sim/app/api/workspaces/[id]/pdf/preview/route.test.ts @@ -1,23 +1,25 @@ /** * @vitest-environment node */ +import { + authMock, + authMockFns, + workflowsApiUtilsMock, + workflowsApiUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' import { MAX_DOCUMENT_PREVIEW_CODE_BYTES } from '@/lib/execution/constants' -const { mockGetSession, mockVerifyWorkspaceMembership, mockRunSandboxTask } = vi.hoisted(() => ({ - mockGetSession: vi.fn(), - mockVerifyWorkspaceMembership: vi.fn(), +const { mockRunSandboxTask } = vi.hoisted(() => ({ mockRunSandboxTask: vi.fn(), })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +const mockVerifyWorkspaceMembership = workflowsApiUtilsMockFns.mockVerifyWorkspaceMembership -vi.mock('@/app/api/workflows/utils', () => ({ - verifyWorkspaceMembership: mockVerifyWorkspaceMembership, -})) +vi.mock('@/lib/auth', () => authMock) + +vi.mock('@/app/api/workflows/utils', () => workflowsApiUtilsMock) vi.mock('@/lib/execution/sandbox/run-task', () => ({ runSandboxTask: mockRunSandboxTask, @@ -28,7 +30,7 @@ import { POST } from '@/app/api/workspaces/[id]/pdf/preview/route' describe('PDF preview API route', () => { beforeEach(() => { vi.clearAllMocks() - mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) mockVerifyWorkspaceMembership.mockResolvedValue(true) mockRunSandboxTask.mockResolvedValue(Buffer.from('%PDF-test')) }) @@ -104,7 +106,7 @@ describe('PDF preview API route', () => { }) it('returns 401 for unauthenticated requests', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const request = new NextRequest( 'http://localhost:3000/api/workspaces/workspace-1/pdf/preview', diff --git a/apps/sim/app/api/workspaces/[id]/permissions/route.ts b/apps/sim/app/api/workspaces/[id]/permissions/route.ts index e7ee5385597..d5add813020 100644 --- a/apps/sim/app/api/workspaces/[id]/permissions/route.ts +++ b/apps/sim/app/api/workspaces/[id]/permissions/route.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { permissions, user, workspace, workspaceEnvironment } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' -import { generateId } from '@/lib/core/utils/uuid' import { syncWorkspaceEnvCredentials } from '@/lib/credentials/environment' import { captureServerEvent } from '@/lib/posthog/server' import { diff --git a/apps/sim/app/api/workspaces/[id]/pptx/preview/route.test.ts b/apps/sim/app/api/workspaces/[id]/pptx/preview/route.test.ts index 776ba4120e4..d46479841a3 100644 --- a/apps/sim/app/api/workspaces/[id]/pptx/preview/route.test.ts +++ b/apps/sim/app/api/workspaces/[id]/pptx/preview/route.test.ts @@ -1,23 +1,25 @@ /** * @vitest-environment node */ +import { + authMock, + authMockFns, + workflowsApiUtilsMock, + workflowsApiUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' import { MAX_DOCUMENT_PREVIEW_CODE_BYTES } from '@/lib/execution/constants' -const { mockGetSession, mockVerifyWorkspaceMembership, mockRunSandboxTask } = vi.hoisted(() => ({ - mockGetSession: vi.fn(), - mockVerifyWorkspaceMembership: vi.fn(), +const { mockRunSandboxTask } = vi.hoisted(() => ({ mockRunSandboxTask: vi.fn(), })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +const mockVerifyWorkspaceMembership = workflowsApiUtilsMockFns.mockVerifyWorkspaceMembership -vi.mock('@/app/api/workflows/utils', () => ({ - verifyWorkspaceMembership: mockVerifyWorkspaceMembership, -})) +vi.mock('@/lib/auth', () => authMock) + +vi.mock('@/app/api/workflows/utils', () => workflowsApiUtilsMock) vi.mock('@/lib/execution/sandbox/run-task', () => ({ runSandboxTask: mockRunSandboxTask, @@ -30,7 +32,7 @@ const PPTX_MIME = 'application/vnd.openxmlformats-officedocument.presentationml. describe('PPTX preview API route', () => { beforeEach(() => { vi.clearAllMocks() - mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-1' } }) mockVerifyWorkspaceMembership.mockResolvedValue(true) mockRunSandboxTask.mockResolvedValue(Buffer.from('PK\x03\x04pptx')) }) @@ -106,7 +108,7 @@ describe('PPTX preview API route', () => { }) it('returns 401 for unauthenticated requests', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const request = new NextRequest( 'http://localhost:3000/api/workspaces/workspace-1/pptx/preview', diff --git a/apps/sim/app/api/workspaces/invitations/[invitationId]/route.test.ts b/apps/sim/app/api/workspaces/invitations/[invitationId]/route.test.ts index 5d1681f1052..8b213f3abf7 100644 --- a/apps/sim/app/api/workspaces/invitations/[invitationId]/route.test.ts +++ b/apps/sim/app/api/workspaces/invitations/[invitationId]/route.test.ts @@ -1,10 +1,18 @@ -import { auditMock, createSession, createWorkspaceRecord, loggerMock } from '@sim/testing' +import { + auditMock, + authMock, + authMockFns, + createSession, + createWorkspaceRecord, + permissionsMock, + permissionsMockFns, + schemaMock, +} from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' -const mockGetSession = vi.fn() -const mockHasWorkspaceAdminAccess = vi.fn() -const mockGetWorkspaceById = vi.fn() +const mockHasWorkspaceAdminAccess = permissionsMockFns.mockHasWorkspaceAdminAccess +const mockGetWorkspaceById = permissionsMockFns.mockGetWorkspaceById let dbSelectResults: any[] = [] let dbSelectCallIndex = 0 @@ -57,22 +65,14 @@ const mockDbTransaction = vi.fn().mockImplementation(async (callback: any) => { }) }) -vi.mock('@/lib/auth', () => ({ - getSession: () => mockGetSession(), -})) +vi.mock('@/lib/auth', () => authMock) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - hasWorkspaceAdminAccess: (userId: string, workspaceId: string) => - mockHasWorkspaceAdminAccess(userId, workspaceId), - getWorkspaceById: (id: string) => mockGetWorkspaceById(id), -})) +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) vi.mock('@/lib/credentials/environment', () => ({ syncWorkspaceEnvCredentials: vi.fn().mockResolvedValue(undefined), })) -vi.mock('@sim/logger', () => loggerMock) - vi.mock('@/lib/audit/log', () => auditMock) vi.mock('@/lib/core/utils/urls', () => ({ @@ -105,37 +105,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - workspaceInvitation: { - id: 'id', - workspaceId: 'workspaceId', - email: 'email', - inviterId: 'inviterId', - status: 'status', - token: 'token', - permissions: 'permissions', - expiresAt: 'expiresAt', - }, - workspace: { - id: 'id', - name: 'name', - }, - user: { - id: 'id', - email: 'email', - }, - permissions: { - id: 'id', - entityType: 'entityType', - entityId: 'entityId', - userId: 'userId', - permissionType: 'permissionType', - }, - workspaceEnvironment: { - workspaceId: 'workspaceId', - variables: 'variables', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ eq: vi.fn((a: unknown, b: unknown) => ({ type: 'eq', a, b })), @@ -143,7 +113,7 @@ vi.mock('drizzle-orm', () => ({ isNull: vi.fn((field: unknown) => ({ type: 'isNull', field })), })) -vi.mock('@/lib/core/utils/uuid', () => ({ +vi.mock('@sim/utils/id', () => ({ generateId: vi.fn().mockReturnValue('mock-uuid-1234'), generateShortId: vi.fn(() => 'mock-short-id'), isValidUuid: vi.fn((v: string) => @@ -193,7 +163,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { describe('GET /api/workspaces/invitations/[invitationId]', () => { it('should return invitation details when caller is the invitee', async () => { const session = createSession({ userId: mockUser.id, email: 'invited@example.com' }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) mockHasWorkspaceAdminAccess.mockResolvedValue(false) dbSelectResults = [[mockInvitation], [mockWorkspace]] @@ -214,7 +184,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { it('should return invitation details when caller is a workspace admin', async () => { const session = createSession({ userId: mockUser.id, email: mockUser.email }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) mockHasWorkspaceAdminAccess.mockResolvedValue(true) dbSelectResults = [[mockInvitation], [mockWorkspace]] @@ -235,7 +205,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { it('should return 403 when caller is neither invitee nor workspace admin', async () => { const session = createSession({ userId: mockUser.id, email: 'unrelated@example.com' }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) mockHasWorkspaceAdminAccess.mockResolvedValue(false) dbSelectResults = [[mockInvitation], [mockWorkspace]] @@ -250,7 +220,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { }) it('should redirect to login when unauthenticated with token', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const request = new NextRequest( 'http://localhost/api/workspaces/invitations/token-abc123?token=token-abc123' @@ -266,7 +236,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { }) it('should return 401 when unauthenticated without token', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const request = new NextRequest('http://localhost/api/workspaces/invitations/invitation-789') const params = Promise.resolve({ invitationId: 'invitation-789' }) @@ -284,7 +254,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { email: 'invited@example.com', name: mockUser.name, }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) dbSelectResults = [ [mockInvitation], @@ -313,7 +283,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { email: 'invited@example.com', name: mockUser.name, }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) const expiredInvitation = { ...mockInvitation, @@ -342,7 +312,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { email: 'wrong@example.com', name: mockUser.name, }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) dbSelectResults = [ [mockInvitation], @@ -366,7 +336,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { it('should return 404 when invitation not found (without token)', async () => { const session = createSession({ userId: mockUser.id, email: mockUser.email }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) dbSelectResults = [[]] const request = new NextRequest('http://localhost/api/workspaces/invitations/non-existent') @@ -381,7 +351,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { it('should redirect to error page with token preserved when invitation not found (with token)', async () => { const session = createSession({ userId: mockUser.id, email: mockUser.email }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) dbSelectResults = [[]] const request = new NextRequest( @@ -404,7 +374,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { email: 'invited@example.com', name: mockUser.name, }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) const acceptedInvitation = { ...mockInvitation, @@ -433,7 +403,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { email: 'invited@example.com', name: mockUser.name, }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) dbSelectResults = [[mockInvitation], []] @@ -457,7 +427,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { email: 'invited@example.com', name: mockUser.name, }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) dbSelectResults = [[mockInvitation], [mockWorkspace], []] @@ -481,7 +451,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { email: 'wrong@example.com', name: mockUser.name, }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) dbSelectResults = [ [mockInvitation], @@ -511,7 +481,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { email: 'wrong@example.com', name: 'Wrong User', }) - mockGetSession.mockResolvedValue(wrongSession) + authMockFns.mockGetSession.mockResolvedValue(wrongSession) dbSelectResults = [ [mockInvitation], @@ -540,7 +510,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { email: 'invited@example.com', name: mockUser.name, }) - mockGetSession.mockResolvedValue(correctSession) + authMockFns.mockGetSession.mockResolvedValue(correctSession) dbSelectResults = [ [mockInvitation], @@ -566,7 +536,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { describe('DELETE /api/workspaces/invitations/[invitationId]', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const request = new NextRequest( 'http://localhost/api/workspaces/invitations/invitation-789', @@ -583,7 +553,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { it('should return 404 when invitation does not exist', async () => { const session = createSession({ userId: mockUser.id, email: mockUser.email }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) dbSelectResults = [[]] const request = new NextRequest('http://localhost/api/workspaces/invitations/non-existent', { @@ -600,7 +570,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { it('should return 403 when user lacks admin access', async () => { const session = createSession({ userId: mockUser.id, email: mockUser.email }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) mockHasWorkspaceAdminAccess.mockResolvedValue(false) dbSelectResults = [[mockInvitation]] @@ -620,7 +590,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { it('should return 400 when trying to delete non-pending invitation', async () => { const session = createSession({ userId: mockUser.id, email: mockUser.email }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) mockHasWorkspaceAdminAccess.mockResolvedValue(true) const acceptedInvitation = { ...mockInvitation, status: 'accepted' } @@ -641,7 +611,7 @@ describe('Workspace Invitation [invitationId] API Route', () => { it('should successfully delete pending invitation when user has admin access', async () => { const session = createSession({ userId: mockUser.id, email: mockUser.email }) - mockGetSession.mockResolvedValue(session) + authMockFns.mockGetSession.mockResolvedValue(session) mockHasWorkspaceAdminAccess.mockResolvedValue(true) dbSelectResults = [[mockInvitation]] diff --git a/apps/sim/app/api/workspaces/invitations/[invitationId]/route.ts b/apps/sim/app/api/workspaces/invitations/[invitationId]/route.ts index d76322d4e5f..2580c0df140 100644 --- a/apps/sim/app/api/workspaces/invitations/[invitationId]/route.ts +++ b/apps/sim/app/api/workspaces/invitations/[invitationId]/route.ts @@ -9,13 +9,13 @@ import { workspaceInvitation, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { WorkspaceInvitationEmail } from '@/components/emails' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { syncWorkspaceEnvCredentials } from '@/lib/credentials/environment' import { sendEmail } from '@/lib/messaging/email/mailer' import { getFromEmailAddress } from '@/lib/messaging/email/utils' diff --git a/apps/sim/app/api/workspaces/invitations/route.test.ts b/apps/sim/app/api/workspaces/invitations/route.test.ts index 20b697fd8e1..089fd5bd19a 100644 --- a/apps/sim/app/api/workspaces/invitations/route.test.ts +++ b/apps/sim/app/api/workspaces/invitations/route.test.ts @@ -1,11 +1,17 @@ /** * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + authMock, + authMockFns, + createMockRequest, + permissionsMock, + permissionsMockFns, + schemaMock, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' const { - mockGetSession, mockInsertValues, mockDbResults, mockResendSend, @@ -15,9 +21,7 @@ const { mockGetEmailDomain, mockValidateInvitationsAllowed, mockRandomUUID, - mockGetWorkspaceById, } = vi.hoisted(() => { - const mockGetSession = vi.fn() const mockInsertValues = vi.fn().mockResolvedValue(undefined) const mockResendSend = vi.fn().mockResolvedValue({ id: 'email-id' }) const mockRender = vi.fn().mockResolvedValue('email content') @@ -25,7 +29,6 @@ const { const mockGetEmailDomain = vi.fn().mockReturnValue('sim.ai') const mockValidateInvitationsAllowed = vi.fn().mockResolvedValue(undefined) const mockRandomUUID = vi.fn().mockReturnValue('mock-uuid-1234') - const mockGetWorkspaceById = vi.fn() const mockDbResults: { value: any[] } = { value: [] } @@ -44,7 +47,6 @@ const { } return { - mockGetSession, mockInsertValues, mockDbResults, mockResendSend, @@ -54,11 +56,12 @@ const { mockGetEmailDomain, mockValidateInvitationsAllowed, mockRandomUUID, - mockGetWorkspaceById, } }) -vi.mock('@/lib/core/utils/uuid', () => ({ +const mockGetWorkspaceById = permissionsMockFns.mockGetWorkspaceById + +vi.mock('@sim/utils/id', () => ({ generateId: mockRandomUUID, generateShortId: vi.fn(() => 'mock-short-id'), isValidUuid: vi.fn((v: string) => @@ -66,38 +69,13 @@ vi.mock('@/lib/core/utils/uuid', () => ({ ), })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@sim/db', () => ({ db: mockDbChain, })) -vi.mock('@sim/db/schema', () => ({ - user: { id: 'user_id', email: 'user_email', name: 'user_name', image: 'user_image' }, - workspace: { id: 'workspace_id', name: 'workspace_name', ownerId: 'owner_id' }, - permissions: { - userId: 'user_id', - entityId: 'entity_id', - entityType: 'entity_type', - permissionType: 'permission_type', - }, - workspaceInvitation: { - id: 'invitation_id', - workspaceId: 'workspace_id', - email: 'invitation_email', - status: 'invitation_status', - token: 'invitation_token', - inviterId: 'inviter_id', - role: 'invitation_role', - permissions: 'invitation_permissions', - expiresAt: 'expires_at', - createdAt: 'created_at', - updatedAt: 'updated_at', - }, - permissionTypeEnum: { enumValues: ['admin', 'write', 'read'] as const }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('resend', () => ({ Resend: vi.fn().mockImplementation(() => ({ @@ -118,9 +96,7 @@ vi.mock('@/lib/core/config/env', async () => { return createEnvMock() }) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - getWorkspaceById: mockGetWorkspaceById, -})) +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) vi.mock('@/lib/core/utils/urls', () => ({ getEmailDomain: mockGetEmailDomain, @@ -131,15 +107,6 @@ vi.mock('@/lib/audit/log', async () => { return auditMock }) -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})) - vi.mock('drizzle-orm', () => ({ and: vi.fn().mockImplementation((...args: any[]) => ({ type: 'and', conditions: args })), eq: vi.fn().mockImplementation((field: any, value: any) => ({ type: 'eq', field, value })), @@ -193,7 +160,7 @@ describe('Workspace Invitations API Route', () => { describe('GET /api/workspaces/invitations', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('GET') const response = await GET(req) @@ -204,7 +171,7 @@ describe('Workspace Invitations API Route', () => { }) it('should return empty invitations when user has no workspaces', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockDbResults.value = [[], []] // No workspaces, no invitations const req = createMockRequest('GET') @@ -216,7 +183,7 @@ describe('Workspace Invitations API Route', () => { }) it('should return invitations for user workspaces', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const mockWorkspaces = [{ id: 'workspace-1' }, { id: 'workspace-2' }] const mockInvitations = [ { id: 'invitation-1', workspaceId: 'workspace-1', email: 'test@example.com' }, @@ -235,7 +202,7 @@ describe('Workspace Invitations API Route', () => { describe('POST /api/workspaces/invitations', () => { it('should return 401 when user is not authenticated', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const req = createMockRequest('POST', { workspaceId: 'workspace-1', @@ -249,7 +216,7 @@ describe('Workspace Invitations API Route', () => { }) it('should return 400 when workspaceId is missing', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('POST', { email: 'test@example.com' }) const response = await POST(req) @@ -260,7 +227,7 @@ describe('Workspace Invitations API Route', () => { }) it('should return 400 when email is missing', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('POST', { workspaceId: 'workspace-1' }) const response = await POST(req) @@ -271,7 +238,7 @@ describe('Workspace Invitations API Route', () => { }) it('should return 400 when permission type is invalid', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) const req = createMockRequest('POST', { workspaceId: 'workspace-1', @@ -288,7 +255,7 @@ describe('Workspace Invitations API Route', () => { }) it('should return 403 when user does not have admin permissions', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockDbResults.value = [[]] // No admin permissions found const req = createMockRequest('POST', { @@ -303,7 +270,7 @@ describe('Workspace Invitations API Route', () => { }) it('should return 404 when workspace is not found', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockGetWorkspaceById.mockResolvedValueOnce(null) mockDbResults.value = [ [{ permissionType: 'admin' }], // User has admin permissions @@ -321,7 +288,7 @@ describe('Workspace Invitations API Route', () => { }) it('should return 400 when user already has workspace access', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockDbResults.value = [ [{ permissionType: 'admin' }], // User has admin permissions [mockWorkspace], // Workspace exists @@ -344,7 +311,7 @@ describe('Workspace Invitations API Route', () => { }) it('should return 400 when invitation already exists', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123' } }) mockDbResults.value = [ [{ permissionType: 'admin' }], // User has admin permissions [mockWorkspace], // Workspace exists @@ -367,7 +334,7 @@ describe('Workspace Invitations API Route', () => { }) it('should successfully create invitation and send email', async () => { - mockGetSession.mockResolvedValue({ + authMockFns.mockGetSession.mockResolvedValue({ user: { id: 'user-123', name: 'Test User', email: 'sender@example.com' }, }) mockDbResults.value = [ diff --git a/apps/sim/app/api/workspaces/invitations/route.ts b/apps/sim/app/api/workspaces/invitations/route.ts index 020e350dbb2..ff1edf8d55c 100644 --- a/apps/sim/app/api/workspaces/invitations/route.ts +++ b/apps/sim/app/api/workspaces/invitations/route.ts @@ -9,6 +9,7 @@ import { workspaceInvitation, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, inArray, isNull } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { WorkspaceInvitationEmail } from '@/components/emails' @@ -16,7 +17,6 @@ import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { PlatformEvents } from '@/lib/core/telemetry' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { sendEmail } from '@/lib/messaging/email/mailer' import { getFromEmailAddress } from '@/lib/messaging/email/utils' import { captureServerEvent } from '@/lib/posthog/server' diff --git a/apps/sim/app/api/workspaces/route.ts b/apps/sim/app/api/workspaces/route.ts index f8350ec88bd..8bce8063fad 100644 --- a/apps/sim/app/api/workspaces/route.ts +++ b/apps/sim/app/api/workspaces/route.ts @@ -1,13 +1,13 @@ import { db } from '@sim/db' import { permissions, settings, workflow, workspace } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, desc, eq, isNull, sql } from 'drizzle-orm' import { NextResponse } from 'next/server' import { z } from 'zod' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { getSession } from '@/lib/auth' import { PlatformEvents } from '@/lib/core/telemetry' -import { generateId } from '@/lib/core/utils/uuid' import { captureServerEvent } from '@/lib/posthog/server' import { buildDefaultWorkflowArtifacts } from '@/lib/workflows/defaults' import { saveWorkflowToNormalizedTables } from '@/lib/workflows/persistence/utils' diff --git a/apps/sim/app/chat/[identifier]/chat.tsx b/apps/sim/app/chat/[identifier]/chat.tsx index d179385c59d..6a37aeb58f5 100644 --- a/apps/sim/app/chat/[identifier]/chat.tsx +++ b/apps/sim/app/chat/[identifier]/chat.tsx @@ -2,8 +2,8 @@ import { type RefObject, useCallback, useEffect, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { noop } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' import { getFormattedGitHubStars } from '@/app/(landing)/actions/github' import { ChatErrorState, diff --git a/apps/sim/app/chat/components/input/input.tsx b/apps/sim/app/chat/components/input/input.tsx index 2c9d1131be9..c1d23aa4cab 100644 --- a/apps/sim/app/chat/components/input/input.tsx +++ b/apps/sim/app/chat/components/input/input.tsx @@ -3,10 +3,10 @@ import type React from 'react' import { useCallback, useLayoutEffect, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { ArrowUp, Mic, Paperclip, X } from 'lucide-react' import { Badge, Tooltip } from '@/components/emcn' import { cn } from '@/lib/core/utils/cn' -import { generateId } from '@/lib/core/utils/uuid' import { CHAT_ACCEPT_ATTRIBUTE } from '@/lib/uploads/utils/validation' import { VoiceInput } from '@/app/chat/components/input/voice-input' diff --git a/apps/sim/app/chat/components/message/components/file-download.tsx b/apps/sim/app/chat/components/message/components/file-download.tsx index fc148fc9da4..a54c5bf9978 100644 --- a/apps/sim/app/chat/components/message/components/file-download.tsx +++ b/apps/sim/app/chat/components/message/components/file-download.tsx @@ -2,10 +2,10 @@ import { useState } from 'react' import { createLogger } from '@sim/logger' +import { sleep } from '@sim/utils/helpers' import { ArrowDown, Download, Loader2, Music } from 'lucide-react' import { Button } from '@/components/emcn' import { DefaultFileIcon, getDocumentIcon } from '@/components/icons/document-icons' -import { sleep } from '@/lib/core/utils/helpers' import type { ChatFile } from '@/app/chat/components/message/message' const logger = createLogger('ChatFileDownload') diff --git a/apps/sim/app/chat/hooks/use-chat-streaming.ts b/apps/sim/app/chat/hooks/use-chat-streaming.ts index 807cb0a1733..e673764e07f 100644 --- a/apps/sim/app/chat/hooks/use-chat-streaming.ts +++ b/apps/sim/app/chat/hooks/use-chat-streaming.ts @@ -2,8 +2,8 @@ import { useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { isUserFileWithMetadata } from '@/lib/core/utils/user-file' -import { generateId } from '@/lib/core/utils/uuid' import type { ChatFile, ChatMessage } from '@/app/chat/components/message/message' import { CHAT_ERROR_MESSAGES } from '@/app/chat/constants' diff --git a/apps/sim/app/credential-account/[token]/page.tsx b/apps/sim/app/credential-account/[token]/page.tsx index 4f782725b2f..5ecbae4081a 100644 --- a/apps/sim/app/credential-account/[token]/page.tsx +++ b/apps/sim/app/credential-account/[token]/page.tsx @@ -1,6 +1,7 @@ 'use client' import { useCallback, useEffect, useState } from 'react' +import { createLogger } from '@sim/logger' import { Mail } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { GmailIcon, OutlookIcon } from '@/components/icons' @@ -8,6 +9,8 @@ import { client, useSession } from '@/lib/auth/auth-client' import { getProviderDisplayName, isPollingProvider } from '@/lib/credential-sets/providers' import { InviteLayout, InviteStatusCard } from '@/app/invite/components' +const logger = createLogger('CredentialAccount') + interface InvitationInfo { credentialSetName: string organizationName: string @@ -113,7 +116,7 @@ export default function CredentialAccountInvitePage() { }) } catch (oauthError) { // OAuth redirect will happen, this catch is for any pre-redirect errors - console.error('OAuth initiation error:', oauthError) + logger.error('OAuth initiation error:', oauthError) // If OAuth fails, redirect to workspace where they can connect manually router.push('/workspace') } diff --git a/apps/sim/app/ingest/[[...path]]/route.ts b/apps/sim/app/ingest/[[...path]]/route.ts index 9084c5c0f41..18570b3e8c5 100644 --- a/apps/sim/app/ingest/[[...path]]/route.ts +++ b/apps/sim/app/ingest/[[...path]]/route.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { type NextRequest, NextResponse } from 'next/server' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('PostHogProxy') diff --git a/apps/sim/app/resume/[workflowId]/[executionId]/resume-page-client.tsx b/apps/sim/app/resume/[workflowId]/[executionId]/resume-page-client.tsx index f6d2ef0182c..f91b90ed9c2 100644 --- a/apps/sim/app/resume/[workflowId]/[executionId]/resume-page-client.tsx +++ b/apps/sim/app/resume/[workflowId]/[executionId]/resume-page-client.tsx @@ -1,8 +1,12 @@ 'use client' import { useCallback, useEffect, useMemo, useState } from 'react' +import { createLogger } from '@sim/logger' import { RefreshCw } from 'lucide-react' import { useRouter } from 'next/navigation' + +const logger = createLogger('ResumePage') + import { Badge, Button, @@ -592,7 +596,7 @@ export default function ResumeExecutionPage({ } } catch (err) { if ((err as any)?.name !== 'AbortError') { - console.error('Failed to load pause context detail', err) + logger.error('Failed to load pause context detail', err) } } finally { setLoadingDetail(false) @@ -626,7 +630,7 @@ export default function ResumeExecutionPage({ setSelectedContextId(first) } } catch (err) { - console.error('Failed to refresh execution detail', err) + logger.error('Failed to refresh execution detail', err) } finally { setRefreshingExecution(false) } @@ -691,7 +695,7 @@ export default function ResumeExecutionPage({ setFormErrors({}) } } catch (err) { - console.error('Failed to refresh pause context detail', err) + logger.error('Failed to refresh pause context detail', err) } finally { if (showLoader) setLoadingDetail(false) } diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/resource-content.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/resource-content.tsx index 35d8c2e115b..dd04962691d 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/resource-content.tsx +++ b/apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/resource-content.tsx @@ -2,6 +2,7 @@ import { lazy, memo, Suspense, useCallback, useEffect, useMemo, useState } from 'react' import { createLogger } from '@sim/logger' +import { formatDuration } from '@sim/utils/formatting' import { Square } from 'lucide-react' import { useRouter } from 'next/navigation' import { Button, Eye, PlayOutline, Skeleton, Tooltip } from '@/components/emcn' @@ -21,7 +22,6 @@ import { reportManualRunToolStop, } from '@/lib/copilot/tools/client/run-tool-execution' import { cn } from '@/lib/core/utils/cn' -import { formatDuration } from '@/lib/core/utils/formatting' import { filterHiddenOutputKeys } from '@/lib/logs/execution/trace-spans/trace-spans' import { downloadWorkspaceFile, diff --git a/apps/sim/app/workspace/[workspaceId]/home/hooks/use-chat.ts b/apps/sim/app/workspace/[workspaceId]/home/hooks/use-chat.ts index bcdad8292e7..170e55734fc 100644 --- a/apps/sim/app/workspace/[workspaceId]/home/hooks/use-chat.ts +++ b/apps/sim/app/workspace/[workspaceId]/home/hooks/use-chat.ts @@ -1,5 +1,8 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' +import { generateId } from '@sim/utils/id' import { useQueryClient } from '@tanstack/react-query' import { usePathname, useRouter } from 'next/navigation' import { toDisplayMessage } from '@/lib/copilot/chat/display-message' @@ -86,8 +89,6 @@ import { reportManualRunToolStop, } from '@/lib/copilot/tools/client/run-tool-execution' import { isWorkflowToolName } from '@/lib/copilot/tools/workflow-tools' -import { sleep, toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { getNextWorkflowColor } from '@/lib/workflows/colors' import { getQueryClient } from '@/app/_shell/providers/get-query-client' import { invalidateResourceQueries } from '@/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-registry' diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx index f365755a6d2..6665bd6c997 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx @@ -2,6 +2,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { format } from 'date-fns' import { AlertCircle, Loader2, Pencil, Plus, Tag, X } from 'lucide-react' import { useParams, usePathname, useRouter, useSearchParams } from 'next/navigation' @@ -25,7 +26,6 @@ import { import { Database, DatabaseX } from '@/components/emcn/icons' import { SearchHighlight } from '@/components/ui/search-highlight' import { cn } from '@/lib/core/utils/cn' -import { generateId } from '@/lib/core/utils/uuid' import { ADD_CONNECTOR_SEARCH_PARAM } from '@/lib/credentials/client-state' import { ALL_TAG_SLOTS, type AllTagSlot, getFieldTypeForSlot } from '@/lib/knowledge/constants' import type { DocumentSortField, SortOrder } from '@/lib/knowledge/documents/types' diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/base-card/base-card.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/base-card/base-card.tsx index 50933913e03..e14ae0aeee0 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/components/base-card/base-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/base-card/base-card.tsx @@ -1,9 +1,9 @@ 'use client' import { useCallback, useState } from 'react' +import { formatAbsoluteDate, formatRelativeTime } from '@sim/utils/formatting' import { useParams, useRouter } from 'next/navigation' import { Badge, DocumentAttachment, Tooltip } from '@/components/emcn' -import { formatAbsoluteDate, formatRelativeTime } from '@/lib/core/utils/formatting' import { BaseTagsModal } from '@/app/workspace/[workspaceId]/knowledge/[id]/components' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { useContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/hooks' diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/hooks/use-knowledge-upload.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/hooks/use-knowledge-upload.ts index a38c476c46e..d224172f24c 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/hooks/use-knowledge-upload.ts +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/hooks/use-knowledge-upload.ts @@ -1,7 +1,7 @@ import { useCallback, useState } from 'react' import { createLogger } from '@sim/logger' +import { sleep } from '@sim/utils/helpers' import { useQueryClient } from '@tanstack/react-query' -import { sleep } from '@/lib/core/utils/helpers' import { getFileExtension, getMimeTypeFromExtension } from '@/lib/uploads/utils/file-utils' import { knowledgeKeys } from '@/hooks/queries/kb/knowledge' diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/trace-spans/trace-spans.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/trace-spans/trace-spans.tsx index 509654c294b..a6c740a46fa 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/trace-spans/trace-spans.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/trace-spans/trace-spans.tsx @@ -2,6 +2,7 @@ import type React from 'react' import { memo, useCallback, useMemo, useRef, useState } from 'react' +import { formatDuration } from '@sim/utils/formatting' import { ArrowDown, ArrowUp, Check, Clipboard, Search, X } from 'lucide-react' import { createPortal } from 'react-dom' import { @@ -19,7 +20,6 @@ import { import { Copy as CopyIcon, Search as SearchIcon } from '@/components/emcn/icons' import { AgentSkillsIcon, WorkflowIcon } from '@/components/icons' import { cn } from '@/lib/core/utils/cn' -import { formatDuration } from '@/lib/core/utils/formatting' import { LoopTool } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/loop/loop-config' import { ParallelTool } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/parallel/parallel-config' import { getBlock, getBlockByToolName } from '@/blocks' diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/log-details.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/log-details.tsx index a48dc3e8a7f..42e09dd0385 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/log-details.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/log-details.tsx @@ -1,6 +1,7 @@ 'use client' import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { formatDuration } from '@sim/utils/formatting' import { ArrowDown, ArrowUp, Check, ChevronUp, Clipboard, Search, X } from 'lucide-react' import { createPortal } from 'react-dom' import { @@ -18,7 +19,6 @@ import { import { Copy as CopyIcon, Search as SearchIcon } from '@/components/emcn/icons' import { BASE_EXECUTION_CHARGE } from '@/lib/billing/constants' import { cn } from '@/lib/core/utils/cn' -import { formatDuration } from '@/lib/core/utils/formatting' import { filterHiddenOutputKeys } from '@/lib/logs/execution/trace-spans/trace-spans' import { workflowBorderColor } from '@/lib/workspaces/colors' import { diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/logs-list/logs-list.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/logs-list/logs-list.tsx index dab1c288f79..2aad8a647b1 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/logs-list/logs-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/logs-list/logs-list.tsx @@ -1,13 +1,13 @@ 'use client' import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { formatDuration } from '@sim/utils/formatting' import { ArrowUpRight, Loader2 } from 'lucide-react' import Link from 'next/link' import { List, type RowComponentProps, useListRef } from 'react-window' import { Badge, buttonVariants } from '@/components/emcn' import { dollarsToCredits } from '@/lib/billing/credits/conversion' import { cn } from '@/lib/core/utils/cn' -import { formatDuration } from '@/lib/core/utils/formatting' import { workflowBorderColor } from '@/lib/workspaces/colors' import { DELETED_WORKFLOW_COLOR, diff --git a/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx b/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx index fa0373e4444..dc2e188432c 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx @@ -1,6 +1,7 @@ 'use client' import { useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react' +import { formatDuration } from '@sim/utils/formatting' import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'next/navigation' import { useShallow } from 'zustand/react/shallow' @@ -16,7 +17,6 @@ import { import { DatePicker } from '@/components/emcn/components/date-picker/date-picker' import { dollarsToCredits } from '@/lib/billing/credits/conversion' import { cn } from '@/lib/core/utils/cn' -import { formatDuration } from '@/lib/core/utils/formatting' import { getEndDateFromTimeRange, getStartDateFromTimeRange, diff --git a/apps/sim/app/workspace/[workspaceId]/logs/utils.ts b/apps/sim/app/workspace/[workspaceId]/logs/utils.ts index 27cc823a195..535ab8000d9 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/utils.ts +++ b/apps/sim/app/workspace/[workspaceId]/logs/utils.ts @@ -1,7 +1,7 @@ import React from 'react' +import { formatDuration } from '@sim/utils/formatting' import { format } from 'date-fns' import { Badge } from '@/components/emcn' -import { formatDuration } from '@/lib/core/utils/formatting' import { getIntegrationMetadata } from '@/lib/logs/get-trigger-options' import { getBlock } from '@/blocks/registry' import { CORE_TRIGGER_TYPES } from '@/stores/logs/filters/types' diff --git a/apps/sim/app/workspace/[workspaceId]/providers/global-commands-provider.tsx b/apps/sim/app/workspace/[workspaceId]/providers/global-commands-provider.tsx index 75d4bafec1d..f58f4ace977 100644 --- a/apps/sim/app/workspace/[workspaceId]/providers/global-commands-provider.tsx +++ b/apps/sim/app/workspace/[workspaceId]/providers/global-commands-provider.tsx @@ -10,9 +10,9 @@ import { useRef, } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { useRouter } from 'next/navigation' import { isMacPlatform } from '@/lib/core/utils/platform' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('GlobalCommands') diff --git a/apps/sim/app/workspace/[workspaceId]/scheduled-tasks/scheduled-tasks.tsx b/apps/sim/app/workspace/[workspaceId]/scheduled-tasks/scheduled-tasks.tsx index b6676920122..7bcf7169039 100644 --- a/apps/sim/app/workspace/[workspaceId]/scheduled-tasks/scheduled-tasks.tsx +++ b/apps/sim/app/workspace/[workspaceId]/scheduled-tasks/scheduled-tasks.tsx @@ -2,6 +2,7 @@ import { useCallback, useMemo, useState } from 'react' import { createLogger } from '@sim/logger' +import { formatAbsoluteDate } from '@sim/utils/formatting' import { useParams } from 'next/navigation' import { Button, @@ -13,7 +14,6 @@ import { ModalHeader, } from '@/components/emcn' import { Calendar } from '@/components/emcn/icons' -import { formatAbsoluteDate } from '@/lib/core/utils/formatting' import { parseCronToHumanReadable } from '@/lib/workflows/schedules/utils' import type { FilterTag, diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-keys.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-keys.tsx index 7438e59c68b..8b07b87de27 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-keys.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/api-keys/api-keys.tsx @@ -2,6 +2,7 @@ import { useCallback, useMemo, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { formatDate } from '@sim/utils/formatting' import { Info, Plus, Search } from 'lucide-react' import { useParams } from 'next/navigation' import { @@ -17,7 +18,6 @@ import { } from '@/components/emcn' import { Input } from '@/components/ui' import { useSession } from '@/lib/auth/auth-client' -import { formatDate } from '@/lib/core/utils/formatting' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { ApiKeySkeleton } from '@/app/workspace/[workspaceId]/settings/components/api-keys/api-key-skeleton' import { diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/copilot/copilot.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/copilot/copilot.tsx index cb14534f5e7..ac4eda18f41 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/copilot/copilot.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/copilot/copilot.tsx @@ -3,6 +3,7 @@ import { useMemo, useState } from 'react' // import { useParams } from 'next/navigation' import { createLogger } from '@sim/logger' +import { formatDate } from '@sim/utils/formatting' import { Check, Copy, Plus, Search } from 'lucide-react' import { Button, @@ -15,7 +16,6 @@ import { // Switch, } from '@/components/emcn' import { Input } from '@/components/ui' -import { formatDate } from '@/lib/core/utils/formatting' // import { useMcpServers, useUpdateMcpServer } from '@/hooks/queries/mcp' import { CopilotKeySkeleton } from '@/app/workspace/[workspaceId]/settings/components/copilot/copilot-skeleton' import { diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-task-list.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-task-list.tsx index 69276930a38..795f49e9104 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-task-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/inbox/inbox-task-list.tsx @@ -1,6 +1,7 @@ 'use client' import { useCallback, useMemo, useState } from 'react' +import { formatRelativeTime } from '@sim/utils/formatting' import { ChevronDown, Paperclip, Search } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { @@ -13,7 +14,6 @@ import { DropdownMenuTrigger, } from '@/components/emcn' import { Input } from '@/components/ui' -import { formatRelativeTime } from '@/lib/core/utils/formatting' import { InboxTaskSkeleton } from '@/app/workspace/[workspaceId]/settings/components/inbox/inbox-skeleton' import type { InboxTaskItem } from '@/hooks/queries/inbox' import { useInboxConfig, useInboxTasks } from '@/hooks/queries/inbox' diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted.tsx index 48c5dbbc5fd..c8b2e49f7b6 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted.tsx @@ -1,11 +1,11 @@ 'use client' import { useMemo, useState } from 'react' +import { formatDate } from '@sim/utils/formatting' import { Folder, Search } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { Button, Combobox, SModalTabs, SModalTabsList, SModalTabsTrigger } from '@/components/emcn' import { Input } from '@/components/ui' -import { formatDate } from '@/lib/core/utils/formatting' import { workflowBorderColor } from '@/lib/workspaces/colors' import { RESOURCE_REGISTRY } from '@/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-registry' import type { MothershipResourceType } from '@/app/workspace/[workspaceId]/home/types' diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/components/credit-balance/credit-balance.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/components/credit-balance/credit-balance.tsx index aa71081950a..617d5ff2594 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/components/credit-balance/credit-balance.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/subscription/components/credit-balance/credit-balance.tsx @@ -1,6 +1,7 @@ 'use client' import { useEffect, useRef, useState } from 'react' +import { generateId } from '@sim/utils/id' import { Button, Input, @@ -14,7 +15,6 @@ import { ModalTrigger, } from '@/components/emcn' import { dollarsToCredits, formatCredits } from '@/lib/billing/credits/conversion' -import { generateId } from '@/lib/core/utils/uuid' import { usePurchaseCredits } from '@/hooks/queries/subscription' interface CreditBalanceProps { diff --git a/apps/sim/app/workspace/[workspaceId]/settings/components/usage-limit/usage-limit.tsx b/apps/sim/app/workspace/[workspaceId]/settings/components/usage-limit/usage-limit.tsx index ba7ea7ca72b..43ab44f66b1 100644 --- a/apps/sim/app/workspace/[workspaceId]/settings/components/usage-limit/usage-limit.tsx +++ b/apps/sim/app/workspace/[workspaceId]/settings/components/usage-limit/usage-limit.tsx @@ -2,12 +2,12 @@ import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { Check, X } from 'lucide-react' import { Badge, Button } from '@/components/emcn' import { ON_DEMAND_UNLIMITED } from '@/lib/billing/constants' import { formatCredits } from '@/lib/billing/credits/conversion' import { cn } from '@/lib/core/utils/cn' -import { toError } from '@/lib/core/utils/helpers' import { useUpdateOrganizationUsageLimit } from '@/hooks/queries/organization' import { useUpdateUsageLimit } from '@/hooks/queries/subscription' diff --git a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-filter/table-filter.tsx b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-filter/table-filter.tsx index 2f9a6fcb9a6..a43cac4137b 100644 --- a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-filter/table-filter.tsx +++ b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/table-filter/table-filter.tsx @@ -1,6 +1,7 @@ 'use client' import { memo, useCallback, useMemo, useRef, useState } from 'react' +import { generateShortId } from '@sim/utils/id' import { X } from 'lucide-react' import { Button, @@ -10,7 +11,6 @@ import { DropdownMenuTrigger, } from '@/components/emcn' import { ChevronDown, Plus } from '@/components/emcn/icons' -import { generateShortId } from '@/lib/core/utils/uuid' import type { Filter, FilterRule } from '@/lib/table' import { COMPARISON_OPERATORS } from '@/lib/table/query-builder/constants' import { filterRulesToFilter, filterToRules } from '@/lib/table/query-builder/converters' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/chat.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/chat.tsx index edd6f1ed408..3d3f79f3d49 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/chat.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/chat.tsx @@ -2,6 +2,7 @@ import { type KeyboardEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { AlertCircle, ArrowDownToLine, @@ -31,7 +32,6 @@ import { extractPathFromOutputId, parseOutputContentSafely, } from '@/lib/core/utils/response-format' -import { generateId } from '@/lib/core/utils/uuid' import { CHAT_ACCEPT_ATTRIBUTE } from '@/lib/uploads/utils/validation' import { normalizeInputFormatValue } from '@/lib/workflows/input-format' import { StartBlockPath, TriggerUtils } from '@/lib/workflows/triggers/triggers' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/hooks/use-chat-file-upload.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/hooks/use-chat-file-upload.ts index d86a22312d6..d9c5c45a7ab 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/hooks/use-chat-file-upload.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/hooks/use-chat-file-upload.ts @@ -1,5 +1,5 @@ import { useCallback, useState } from 'react' -import { generateId } from '@/lib/core/utils/uuid' +import { generateId } from '@sim/utils/id' export interface ChatFile { id: string diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-file-attachments.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-file-attachments.ts index a7ac6ff729e..af19b89aeb9 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-file-attachments.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/hooks/use-file-attachments.ts @@ -2,7 +2,7 @@ import { useCallback, useEffect, useRef, useState } from 'react' import { createLogger } from '@sim/logger' -import { generateId } from '@/lib/core/utils/uuid' +import { generateId } from '@sim/utils/id' import { resolveFileType } from '@/lib/uploads/utils/file-utils' const logger = createLogger('useFileAttachments') diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/a2a/a2a.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/a2a/a2a.tsx index a5864aea640..85aaee4e1ef 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/a2a/a2a.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/a2a/a2a.tsx @@ -2,6 +2,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { Check, Clipboard } from 'lucide-react' import { useParams } from 'next/navigation' import { @@ -19,7 +20,6 @@ import { } from '@/components/emcn' import type { AgentAuthentication, AgentCapabilities } from '@/lib/a2a/types' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { normalizeInputFormatValue } from '@/lib/workflows/input-format' import { StartBlockPath, TriggerUtils } from '@/lib/workflows/triggers/triggers' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/general/components/versions.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/general/components/versions.tsx index 82c09c5817c..92be43d5408 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/general/components/versions.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/general/components/versions.tsx @@ -1,6 +1,7 @@ 'use client' import { useEffect, useRef, useState } from 'react' +import { formatDateTime } from '@sim/utils/formatting' import clsx from 'clsx' import { FileText, MoreVertical, Pencil, RotateCcw, SendToBack } from 'lucide-react' import { @@ -12,7 +13,6 @@ import { Skeleton, Tooltip, } from '@/components/emcn' -import { formatDateTime } from '@/lib/core/utils/formatting' import type { WorkflowDeploymentVersionResponse } from '@/lib/workflows/persistence/utils' import { useUpdateDeploymentVersion } from '@/hooks/queries/deployments' import { VersionDescriptionModal } from './version-description-modal' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx index c3827f33a56..99d02d207d7 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx @@ -1,6 +1,7 @@ 'use client' import { useMemo, useRef } from 'react' +import { generateId } from '@sim/utils/id' import { Plus } from 'lucide-react' import { Badge, @@ -12,7 +13,6 @@ import { Trash, } from '@/components/emcn' import { cn } from '@/lib/core/utils/cn' -import { generateId } from '@/lib/core/utils/uuid' import { FIELD_TYPE_LABELS, getPlaceholderForFieldType } from '@/lib/knowledge/constants' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { TagDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/dropdown/dropdown.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/dropdown/dropdown.tsx index 09e5399f336..0534816dc25 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/dropdown/dropdown.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/dropdown/dropdown.tsx @@ -1,9 +1,9 @@ import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { generateId } from '@sim/utils/id' import { isEqual } from 'es-toolkit' import { useStoreWithEqualityFn } from 'zustand/traditional' import { Badge } from '@/components/emcn' import { Combobox, type ComboboxOption } from '@/components/emcn/components' -import { generateId } from '@/lib/core/utils/uuid' import { buildCanonicalIndex, resolveDependencyValue } from '@/lib/workflows/subblocks/visibility' import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-value' import { getBlock } from '@/blocks/registry' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx index b115eda4327..97e22638656 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx @@ -1,10 +1,10 @@ import { useMemo, useRef } from 'react' +import { generateId } from '@sim/utils/id' import { Plus } from 'lucide-react' import { Button, Input, Textarea, Tooltip } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' import { Label } from '@/components/ui/label' import { cn } from '@/lib/core/utils/cn' -import { generateId } from '@/lib/core/utils/uuid' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { TagDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' import { useSubBlockInput } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-input' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/filter-builder/filter-builder.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/filter-builder/filter-builder.tsx index 02cb4b93dad..492f2f09844 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/filter-builder/filter-builder.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/filter-builder/filter-builder.tsx @@ -1,8 +1,8 @@ 'use client' import { useCallback, useMemo } from 'react' +import { generateId } from '@sim/utils/id' import type { ComboboxOption } from '@/components/emcn' -import { generateId } from '@/lib/core/utils/uuid' import { useTableColumns } from '@/lib/table/hooks' import type { FilterRule } from '@/lib/table/query-builder/constants' import { useFilterBuilder } from '@/lib/table/query-builder/use-query-builder' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-tag-filters/knowledge-tag-filters.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-tag-filters/knowledge-tag-filters.tsx index ec2b3b21254..f8f15fd780d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-tag-filters/knowledge-tag-filters.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/knowledge-tag-filters/knowledge-tag-filters.tsx @@ -1,6 +1,7 @@ 'use client' import { useRef } from 'react' +import { generateId } from '@sim/utils/id' import { Plus } from 'lucide-react' import { Badge, @@ -12,7 +13,6 @@ import { Trash, } from '@/components/emcn' import { cn } from '@/lib/core/utils/cn' -import { generateId } from '@/lib/core/utils/uuid' import { FIELD_TYPE_LABELS, getPlaceholderForFieldType } from '@/lib/knowledge/constants' import { type FilterFieldType, getOperatorsForFieldType } from '@/lib/knowledge/filters/types' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/sort-builder/sort-builder.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/sort-builder/sort-builder.tsx index c706b8e419c..12213e0b63a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/sort-builder/sort-builder.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/sort-builder/sort-builder.tsx @@ -1,8 +1,8 @@ 'use client' import { useCallback, useMemo } from 'react' +import { generateId } from '@sim/utils/id' import type { ComboboxOption } from '@/components/emcn' -import { generateId } from '@/lib/core/utils/uuid' import { useTableColumns } from '@/lib/table/hooks' import { SORT_DIRECTIONS, type SortRule } from '@/lib/table/query-builder/constants' import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-value' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/starter/input-format.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/starter/input-format.tsx index 80e1e215c97..4e33f85ed8f 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/starter/input-format.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/starter/input-format.tsx @@ -1,7 +1,7 @@ import { useCallback, useRef } from 'react' +import { generateId } from '@sim/utils/id' import { Plus } from 'lucide-react' import { Trash } from '@/components/emcn/icons/trash' -import { generateId } from '@/lib/core/utils/uuid' import 'prismjs/components/prism-json' import Editor from 'react-simple-code-editor' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/table/table.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/table/table.tsx index fc4d27748c0..843eaa42747 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/table/table.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/table/table.tsx @@ -1,11 +1,11 @@ import { useEffect, useMemo, useRef } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { useParams } from 'next/navigation' import { Button } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' import { Input } from '@/components/ui/input' import { cn } from '@/lib/core/utils/cn' -import { generateId } from '@/lib/core/utils/uuid' import { EnvVarDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { TagDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/variables-input/variables-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/variables-input/variables-input.tsx index 5ecb73e01fd..66d6d90025a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/variables-input/variables-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/variables-input/variables-input.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { generateId } from '@sim/utils/id' import { Plus } from 'lucide-react' import { useParams } from 'next/navigation' import { @@ -12,7 +13,6 @@ import { } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' import { cn } from '@/lib/core/utils/cn' -import { generateId } from '@/lib/core/utils/uuid' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { checkTagTrigger, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/panel.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/panel.tsx index ec140ce4759..58995808c79 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/panel.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/panel.tsx @@ -2,6 +2,7 @@ import { memo, useCallback, useEffect, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { History, Plus, Square } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { usePostHog } from 'posthog-js/react' @@ -34,7 +35,6 @@ import { import { Lock, Unlock, Upload } from '@/components/emcn/icons' import { VariableIcon } from '@/components/icons' import { useSession } from '@/lib/auth/auth-client' -import { toError } from '@/lib/core/utils/helpers' import { captureEvent } from '@/lib/posthog/client' import { generateWorkflowJson } from '@/lib/workflows/operations/import-export' import { ConversationListItem } from '@/app/workspace/[workspaceId]/components' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx index 5eef2d85acc..d87f6e156ca 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx @@ -2,6 +2,7 @@ import type React from 'react' import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { formatDuration } from '@sim/utils/formatting' import clsx from 'clsx' import { ArrowDown, @@ -25,7 +26,6 @@ import { Tooltip, } from '@/components/emcn' import { getEnv, isTruthy } from '@/lib/core/config/env' -import { formatDuration } from '@/lib/core/utils/formatting' import { useRegisterGlobalCommands } from '@/app/workspace/[workspaceId]/providers/global-commands-provider' import { createCommands } from '@/app/workspace/[workspaceId]/utils/commands-utils' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution.ts index 4bbb03a420c..de3da34c7d6 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution.ts @@ -1,10 +1,11 @@ import { useCallback, useEffect, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' +import { generateId } from '@sim/utils/id' import { useQueryClient } from '@tanstack/react-query' import { useParams } from 'next/navigation' import { useShallow } from 'zustand/react/shallow' -import { sleep, toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { buildTraceSpans } from '@/lib/logs/execution/trace-spans/trace-spans' import { processStreamingBlockLogs } from '@/lib/tokenization' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/workflow-execution-utils.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/workflow-execution-utils.ts index e8e1fcea9aa..5d416cffec4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/workflow-execution-utils.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/workflow-execution-utils.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { generateId } from '@/lib/core/utils/uuid' +import { generateId } from '@sim/utils/id' import type { BlockCompletedData, BlockErrorData, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx index 90e5425966a..97ab1a0bc6d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx @@ -16,10 +16,10 @@ import ReactFlow, { } from 'reactflow' import 'reactflow/dist/style.css' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { useShallow } from 'zustand/react/shallow' import { useSession } from '@/lib/auth/auth-client' import type { OAuthConnectEventDetail } from '@/lib/copilot/tools/client/base-tool' -import { generateId } from '@/lib/core/utils/uuid' import { consumeOAuthReturnContext, writeOAuthReturnContext } from '@/lib/credentials/client-state' import type { OAuthProvider } from '@/lib/oauth' import { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/preview-editor.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/preview-editor.tsx index fabf2e975a6..f9387e12534 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/preview-editor.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/preview-editor.tsx @@ -1,6 +1,7 @@ 'use client' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { formatDuration } from '@sim/utils/formatting' import { ArrowDown, ArrowUp, @@ -28,7 +29,6 @@ import { Tooltip, } from '@/components/emcn' import { cn } from '@/lib/core/utils/cn' -import { formatDuration } from '@/lib/core/utils/formatting' import { extractReferencePrefixes } from '@/lib/workflows/sanitization/references' import { buildCanonicalIndex, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/folder-item/folder-item.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/folder-item/folder-item.tsx index d179568c316..963bed08eb9 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/folder-item/folder-item.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/folder-item/folder-item.tsx @@ -2,11 +2,11 @@ import { useCallback, useMemo, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import clsx from 'clsx' import { ChevronRight, Folder, FolderOpen, MoreHorizontal } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { SIM_RESOURCES_DRAG_TYPE } from '@/lib/copilot/resource-types' -import { generateId } from '@/lib/core/utils/uuid' import { getNextWorkflowColor } from '@/lib/workflows/colors' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { ContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/context-menu/context-menu' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-folder-operations.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-folder-operations.ts index 45b58376685..43a3bb88df0 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-folder-operations.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-folder-operations.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' import { createLogger } from '@sim/logger' -import { generateId } from '@/lib/core/utils/uuid' +import { generateId } from '@sim/utils/id' import { generateFolderName } from '@/lib/workspaces/naming' import { useCreateFolder } from '@/hooks/queries/folders' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-workflow-operations.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-workflow-operations.ts index 2e49e8e9a04..4dbda7a9eda 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-workflow-operations.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-workflow-operations.ts @@ -1,6 +1,6 @@ import { useCallback, useMemo } from 'react' +import { generateId } from '@sim/utils/id' import { useRouter } from 'next/navigation' -import { generateId } from '@/lib/core/utils/uuid' import { getNextWorkflowColor } from '@/lib/workflows/colors' import { useCreateWorkflow, useWorkflowMap } from '@/hooks/queries/workflows' import { useWorkflowDiffStore } from '@/stores/workflow-diff/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-folder.ts b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-folder.ts index 8703c34f017..b53bfe78f95 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-folder.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-folder.ts @@ -1,6 +1,6 @@ import { useCallback, useState } from 'react' import { createLogger } from '@sim/logger' -import { generateId } from '@/lib/core/utils/uuid' +import { generateId } from '@sim/utils/id' import { getChildFolders, getFolderById } from '@/lib/folders/tree' import { useDuplicateFolderMutation } from '@/hooks/queries/folders' import { getFolderMap } from '@/hooks/queries/utils/folder-cache' diff --git a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-selection.ts b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-selection.ts index 5bf684a72ac..2923937f893 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-selection.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-selection.ts @@ -1,7 +1,7 @@ import { useCallback, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { useRouter } from 'next/navigation' -import { generateId } from '@/lib/core/utils/uuid' import { getChildFolders, getFolderById } from '@/lib/folders/tree' import { getNextWorkflowColor } from '@/lib/workflows/colors' import { useDuplicateFolderMutation } from '@/hooks/queries/folders' diff --git a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-workflow.ts b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-workflow.ts index 32621febc96..1613cf1730c 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-workflow.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-workflow.ts @@ -1,7 +1,7 @@ import { useCallback, useRef } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { useRouter } from 'next/navigation' -import { generateId } from '@/lib/core/utils/uuid' import { getNextWorkflowColor } from '@/lib/workflows/colors' import { getWorkflows } from '@/hooks/queries/utils/workflow-cache' import { useDuplicateWorkflowMutation } from '@/hooks/queries/workflows' diff --git a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workspace.ts b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workspace.ts index ffa082ca994..fbdc4b3abc5 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workspace.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workspace.ts @@ -1,7 +1,7 @@ import { useCallback, useState } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { useRouter } from 'next/navigation' -import { generateId } from '@/lib/core/utils/uuid' import { extractWorkflowName, extractWorkflowsFromZip, diff --git a/apps/sim/app/workspace/providers/socket-provider.tsx b/apps/sim/app/workspace/providers/socket-provider.tsx index 7af310952bd..9a63092f97a 100644 --- a/apps/sim/app/workspace/providers/socket-provider.tsx +++ b/apps/sim/app/workspace/providers/socket-provider.tsx @@ -11,10 +11,10 @@ import { useState, } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { useParams } from 'next/navigation' import type { Socket } from 'socket.io-client' import { getSocketUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { type SocketJoinCommand, SocketJoinController, diff --git a/apps/sim/background/async-preprocessing-correlation.test.ts b/apps/sim/background/async-preprocessing-correlation.test.ts index 0489efb6eaa..e67acc798c6 100644 --- a/apps/sim/background/async-preprocessing-correlation.test.ts +++ b/apps/sim/background/async-preprocessing-correlation.test.ts @@ -2,21 +2,24 @@ * @vitest-environment node */ +import { + executionPreprocessingMock, + executionPreprocessingMockFns, + LoggingSessionMock, + loggingSessionMock, + workflowsPersistenceUtilsMock, + workflowsPersistenceUtilsMockFns, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' const { - mockPreprocessExecution, mockTask, mockDbUpdate, mockDbSelect, mockExecuteWorkflowCore, - mockLoggingSession, - mockBlockExistsInDeployment, - mockLoadDeployedWorkflowState, mockGetScheduleTimeValues, mockGetSubBlockValue, } = vi.hoisted(() => ({ - mockPreprocessExecution: vi.fn(), mockTask: vi.fn((config) => config), mockDbUpdate: vi.fn(() => ({ set: vi.fn(() => ({ @@ -25,13 +28,13 @@ const { })), mockDbSelect: vi.fn(), mockExecuteWorkflowCore: vi.fn(), - mockLoggingSession: vi.fn(), - mockBlockExistsInDeployment: vi.fn(), - mockLoadDeployedWorkflowState: vi.fn(), mockGetScheduleTimeValues: vi.fn(), mockGetSubBlockValue: vi.fn(), })) +const mockPreprocessExecution = executionPreprocessingMockFns.mockPreprocessExecution +const mockLoadDeployedWorkflowState = workflowsPersistenceUtilsMockFns.mockLoadDeployedWorkflowState + vi.mock('@trigger.dev/sdk', () => ({ task: mockTask })) vi.mock('@sim/db', () => ({ @@ -50,22 +53,9 @@ vi.mock('drizzle-orm', () => ({ sql: Object.assign(vi.fn(), { raw: vi.fn() }), })) -vi.mock('@/lib/execution/preprocessing', () => ({ - preprocessExecution: mockPreprocessExecution, -})) +vi.mock('@/lib/execution/preprocessing', () => executionPreprocessingMock) -vi.mock('@/lib/logs/execution/logging-session', () => ({ - LoggingSession: vi.fn().mockImplementation(() => { - const instance = { - safeStart: vi.fn().mockResolvedValue(true), - safeCompleteWithError: vi.fn().mockResolvedValue(undefined), - markAsFailed: vi.fn().mockResolvedValue(undefined), - waitForPostExecution: vi.fn().mockResolvedValue(undefined), - } - mockLoggingSession(instance) - return instance - }), -})) +vi.mock('@/lib/logs/execution/logging-session', () => loggingSessionMock) vi.mock('@/lib/core/execution-limits', () => ({ createTimeoutAbortController: vi.fn(() => ({ @@ -93,10 +83,7 @@ vi.mock('@/lib/workflows/executor/human-in-the-loop-manager', () => ({ }, })) -vi.mock('@/lib/workflows/persistence/utils', () => ({ - blockExistsInDeployment: mockBlockExistsInDeployment, - loadDeployedWorkflowState: mockLoadDeployedWorkflowState, -})) +vi.mock('@/lib/workflows/persistence/utils', () => workflowsPersistenceUtilsMock) vi.mock('@/lib/workflows/schedules/utils', () => ({ calculateNextRunTime: vi.fn(), @@ -112,15 +99,6 @@ vi.mock('@/executor/utils/errors', () => ({ hasExecutionResult: vi.fn().mockReturnValue(false), })) -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})) - import { executeScheduleJob } from './schedule-execution' import { executeWorkflowJob } from './workflow-execution' @@ -183,7 +161,7 @@ describe('async preprocessing correlation threading', () => { requestId: 'request-1', }) - const loggingSession = mockLoggingSession.mock.calls[0]?.[0] + const loggingSession = LoggingSessionMock.mock.results[0]?.value expect(loggingSession).toBeDefined() expect(loggingSession.safeStart).not.toHaveBeenCalled() expect(mockExecuteWorkflowCore).toHaveBeenCalledWith( @@ -221,7 +199,7 @@ describe('async preprocessing correlation threading', () => { scheduledFor: '2025-01-01T00:00:00.000Z', }) - const loggingSession = mockLoggingSession.mock.calls[0]?.[0] + const loggingSession = LoggingSessionMock.mock.results[0]?.value expect(loggingSession).toBeDefined() expect(loggingSession.safeStart).not.toHaveBeenCalled() expect(mockExecuteWorkflowCore).toHaveBeenCalledWith( diff --git a/apps/sim/background/resume-execution.ts b/apps/sim/background/resume-execution.ts index dfdd03a3c24..9b04463aa4f 100644 --- a/apps/sim/background/resume-execution.ts +++ b/apps/sim/background/resume-execution.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { task } from '@trigger.dev/sdk' -import { toError } from '@/lib/core/utils/helpers' import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' const logger = createLogger('TriggerResumeExecution') diff --git a/apps/sim/background/schedule-execution.ts b/apps/sim/background/schedule-execution.ts index 54c1f10a7f0..ca6728b42aa 100644 --- a/apps/sim/background/schedule-execution.ts +++ b/apps/sim/background/schedule-execution.ts @@ -1,12 +1,12 @@ import { db, jobExecutionLogs, workflow, workflowSchedule } from '@sim/db' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { task } from '@trigger.dev/sdk' import { Cron } from 'croner' import { and, eq, isNull } from 'drizzle-orm' import type { AsyncExecutionCorrelation } from '@/lib/core/async-jobs/types' import { createTimeoutAbortController, getTimeoutErrorMessage } from '@/lib/core/execution-limits' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { preprocessExecution } from '@/lib/execution/preprocessing' import { LoggingSession } from '@/lib/logs/execution/logging-session' import { buildTraceSpans } from '@/lib/logs/execution/trace-spans/trace-spans' diff --git a/apps/sim/background/webhook-execution.ts b/apps/sim/background/webhook-execution.ts index ff33c23d1ad..113e8153551 100644 --- a/apps/sim/background/webhook-execution.ts +++ b/apps/sim/background/webhook-execution.ts @@ -1,13 +1,13 @@ import { db } from '@sim/db' import { account, webhook } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { task } from '@trigger.dev/sdk' import { eq } from 'drizzle-orm' import type { AsyncExecutionCorrelation } from '@/lib/core/async-jobs/types' import { createTimeoutAbortController, getTimeoutErrorMessage } from '@/lib/core/execution-limits' import { IdempotencyService, webhookIdempotency } from '@/lib/core/idempotency' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { preprocessExecution } from '@/lib/execution/preprocessing' import { LoggingSession } from '@/lib/logs/execution/logging-session' import { buildTraceSpans } from '@/lib/logs/execution/trace-spans/trace-spans' diff --git a/apps/sim/background/workflow-execution.ts b/apps/sim/background/workflow-execution.ts index 428fe3e7c8c..7718625f72e 100644 --- a/apps/sim/background/workflow-execution.ts +++ b/apps/sim/background/workflow-execution.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { task } from '@trigger.dev/sdk' import type { AsyncExecutionCorrelation } from '@/lib/core/async-jobs/types' import { createTimeoutAbortController, getTimeoutErrorMessage } from '@/lib/core/execution-limits' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { preprocessExecution } from '@/lib/execution/preprocessing' import { LoggingSession } from '@/lib/logs/execution/logging-session' import { buildTraceSpans } from '@/lib/logs/execution/trace-spans/trace-spans' diff --git a/apps/sim/background/workspace-notification-delivery.ts b/apps/sim/background/workspace-notification-delivery.ts index 17fcf73012b..a0e1eab3ac0 100644 --- a/apps/sim/background/workspace-notification-delivery.ts +++ b/apps/sim/background/workspace-notification-delivery.ts @@ -6,6 +6,9 @@ import { workspaceNotificationSubscription, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { formatDuration } from '@sim/utils/formatting' +import { generateId } from '@sim/utils/id' import { task } from '@trigger.dev/sdk' import { and, eq, isNull, lte, or, sql } from 'drizzle-orm' import { @@ -19,10 +22,7 @@ import { dollarsToCredits } from '@/lib/billing/credits/conversion' import { RateLimiter } from '@/lib/core/rate-limiter' import { decryptSecret } from '@/lib/core/security/encryption' import { secureFetchWithValidation } from '@/lib/core/security/input-validation.server' -import { formatDuration } from '@/lib/core/utils/formatting' -import { toError } from '@/lib/core/utils/helpers' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import type { TraceSpan, WorkflowExecutionLog } from '@/lib/logs/types' import { sendEmail } from '@/lib/messaging/email/mailer' import type { AlertConfig } from '@/lib/notifications/alert-rules' diff --git a/apps/sim/blocks/blocks/langsmith.ts b/apps/sim/blocks/blocks/langsmith.ts index 8e5ae00f2ee..378dfdfdca0 100644 --- a/apps/sim/blocks/blocks/langsmith.ts +++ b/apps/sim/blocks/blocks/langsmith.ts @@ -1,5 +1,5 @@ +import { toError } from '@sim/utils/errors' import { LangsmithIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { AuthMode, type BlockConfig, IntegrationType } from '@/blocks/types' import type { LangsmithResponse } from '@/tools/langsmith/types' diff --git a/apps/sim/blocks/blocks/mistral_parse.ts b/apps/sim/blocks/blocks/mistral_parse.ts index a6b40b2861f..e378a2d115b 100644 --- a/apps/sim/blocks/blocks/mistral_parse.ts +++ b/apps/sim/blocks/blocks/mistral_parse.ts @@ -1,5 +1,5 @@ +import { toError } from '@sim/utils/errors' import { MistralIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { AuthMode, type BlockConfig, IntegrationType, type SubBlockType } from '@/blocks/types' import { createVersionedToolSelector, normalizeFileInput } from '@/blocks/utils' import type { MistralParserOutput } from '@/tools/mistral/types' diff --git a/apps/sim/blocks/blocks/notion.ts b/apps/sim/blocks/blocks/notion.ts index 7b015b03d9f..4528d950f83 100644 --- a/apps/sim/blocks/blocks/notion.ts +++ b/apps/sim/blocks/blocks/notion.ts @@ -1,5 +1,5 @@ +import { toError } from '@sim/utils/errors' import { NotionIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import type { BlockConfig } from '@/blocks/types' import { AuthMode, IntegrationType } from '@/blocks/types' import { createVersionedToolSelector } from '@/blocks/utils' diff --git a/apps/sim/blocks/blocks/reducto.ts b/apps/sim/blocks/blocks/reducto.ts index 83314b4d59f..1d996cec0de 100644 --- a/apps/sim/blocks/blocks/reducto.ts +++ b/apps/sim/blocks/blocks/reducto.ts @@ -1,5 +1,5 @@ +import { toError } from '@sim/utils/errors' import { ReductoIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { AuthMode, type BlockConfig, IntegrationType, type SubBlockType } from '@/blocks/types' import { createVersionedToolSelector, normalizeFileInput } from '@/blocks/utils' import type { ReductoParserOutput } from '@/tools/reducto/types' diff --git a/apps/sim/blocks/blocks/sharepoint.ts b/apps/sim/blocks/blocks/sharepoint.ts index 70ebf85dfd8..f7527e68315 100644 --- a/apps/sim/blocks/blocks/sharepoint.ts +++ b/apps/sim/blocks/blocks/sharepoint.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { MicrosoftSharepointIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { getScopesForService } from '@/lib/oauth/utils' import type { BlockConfig } from '@/blocks/types' import { AuthMode, IntegrationType } from '@/blocks/types' diff --git a/apps/sim/blocks/blocks/table.ts b/apps/sim/blocks/blocks/table.ts index 0d027eacc98..e75d1731675 100644 --- a/apps/sim/blocks/blocks/table.ts +++ b/apps/sim/blocks/blocks/table.ts @@ -1,5 +1,5 @@ +import { toError } from '@sim/utils/errors' import { TableIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { TABLE_LIMITS } from '@/lib/table/constants' import { filterRulesToFilter, sortRulesToSort } from '@/lib/table/query-builder/converters' import type { BlockConfig } from '@/blocks/types' diff --git a/apps/sim/blocks/utils.ts b/apps/sim/blocks/utils.ts index 148d2ad8eef..fd5c15bdc0a 100644 --- a/apps/sim/blocks/utils.ts +++ b/apps/sim/blocks/utils.ts @@ -1,5 +1,5 @@ +import { toError } from '@sim/utils/errors' import { isAzureConfigured, isHosted, isOllamaConfigured } from '@/lib/core/config/feature-flags' -import { toError } from '@/lib/core/utils/helpers' import { getScopesForService } from '@/lib/oauth/utils' import type { BlockOutput, OutputFieldDefinition, SubBlockConfig } from '@/blocks/types' import { diff --git a/apps/sim/components/emcn/components/toast/toast.tsx b/apps/sim/components/emcn/components/toast/toast.tsx index 1c892c1857c..119ac2faf6c 100644 --- a/apps/sim/components/emcn/components/toast/toast.tsx +++ b/apps/sim/components/emcn/components/toast/toast.tsx @@ -10,10 +10,10 @@ import { useRef, useState, } from 'react' +import { generateId } from '@sim/utils/id' import { X } from 'lucide-react' import { createPortal } from 'react-dom' import { cn } from '@/lib/core/utils/cn' -import { generateId } from '@/lib/core/utils/uuid' const AUTO_DISMISS_MS = 5000 const EXIT_ANIMATION_MS = 200 diff --git a/apps/sim/connectors/airtable/airtable.ts b/apps/sim/connectors/airtable/airtable.ts index 6ef383c68ba..1ef21536155 100644 --- a/apps/sim/connectors/airtable/airtable.ts +++ b/apps/sim/connectors/airtable/airtable.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { AirtableIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { computeContentHash, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/asana/asana.ts b/apps/sim/connectors/asana/asana.ts index 1cb4c22d788..ed20942aebc 100644 --- a/apps/sim/connectors/asana/asana.ts +++ b/apps/sim/connectors/asana/asana.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { AsanaIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { joinTagArray, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/confluence/confluence.ts b/apps/sim/connectors/confluence/confluence.ts index 583647ffe6b..7149c96272d 100644 --- a/apps/sim/connectors/confluence/confluence.ts +++ b/apps/sim/connectors/confluence/confluence.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { ConfluenceIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { htmlToPlainText, joinTagArray, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/discord/discord.ts b/apps/sim/connectors/discord/discord.ts index 2da531584fd..bf589ff9c0f 100644 --- a/apps/sim/connectors/discord/discord.ts +++ b/apps/sim/connectors/discord/discord.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { DiscordIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { computeContentHash, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/dropbox/dropbox.ts b/apps/sim/connectors/dropbox/dropbox.ts index 3bcba681819..7584783a7b7 100644 --- a/apps/sim/connectors/dropbox/dropbox.ts +++ b/apps/sim/connectors/dropbox/dropbox.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { DropboxIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { htmlToPlainText, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/evernote/evernote.ts b/apps/sim/connectors/evernote/evernote.ts index a6e23d15326..e5afefbcdaf 100644 --- a/apps/sim/connectors/evernote/evernote.ts +++ b/apps/sim/connectors/evernote/evernote.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { EvernoteIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import { ThriftReader, diff --git a/apps/sim/connectors/fireflies/fireflies.ts b/apps/sim/connectors/fireflies/fireflies.ts index 65341a324db..3334a347cad 100644 --- a/apps/sim/connectors/fireflies/fireflies.ts +++ b/apps/sim/connectors/fireflies/fireflies.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { FirefliesIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/github/github.ts b/apps/sim/connectors/github/github.ts index b11dba3cbb3..7952cd4943b 100644 --- a/apps/sim/connectors/github/github.ts +++ b/apps/sim/connectors/github/github.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { GithubIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/gmail/gmail.ts b/apps/sim/connectors/gmail/gmail.ts index a671df4f9d1..a8590e38469 100644 --- a/apps/sim/connectors/gmail/gmail.ts +++ b/apps/sim/connectors/gmail/gmail.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { GmailIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { htmlToPlainText, joinTagArray, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/google-docs/google-docs.ts b/apps/sim/connectors/google-docs/google-docs.ts index 244f4364159..570413516fa 100644 --- a/apps/sim/connectors/google-docs/google-docs.ts +++ b/apps/sim/connectors/google-docs/google-docs.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { GoogleDocsIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { joinTagArray, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/google-drive/google-drive.ts b/apps/sim/connectors/google-drive/google-drive.ts index dd3c2f26d28..f132edbc3cb 100644 --- a/apps/sim/connectors/google-drive/google-drive.ts +++ b/apps/sim/connectors/google-drive/google-drive.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { GoogleDriveIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { htmlToPlainText, joinTagArray, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/google-sheets/google-sheets.ts b/apps/sim/connectors/google-sheets/google-sheets.ts index 2b81bc1485e..d69f91e0da8 100644 --- a/apps/sim/connectors/google-sheets/google-sheets.ts +++ b/apps/sim/connectors/google-sheets/google-sheets.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { GoogleSheetsIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/intercom/intercom.ts b/apps/sim/connectors/intercom/intercom.ts index 3af1d4a43dd..112eb72b35d 100644 --- a/apps/sim/connectors/intercom/intercom.ts +++ b/apps/sim/connectors/intercom/intercom.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { IntercomIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { htmlToPlainText, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/linear/linear.ts b/apps/sim/connectors/linear/linear.ts index e5f2727e7d6..f25aafe8154 100644 --- a/apps/sim/connectors/linear/linear.ts +++ b/apps/sim/connectors/linear/linear.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { LinearIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import type { RetryOptions } from '@/lib/knowledge/documents/utils' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' diff --git a/apps/sim/connectors/mapTags.test.ts b/apps/sim/connectors/mapTags.test.ts index 7fbeb531ca0..62701d04698 100644 --- a/apps/sim/connectors/mapTags.test.ts +++ b/apps/sim/connectors/mapTags.test.ts @@ -12,9 +12,6 @@ vi.mock('@/components/icons', () => ({ GoogleDriveIcon: () => null, AirtableIcon: () => null, })) -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }), -})) vi.mock('@/lib/knowledge/documents/utils', () => ({ fetchWithRetry: vi.fn(), VALIDATE_RETRY_OPTIONS: {}, diff --git a/apps/sim/connectors/microsoft-teams/microsoft-teams.ts b/apps/sim/connectors/microsoft-teams/microsoft-teams.ts index 65310ac438b..97729aca3ce 100644 --- a/apps/sim/connectors/microsoft-teams/microsoft-teams.ts +++ b/apps/sim/connectors/microsoft-teams/microsoft-teams.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { MicrosoftTeamsIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { computeContentHash, htmlToPlainText, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/notion/notion.ts b/apps/sim/connectors/notion/notion.ts index c049c0fbcda..40efc9eadaa 100644 --- a/apps/sim/connectors/notion/notion.ts +++ b/apps/sim/connectors/notion/notion.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { NotionIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { joinTagArray, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/obsidian/obsidian.ts b/apps/sim/connectors/obsidian/obsidian.ts index 387ec66d1bf..f8c469dc86a 100644 --- a/apps/sim/connectors/obsidian/obsidian.ts +++ b/apps/sim/connectors/obsidian/obsidian.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { ObsidianIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { joinTagArray, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/onedrive/onedrive.ts b/apps/sim/connectors/onedrive/onedrive.ts index ac68c3fce51..b8ab17c9362 100644 --- a/apps/sim/connectors/onedrive/onedrive.ts +++ b/apps/sim/connectors/onedrive/onedrive.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { MicrosoftOneDriveIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { htmlToPlainText, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/outlook/outlook.ts b/apps/sim/connectors/outlook/outlook.ts index e219e10dd0a..b0081e5af4b 100644 --- a/apps/sim/connectors/outlook/outlook.ts +++ b/apps/sim/connectors/outlook/outlook.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { OutlookIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { htmlToPlainText, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/reddit/reddit.ts b/apps/sim/connectors/reddit/reddit.ts index 894c1f8b272..b63015df860 100644 --- a/apps/sim/connectors/reddit/reddit.ts +++ b/apps/sim/connectors/reddit/reddit.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { RedditIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/servicenow/servicenow.ts b/apps/sim/connectors/servicenow/servicenow.ts index 35436a5e0e4..be55c08ae98 100644 --- a/apps/sim/connectors/servicenow/servicenow.ts +++ b/apps/sim/connectors/servicenow/servicenow.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { ServiceNowIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { htmlToPlainText, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/sharepoint/sharepoint.ts b/apps/sim/connectors/sharepoint/sharepoint.ts index 62b12a0a8b9..8ac32dc5752 100644 --- a/apps/sim/connectors/sharepoint/sharepoint.ts +++ b/apps/sim/connectors/sharepoint/sharepoint.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { MicrosoftSharepointIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { htmlToPlainText, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/slack/slack.ts b/apps/sim/connectors/slack/slack.ts index 5434acfe570..271c6f46527 100644 --- a/apps/sim/connectors/slack/slack.ts +++ b/apps/sim/connectors/slack/slack.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { SlackIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { computeContentHash, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/webflow/webflow.ts b/apps/sim/connectors/webflow/webflow.ts index 718e72f9827..bfa3936aedc 100644 --- a/apps/sim/connectors/webflow/webflow.ts +++ b/apps/sim/connectors/webflow/webflow.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { WebflowIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { htmlToPlainText, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/wordpress/wordpress.ts b/apps/sim/connectors/wordpress/wordpress.ts index 4f59da0697d..272ff16a91c 100644 --- a/apps/sim/connectors/wordpress/wordpress.ts +++ b/apps/sim/connectors/wordpress/wordpress.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { WordpressIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { htmlToPlainText, joinTagArray, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/connectors/zendesk/zendesk.ts b/apps/sim/connectors/zendesk/zendesk.ts index c2e6c653b16..386f0353e15 100644 --- a/apps/sim/connectors/zendesk/zendesk.ts +++ b/apps/sim/connectors/zendesk/zendesk.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { ZendeskIcon } from '@/components/icons' -import { toError } from '@/lib/core/utils/helpers' import { fetchWithRetry, VALIDATE_RETRY_OPTIONS } from '@/lib/knowledge/documents/utils' import type { ConnectorConfig, ExternalDocument, ExternalDocumentList } from '@/connectors/types' import { htmlToPlainText, joinTagArray, parseTagDate } from '@/connectors/utils' diff --git a/apps/sim/ee/access-control/utils/permission-check.test.ts b/apps/sim/ee/access-control/utils/permission-check.test.ts index 5d68ee149cf..22ec9e5590c 100644 --- a/apps/sim/ee/access-control/utils/permission-check.test.ts +++ b/apps/sim/ee/access-control/utils/permission-check.test.ts @@ -1,7 +1,7 @@ /** * @vitest-environment node */ -import { databaseMock, drizzleOrmMock, loggerMock } from '@sim/testing' +import { schemaMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' const { @@ -40,10 +40,7 @@ const { mockGetProviderFromModel: vi.fn<(model: string) => string>(), })) -vi.mock('@sim/db', () => databaseMock) -vi.mock('@sim/db/schema', () => ({})) -vi.mock('@sim/logger', () => loggerMock) -vi.mock('drizzle-orm', () => drizzleOrmMock) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('@/lib/billing', () => ({ isOrganizationOnEnterprisePlan: mockIsOrganizationOnEnterprisePlan, })) diff --git a/apps/sim/ee/audit-logs/components/audit-logs.tsx b/apps/sim/ee/audit-logs/components/audit-logs.tsx index 370d81e2289..05de261f47c 100644 --- a/apps/sim/ee/audit-logs/components/audit-logs.tsx +++ b/apps/sim/ee/audit-logs/components/audit-logs.tsx @@ -2,11 +2,11 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { createLogger } from '@sim/logger' +import { formatDateTime } from '@sim/utils/formatting' import { ChevronDown, RefreshCw, Search } from 'lucide-react' import { Badge, Button, Combobox, type ComboboxOption, Skeleton } from '@/components/emcn' import { Input } from '@/components/ui' import { cn } from '@/lib/core/utils/cn' -import { formatDateTime } from '@/lib/core/utils/formatting' import type { EnterpriseAuditLogEntry } from '@/app/api/v1/audit-logs/format' import { RESOURCE_TYPE_OPTIONS } from '@/ee/audit-logs/constants' import { type AuditLogFilters, useAuditLogs } from '@/ee/audit-logs/hooks/audit-logs' diff --git a/apps/sim/executor/dag/builder.test.ts b/apps/sim/executor/dag/builder.test.ts index 9be90e75f85..703d5165155 100644 --- a/apps/sim/executor/dag/builder.test.ts +++ b/apps/sim/executor/dag/builder.test.ts @@ -1,5 +1,4 @@ -import { loggerMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import { BlockType } from '@/executor/constants' import { DAGBuilder } from '@/executor/dag/builder' import { @@ -9,8 +8,6 @@ import { } from '@/executor/utils/subflow-utils' import type { SerializedBlock, SerializedWorkflow } from '@/serializer/types' -vi.mock('@sim/logger', () => loggerMock) - function createBlock(id: string, metadataId: string): SerializedBlock { return { id, diff --git a/apps/sim/executor/dag/construction/edges.test.ts b/apps/sim/executor/dag/construction/edges.test.ts index e73446a62ea..857f98af27b 100644 --- a/apps/sim/executor/dag/construction/edges.test.ts +++ b/apps/sim/executor/dag/construction/edges.test.ts @@ -1,11 +1,8 @@ -import { loggerMock } from '@sim/testing' -import { beforeEach, describe, expect, it, vi } from 'vitest' +import { beforeEach, describe, expect, it } from 'vitest' import type { DAG, DAGNode } from '@/executor/dag/builder' import type { SerializedBlock, SerializedLoop, SerializedWorkflow } from '@/serializer/types' import { EdgeConstructor } from './edges' -vi.mock('@sim/logger', () => loggerMock) - function createMockBlock(id: string, type = 'function', config: any = {}): SerializedBlock { return { id, diff --git a/apps/sim/executor/dag/construction/edges.ts b/apps/sim/executor/dag/construction/edges.ts index 0dd86c11f3a..9e9c4a567fc 100644 --- a/apps/sim/executor/dag/construction/edges.ts +++ b/apps/sim/executor/dag/construction/edges.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { EDGE, isConditionBlockType, diff --git a/apps/sim/executor/execution/block-executor.ts b/apps/sim/executor/execution/block-executor.ts index 55b5df5ac4c..c348aa401fb 100644 --- a/apps/sim/executor/execution/block-executor.ts +++ b/apps/sim/executor/execution/block-executor.ts @@ -1,6 +1,6 @@ import { createLogger, type Logger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { redactApiKeys } from '@/lib/core/security/redaction' -import { toError } from '@/lib/core/utils/helpers' import { getBaseUrl } from '@/lib/core/utils/urls' import { containsUserFileWithMetadata, diff --git a/apps/sim/executor/execution/edge-manager.test.ts b/apps/sim/executor/execution/edge-manager.test.ts index 44fb3b10944..13c64b043aa 100644 --- a/apps/sim/executor/execution/edge-manager.test.ts +++ b/apps/sim/executor/execution/edge-manager.test.ts @@ -1,12 +1,9 @@ -import { loggerMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import type { DAG, DAGNode } from '@/executor/dag/builder' import type { DAGEdge } from '@/executor/dag/types' import type { SerializedBlock } from '@/serializer/types' import { EdgeManager } from './edge-manager' -vi.mock('@sim/logger', () => loggerMock) - function createMockBlock(id: string): SerializedBlock { return { id, diff --git a/apps/sim/executor/execution/engine.test.ts b/apps/sim/executor/execution/engine.test.ts index f9c0ab41209..6147762d496 100644 --- a/apps/sim/executor/execution/engine.test.ts +++ b/apps/sim/executor/execution/engine.test.ts @@ -1,11 +1,8 @@ /** * @vitest-environment node */ -import { loggerMock } from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, type Mock, vi } from 'vitest' -vi.mock('@sim/logger', () => loggerMock) - vi.mock('@/lib/execution/cancellation', () => ({ isExecutionCancelled: vi.fn(), isRedisCancellationEnabled: vi.fn(), diff --git a/apps/sim/executor/execution/engine.ts b/apps/sim/executor/execution/engine.ts index bf110b7bdb6..d7dc8f44f11 100644 --- a/apps/sim/executor/execution/engine.ts +++ b/apps/sim/executor/execution/engine.ts @@ -1,5 +1,5 @@ import { createLogger, type Logger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { isExecutionCancelled, isRedisCancellationEnabled } from '@/lib/execution/cancellation' import { BlockType } from '@/executor/constants' import type { DAG } from '@/executor/dag/builder' diff --git a/apps/sim/executor/handlers/agent/agent-handler.test.ts b/apps/sim/executor/handlers/agent/agent-handler.test.ts index 437dc69121d..ef94e7c5769 100644 --- a/apps/sim/executor/handlers/agent/agent-handler.test.ts +++ b/apps/sim/executor/handlers/agent/agent-handler.test.ts @@ -1,4 +1,4 @@ -import { setupGlobalFetchMock } from '@sim/testing' +import { schemaMock, setupGlobalFetchMock } from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, type Mock, vi } from 'vitest' import { getAllBlocks } from '@/blocks' import { BlockType, isMcpTool } from '@/executor/constants' @@ -102,14 +102,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - mcpServers: { - id: 'id', - workspaceId: 'workspaceId', - connectionStatus: 'connectionStatus', - deletedAt: 'deletedAt', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) const mockGetCustomToolById = vi.fn() diff --git a/apps/sim/executor/handlers/agent/agent-handler.ts b/apps/sim/executor/handlers/agent/agent-handler.ts index 09572c43e86..fcf43b6844b 100644 --- a/apps/sim/executor/handlers/agent/agent-handler.ts +++ b/apps/sim/executor/handlers/agent/agent-handler.ts @@ -1,8 +1,9 @@ import { db } from '@sim/db' import { mcpServers } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' import { and, eq, inArray, isNull } from 'drizzle-orm' -import { toError } from '@/lib/core/utils/helpers' import { createMcpToolId } from '@/lib/mcp/utils' import { getCustomToolById } from '@/lib/workflows/custom-tools/operations' import { getAllBlocks } from '@/blocks' @@ -456,7 +457,7 @@ export class AgentBlockHandler implements BlockHandler { logger.warn( `[AgentHandler] Session error discovering tools from ${serverId}, retrying (attempt ${attempt + 1})` ) - await new Promise((r) => setTimeout(r, 100)) + await sleep(100) continue } throw new Error(`Failed to discover tools: ${response.status} ${errorText}`) @@ -475,7 +476,7 @@ export class AgentBlockHandler implements BlockHandler { `[AgentHandler] Retryable error discovering tools from ${serverId} (attempt ${attempt + 1}):`, error ) - await new Promise((r) => setTimeout(r, 100)) + await sleep(100) continue } throw error diff --git a/apps/sim/executor/handlers/agent/memory.test.ts b/apps/sim/executor/handlers/agent/memory.test.ts index 1010cbd34de..316b2a0e731 100644 --- a/apps/sim/executor/handlers/agent/memory.test.ts +++ b/apps/sim/executor/handlers/agent/memory.test.ts @@ -1,11 +1,8 @@ -import { loggerMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' import { MEMORY } from '@/executor/constants' import { Memory } from '@/executor/handlers/agent/memory' import type { Message } from '@/executor/handlers/agent/types' -vi.mock('@sim/logger', () => loggerMock) - vi.mock('@/lib/tokenization/estimators', () => ({ getAccurateTokenCount: vi.fn((text: string) => { return Math.ceil(text.length / 4) diff --git a/apps/sim/executor/handlers/agent/memory.ts b/apps/sim/executor/handlers/agent/memory.ts index 00252bfd812..6428f0b7607 100644 --- a/apps/sim/executor/handlers/agent/memory.ts +++ b/apps/sim/executor/handlers/agent/memory.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import { memory } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, sql } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' import { getAccurateTokenCount } from '@/lib/tokenization/estimators' import { MEMORY } from '@/executor/constants' import type { AgentInputs, Message } from '@/executor/handlers/agent/types' diff --git a/apps/sim/executor/handlers/api/api-handler.test.ts b/apps/sim/executor/handlers/api/api-handler.test.ts index 0f7f0186ae3..f073f996ad5 100644 --- a/apps/sim/executor/handlers/api/api-handler.test.ts +++ b/apps/sim/executor/handlers/api/api-handler.test.ts @@ -1,7 +1,7 @@ import '@sim/testing/mocks/executor' +import { inputValidationMock, inputValidationMockFns } from '@sim/testing' import { beforeEach, describe, expect, it, type Mock, vi } from 'vitest' -import { validateUrlWithDNS } from '@/lib/core/security/input-validation.server' import { BlockType } from '@/executor/constants' import { ApiBlockHandler } from '@/executor/handlers/api/api-handler' import type { ExecutionContext } from '@/executor/types' @@ -10,13 +10,11 @@ import { executeTool } from '@/tools' import type { ToolConfig } from '@/tools/types' import { getTool } from '@/tools/utils' -vi.mock('@/lib/core/security/input-validation.server', () => ({ - validateUrlWithDNS: vi.fn(), -})) +vi.mock('@/lib/core/security/input-validation.server', () => inputValidationMock) const mockGetTool = vi.mocked(getTool) const mockExecuteTool = executeTool as Mock -const mockValidateUrlWithDNS = vi.mocked(validateUrlWithDNS) +const mockValidateUrlWithDNS = inputValidationMockFns.mockValidateUrlWithDNS describe('ApiBlockHandler', () => { let handler: ApiBlockHandler diff --git a/apps/sim/executor/handlers/condition/condition-handler.test.ts b/apps/sim/executor/handlers/condition/condition-handler.test.ts index 356e15b755f..3d7d4c70604 100644 --- a/apps/sim/executor/handlers/condition/condition-handler.test.ts +++ b/apps/sim/executor/handlers/condition/condition-handler.test.ts @@ -1,12 +1,10 @@ -import { loggerMock, requestUtilsMock } from '@sim/testing' +import { requestUtilsMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' import { BlockType } from '@/executor/constants' import { ConditionBlockHandler } from '@/executor/handlers/condition/condition-handler' import type { BlockState, ExecutionContext } from '@/executor/types' import type { SerializedBlock, SerializedWorkflow } from '@/serializer/types' -vi.mock('@sim/logger', () => loggerMock) - vi.mock('@/lib/core/utils/request', () => requestUtilsMock) vi.mock('@/tools', () => ({ diff --git a/apps/sim/executor/handlers/evaluator/evaluator-handler.test.ts b/apps/sim/executor/handlers/evaluator/evaluator-handler.test.ts index e70015a68bc..c338b9c310a 100644 --- a/apps/sim/executor/handlers/evaluator/evaluator-handler.test.ts +++ b/apps/sim/executor/handlers/evaluator/evaluator-handler.test.ts @@ -1,15 +1,9 @@ import '@sim/testing/mocks/executor' +import { authOAuthUtilsMock, authOAuthUtilsMockFns } from '@sim/testing' import { beforeEach, describe, expect, it, type Mock, vi } from 'vitest' -vi.mock('@/app/api/auth/oauth/utils', () => ({ - resolveOAuthAccountId: vi - .fn() - .mockResolvedValue({ accountId: 'test-vertex-credential-id', usedCredentialTable: false }), - refreshTokenIfNeeded: vi - .fn() - .mockResolvedValue({ accessToken: 'mock-access-token', refreshed: false }), -})) +vi.mock('@/app/api/auth/oauth/utils', () => authOAuthUtilsMock) import { BlockType } from '@/executor/constants' import { EvaluatorBlockHandler } from '@/executor/handlers/evaluator/evaluator-handler' @@ -60,6 +54,14 @@ describe('EvaluatorBlockHandler', () => { vi.clearAllMocks() // Default mock implementations + authOAuthUtilsMockFns.mockResolveOAuthAccountId.mockResolvedValue({ + accountId: 'test-vertex-credential-id', + usedCredentialTable: false, + }) + authOAuthUtilsMockFns.mockRefreshTokenIfNeeded.mockResolvedValue({ + accessToken: 'mock-access-token', + refreshed: false, + }) mockGetProviderFromModel.mockReturnValue('openai') // Set up fetch mock to return a successful response diff --git a/apps/sim/executor/handlers/function/function-handler.test.ts b/apps/sim/executor/handlers/function/function-handler.test.ts index 5426610c701..0dcda1ce37d 100644 --- a/apps/sim/executor/handlers/function/function-handler.test.ts +++ b/apps/sim/executor/handlers/function/function-handler.test.ts @@ -1,4 +1,3 @@ -import { loggerMock } from '@sim/testing' import { beforeEach, describe, expect, it, type Mock, vi } from 'vitest' import { DEFAULT_EXECUTION_TIMEOUT_MS } from '@/lib/execution/constants' import { BlockType } from '@/executor/constants' @@ -7,8 +6,6 @@ import type { ExecutionContext } from '@/executor/types' import type { SerializedBlock } from '@/serializer/types' import { executeTool } from '@/tools' -vi.mock('@sim/logger', () => loggerMock) - vi.mock('@/tools', () => ({ executeTool: vi.fn(), })) diff --git a/apps/sim/executor/handlers/generic/generic-handler.ts b/apps/sim/executor/handlers/generic/generic-handler.ts index 64a915c16f8..b1d700a1f44 100644 --- a/apps/sim/executor/handlers/generic/generic-handler.ts +++ b/apps/sim/executor/handlers/generic/generic-handler.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { getBlock } from '@/blocks/index' import { isMcpTool } from '@/executor/constants' import type { BlockHandler, ExecutionContext } from '@/executor/types' diff --git a/apps/sim/executor/handlers/mothership/mothership-handler.test.ts b/apps/sim/executor/handlers/mothership/mothership-handler.test.ts index 524c1e3ad65..38a36c32f0e 100644 --- a/apps/sim/executor/handlers/mothership/mothership-handler.test.ts +++ b/apps/sim/executor/handlers/mothership/mothership-handler.test.ts @@ -28,7 +28,7 @@ vi.mock('@/executor/utils/http', () => ({ extractAPIErrorMessage: mockExtractAPIErrorMessage, })) -vi.mock('@/lib/core/utils/uuid', () => ({ +vi.mock('@sim/utils/id', () => ({ generateId: mockGenerateId, })) @@ -37,20 +37,6 @@ vi.mock('@/lib/execution/cancellation', () => ({ isRedisCancellationEnabled: mockIsRedisCancellationEnabled, })) -vi.mock('@sim/logger', () => { - const createMockLogger = (): Record => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - withMetadata: vi.fn(() => createMockLogger()), - }) - - return { - createLogger: vi.fn(() => createMockLogger()), - } -}) - function createAbortError(): Error { const error = new Error('The operation was aborted') error.name = 'AbortError' diff --git a/apps/sim/executor/handlers/mothership/mothership-handler.ts b/apps/sim/executor/handlers/mothership/mothership-handler.ts index 9b788f847b0..433bcc273e2 100644 --- a/apps/sim/executor/handlers/mothership/mothership-handler.ts +++ b/apps/sim/executor/handlers/mothership/mothership-handler.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { isExecutionCancelled, isRedisCancellationEnabled } from '@/lib/execution/cancellation' import type { BlockOutput } from '@/blocks/types' import { BlockType } from '@/executor/constants' diff --git a/apps/sim/executor/handlers/router/router-handler.test.ts b/apps/sim/executor/handlers/router/router-handler.test.ts index 5d4defa0a0b..90e326c2785 100644 --- a/apps/sim/executor/handlers/router/router-handler.test.ts +++ b/apps/sim/executor/handlers/router/router-handler.test.ts @@ -1,15 +1,9 @@ import '@sim/testing/mocks/executor' +import { authOAuthUtilsMock, authOAuthUtilsMockFns } from '@sim/testing' import { beforeEach, describe, expect, it, type Mock, vi } from 'vitest' -vi.mock('@/app/api/auth/oauth/utils', () => ({ - resolveOAuthAccountId: vi - .fn() - .mockResolvedValue({ accountId: 'test-vertex-credential-id', usedCredentialTable: false }), - refreshTokenIfNeeded: vi - .fn() - .mockResolvedValue({ accessToken: 'mock-access-token', refreshed: false }), -})) +vi.mock('@/app/api/auth/oauth/utils', () => authOAuthUtilsMock) import { generateRouterPrompt, generateRouterV2Prompt } from '@/blocks/blocks/router' import { BlockType } from '@/executor/constants' @@ -85,6 +79,14 @@ describe('RouterBlockHandler', () => { vi.clearAllMocks() + authOAuthUtilsMockFns.mockResolveOAuthAccountId.mockResolvedValue({ + accountId: 'test-vertex-credential-id', + usedCredentialTable: false, + }) + authOAuthUtilsMockFns.mockRefreshTokenIfNeeded.mockResolvedValue({ + accessToken: 'mock-access-token', + refreshed: false, + }) mockGetProviderFromModel.mockReturnValue('openai') mockGenerateRouterPrompt.mockReturnValue('Generated System Prompt') @@ -375,6 +377,14 @@ describe('RouterBlockHandler V2', () => { vi.clearAllMocks() + authOAuthUtilsMockFns.mockResolveOAuthAccountId.mockResolvedValue({ + accountId: 'test-vertex-credential-id', + usedCredentialTable: false, + }) + authOAuthUtilsMockFns.mockRefreshTokenIfNeeded.mockResolvedValue({ + accessToken: 'mock-access-token', + refreshed: false, + }) mockGetProviderFromModel.mockReturnValue('openai') mockGenerateRouterV2Prompt.mockReturnValue('Generated V2 System Prompt') }) diff --git a/apps/sim/executor/handlers/workflow/workflow-handler.ts b/apps/sim/executor/handlers/workflow/workflow-handler.ts index aaf10d9b9ee..26d3b3df330 100644 --- a/apps/sim/executor/handlers/workflow/workflow-handler.ts +++ b/apps/sim/executor/handlers/workflow/workflow-handler.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { generateId } from '@/lib/core/utils/uuid' +import { generateId } from '@sim/utils/id' import { buildNextCallChain, validateCallChain } from '@/lib/execution/call-chain' import { snapshotService } from '@/lib/logs/execution/snapshot/service' import { buildTraceSpans } from '@/lib/logs/execution/trace-spans/trace-spans' diff --git a/apps/sim/executor/orchestrators/loop.ts b/apps/sim/executor/orchestrators/loop.ts index d01daaa67a5..9816109a93d 100644 --- a/apps/sim/executor/orchestrators/loop.ts +++ b/apps/sim/executor/orchestrators/loop.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { generateRequestId } from '@/lib/core/utils/request' import { isExecutionCancelled, isRedisCancellationEnabled } from '@/lib/execution/cancellation' import { executeInIsolatedVM } from '@/lib/execution/isolated-vm' diff --git a/apps/sim/executor/orchestrators/parallel.test.ts b/apps/sim/executor/orchestrators/parallel.test.ts index aa54bed9b2b..f0262b92e9e 100644 --- a/apps/sim/executor/orchestrators/parallel.test.ts +++ b/apps/sim/executor/orchestrators/parallel.test.ts @@ -7,15 +7,6 @@ import type { BlockStateWriter, ContextExtensions } from '@/executor/execution/t import { ParallelOrchestrator } from '@/executor/orchestrators/parallel' import type { ExecutionContext } from '@/executor/types' -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})) - function createDag(): DAG { return { nodes: new Map(), diff --git a/apps/sim/executor/orchestrators/parallel.ts b/apps/sim/executor/orchestrators/parallel.ts index 1f98953bc5e..7cc10abbee7 100644 --- a/apps/sim/executor/orchestrators/parallel.ts +++ b/apps/sim/executor/orchestrators/parallel.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { DEFAULTS } from '@/executor/constants' import type { DAG } from '@/executor/dag/builder' import type { ParallelScope } from '@/executor/execution/state' diff --git a/apps/sim/executor/utils.test.ts b/apps/sim/executor/utils.test.ts index bcd2b78383c..5769b81ac8a 100644 --- a/apps/sim/executor/utils.test.ts +++ b/apps/sim/executor/utils.test.ts @@ -1,12 +1,9 @@ -import { loggerMock } from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { StreamingResponseFormatProcessor, streamingResponseFormatProcessor, } from '@/executor/utils' -vi.mock('@sim/logger', () => loggerMock) - describe('StreamingResponseFormatProcessor', () => { let processor: StreamingResponseFormatProcessor diff --git a/apps/sim/executor/utils/file-tool-processor.ts b/apps/sim/executor/utils/file-tool-processor.ts index 1b1e168415b..1fa86ffc731 100644 --- a/apps/sim/executor/utils/file-tool-processor.ts +++ b/apps/sim/executor/utils/file-tool-processor.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { isUserFile } from '@/lib/core/utils/user-file' import { uploadExecutionFile, uploadFileFromRawData } from '@/lib/uploads/contexts/execution' import { downloadFileFromUrl } from '@/lib/uploads/utils/file-utils.server' diff --git a/apps/sim/executor/utils/parallel-expansion.test.ts b/apps/sim/executor/utils/parallel-expansion.test.ts index 16daa93e4eb..bcb2fbeb5c5 100644 --- a/apps/sim/executor/utils/parallel-expansion.test.ts +++ b/apps/sim/executor/utils/parallel-expansion.test.ts @@ -1,8 +1,7 @@ /** * @vitest-environment node */ -import { loggerMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import { BlockType } from '@/executor/constants' import { DAGBuilder } from '@/executor/dag/builder' import { EdgeManager } from '@/executor/execution/edge-manager' @@ -15,8 +14,6 @@ import { } from '@/executor/utils/subflow-utils' import type { SerializedBlock, SerializedWorkflow } from '@/serializer/types' -vi.mock('@sim/logger', () => loggerMock) - function createBlock(id: string, metadataId: string): SerializedBlock { return { id, diff --git a/apps/sim/executor/utils/subflow-utils.ts b/apps/sim/executor/utils/subflow-utils.ts index b7227bd4ad8..01765360787 100644 --- a/apps/sim/executor/utils/subflow-utils.ts +++ b/apps/sim/executor/utils/subflow-utils.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { DEFAULTS, LOOP, PARALLEL, REFERENCE } from '@/executor/constants' import type { ContextExtensions } from '@/executor/execution/types' import { type BlockLog, type ExecutionContext, getNextExecutionOrder } from '@/executor/types' diff --git a/apps/sim/executor/variables/resolver.ts b/apps/sim/executor/variables/resolver.ts index 88198fc360f..412dd549d39 100644 --- a/apps/sim/executor/variables/resolver.ts +++ b/apps/sim/executor/variables/resolver.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { BlockType } from '@/executor/constants' import type { ExecutionState, LoopScope } from '@/executor/execution/state' import type { ExecutionContext } from '@/executor/types' diff --git a/apps/sim/executor/variables/resolvers/block.test.ts b/apps/sim/executor/variables/resolvers/block.test.ts index 4c943f297ab..5b9ed37fc3b 100644 --- a/apps/sim/executor/variables/resolvers/block.test.ts +++ b/apps/sim/executor/variables/resolvers/block.test.ts @@ -1,4 +1,3 @@ -import { loggerMock } from '@sim/testing' import { describe, expect, it, vi } from 'vitest' import { ExecutionState } from '@/executor/execution/state' import { BlockResolver } from './block' @@ -115,7 +114,6 @@ const MOCK_BLOCKS = vi.hoisted( }) as Record ) -vi.mock('@sim/logger', () => loggerMock) vi.mock('@/blocks/registry', () => ({ getBlock: (type: string) => MOCK_BLOCKS[type] ?? undefined, registry: MOCK_BLOCKS, diff --git a/apps/sim/executor/variables/resolvers/env.test.ts b/apps/sim/executor/variables/resolvers/env.test.ts index 7846b308f1f..b9fa9658343 100644 --- a/apps/sim/executor/variables/resolvers/env.test.ts +++ b/apps/sim/executor/variables/resolvers/env.test.ts @@ -1,10 +1,7 @@ -import { loggerMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import { EnvResolver } from './env' import type { ResolutionContext } from './reference' -vi.mock('@sim/logger', () => loggerMock) - /** * Creates a minimal ResolutionContext for testing. * The EnvResolver only uses context.executionContext.environmentVariables. diff --git a/apps/sim/executor/variables/resolvers/loop.test.ts b/apps/sim/executor/variables/resolvers/loop.test.ts index 862072a516f..3d3b643b516 100644 --- a/apps/sim/executor/variables/resolvers/loop.test.ts +++ b/apps/sim/executor/variables/resolvers/loop.test.ts @@ -1,12 +1,9 @@ -import { loggerMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import type { LoopScope } from '@/executor/execution/state' import { InvalidFieldError } from '@/executor/utils/block-reference' import { LoopResolver } from './loop' import type { ResolutionContext } from './reference' -vi.mock('@sim/logger', () => loggerMock) - interface LoopDef { nodes: string[] id?: string diff --git a/apps/sim/executor/variables/resolvers/parallel.test.ts b/apps/sim/executor/variables/resolvers/parallel.test.ts index 14f0122ed0b..cec6294f391 100644 --- a/apps/sim/executor/variables/resolvers/parallel.test.ts +++ b/apps/sim/executor/variables/resolvers/parallel.test.ts @@ -1,11 +1,8 @@ -import { loggerMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import { InvalidFieldError } from '@/executor/utils/block-reference' import { ParallelResolver } from './parallel' import type { ResolutionContext } from './reference' -vi.mock('@sim/logger', () => loggerMock) - interface BlockDef { id: string name: string diff --git a/apps/sim/executor/variables/resolvers/workflow.test.ts b/apps/sim/executor/variables/resolvers/workflow.test.ts index 29529d1f703..610066b17df 100644 --- a/apps/sim/executor/variables/resolvers/workflow.test.ts +++ b/apps/sim/executor/variables/resolvers/workflow.test.ts @@ -1,10 +1,7 @@ -import { loggerMock } from '@sim/testing' import { describe, expect, it, vi } from 'vitest' import type { ResolutionContext } from './reference' import { WorkflowResolver } from './workflow' -vi.mock('@sim/logger', () => loggerMock) - vi.mock('@/lib/workflows/variables/variable-manager', () => ({ VariableManager: { resolveForExecution: vi.fn((value) => value), diff --git a/apps/sim/hooks/queries/a2a/tasks.ts b/apps/sim/hooks/queries/a2a/tasks.ts index d4650443a76..abb9bbb3acb 100644 --- a/apps/sim/hooks/queries/a2a/tasks.ts +++ b/apps/sim/hooks/queries/a2a/tasks.ts @@ -5,9 +5,9 @@ */ import type { Artifact, Message, TaskState } from '@a2a-js/sdk' +import { generateId } from '@sim/utils/id' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { isTerminalState } from '@/lib/a2a/utils' -import { generateId } from '@/lib/core/utils/uuid' /** A2A v0.3 JSON-RPC method names */ const A2A_METHODS = { diff --git a/apps/sim/hooks/queries/admin-users.ts b/apps/sim/hooks/queries/admin-users.ts index 7228aacf60d..2d593797b93 100644 --- a/apps/sim/hooks/queries/admin-users.ts +++ b/apps/sim/hooks/queries/admin-users.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { isValidUuid } from '@sim/utils/id' import { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { client } from '@/lib/auth/auth-client' -import { isValidUuid } from '@/lib/core/utils/uuid' const logger = createLogger('AdminUsersQuery') diff --git a/apps/sim/hooks/queries/folders.test.ts b/apps/sim/hooks/queries/folders.test.ts index 355b3d899e3..2bb75d22466 100644 --- a/apps/sim/hooks/queries/folders.test.ts +++ b/apps/sim/hooks/queries/folders.test.ts @@ -1,12 +1,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockLogger, mockGetFolderMap, mockGetWorkflows, queryClient } = vi.hoisted(() => ({ - mockLogger: { - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }, +const { mockGetFolderMap, mockGetWorkflows, queryClient } = vi.hoisted(() => ({ mockGetFolderMap: vi.fn(() => ({})), mockGetWorkflows: vi.fn(() => []), queryClient: { @@ -28,10 +22,6 @@ let workflowList: Array<{ sortOrder: number }> -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn(() => mockLogger), -})) - vi.mock('@tanstack/react-query', () => ({ keepPreviousData: {}, useQuery: vi.fn(), diff --git a/apps/sim/hooks/queries/folders.ts b/apps/sim/hooks/queries/folders.ts index caff7436663..68a61093193 100644 --- a/apps/sim/hooks/queries/folders.ts +++ b/apps/sim/hooks/queries/folders.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { generateId } from '@/lib/core/utils/uuid' import { getFolderMap } from '@/hooks/queries/utils/folder-cache' import { type FolderQueryScope, folderKeys } from '@/hooks/queries/utils/folder-keys' import { invalidateWorkflowLists } from '@/hooks/queries/utils/invalidate-workflow-lists' diff --git a/apps/sim/hooks/queries/inbox.ts b/apps/sim/hooks/queries/inbox.ts index e372d639692..b11b3438e55 100644 --- a/apps/sim/hooks/queries/inbox.ts +++ b/apps/sim/hooks/queries/inbox.ts @@ -1,5 +1,5 @@ +import { generateId } from '@sim/utils/id' import { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { generateId } from '@/lib/core/utils/uuid' import type { InboxTaskStatus } from '@/lib/mothership/inbox/types' export const inboxKeys = { diff --git a/apps/sim/hooks/queries/workflows.ts b/apps/sim/hooks/queries/workflows.ts index ffa7cd26de5..b0a0c6ccc3b 100644 --- a/apps/sim/hooks/queries/workflows.ts +++ b/apps/sim/hooks/queries/workflows.ts @@ -3,6 +3,7 @@ */ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { keepPreviousData, skipToken, @@ -10,7 +11,6 @@ import { useQuery, useQueryClient, } from '@tanstack/react-query' -import { generateId } from '@/lib/core/utils/uuid' import { getNextWorkflowColor } from '@/lib/workflows/colors' import { deploymentKeys } from '@/hooks/queries/deployments' import { fetchDeploymentVersionState } from '@/hooks/queries/utils/fetch-deployment-version-state' diff --git a/apps/sim/hooks/use-code-undo-redo.ts b/apps/sim/hooks/use-code-undo-redo.ts index 82c20da6192..c3bdc8e9552 100644 --- a/apps/sim/hooks/use-code-undo-redo.ts +++ b/apps/sim/hooks/use-code-undo-redo.ts @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo, useRef } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { useShallow } from 'zustand/react/shallow' -import { generateId } from '@/lib/core/utils/uuid' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' import { useCodeUndoRedoStore } from '@/stores/undo-redo' import { useWorkflowDiffStore } from '@/stores/workflow-diff/store' diff --git a/apps/sim/hooks/use-collaborative-workflow.ts b/apps/sim/hooks/use-collaborative-workflow.ts index ae1b2fe90f6..bbf54868a27 100644 --- a/apps/sim/hooks/use-collaborative-workflow.ts +++ b/apps/sim/hooks/use-collaborative-workflow.ts @@ -1,10 +1,10 @@ import { useCallback, useEffect, useRef } from 'react' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { useQueryClient } from '@tanstack/react-query' import type { Edge } from 'reactflow' import { useShallow } from 'zustand/react/shallow' import { useSession } from '@/lib/auth/auth-client' -import { generateId } from '@/lib/core/utils/uuid' import { useSocket } from '@/app/workspace/providers/socket-provider' import { getBlock } from '@/blocks' import { normalizeName, RESERVED_BLOCK_NAMES } from '@/executor/constants' diff --git a/apps/sim/hooks/use-stream-cleanup.ts b/apps/sim/hooks/use-stream-cleanup.ts index 060f8b3c0cd..8f406667a5e 100644 --- a/apps/sim/hooks/use-stream-cleanup.ts +++ b/apps/sim/hooks/use-stream-cleanup.ts @@ -1,6 +1,9 @@ 'use client' import { useCallback, useEffect } from 'react' +import { createLogger } from '@sim/logger' + +const logger = createLogger('UseStreamCleanup') /** * Generic hook to handle stream cleanup on page unload and component unmount @@ -15,7 +18,7 @@ export function useStreamCleanup(cleanup: () => void) { try { cleanup() } catch (error) { - console.warn('Error during stream cleanup:', error) + logger.warn('Error during stream cleanup:', error) } }, [cleanup]) diff --git a/apps/sim/hooks/use-undo-redo.ts b/apps/sim/hooks/use-undo-redo.ts index 5ba2f9d929b..023b2f1d8f8 100644 --- a/apps/sim/hooks/use-undo-redo.ts +++ b/apps/sim/hooks/use-undo-redo.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' import { createLogger } from '@sim/logger' -import { generateId } from '@/lib/core/utils/uuid' +import { generateId } from '@sim/utils/id' declare global { interface Window { diff --git a/apps/sim/lib/a2a/utils.ts b/apps/sim/lib/a2a/utils.ts index f9b122eddbe..cc6cf64ae83 100644 --- a/apps/sim/lib/a2a/utils.ts +++ b/apps/sim/lib/a2a/utils.ts @@ -16,9 +16,9 @@ import { ClientFactoryOptions, } from '@a2a-js/sdk/client' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { validateUrlWithDNS } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { isInternalFileUrl } from '@/lib/uploads/utils/file-utils' import { A2A_TERMINAL_STATES } from './constants' diff --git a/apps/sim/lib/api-key/auth.ts b/apps/sim/lib/api-key/auth.ts index 8ecb7a4a441..ac194d3a5e5 100644 --- a/apps/sim/lib/api-key/auth.ts +++ b/apps/sim/lib/api-key/auth.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { apiKey } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { and, eq } from 'drizzle-orm' import { decryptApiKey, @@ -12,7 +13,6 @@ import { } from '@/lib/api-key/crypto' import { env } from '@/lib/core/config/env' import { safeCompare } from '@/lib/core/security/encryption' -import { generateShortId } from '@/lib/core/utils/uuid' const logger = createLogger('ApiKeyAuth') diff --git a/apps/sim/lib/audio/extractor.ts b/apps/sim/lib/audio/extractor.ts index 5c328722c19..f7e722bb578 100644 --- a/apps/sim/lib/audio/extractor.ts +++ b/apps/sim/lib/audio/extractor.ts @@ -3,6 +3,7 @@ import fsSync from 'node:fs' import fs from 'node:fs/promises' import os from 'node:os' import path from 'node:path' +import { createLogger } from '@sim/logger' import ffmpegStatic from 'ffmpeg-static' import ffmpeg from 'fluent-ffmpeg' import type { @@ -11,6 +12,8 @@ import type { AudioMetadata, } from '@/lib/audio/types' +const logger = createLogger('AudioExtractor') + let ffmpegInitialized = false let ffmpegPath: string | null = null @@ -35,7 +38,7 @@ function ensureFfmpeg(): void { fsSync.accessSync(ffmpegStatic, fsSync.constants.X_OK) ffmpegPath = ffmpegStatic ffmpeg.setFfmpegPath(ffmpegPath) - console.log('[FFmpeg] Using ffmpeg-static:', ffmpegPath) + logger.info('[FFmpeg] Using ffmpeg-static:', ffmpegPath) return } catch { // Binary doesn't exist or not executable @@ -49,7 +52,7 @@ function ensureFfmpeg(): void { // On Windows, 'where' returns multiple paths - take first ffmpegPath = result.split('\n')[0] ffmpeg.setFfmpegPath(ffmpegPath) - console.log('[FFmpeg] Using system ffmpeg:', ffmpegPath) + logger.info('[FFmpeg] Using system ffmpeg:', ffmpegPath) return } catch { // System ffmpeg not found @@ -57,7 +60,7 @@ function ensureFfmpeg(): void { // No FFmpeg found - set flag but don't throw yet // Error will be thrown when user tries to use video extraction - console.warn('[FFmpeg] No FFmpeg binary found at module load time') + logger.warn('[FFmpeg] No FFmpeg binary found at module load time') } /** @@ -134,7 +137,7 @@ async function convertAudioWithFFmpeg( duration = metadata.duration || 0 } catch (error) { // Metadata extraction failed, continue without duration - console.warn('Failed to extract metadata:', error) + logger.warn('Failed to extract metadata:', error) } // Convert using FFmpeg diff --git a/apps/sim/lib/audit/log.test.ts b/apps/sim/lib/audit/log.test.ts index 57381729a43..64856f943ed 100644 --- a/apps/sim/lib/audit/log.test.ts +++ b/apps/sim/lib/audit/log.test.ts @@ -1,19 +1,15 @@ /** * @vitest-environment node */ -import { auditMock, databaseMock, drizzleOrmMock, loggerMock } from '@sim/testing' +import { auditMock, databaseMock, schemaMock } from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' vi.mock('@sim/db', () => ({ ...databaseMock, auditLog: { id: 'id', workspaceId: 'workspace_id' }, })) -vi.mock('@sim/db/schema', () => ({ - user: { id: 'id', name: 'name', email: 'email' }, -})) -vi.mock('drizzle-orm', () => drizzleOrmMock) -vi.mock('@sim/logger', () => loggerMock) -vi.mock('@/lib/core/utils/uuid', () => ({ +vi.mock('@sim/db/schema', () => schemaMock) +vi.mock('@sim/utils/id', () => ({ generateId: () => 'test-uuid-123', generateShortId: () => 'test-id-123', isValidUuid: (v: string) => diff --git a/apps/sim/lib/audit/log.ts b/apps/sim/lib/audit/log.ts index ea7783aba78..3176fcbee9a 100644 --- a/apps/sim/lib/audit/log.ts +++ b/apps/sim/lib/audit/log.ts @@ -1,10 +1,10 @@ import { auditLog, db } from '@sim/db' import { user } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import type { AuditActionType, AuditResourceTypeValue } from '@/lib/audit/types' import { getClientIp } from '@/lib/core/utils/request' -import { generateShortId } from '@/lib/core/utils/uuid' export type { AuditActionType, AuditResourceTypeValue } from '@/lib/audit/types' export { AuditAction, AuditResourceType } from '@/lib/audit/types' diff --git a/apps/sim/lib/auth/anonymous.ts b/apps/sim/lib/auth/anonymous.ts index 4df32329130..839e65487ec 100644 --- a/apps/sim/lib/auth/anonymous.ts +++ b/apps/sim/lib/auth/anonymous.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import * as schema from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' import { ANONYMOUS_USER, ANONYMOUS_USER_ID } from './constants' const logger = createLogger('AnonymousAuth') diff --git a/apps/sim/lib/auth/auth.ts b/apps/sim/lib/auth/auth.ts index 32237b4119a..fba33becdac 100644 --- a/apps/sim/lib/auth/auth.ts +++ b/apps/sim/lib/auth/auth.ts @@ -4,6 +4,8 @@ import { stripe } from '@better-auth/stripe' import { db } from '@sim/db' import * as schema from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { betterAuth } from 'better-auth' import { drizzleAdapter } from 'better-auth/adapters/drizzle' import { nextCookies } from 'better-auth/next-js' @@ -73,9 +75,7 @@ import { isSignupEmailValidationEnabled, } from '@/lib/core/config/feature-flags' import { PlatformEvents } from '@/lib/core/telemetry' -import { toError } from '@/lib/core/utils/helpers' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { processCredentialDraft } from '@/lib/credentials/draft-processor' import { sendEmail } from '@/lib/messaging/email/mailer' import { getFromEmailAddress, getPersonalEmailFrom } from '@/lib/messaging/email/utils' diff --git a/apps/sim/lib/auth/cimd.ts b/apps/sim/lib/auth/cimd.ts index 3ed57e50cc7..45e9628b75a 100644 --- a/apps/sim/lib/auth/cimd.ts +++ b/apps/sim/lib/auth/cimd.ts @@ -1,9 +1,9 @@ import { db } from '@sim/db' import { oauthApplication } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { secureFetchWithValidation } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('cimd') diff --git a/apps/sim/lib/billing/calculations/usage-monitor.ts b/apps/sim/lib/billing/calculations/usage-monitor.ts index c57fdcc7cd6..6e053067715 100644 --- a/apps/sim/lib/billing/calculations/usage-monitor.ts +++ b/apps/sim/lib/billing/calculations/usage-monitor.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { member, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq } from 'drizzle-orm' import { getHighestPrioritySubscription, @@ -15,7 +16,6 @@ import { getPlanTierDollars, isPaid } from '@/lib/billing/plan-helpers' import { isOrgScopedSubscription } from '@/lib/billing/subscriptions/utils' import { toDecimal, toNumber } from '@/lib/billing/utils/decimal' import { isBillingEnabled } from '@/lib/core/config/feature-flags' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('UsageMonitor') diff --git a/apps/sim/lib/billing/core/usage-log.ts b/apps/sim/lib/billing/core/usage-log.ts index 165c6e3e3f7..a2400d28a85 100644 --- a/apps/sim/lib/billing/core/usage-log.ts +++ b/apps/sim/lib/billing/core/usage-log.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { usageLog, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, desc, eq, gte, lte, type SQL, sql } from 'drizzle-orm' import { isBillingEnabled } from '@/lib/core/config/feature-flags' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('UsageLog') diff --git a/apps/sim/lib/billing/core/usage.ts b/apps/sim/lib/billing/core/usage.ts index c560acc63a9..c9990673ac8 100644 --- a/apps/sim/lib/billing/core/usage.ts +++ b/apps/sim/lib/billing/core/usage.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { member, organization, settings, user, userStats } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import { getEmailSubject, @@ -31,7 +32,6 @@ import type { BillingData, UsageData, UsageLimitInfo } from '@/lib/billing/types import { Decimal, toDecimal, toNumber } from '@/lib/billing/utils/decimal' import { isBillingEnabled } from '@/lib/core/config/feature-flags' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { sendEmail } from '@/lib/messaging/email/mailer' import { getEmailPreferences } from '@/lib/messaging/email/unsubscribe' diff --git a/apps/sim/lib/billing/credits/daily-refresh.test.ts b/apps/sim/lib/billing/credits/daily-refresh.test.ts index 8def419adec..9b1644fa99c 100644 --- a/apps/sim/lib/billing/credits/daily-refresh.test.ts +++ b/apps/sim/lib/billing/credits/daily-refresh.test.ts @@ -1,7 +1,7 @@ /** * @vitest-environment node */ -import { loggerMock } from '@sim/testing' +import { schemaMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' const mockDbSelect = vi.fn() @@ -18,13 +18,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - usageLog: { - userId: 'user_id', - createdAt: 'created_at', - cost: 'cost', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => { const sqlTag = () => { @@ -42,7 +36,6 @@ vi.mock('drizzle-orm', () => { } }) -vi.mock('@sim/logger', () => loggerMock) vi.mock('@/lib/billing/constants', () => ({ DAILY_REFRESH_RATE: 0.01, })) diff --git a/apps/sim/lib/billing/organization.ts b/apps/sim/lib/billing/organization.ts index 248aef50ceb..dffcba108bc 100644 --- a/apps/sim/lib/billing/organization.ts +++ b/apps/sim/lib/billing/organization.ts @@ -8,13 +8,13 @@ import { userStats, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, inArray, sql } from 'drizzle-orm' import { hasPaidSubscription } from '@/lib/billing' import { getPlanPricing } from '@/lib/billing/core/billing' import { syncUsageLimitsFromSubscription } from '@/lib/billing/core/usage' import { isEnterprise, isPaid, isTeam } from '@/lib/billing/plan-helpers' import { toDecimal, toNumber } from '@/lib/billing/utils/decimal' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('BillingOrganization') diff --git a/apps/sim/lib/billing/organizations/membership.ts b/apps/sim/lib/billing/organizations/membership.ts index 35b08984a32..b39e79503d4 100644 --- a/apps/sim/lib/billing/organizations/membership.ts +++ b/apps/sim/lib/billing/organizations/membership.ts @@ -14,6 +14,7 @@ import { userStats, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, inArray, isNull, ne, or, sql } from 'drizzle-orm' import { syncUsageLimitsFromSubscription } from '@/lib/billing/core/usage' import { isPaid, sqlIsPro } from '@/lib/billing/plan-helpers' @@ -22,7 +23,6 @@ import { toDecimal, toNumber } from '@/lib/billing/utils/decimal' import { validateSeatAvailability } from '@/lib/billing/validation/seat-management' import { OUTBOX_EVENT_TYPES } from '@/lib/billing/webhooks/outbox-handlers' import { enqueueOutboxEvent } from '@/lib/core/outbox/service' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('OrganizationMembership') diff --git a/apps/sim/lib/billing/webhooks/enterprise.ts b/apps/sim/lib/billing/webhooks/enterprise.ts index ed34d08a3c0..c717024001e 100644 --- a/apps/sim/lib/billing/webhooks/enterprise.ts +++ b/apps/sim/lib/billing/webhooks/enterprise.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { organization, subscription, user } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import type Stripe from 'stripe' import { getEmailSubject, renderEnterpriseSubscriptionEmail } from '@/components/emails' -import { generateId } from '@/lib/core/utils/uuid' import { sendEmail } from '@/lib/messaging/email/mailer' import { getFromEmailAddress } from '@/lib/messaging/email/utils' import { parseEnterpriseSubscriptionMetadata } from '../types' diff --git a/apps/sim/lib/billing/webhooks/invoices.test.ts b/apps/sim/lib/billing/webhooks/invoices.test.ts index f0a004059b2..f39906d5ab0 100644 --- a/apps/sim/lib/billing/webhooks/invoices.test.ts +++ b/apps/sim/lib/billing/webhooks/invoices.test.ts @@ -1,11 +1,12 @@ /** * @vitest-environment node */ +import { schemaMock, urlsMock, urlsMockFns } from '@sim/testing' import type Stripe from 'stripe' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockBlockOrgMembers, mockDbSelect, mockLogger, mockUnblockOrgMembers, selectResponses } = - vi.hoisted(() => { +const { mockBlockOrgMembers, mockDbSelect, mockUnblockOrgMembers, selectResponses } = vi.hoisted( + () => { const selectResponses: Array<{ limitResult?: unknown; whereResult?: unknown }> = [] const mockDbSelect = vi.fn(() => { const nextResponse = selectResponses.shift() @@ -31,16 +32,11 @@ const { mockBlockOrgMembers, mockDbSelect, mockLogger, mockUnblockOrgMembers, se return { mockBlockOrgMembers: vi.fn(), mockDbSelect, - mockLogger: { - debug: vi.fn(), - error: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - }, mockUnblockOrgMembers: vi.fn(), selectResponses, } - }) + } +) vi.mock('@sim/db', () => ({ db: { @@ -48,32 +44,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - member: { - organizationId: 'member.organizationId', - role: 'member.role', - userId: 'member.userId', - }, - organization: {}, - subscription: { - referenceId: 'subscription.referenceId', - stripeSubscriptionId: 'subscription.stripeSubscriptionId', - }, - user: { - email: 'user.email', - id: 'user.id', - name: 'user.name', - }, - userStats: { - billingBlocked: 'userStats.billingBlocked', - billingBlockedReason: 'userStats.billingBlockedReason', - userId: 'userStats.userId', - }, -})) - -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn(() => mockLogger), -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn(() => 'and'), @@ -150,9 +121,7 @@ vi.mock('@/lib/billing/webhooks/idempotency', () => ({ }, })) -vi.mock('@/lib/core/utils/urls', () => ({ - getBaseUrl: vi.fn(() => 'https://sim.test'), -})) +vi.mock('@/lib/core/utils/urls', () => urlsMock) vi.mock('@/lib/messaging/email/mailer', () => ({ sendEmail: vi.fn(), @@ -196,6 +165,7 @@ describe('invoice billing recovery', () => { beforeEach(() => { vi.clearAllMocks() selectResponses.length = 0 + urlsMockFns.mockGetBaseUrl.mockReturnValue('https://sim.test') mockBlockOrgMembers.mockResolvedValue(2) mockUnblockOrgMembers.mockResolvedValue(2) }) diff --git a/apps/sim/lib/chunkers/json-yaml-chunker.test.ts b/apps/sim/lib/chunkers/json-yaml-chunker.test.ts index 251b50daeaa..8ac0eafada8 100644 --- a/apps/sim/lib/chunkers/json-yaml-chunker.test.ts +++ b/apps/sim/lib/chunkers/json-yaml-chunker.test.ts @@ -2,12 +2,9 @@ * @vitest-environment node */ -import { loggerMock } from '@sim/testing' import { describe, expect, it, vi } from 'vitest' import { JsonYamlChunker } from './json-yaml-chunker' -vi.mock('@sim/logger', () => loggerMock) - vi.mock('@/lib/tokenization', () => ({ getAccurateTokenCount: (text: string) => Math.ceil(text.length / 4), })) diff --git a/apps/sim/lib/chunkers/recursive-chunker.test.ts b/apps/sim/lib/chunkers/recursive-chunker.test.ts index 846267034cf..345da36aaf3 100644 --- a/apps/sim/lib/chunkers/recursive-chunker.test.ts +++ b/apps/sim/lib/chunkers/recursive-chunker.test.ts @@ -2,12 +2,9 @@ * @vitest-environment node */ -import { loggerMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import { RecursiveChunker } from './recursive-chunker' -vi.mock('@sim/logger', () => loggerMock) - describe('RecursiveChunker', () => { describe('empty and whitespace input', () => { it.concurrent('should return empty array for empty string', async () => { diff --git a/apps/sim/lib/chunkers/regex-chunker.test.ts b/apps/sim/lib/chunkers/regex-chunker.test.ts index 5b64cf3f495..5716d45b28a 100644 --- a/apps/sim/lib/chunkers/regex-chunker.test.ts +++ b/apps/sim/lib/chunkers/regex-chunker.test.ts @@ -2,12 +2,9 @@ * @vitest-environment node */ -import { loggerMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import { RegexChunker } from './regex-chunker' -vi.mock('@sim/logger', () => loggerMock) - describe('RegexChunker', () => { describe('empty and whitespace input', () => { it.concurrent('should return empty array for empty string', async () => { diff --git a/apps/sim/lib/chunkers/regex-chunker.ts b/apps/sim/lib/chunkers/regex-chunker.ts index 83b7dfdaee4..4276287c627 100644 --- a/apps/sim/lib/chunkers/regex-chunker.ts +++ b/apps/sim/lib/chunkers/regex-chunker.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import type { Chunk, RegexChunkerOptions } from '@/lib/chunkers/types' import { addOverlap, @@ -9,7 +10,6 @@ import { splitAtWordBoundaries, tokensToChars, } from '@/lib/chunkers/utils' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('RegexChunker') diff --git a/apps/sim/lib/chunkers/sentence-chunker.test.ts b/apps/sim/lib/chunkers/sentence-chunker.test.ts index 78708de29ad..4d5883f22ff 100644 --- a/apps/sim/lib/chunkers/sentence-chunker.test.ts +++ b/apps/sim/lib/chunkers/sentence-chunker.test.ts @@ -2,12 +2,9 @@ * @vitest-environment node */ -import { loggerMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import { SentenceChunker } from './sentence-chunker' -vi.mock('@sim/logger', () => loggerMock) - describe('SentenceChunker', () => { describe('empty and whitespace input', () => { it.concurrent('should return empty array for empty string', async () => { diff --git a/apps/sim/lib/chunkers/structured-data-chunker.test.ts b/apps/sim/lib/chunkers/structured-data-chunker.test.ts index 3cd6b7ec27a..73c9106ae26 100644 --- a/apps/sim/lib/chunkers/structured-data-chunker.test.ts +++ b/apps/sim/lib/chunkers/structured-data-chunker.test.ts @@ -2,12 +2,9 @@ * @vitest-environment node */ -import { loggerMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import { StructuredDataChunker } from './structured-data-chunker' -vi.mock('@sim/logger', () => loggerMock) - describe('StructuredDataChunker', () => { describe('isStructuredData', () => { it('should detect CSV content with many columns', () => { diff --git a/apps/sim/lib/chunkers/token-chunker.test.ts b/apps/sim/lib/chunkers/token-chunker.test.ts index 420224c4d6e..24666410b96 100644 --- a/apps/sim/lib/chunkers/token-chunker.test.ts +++ b/apps/sim/lib/chunkers/token-chunker.test.ts @@ -2,12 +2,9 @@ * @vitest-environment node */ -import { loggerMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import { TokenChunker } from './token-chunker' -vi.mock('@sim/logger', () => loggerMock) - describe('TokenChunker', () => { describe('empty and whitespace input', () => { it.concurrent('should return empty array for empty string', async () => { diff --git a/apps/sim/lib/copilot/auth/permissions.test.ts b/apps/sim/lib/copilot/auth/permissions.test.ts index 46aaf84bf39..dbb7222380b 100644 --- a/apps/sim/lib/copilot/auth/permissions.test.ts +++ b/apps/sim/lib/copilot/auth/permissions.test.ts @@ -1,23 +1,20 @@ /** * @vitest-environment node */ -import { loggerMock } from '@sim/testing' +import { permissionsMock, permissionsMockFns } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetActiveWorkflowContext, mockGetUserEntityPermissions } = vi.hoisted(() => ({ +const { mockGetActiveWorkflowContext } = vi.hoisted(() => ({ mockGetActiveWorkflowContext: vi.fn(), - mockGetUserEntityPermissions: vi.fn(), })) -vi.mock('@sim/logger', () => loggerMock) +const mockGetUserEntityPermissions = permissionsMockFns.mockGetUserEntityPermissions vi.mock('@/lib/workflows/active-context', () => ({ getActiveWorkflowContext: mockGetActiveWorkflowContext, })) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - getUserEntityPermissions: mockGetUserEntityPermissions, -})) +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) import { createPermissionError, verifyWorkflowAccess } from '@/lib/copilot/auth/permissions' diff --git a/apps/sim/lib/copilot/chat/payload.test.ts b/apps/sim/lib/copilot/chat/payload.test.ts index 4231ac64b36..ab94e1b4719 100644 --- a/apps/sim/lib/copilot/chat/payload.test.ts +++ b/apps/sim/lib/copilot/chat/payload.test.ts @@ -1,6 +1,7 @@ /** * @vitest-environment node */ +import { featureFlagsMock, workflowsUtilsMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' const { mockCreateUserToolSchema, mockGetHighestPrioritySubscription } = vi.hoisted(() => ({ @@ -18,17 +19,13 @@ vi.mock('@/lib/billing/plan-helpers', () => ({ ), })) -vi.mock('@/lib/core/config/feature-flags', () => ({ - isHosted: false, -})) +vi.mock('@/lib/core/config/feature-flags', () => featureFlagsMock) vi.mock('@/lib/mcp/utils', () => ({ createMcpToolId: vi.fn(), })) -vi.mock('@/lib/workflows/utils', () => ({ - getWorkflowById: vi.fn(), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) vi.mock('@/tools/registry', () => ({ tools: { diff --git a/apps/sim/lib/copilot/chat/payload.ts b/apps/sim/lib/copilot/chat/payload.ts index b998cec31ae..6f6f297dda7 100644 --- a/apps/sim/lib/copilot/chat/payload.ts +++ b/apps/sim/lib/copilot/chat/payload.ts @@ -1,10 +1,10 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' import { isPaid } from '@/lib/billing/plan-helpers' import { getToolEntry } from '@/lib/copilot/tool-executor/router' import { getCopilotToolDescription } from '@/lib/copilot/tools/descriptions' import { isHosted } from '@/lib/core/config/feature-flags' -import { toError } from '@/lib/core/utils/helpers' import { createMcpToolId } from '@/lib/mcp/utils' import { trackChatUpload } from '@/lib/uploads/contexts/workspace/workspace-file-manager' import { tools } from '@/tools/registry' diff --git a/apps/sim/lib/copilot/chat/post.test.ts b/apps/sim/lib/copilot/chat/post.test.ts index c2c884c96de..b71b531ceb2 100644 --- a/apps/sim/lib/copilot/chat/post.test.ts +++ b/apps/sim/lib/copilot/chat/post.test.ts @@ -2,14 +2,23 @@ * @vitest-environment node */ +import { + authMock, + authMockFns, + permissionsMock, + permissionsMockFns, + schemaMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { NextRequest } from 'next/server' import { beforeEach, describe, expect, it, vi } from 'vitest' +const resolveWorkflowIdForUser = workflowsUtilsMockFns.mockResolveWorkflowIdForUser +const getWorkflowById = workflowsUtilsMockFns.mockGetWorkflowById +const getUserEntityPermissions = permissionsMockFns.mockGetUserEntityPermissions + const { - getSession, - resolveWorkflowIdForUser, - getWorkflowById, - getUserEntityPermissions, getEffectiveDecryptedEnv, generateWorkspaceContext, processContextsServer, @@ -21,10 +30,6 @@ const { releasePendingChatStream, resolveOrCreateChat, } = vi.hoisted(() => ({ - getSession: vi.fn(), - resolveWorkflowIdForUser: vi.fn(), - getWorkflowById: vi.fn(), - getUserEntityPermissions: vi.fn(), getEffectiveDecryptedEnv: vi.fn(), generateWorkspaceContext: vi.fn(), processContextsServer: vi.fn(), @@ -37,18 +42,13 @@ const { resolveOrCreateChat: vi.fn(), })) -vi.mock('@/lib/auth', () => ({ - getSession, -})) +const getSession = authMockFns.mockGetSession -vi.mock('@/lib/workflows/utils', () => ({ - resolveWorkflowIdForUser, - getWorkflowById, -})) +vi.mock('@/lib/auth', () => authMock) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - getUserEntityPermissions, -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) + +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) vi.mock('@/lib/environment/utils', () => ({ getEffectiveDecryptedEnv, @@ -100,14 +100,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - copilotChats: { - id: 'id', - messages: 'messages', - conversationId: 'conversationId', - updatedAt: 'updatedAt', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ eq: vi.fn(() => ({})), diff --git a/apps/sim/lib/copilot/chat/post.ts b/apps/sim/lib/copilot/chat/post.ts index 468ed4f048c..1dc5d0079a5 100644 --- a/apps/sim/lib/copilot/chat/post.ts +++ b/apps/sim/lib/copilot/chat/post.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { copilotChats } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' @@ -33,7 +34,6 @@ import type { ExecutionContext, OrchestratorResult } from '@/lib/copilot/request import { persistChatResources } from '@/lib/copilot/resources/persistence' import { taskPubSub } from '@/lib/copilot/tasks' import { prepareExecutionContext } from '@/lib/copilot/tools/handlers/context' -import { toError } from '@/lib/core/utils/helpers' import { getEffectiveDecryptedEnv } from '@/lib/environment/utils' import { getWorkflowById, resolveWorkflowIdForUser } from '@/lib/workflows/utils' import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' diff --git a/apps/sim/lib/copilot/chat/workspace-context.ts b/apps/sim/lib/copilot/chat/workspace-context.ts index b0af547ba66..bfea8ed5b8b 100644 --- a/apps/sim/lib/copilot/chat/workspace-context.ts +++ b/apps/sim/lib/copilot/chat/workspace-context.ts @@ -10,9 +10,9 @@ import { workflowSchedule, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, count, eq, inArray, isNull } from 'drizzle-orm' import { normalizeVfsSegment } from '@/lib/copilot/vfs/normalize-segment' -import { toError } from '@/lib/core/utils/helpers' import { getAccessibleOAuthCredentials } from '@/lib/credentials/environment' import { listWorkspaceFiles } from '@/lib/uploads/contexts/workspace' import { listCustomTools } from '@/lib/workflows/custom-tools/operations' diff --git a/apps/sim/lib/copilot/persistence/tool-confirm/index.ts b/apps/sim/lib/copilot/persistence/tool-confirm/index.ts index 136482be884..cd13ee31057 100644 --- a/apps/sim/lib/copilot/persistence/tool-confirm/index.ts +++ b/apps/sim/lib/copilot/persistence/tool-confirm/index.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { ASYNC_TOOL_STATUS, type AsyncCompletionEnvelope, @@ -8,7 +9,6 @@ import { import { getAsyncToolCalls } from '@/lib/copilot/async-runs/repository' import { MothershipStreamV1ToolOutcome } from '@/lib/copilot/generated/mothership-stream-v1' import { getRedisClient } from '@/lib/core/config/redis' -import { toError } from '@/lib/core/utils/helpers' import { createPubSubChannel } from '@/lib/events/pubsub' const logger = createLogger('CopilotOrchestratorPersistence') diff --git a/apps/sim/lib/copilot/request/context/request-context.ts b/apps/sim/lib/copilot/request/context/request-context.ts index bed52c21a49..e6ad4807eee 100644 --- a/apps/sim/lib/copilot/request/context/request-context.ts +++ b/apps/sim/lib/copilot/request/context/request-context.ts @@ -1,6 +1,6 @@ +import { generateId } from '@sim/utils/id' import { TraceCollector } from '@/lib/copilot/request/trace' import type { StreamingContext } from '@/lib/copilot/request/types' -import { generateId } from '@/lib/core/utils/uuid' /** * Create a fresh StreamingContext. diff --git a/apps/sim/lib/copilot/request/go/file-preview-adapter.ts b/apps/sim/lib/copilot/request/go/file-preview-adapter.ts index bc2d17e76ff..53e698a6c11 100644 --- a/apps/sim/lib/copilot/request/go/file-preview-adapter.ts +++ b/apps/sim/lib/copilot/request/go/file-preview-adapter.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { MothershipStreamV1EventType } from '@/lib/copilot/generated/mothership-stream-v1' import { createFilePreviewSession, @@ -25,7 +26,6 @@ import { buildFilePreviewText, loadWorkspaceFileTextForPreview, } from '@/lib/copilot/tools/server/files/file-preview' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('CopilotFilePreviewAdapter') diff --git a/apps/sim/lib/copilot/request/go/parser.ts b/apps/sim/lib/copilot/request/go/parser.ts index ddb18d0f096..79cdf7383ad 100644 --- a/apps/sim/lib/copilot/request/go/parser.ts +++ b/apps/sim/lib/copilot/request/go/parser.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' const logger = createLogger('CopilotSseParser') diff --git a/apps/sim/lib/copilot/request/go/stream.ts b/apps/sim/lib/copilot/request/go/stream.ts index d031162ba87..a1bb3928a76 100644 --- a/apps/sim/lib/copilot/request/go/stream.ts +++ b/apps/sim/lib/copilot/request/go/stream.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { ORCHESTRATION_TIMEOUT_MS } from '@/lib/copilot/constants' import { MothershipStreamV1SpanLifecycleEvent } from '@/lib/copilot/generated/mothership-stream-v1' import { @@ -26,7 +27,6 @@ import type { StreamEvent, StreamingContext, } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('CopilotGoStream') diff --git a/apps/sim/lib/copilot/request/handlers/handlers.test.ts b/apps/sim/lib/copilot/request/handlers/handlers.test.ts index fd0892ab930..e3d20014cd8 100644 --- a/apps/sim/lib/copilot/request/handlers/handlers.test.ts +++ b/apps/sim/lib/copilot/request/handlers/handlers.test.ts @@ -2,12 +2,9 @@ * @vitest-environment node */ -import { loggerMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' import { TraceCollector } from '@/lib/copilot/request/trace' -vi.mock('@sim/logger', () => loggerMock) - const { isSimExecuted, executeTool, ensureHandlersRegistered } = vi.hoisted(() => ({ isSimExecuted: vi.fn().mockReturnValue(true), executeTool: vi.fn().mockResolvedValue({ success: true, output: { ok: true } }), diff --git a/apps/sim/lib/copilot/request/handlers/tool.ts b/apps/sim/lib/copilot/request/handlers/tool.ts index 0a6c0d7f8af..f58cc11c59b 100644 --- a/apps/sim/lib/copilot/request/handlers/tool.ts +++ b/apps/sim/lib/copilot/request/handlers/tool.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { upsertAsyncToolCall } from '@/lib/copilot/async-runs/repository' import { STREAM_TIMEOUT_MS } from '@/lib/copilot/constants' import { @@ -26,7 +27,6 @@ import type { import { getToolEntry, isSimExecuted } from '@/lib/copilot/tool-executor' import { isToolHiddenInUi } from '@/lib/copilot/tools/client/hidden-tools' import { isWorkflowToolName } from '@/lib/copilot/tools/workflow-tools' -import { toError } from '@/lib/core/utils/helpers' import type { ToolScope } from './types' import { abortPendingToolIfStreamDead, diff --git a/apps/sim/lib/copilot/request/handlers/types.ts b/apps/sim/lib/copilot/request/handlers/types.ts index 9ce64903425..9a1aa0d3967 100644 --- a/apps/sim/lib/copilot/request/handlers/types.ts +++ b/apps/sim/lib/copilot/request/handlers/types.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import type { AsyncCompletionSignal, AsyncTerminalCompletionSnapshot, @@ -24,7 +25,6 @@ import type { StreamingContext, ToolCallState, } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' export type StreamHandler = ( event: StreamEvent, diff --git a/apps/sim/lib/copilot/request/http.ts b/apps/sim/lib/copilot/request/http.ts index 34eb28cf76a..e873af67499 100644 --- a/apps/sim/lib/copilot/request/http.ts +++ b/apps/sim/lib/copilot/request/http.ts @@ -1,3 +1,4 @@ +import { generateId } from '@sim/utils/id' import type { NextRequest } from 'next/server' import { NextResponse } from 'next/server' import { getSession } from '@/lib/auth' @@ -5,7 +6,6 @@ import { ASYNC_TOOL_CONFIRMATION_STATUS } from '@/lib/copilot/async-runs/lifecyc import { env } from '@/lib/core/config/env' import { safeCompare } from '@/lib/core/security/encryption' import { generateRequestId } from '@/lib/core/utils/request' -import { generateId } from '@/lib/core/utils/uuid' export const NotificationStatus = { pending: 'pending', diff --git a/apps/sim/lib/copilot/request/lifecycle/finalize.ts b/apps/sim/lib/copilot/request/lifecycle/finalize.ts index 51464dc4c7a..657a9003f19 100644 --- a/apps/sim/lib/copilot/request/lifecycle/finalize.ts +++ b/apps/sim/lib/copilot/request/lifecycle/finalize.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { updateRunStatus } from '@/lib/copilot/async-runs/repository' import { MothershipStreamV1CompletionStatus, @@ -6,7 +7,6 @@ import { } from '@/lib/copilot/generated/mothership-stream-v1' import type { StreamWriter } from '@/lib/copilot/request/session' import type { OrchestratorResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('CopilotStreamFinalize') diff --git a/apps/sim/lib/copilot/request/lifecycle/headless.ts b/apps/sim/lib/copilot/request/lifecycle/headless.ts index 6627053f2fd..f2a7d9d2a1b 100644 --- a/apps/sim/lib/copilot/request/lifecycle/headless.ts +++ b/apps/sim/lib/copilot/request/lifecycle/headless.ts @@ -1,4 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import type { RequestTraceV1Outcome as RequestTraceOutcome } from '@/lib/copilot/generated/request-trace-v1' import { RequestTraceV1Outcome, @@ -8,8 +10,6 @@ import type { CopilotLifecycleOptions } from '@/lib/copilot/request/lifecycle/ru import { runCopilotLifecycle } from '@/lib/copilot/request/lifecycle/run' import { reportTrace, TraceCollector } from '@/lib/copilot/request/trace' import type { OrchestratorResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('CopilotHeadlessLifecycle') diff --git a/apps/sim/lib/copilot/request/lifecycle/run.ts b/apps/sim/lib/copilot/request/lifecycle/run.ts index e72d30e6834..254fb88dca3 100644 --- a/apps/sim/lib/copilot/request/lifecycle/run.ts +++ b/apps/sim/lib/copilot/request/lifecycle/run.ts @@ -1,4 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { createRunSegment, updateRunStatus } from '@/lib/copilot/async-runs/repository' import { SIM_AGENT_API_URL, SIM_AGENT_VERSION } from '@/lib/copilot/constants' import { @@ -31,8 +33,6 @@ import type { } from '@/lib/copilot/request/types' import { prepareExecutionContext } from '@/lib/copilot/tools/handlers/context' import { env } from '@/lib/core/config/env' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { getEffectiveDecryptedEnv } from '@/lib/environment/utils' const logger = createLogger('CopilotLifecycle') diff --git a/apps/sim/lib/copilot/request/lifecycle/start.ts b/apps/sim/lib/copilot/request/lifecycle/start.ts index bb9529c8d3c..2cff3f75d3d 100644 --- a/apps/sim/lib/copilot/request/lifecycle/start.ts +++ b/apps/sim/lib/copilot/request/lifecycle/start.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { copilotChats } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq } from 'drizzle-orm' import { createRunSegment } from '@/lib/copilot/async-runs/repository' import { SIM_AGENT_API_URL } from '@/lib/copilot/constants' @@ -28,7 +29,6 @@ import { SSE_RESPONSE_HEADERS } from '@/lib/copilot/request/session/sse' import { reportTrace, TraceCollector } from '@/lib/copilot/request/trace' import { taskPubSub } from '@/lib/copilot/tasks' import { env } from '@/lib/core/config/env' -import { toError } from '@/lib/core/utils/helpers' export { SSE_RESPONSE_HEADERS } diff --git a/apps/sim/lib/copilot/request/session/abort.ts b/apps/sim/lib/copilot/request/session/abort.ts index 722f8886bb9..8686649a18b 100644 --- a/apps/sim/lib/copilot/request/session/abort.ts +++ b/apps/sim/lib/copilot/request/session/abort.ts @@ -1,6 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' import { acquireLock, getRedisClient, releaseLock } from '@/lib/core/config/redis' -import { sleep, toError } from '@/lib/core/utils/helpers' import { clearAbortMarker, hasAbortMarker, writeAbortMarker } from './buffer' const logger = createLogger('SessionAbort') diff --git a/apps/sim/lib/copilot/request/session/buffer.test.ts b/apps/sim/lib/copilot/request/session/buffer.test.ts index 4edd7412864..951cdbc648d 100644 --- a/apps/sim/lib/copilot/request/session/buffer.test.ts +++ b/apps/sim/lib/copilot/request/session/buffer.test.ts @@ -2,7 +2,7 @@ * @vitest-environment node */ -import { loggerMock } from '@sim/testing' +import { redisConfigMock, redisConfigMockFns } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' import { MothershipStreamV1EventType, @@ -10,8 +10,6 @@ import { } from '@/lib/copilot/generated/mothership-stream-v1' import { createEvent } from '@/lib/copilot/request/session/event' -vi.mock('@sim/logger', () => loggerMock) - type StoredEnvelope = { score: number value: string @@ -102,9 +100,7 @@ const createRedisStub = () => { let mockRedis: ReturnType -vi.mock('@/lib/core/config/redis', () => ({ - getRedisClient: () => mockRedis, -})) +vi.mock('@/lib/core/config/redis', () => redisConfigMock) import { allocateCursor, @@ -118,6 +114,7 @@ describe('mothership-stream-outbox', () => { beforeEach(() => { mockRedis = createRedisStub() vi.clearAllMocks() + redisConfigMockFns.mockGetRedisClient.mockImplementation(() => mockRedis) }) it('replays envelopes after a given cursor', async () => { diff --git a/apps/sim/lib/copilot/request/session/buffer.ts b/apps/sim/lib/copilot/request/session/buffer.ts index 58a2f4f280c..352946b1a66 100644 --- a/apps/sim/lib/copilot/request/session/buffer.ts +++ b/apps/sim/lib/copilot/request/session/buffer.ts @@ -1,7 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' import { env } from '@/lib/core/config/env' import { getRedisClient } from '@/lib/core/config/redis' -import { sleep, toError } from '@/lib/core/utils/helpers' import { type PersistedStreamEventEnvelope, parsePersistedStreamEventEnvelopeJson, diff --git a/apps/sim/lib/copilot/request/session/file-preview-session.ts b/apps/sim/lib/copilot/request/session/file-preview-session.ts index e6dc9df4ae1..42a2cf7ebdc 100644 --- a/apps/sim/lib/copilot/request/session/file-preview-session.ts +++ b/apps/sim/lib/copilot/request/session/file-preview-session.ts @@ -1,6 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' import { getRedisClient } from '@/lib/core/config/redis' -import { sleep, toError } from '@/lib/core/utils/helpers' import { getStreamConfig } from './buffer' import { FILE_PREVIEW_SESSION_SCHEMA_VERSION, diff --git a/apps/sim/lib/copilot/request/session/writer.ts b/apps/sim/lib/copilot/request/session/writer.ts index 38cf75db28e..7ccabf83dd3 100644 --- a/apps/sim/lib/copilot/request/session/writer.ts +++ b/apps/sim/lib/copilot/request/session/writer.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { MothershipStreamV1EventType } from '@/lib/copilot/generated/mothership-stream-v1' -import { toError } from '@/lib/core/utils/helpers' import { appendEvents } from './buffer' import type { PersistedStreamEventEnvelope } from './contract' import { createEvent } from './event' diff --git a/apps/sim/lib/copilot/request/subagent.ts b/apps/sim/lib/copilot/request/subagent.ts index 6e3c143f343..16e85373210 100644 --- a/apps/sim/lib/copilot/request/subagent.ts +++ b/apps/sim/lib/copilot/request/subagent.ts @@ -1,4 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { generateWorkspaceContext } from '@/lib/copilot/chat/workspace-context' import { SIM_AGENT_API_URL } from '@/lib/copilot/constants' import { @@ -18,8 +20,6 @@ import type { import { prepareExecutionContext } from '@/lib/copilot/tools/handlers/context' import { env } from '@/lib/core/config/env' import { isHosted } from '@/lib/core/config/feature-flags' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { getEffectiveDecryptedEnv } from '@/lib/environment/utils' import { getWorkflowById } from '@/lib/workflows/utils' diff --git a/apps/sim/lib/copilot/request/tools/executor.ts b/apps/sim/lib/copilot/request/tools/executor.ts index 640f013c986..4d1745c4945 100644 --- a/apps/sim/lib/copilot/request/tools/executor.ts +++ b/apps/sim/lib/copilot/request/tools/executor.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import type { AsyncCompletionEnvelope, AsyncCompletionSignal, @@ -40,7 +41,6 @@ import { type ToolCallState, } from '@/lib/copilot/request/types' import { ensureHandlersRegistered, executeTool } from '@/lib/copilot/tool-executor' -import { toError } from '@/lib/core/utils/helpers' export { waitForToolCompletion } from '@/lib/copilot/request/tools/client' diff --git a/apps/sim/lib/copilot/request/tools/files.ts b/apps/sim/lib/copilot/request/tools/files.ts index 077cd3b58dd..3106d2d9a48 100644 --- a/apps/sim/lib/copilot/request/tools/files.ts +++ b/apps/sim/lib/copilot/request/tools/files.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { FunctionExecute, UserTable } from '@/lib/copilot/generated/tool-catalog-v1' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' import { uploadWorkspaceFile } from '@/lib/uploads/contexts/workspace/workspace-file-manager' const logger = createLogger('CopilotToolResultFiles') diff --git a/apps/sim/lib/copilot/request/tools/resources.ts b/apps/sim/lib/copilot/request/tools/resources.ts index 92458d1628c..5212cd048c0 100644 --- a/apps/sim/lib/copilot/request/tools/resources.ts +++ b/apps/sim/lib/copilot/request/tools/resources.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { MothershipStreamV1EventType, MothershipStreamV1ResourceOp, @@ -12,7 +13,6 @@ import { persistChatResources, removeChatResources, } from '@/lib/copilot/resources/persistence' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('CopilotResourceEffects') diff --git a/apps/sim/lib/copilot/request/tools/tables.ts b/apps/sim/lib/copilot/request/tools/tables.ts index f6cc4c5ea4f..079714a4e88 100644 --- a/apps/sim/lib/copilot/request/tools/tables.ts +++ b/apps/sim/lib/copilot/request/tools/tables.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { userTableRows } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { parse as csvParse } from 'csv-parse/sync' import { eq } from 'drizzle-orm' import { FunctionExecute, Read as ReadTool } from '@/lib/copilot/generated/tool-catalog-v1' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' import { getTableById } from '@/lib/table/service' const logger = createLogger('CopilotToolResultTables') diff --git a/apps/sim/lib/copilot/resources/persistence.ts b/apps/sim/lib/copilot/resources/persistence.ts index f94b49c7749..0407e61dd38 100644 --- a/apps/sim/lib/copilot/resources/persistence.ts +++ b/apps/sim/lib/copilot/resources/persistence.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import { copilotChats } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq, sql } from 'drizzle-orm' -import { toError } from '@/lib/core/utils/helpers' import type { MothershipResource } from './types' export { diff --git a/apps/sim/lib/copilot/tool-executor/executor.ts b/apps/sim/lib/copilot/tool-executor/executor.ts index cc904776335..07d2a3f87b1 100644 --- a/apps/sim/lib/copilot/tool-executor/executor.ts +++ b/apps/sim/lib/copilot/tool-executor/executor.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { executeTool as executeAppTool } from '@/tools' import { isKnownTool, isSimExecuted } from './router' import type { diff --git a/apps/sim/lib/copilot/tools/client/run-tool-execution.ts b/apps/sim/lib/copilot/tools/client/run-tool-execution.ts index ad93eb2c4dc..e2dc8473a1e 100644 --- a/apps/sim/lib/copilot/tools/client/run-tool-execution.ts +++ b/apps/sim/lib/copilot/tools/client/run-tool-execution.ts @@ -1,4 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import type { AsyncCompletionData } from '@/lib/copilot/async-runs/lifecycle' import { COPILOT_CONFIRM_API_PATH } from '@/lib/copilot/constants' import { MothershipStreamV1ToolOutcome } from '@/lib/copilot/generated/mothership-stream-v1' @@ -7,8 +9,6 @@ import { RunFromBlock, RunWorkflowUntilBlock, } from '@/lib/copilot/generated/tool-catalog-v1' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { executeWorkflowWithFullLogging } from '@/app/workspace/[workspaceId]/w/[workflowId]/utils/workflow-execution-utils' import { useExecutionStore } from '@/stores/execution/store' import { diff --git a/apps/sim/lib/copilot/tools/handlers/deployment/deploy.ts b/apps/sim/lib/copilot/tools/handlers/deployment/deploy.ts index a661e71941e..b57bf076f89 100644 --- a/apps/sim/lib/copilot/tools/handlers/deployment/deploy.ts +++ b/apps/sim/lib/copilot/tools/handlers/deployment/deploy.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { chat, workflowMcpServer, workflowMcpTool } from '@sim/db/schema' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { mcpPubSub } from '@/lib/mcp/pubsub' import { generateParameterSchemaForWorkflow } from '@/lib/mcp/workflow-mcp-sync' import { sanitizeToolName } from '@/lib/mcp/workflow-tool-schema' diff --git a/apps/sim/lib/copilot/tools/handlers/deployment/manage.test.ts b/apps/sim/lib/copilot/tools/handlers/deployment/manage.test.ts index eb72568f780..785fc7bca39 100644 --- a/apps/sim/lib/copilot/tools/handlers/deployment/manage.test.ts +++ b/apps/sim/lib/copilot/tools/handlers/deployment/manage.test.ts @@ -2,14 +2,16 @@ * @vitest-environment node */ +import { auditMock, workflowsOrchestrationMock, workflowsOrchestrationMockFns } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' import type { ExecutionContext } from '@/lib/copilot/request/types' -const { ensureWorkflowAccessMock, performRevertToVersionMock } = vi.hoisted(() => ({ +const { ensureWorkflowAccessMock } = vi.hoisted(() => ({ ensureWorkflowAccessMock: vi.fn(), - performRevertToVersionMock: vi.fn(), })) +const performRevertToVersionMock = workflowsOrchestrationMockFns.mockPerformRevertToVersion + vi.mock('@sim/db', () => ({ db: { select: vi.fn(), @@ -24,11 +26,7 @@ vi.mock('@sim/db', () => ({ workflowMcpTool: {}, })) -vi.mock('@/lib/audit/log', () => ({ - AuditAction: {}, - AuditResourceType: {}, - recordAudit: vi.fn(), -})) +vi.mock('@/lib/audit/log', () => auditMock) vi.mock('@/lib/mcp/pubsub', () => ({ mcpPubSub: { @@ -53,9 +51,7 @@ vi.mock('../access', () => ({ ensureWorkspaceAccess: vi.fn(), })) -vi.mock('@/lib/workflows/orchestration', () => ({ - performRevertToVersion: performRevertToVersionMock, -})) +vi.mock('@/lib/workflows/orchestration', () => workflowsOrchestrationMock) import { executeRevertToVersion } from './manage' diff --git a/apps/sim/lib/copilot/tools/handlers/deployment/manage.ts b/apps/sim/lib/copilot/tools/handlers/deployment/manage.ts index b33afbbfa96..cde7a541780 100644 --- a/apps/sim/lib/copilot/tools/handlers/deployment/manage.ts +++ b/apps/sim/lib/copilot/tools/handlers/deployment/manage.ts @@ -6,11 +6,11 @@ import { workflowMcpServer, workflowMcpTool, } from '@sim/db/schema' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, eq, inArray, isNull } from 'drizzle-orm' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { mcpPubSub } from '@/lib/mcp/pubsub' import { generateParameterSchemaForWorkflow } from '@/lib/mcp/workflow-mcp-sync' import { sanitizeToolName } from '@/lib/mcp/workflow-tool-schema' diff --git a/apps/sim/lib/copilot/tools/handlers/jobs.ts b/apps/sim/lib/copilot/tools/handlers/jobs.ts index 30271f8e33d..eb797a771f4 100644 --- a/apps/sim/lib/copilot/tools/handlers/jobs.ts +++ b/apps/sim/lib/copilot/tools/handlers/jobs.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { copilotChats, workflowSchedule } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { parseCronToHumanReadable, validateCronExpression } from '@/lib/workflows/schedules/utils' const logger = createLogger('JobTools') diff --git a/apps/sim/lib/copilot/tools/handlers/management/manage-credential.ts b/apps/sim/lib/copilot/tools/handlers/management/manage-credential.ts index f2d3d75c4b8..03422859dcc 100644 --- a/apps/sim/lib/copilot/tools/handlers/management/manage-credential.ts +++ b/apps/sim/lib/copilot/tools/handlers/management/manage-credential.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import { credential } from '@sim/db/schema' +import { toError } from '@sim/utils/errors' import { eq } from 'drizzle-orm' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' export function executeManageCredential( rawParams: Record, diff --git a/apps/sim/lib/copilot/tools/handlers/management/manage-custom-tool.ts b/apps/sim/lib/copilot/tools/handlers/management/manage-custom-tool.ts index 13c6f3fa757..e683403736a 100644 --- a/apps/sim/lib/copilot/tools/handlers/management/manage-custom-tool.ts +++ b/apps/sim/lib/copilot/tools/handlers/management/manage-custom-tool.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' import { deleteCustomTool, getCustomToolById, diff --git a/apps/sim/lib/copilot/tools/handlers/management/manage-mcp-tool.ts b/apps/sim/lib/copilot/tools/handlers/management/manage-mcp-tool.ts index 366ba5b511f..c9b81b3f96f 100644 --- a/apps/sim/lib/copilot/tools/handlers/management/manage-mcp-tool.ts +++ b/apps/sim/lib/copilot/tools/handlers/management/manage-mcp-tool.ts @@ -1,9 +1,9 @@ import { db } from '@sim/db' import { mcpServers } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq, isNull } from 'drizzle-orm' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' import { validateMcpDomain } from '@/lib/mcp/domain-check' import { mcpService } from '@/lib/mcp/service' import { generateMcpServerId } from '@/lib/mcp/utils' diff --git a/apps/sim/lib/copilot/tools/handlers/management/manage-skill.ts b/apps/sim/lib/copilot/tools/handlers/management/manage-skill.ts index 5b8b59acda6..74a91b73c53 100644 --- a/apps/sim/lib/copilot/tools/handlers/management/manage-skill.ts +++ b/apps/sim/lib/copilot/tools/handlers/management/manage-skill.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' import { deleteSkill, listSkills, upsertSkills } from '@/lib/workflows/skills/operations' const logger = createLogger('CopilotToolExecutor') diff --git a/apps/sim/lib/copilot/tools/handlers/materialize-file.ts b/apps/sim/lib/copilot/tools/handlers/materialize-file.ts index 6d1fcbeb392..7db12ce4b5d 100644 --- a/apps/sim/lib/copilot/tools/handlers/materialize-file.ts +++ b/apps/sim/lib/copilot/tools/handlers/materialize-file.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { workflow, workspaceFiles } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' import { findMothershipUploadRowByChatAndName } from '@/lib/copilot/tools/handlers/upload-file-reader' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { getServePathPrefix } from '@/lib/uploads' import { downloadWorkspaceFile } from '@/lib/uploads/contexts/workspace/workspace-file-manager' import { parseWorkflowJson } from '@/lib/workflows/operations/import-export' diff --git a/apps/sim/lib/copilot/tools/handlers/oauth.ts b/apps/sim/lib/copilot/tools/handlers/oauth.ts index 4c7a7829116..2fb2e0eb6f8 100644 --- a/apps/sim/lib/copilot/tools/handlers/oauth.ts +++ b/apps/sim/lib/copilot/tools/handlers/oauth.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import { pendingCredentialDraft, user } from '@sim/db/schema' +import { toError } from '@sim/utils/errors' import { and, eq, lt } from 'drizzle-orm' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' import { getBaseUrl } from '@/lib/core/utils/urls' import { getAllOAuthServices } from '@/lib/oauth/utils' diff --git a/apps/sim/lib/copilot/tools/handlers/restore-resource.ts b/apps/sim/lib/copilot/tools/handlers/restore-resource.ts index 893a76662cf..bbe90f76cfc 100644 --- a/apps/sim/lib/copilot/tools/handlers/restore-resource.ts +++ b/apps/sim/lib/copilot/tools/handlers/restore-resource.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { restoreKnowledgeBase } from '@/lib/knowledge/service' import { getTableById, restoreTable } from '@/lib/table/service' import { diff --git a/apps/sim/lib/copilot/tools/handlers/upload-file-reader.ts b/apps/sim/lib/copilot/tools/handlers/upload-file-reader.ts index d0ae21ac07a..3a46326fac1 100644 --- a/apps/sim/lib/copilot/tools/handlers/upload-file-reader.ts +++ b/apps/sim/lib/copilot/tools/handlers/upload-file-reader.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { workspaceFiles } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq, isNull } from 'drizzle-orm' import { type FileReadResult, readFileRecord } from '@/lib/copilot/vfs/file-reader' import { normalizeVfsSegment } from '@/lib/copilot/vfs/normalize-segment' -import { toError } from '@/lib/core/utils/helpers' import { getServePathPrefix } from '@/lib/uploads' import type { WorkspaceFileRecord } from '@/lib/uploads/contexts/workspace/workspace-file-manager' diff --git a/apps/sim/lib/copilot/tools/handlers/vfs.test.ts b/apps/sim/lib/copilot/tools/handlers/vfs.test.ts index 7ec15c7d087..267ea35d65a 100644 --- a/apps/sim/lib/copilot/tools/handlers/vfs.test.ts +++ b/apps/sim/lib/copilot/tools/handlers/vfs.test.ts @@ -2,7 +2,6 @@ * @vitest-environment node */ -import { loggerMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' import { TOOL_RESULT_MAX_INLINE_CHARS } from '@/lib/copilot/constants' @@ -14,7 +13,6 @@ const { readChatUpload } = vi.hoisted(() => ({ readChatUpload: vi.fn(), })) -vi.mock('@sim/logger', () => loggerMock) vi.mock('@/lib/copilot/vfs', () => ({ getOrMaterializeVFS, })) diff --git a/apps/sim/lib/copilot/tools/handlers/vfs.ts b/apps/sim/lib/copilot/tools/handlers/vfs.ts index 844a49986b1..8a30c78d3bb 100644 --- a/apps/sim/lib/copilot/tools/handlers/vfs.ts +++ b/apps/sim/lib/copilot/tools/handlers/vfs.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { TOOL_RESULT_MAX_INLINE_CHARS } from '@/lib/copilot/constants' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' import { getOrMaterializeVFS } from '@/lib/copilot/vfs' -import { toError } from '@/lib/core/utils/helpers' import { listChatUploads, readChatUpload } from './upload-file-reader' const logger = createLogger('VfsTools') diff --git a/apps/sim/lib/copilot/tools/handlers/workflow/mutations.ts b/apps/sim/lib/copilot/tools/handlers/workflow/mutations.ts index 0c0d5f6f741..ef3a652c38d 100644 --- a/apps/sim/lib/copilot/tools/handlers/workflow/mutations.ts +++ b/apps/sim/lib/copilot/tools/handlers/workflow/mutations.ts @@ -1,14 +1,14 @@ import { db, workflow as workflowTable } from '@sim/db' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import { createWorkspaceApiKey } from '@/lib/api-key/auth' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' import { env } from '@/lib/core/config/env' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { getSocketServerUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { executeWorkflow } from '@/lib/workflows/executor/execute-workflow' import { getExecutionState, diff --git a/apps/sim/lib/copilot/tools/handlers/workflow/queries.test.ts b/apps/sim/lib/copilot/tools/handlers/workflow/queries.test.ts index d238bf78878..86fe5c9e63a 100644 --- a/apps/sim/lib/copilot/tools/handlers/workflow/queries.test.ts +++ b/apps/sim/lib/copilot/tools/handlers/workflow/queries.test.ts @@ -1,31 +1,34 @@ +import { + workflowsPersistenceUtilsMock, + workflowsPersistenceUtilsMockFns, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' const { ensureWorkflowAccessMock, - loadWorkflowFromNormalizedTablesMock, getEffectiveBlockOutputPathsMock, hasTriggerCapabilityMock, getBlockMock, - getWorkflowByIdMock, } = vi.hoisted(() => ({ ensureWorkflowAccessMock: vi.fn(), - loadWorkflowFromNormalizedTablesMock: vi.fn(), getEffectiveBlockOutputPathsMock: vi.fn(), hasTriggerCapabilityMock: vi.fn(), getBlockMock: vi.fn(), - getWorkflowByIdMock: vi.fn(), })) +const loadWorkflowFromNormalizedTablesMock = + workflowsPersistenceUtilsMockFns.mockLoadWorkflowFromNormalizedTables +const getWorkflowByIdMock = workflowsUtilsMockFns.mockGetWorkflowById + vi.mock('../access', () => ({ ensureWorkflowAccess: ensureWorkflowAccessMock, ensureWorkspaceAccess: vi.fn(), getDefaultWorkspaceId: vi.fn(), })) -vi.mock('@/lib/workflows/persistence/utils', () => ({ - loadWorkflowFromNormalizedTables: loadWorkflowFromNormalizedTablesMock, - loadDeployedWorkflowState: vi.fn(), -})) +vi.mock('@/lib/workflows/persistence/utils', () => workflowsPersistenceUtilsMock) vi.mock('@/lib/workflows/blocks/block-outputs', () => ({ getEffectiveBlockOutputPaths: getEffectiveBlockOutputPathsMock, @@ -39,10 +42,7 @@ vi.mock('@/blocks/registry', () => ({ getBlock: getBlockMock, })) -vi.mock('@/lib/workflows/utils', () => ({ - getWorkflowById: getWorkflowByIdMock, - listFolders: vi.fn(), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) import { executeGetBlockOutputs } from './queries' diff --git a/apps/sim/lib/copilot/tools/handlers/workflow/queries.ts b/apps/sim/lib/copilot/tools/handlers/workflow/queries.ts index 71d85576448..e5139b6457a 100644 --- a/apps/sim/lib/copilot/tools/handlers/workflow/queries.ts +++ b/apps/sim/lib/copilot/tools/handlers/workflow/queries.ts @@ -1,6 +1,6 @@ +import { toError } from '@sim/utils/errors' import type { ExecutionContext, ToolCallResult } from '@/lib/copilot/request/types' import { formatNormalizedWorkflowForCopilot } from '@/lib/copilot/tools/shared/workflow-utils' -import { toError } from '@/lib/core/utils/helpers' import { mcpService } from '@/lib/mcp/service' import { listWorkspaceFiles } from '@/lib/uploads/contexts/workspace' import { getEffectiveBlockOutputPaths } from '@/lib/workflows/blocks/block-outputs' diff --git a/apps/sim/lib/copilot/tools/registry/server-tool-adapter.ts b/apps/sim/lib/copilot/tools/registry/server-tool-adapter.ts index 98cc122bc0e..777c4649019 100644 --- a/apps/sim/lib/copilot/tools/registry/server-tool-adapter.ts +++ b/apps/sim/lib/copilot/tools/registry/server-tool-adapter.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import type { ToolExecutionResult, ToolHandler } from '@/lib/copilot/tool-executor/types' import { routeExecution } from '@/lib/copilot/tools/server/router' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('ServerToolAdapter') diff --git a/apps/sim/lib/copilot/tools/server/blocks/get-blocks-metadata-tool.ts b/apps/sim/lib/copilot/tools/server/blocks/get-blocks-metadata-tool.ts index 362d7728bac..5b94a4a8966 100644 --- a/apps/sim/lib/copilot/tools/server/blocks/get-blocks-metadata-tool.ts +++ b/apps/sim/lib/copilot/tools/server/blocks/get-blocks-metadata-tool.ts @@ -1,11 +1,11 @@ import { existsSync, readFileSync } from 'fs' import { join } from 'path' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { z } from 'zod' import { getCopilotToolDescription } from '@/lib/copilot/tools/descriptions' import type { BaseServerTool } from '@/lib/copilot/tools/server/base-tool' import { getAllowedIntegrationsFromEnv, isHosted } from '@/lib/core/config/feature-flags' -import { toError } from '@/lib/core/utils/helpers' import { getServiceAccountProviderForProviderId } from '@/lib/oauth/utils' import { registry as blockRegistry } from '@/blocks/registry' import { AuthMode, type BlockConfig, isHiddenFromDisplay } from '@/blocks/types' diff --git a/apps/sim/lib/copilot/tools/server/files/edit-content.ts b/apps/sim/lib/copilot/tools/server/files/edit-content.ts index de2554b385d..22d9539ba88 100644 --- a/apps/sim/lib/copilot/tools/server/files/edit-content.ts +++ b/apps/sim/lib/copilot/tools/server/files/edit-content.ts @@ -1,10 +1,10 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { assertServerToolNotAborted, type BaseServerTool, type ServerToolContext, } from '@/lib/copilot/tools/server/base-tool' -import { toError } from '@/lib/core/utils/helpers' import { runSandboxTask } from '@/lib/execution/sandbox/run-task' import { updateWorkspaceFileContent } from '@/lib/uploads/contexts/workspace/workspace-file-manager' import { consumeLatestFileIntent } from './file-intent-store' diff --git a/apps/sim/lib/copilot/tools/server/files/file-intent-store.ts b/apps/sim/lib/copilot/tools/server/files/file-intent-store.ts index 2cffe16bcaa..8022e23916f 100644 --- a/apps/sim/lib/copilot/tools/server/files/file-intent-store.ts +++ b/apps/sim/lib/copilot/tools/server/files/file-intent-store.ts @@ -1,6 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' import { getRedisClient } from '@/lib/core/config/redis' -import { sleep, toError } from '@/lib/core/utils/helpers' import type { WorkspaceFileRecord } from '@/lib/uploads/contexts/workspace/workspace-file-manager' export type PendingFileIntent = { diff --git a/apps/sim/lib/copilot/tools/server/files/file-preview.ts b/apps/sim/lib/copilot/tools/server/files/file-preview.ts index e70cdab8c5d..43409613fb6 100644 --- a/apps/sim/lib/copilot/tools/server/files/file-preview.ts +++ b/apps/sim/lib/copilot/tools/server/files/file-preview.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { downloadWorkspaceFile, getWorkspaceFile, diff --git a/apps/sim/lib/copilot/tools/server/files/workspace-file.ts b/apps/sim/lib/copilot/tools/server/files/workspace-file.ts index ee72efb4a43..23f7753cac5 100644 --- a/apps/sim/lib/copilot/tools/server/files/workspace-file.ts +++ b/apps/sim/lib/copilot/tools/server/files/workspace-file.ts @@ -1,11 +1,11 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { WorkspaceFile } from '@/lib/copilot/generated/tool-catalog-v1' import { assertServerToolNotAborted, type BaseServerTool, type ServerToolContext, } from '@/lib/copilot/tools/server/base-tool' -import { toError } from '@/lib/core/utils/helpers' import { runSandboxTask } from '@/lib/execution/sandbox/run-task' import { deleteWorkspaceFile, diff --git a/apps/sim/lib/copilot/tools/server/image/generate-image.ts b/apps/sim/lib/copilot/tools/server/image/generate-image.ts index 9d864e654f3..ec97898cc5c 100644 --- a/apps/sim/lib/copilot/tools/server/image/generate-image.ts +++ b/apps/sim/lib/copilot/tools/server/image/generate-image.ts @@ -1,5 +1,6 @@ import { GoogleGenAI, type Part } from '@google/genai' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { GenerateImage } from '@/lib/copilot/generated/tool-catalog-v1' import { assertServerToolNotAborted, @@ -7,7 +8,6 @@ import { type ServerToolContext, } from '@/lib/copilot/tools/server/base-tool' import { getRotatingApiKey } from '@/lib/core/config/api-keys' -import { toError } from '@/lib/core/utils/helpers' import { getServePathPrefix } from '@/lib/uploads' import { downloadWorkspaceFile, diff --git a/apps/sim/lib/copilot/tools/server/knowledge/knowledge-base.ts b/apps/sim/lib/copilot/tools/server/knowledge/knowledge-base.ts index f8732227056..64d6561273b 100644 --- a/apps/sim/lib/copilot/tools/server/knowledge/knowledge-base.ts +++ b/apps/sim/lib/copilot/tools/server/knowledge/knowledge-base.ts @@ -1,6 +1,8 @@ import { db } from '@sim/db' import { knowledgeConnector } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import { generateInternalToken } from '@/lib/auth/internal' import { KnowledgeBase } from '@/lib/copilot/generated/tool-catalog-v1' @@ -9,9 +11,7 @@ import { type BaseServerTool, type ServerToolContext, } from '@/lib/copilot/tools/server/base-tool' -import { toError } from '@/lib/core/utils/helpers' import { getInternalApiBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { createSingleDocument, deleteDocument, diff --git a/apps/sim/lib/copilot/tools/server/other/search-online.ts b/apps/sim/lib/copilot/tools/server/other/search-online.ts index 8a7dfc337a2..6448089a2e4 100644 --- a/apps/sim/lib/copilot/tools/server/other/search-online.ts +++ b/apps/sim/lib/copilot/tools/server/other/search-online.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { SearchOnline } from '@/lib/copilot/generated/tool-catalog-v1' import type { BaseServerTool } from '@/lib/copilot/tools/server/base-tool' import { env } from '@/lib/core/config/env' -import { toError } from '@/lib/core/utils/helpers' import { executeTool } from '@/tools' interface OnlineSearchParams { diff --git a/apps/sim/lib/copilot/tools/server/table/user-table.test.ts b/apps/sim/lib/copilot/tools/server/table/user-table.test.ts index 2110a5e5e27..ecb8337380a 100644 --- a/apps/sim/lib/copilot/tools/server/table/user-table.test.ts +++ b/apps/sim/lib/copilot/tools/server/table/user-table.test.ts @@ -19,15 +19,7 @@ const { mockReplaceTableRows: vi.fn(), })) -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), -})) - -vi.mock('@/lib/core/utils/uuid', () => ({ +vi.mock('@sim/utils/id', () => ({ generateId: vi.fn().mockReturnValue('deadbeefcafef00d'), generateShortId: vi.fn().mockReturnValue('short-id'), })) diff --git a/apps/sim/lib/copilot/tools/server/table/user-table.ts b/apps/sim/lib/copilot/tools/server/table/user-table.ts index b567a6bf36e..5ffa8630352 100644 --- a/apps/sim/lib/copilot/tools/server/table/user-table.ts +++ b/apps/sim/lib/copilot/tools/server/table/user-table.ts @@ -1,12 +1,12 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { UserTable } from '@/lib/copilot/generated/tool-catalog-v1' import { assertServerToolNotAborted, type BaseServerTool, type ServerToolContext, } from '@/lib/copilot/tools/server/base-tool' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { buildAutoMapping, COLUMN_TYPES, diff --git a/apps/sim/lib/copilot/tools/server/user/get-credentials.ts b/apps/sim/lib/copilot/tools/server/user/get-credentials.ts index b7c329efad1..f856bb62c2b 100644 --- a/apps/sim/lib/copilot/tools/server/user/get-credentials.ts +++ b/apps/sim/lib/copilot/tools/server/user/get-credentials.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { account, user } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq } from 'drizzle-orm' import { jwtDecode } from 'jwt-decode' import { createPermissionError, verifyWorkflowAccess } from '@/lib/copilot/auth/permissions' import type { BaseServerTool } from '@/lib/copilot/tools/server/base-tool' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { getPersonalAndWorkspaceEnv } from '@/lib/environment/utils' import { getAllOAuthServices } from '@/lib/oauth' diff --git a/apps/sim/lib/copilot/tools/server/user/set-environment-variables.test.ts b/apps/sim/lib/copilot/tools/server/user/set-environment-variables.test.ts index ffd6317e76d..38813e2383a 100644 --- a/apps/sim/lib/copilot/tools/server/user/set-environment-variables.test.ts +++ b/apps/sim/lib/copilot/tools/server/user/set-environment-variables.test.ts @@ -18,13 +18,6 @@ const { upsertWorkspaceEnvVarsMock: vi.fn(), })) -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ - info: vi.fn(), - error: vi.fn(), - }), -})) - vi.mock('@/lib/copilot/tools/handlers/access', () => ({ ensureWorkflowAccess: ensureWorkflowAccessMock, ensureWorkspaceAccess: ensureWorkspaceAccessMock, diff --git a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/builders.ts b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/builders.ts index a13b1402dab..ef7d326a580 100644 --- a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/builders.ts +++ b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/builders.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { generateId, isValidUuid } from '@/lib/core/utils/uuid' +import { generateId, isValidUuid } from '@sim/utils/id' import type { PermissionGroupConfig } from '@/lib/permission-groups/types' import { getEffectiveBlockOutputs } from '@/lib/workflows/blocks/block-outputs' import { diff --git a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/index.ts b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/index.ts index 7c9e09328b6..77b0c886b1d 100644 --- a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/index.ts +++ b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/index.ts @@ -1,6 +1,7 @@ import { db } from '@sim/db' import { workflow as workflowTable } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq } from 'drizzle-orm' import { EditWorkflow } from '@/lib/copilot/generated/tool-catalog-v1' import { @@ -9,7 +10,6 @@ import { type ServerToolContext, } from '@/lib/copilot/tools/server/base-tool' import { env } from '@/lib/core/config/env' -import { toError } from '@/lib/core/utils/helpers' import { getSocketServerUrl } from '@/lib/core/utils/urls' import { applyTargetedLayout, diff --git a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/operations.test.ts b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/operations.test.ts index 8c184e0cf5b..a29271f08c8 100644 --- a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/operations.test.ts +++ b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/operations.test.ts @@ -4,15 +4,6 @@ import { describe, expect, it, vi } from 'vitest' import { applyOperationsToWorkflowState } from './engine' -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})) - vi.mock('@/blocks/registry', () => ({ getAllBlocks: () => [ { diff --git a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/validation.test.ts b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/validation.test.ts index aa76cff4e51..c447f190954 100644 --- a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/validation.test.ts +++ b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow/validation.test.ts @@ -1,6 +1,7 @@ /** * @vitest-environment node */ +import { featureFlagsMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' import { normalizeConditionRouterIds } from './builders' @@ -70,9 +71,7 @@ vi.mock('@/lib/copilot/validation/selector-validator', () => ({ validateSelectorIds: mockValidateSelectorIds, })) -vi.mock('@/lib/core/config/feature-flags', () => ({ - isHosted: false, -})) +vi.mock('@/lib/core/config/feature-flags', () => featureFlagsMock) vi.mock('@/providers/utils', () => ({ getHostedModels: () => [], diff --git a/apps/sim/lib/copilot/validation/selector-validator.test.ts b/apps/sim/lib/copilot/validation/selector-validator.test.ts index 8774104a7ae..17c7123dd55 100644 --- a/apps/sim/lib/copilot/validation/selector-validator.test.ts +++ b/apps/sim/lib/copilot/validation/selector-validator.test.ts @@ -1,6 +1,7 @@ /** * @vitest-environment node */ +import { schemaMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' const { mockDbSelect } = vi.hoisted(() => ({ @@ -13,54 +14,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - account: { - id: 'account.id', - userId: 'account.userId', - providerId: 'account.providerId', - }, - credential: { - id: 'credential.id', - accountId: 'credential.accountId', - displayName: 'credential.displayName', - providerId: 'credential.providerId', - workspaceId: 'credential.workspaceId', - type: 'credential.type', - }, - credentialMember: { - credentialId: 'credentialMember.credentialId', - userId: 'credentialMember.userId', - status: 'credentialMember.status', - }, - document: { - id: 'document.id', - userExcluded: 'document.userExcluded', - archivedAt: 'document.archivedAt', - deletedAt: 'document.deletedAt', - }, - knowledgeBase: { - id: 'knowledgeBase.id', - deletedAt: 'knowledgeBase.deletedAt', - workspaceId: 'knowledgeBase.workspaceId', - }, - mcpServers: { - id: 'mcpServers.id', - enabled: 'mcpServers.enabled', - deletedAt: 'mcpServers.deletedAt', - workspaceId: 'mcpServers.workspaceId', - }, - workflow: { - id: 'workflow.id', - archivedAt: 'workflow.archivedAt', - }, -})) - -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ - warn: vi.fn(), - error: vi.fn(), - }), -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn((...args: unknown[]) => ({ type: 'and', args })), diff --git a/apps/sim/lib/copilot/validation/selector-validator.ts b/apps/sim/lib/copilot/validation/selector-validator.ts index f4a174c3699..1f1218dc40f 100644 --- a/apps/sim/lib/copilot/validation/selector-validator.ts +++ b/apps/sim/lib/copilot/validation/selector-validator.ts @@ -9,8 +9,8 @@ import { workflow, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq, inArray, isNull, or } from 'drizzle-orm' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('SelectorValidator') diff --git a/apps/sim/lib/copilot/vfs/file-reader.ts b/apps/sim/lib/copilot/vfs/file-reader.ts index 76e4a86e3eb..777d6ecc95b 100644 --- a/apps/sim/lib/copilot/vfs/file-reader.ts +++ b/apps/sim/lib/copilot/vfs/file-reader.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { WorkspaceFileRecord } from '@/lib/uploads/contexts/workspace/workspace-file-manager' import { downloadWorkspaceFile } from '@/lib/uploads/contexts/workspace/workspace-file-manager' import { isImageFileType } from '@/lib/uploads/utils/file-utils' diff --git a/apps/sim/lib/copilot/vfs/workspace-vfs.ts b/apps/sim/lib/copilot/vfs/workspace-vfs.ts index 5fd84ed4dad..e529c836ea6 100644 --- a/apps/sim/lib/copilot/vfs/workspace-vfs.ts +++ b/apps/sim/lib/copilot/vfs/workspace-vfs.ts @@ -16,6 +16,7 @@ import { workflowSchedule, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, desc, eq, isNotNull, isNull, ne } from 'drizzle-orm' import { listApiKeys } from '@/lib/api-key/service' import { buildWorkspaceMd, type WorkspaceMdData } from '@/lib/copilot/chat/workspace-context' @@ -51,7 +52,6 @@ import { serializeVersions, serializeWorkflowMeta, } from '@/lib/copilot/vfs/serializers' -import { toError } from '@/lib/core/utils/helpers' import { getAccessibleEnvCredentials, getAccessibleOAuthCredentials, diff --git a/apps/sim/lib/core/async-jobs/backends/database.ts b/apps/sim/lib/core/async-jobs/backends/database.ts index f0066e5189f..3c8f27327cf 100644 --- a/apps/sim/lib/core/async-jobs/backends/database.ts +++ b/apps/sim/lib/core/async-jobs/backends/database.ts @@ -1,5 +1,6 @@ import { asyncJobs, db } from '@sim/db' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq, sql } from 'drizzle-orm' import { type EnqueueOptions, @@ -10,7 +11,6 @@ import { type JobStatus, type JobType, } from '@/lib/core/async-jobs/types' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('DatabaseJobQueue') diff --git a/apps/sim/lib/core/config/redis.test.ts b/apps/sim/lib/core/config/redis.test.ts index d56b82f972c..cad0051753b 100644 --- a/apps/sim/lib/core/config/redis.test.ts +++ b/apps/sim/lib/core/config/redis.test.ts @@ -1,4 +1,4 @@ -import { createEnvMock, createMockRedis, loggerMock } from '@sim/testing' +import { createEnvMock, createMockRedis } from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const { MockRedisConstructor } = vi.hoisted(() => ({ @@ -8,7 +8,6 @@ const { MockRedisConstructor } = vi.hoisted(() => ({ const mockRedisInstance = createMockRedis() MockRedisConstructor.mockImplementation(() => mockRedisInstance) -vi.mock('@sim/logger', () => loggerMock) vi.mock('@/lib/core/config/env', () => createEnvMock({ REDIS_URL: 'redis://localhost:6379' })) vi.mock('ioredis', () => ({ default: MockRedisConstructor, diff --git a/apps/sim/lib/core/config/redis.ts b/apps/sim/lib/core/config/redis.ts index 41fa836997d..a603a2bad3b 100644 --- a/apps/sim/lib/core/config/redis.ts +++ b/apps/sim/lib/core/config/redis.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import Redis from 'ioredis' import { env } from '@/lib/core/config/env' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('Redis') diff --git a/apps/sim/lib/core/idempotency/cleanup.ts b/apps/sim/lib/core/idempotency/cleanup.ts index de8929d1524..78eb3c08cb0 100644 --- a/apps/sim/lib/core/idempotency/cleanup.ts +++ b/apps/sim/lib/core/idempotency/cleanup.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import { idempotencyKey } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { sleep } from '@sim/utils/helpers' import { and, count, inArray, like, lt, max, min, sql } from 'drizzle-orm' -import { sleep } from '@/lib/core/utils/helpers' const logger = createLogger('IdempotencyCleanup') diff --git a/apps/sim/lib/core/idempotency/service.ts b/apps/sim/lib/core/idempotency/service.ts index 14e4cb46cee..b5428075a07 100644 --- a/apps/sim/lib/core/idempotency/service.ts +++ b/apps/sim/lib/core/idempotency/service.ts @@ -1,12 +1,12 @@ import { db } from '@sim/db' import { idempotencyKey } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { sleep } from '@sim/utils/helpers' +import { generateId } from '@sim/utils/id' import { eq, lt } from 'drizzle-orm' import { getRedisClient } from '@/lib/core/config/redis' import { getMaxExecutionTimeout } from '@/lib/core/execution-limits' import { getStorageMethod, type StorageMethod } from '@/lib/core/storage' -import { sleep } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { extractProviderIdentifierFromBody } from '@/lib/webhooks/providers' const logger = createLogger('IdempotencyService') diff --git a/apps/sim/lib/core/outbox/service.test.ts b/apps/sim/lib/core/outbox/service.test.ts index 5b282e7d12d..338c645ac36 100644 --- a/apps/sim/lib/core/outbox/service.test.ts +++ b/apps/sim/lib/core/outbox/service.test.ts @@ -126,7 +126,7 @@ vi.mock('drizzle-orm', () => ({ lte: vi.fn((col, val) => ({ _op: 'lte', col, val })), })) -vi.mock('@/lib/core/utils/uuid', () => ({ +vi.mock('@sim/utils/id', () => ({ generateId: vi.fn(() => 'test-event-id'), })) diff --git a/apps/sim/lib/core/outbox/service.ts b/apps/sim/lib/core/outbox/service.ts index e8b29570a30..eb087d02c8e 100644 --- a/apps/sim/lib/core/outbox/service.ts +++ b/apps/sim/lib/core/outbox/service.ts @@ -1,8 +1,9 @@ import { db } from '@sim/db' import { outboxEvent } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, asc, eq, inArray, lte } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('OutboxService') @@ -250,7 +251,7 @@ async function runHandler( } catch (error) { const nextAttempts = event.attempts + 1 const isDead = nextAttempts >= event.maxAttempts - const errMsg = error instanceof Error ? error.message : String(error) + const errMsg = toError(error).message if (isDead) { const updated = await updateIfLeaseHeld(event, { diff --git a/apps/sim/lib/core/rate-limiter/hosted-key/hosted-key-rate-limiter.test.ts b/apps/sim/lib/core/rate-limiter/hosted-key/hosted-key-rate-limiter.test.ts index be199a24cfa..50cf346222d 100644 --- a/apps/sim/lib/core/rate-limiter/hosted-key/hosted-key-rate-limiter.test.ts +++ b/apps/sim/lib/core/rate-limiter/hosted-key/hosted-key-rate-limiter.test.ts @@ -1,4 +1,3 @@ -import { loggerMock } from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, type Mock, vi } from 'vitest' import type { ConsumeResult, @@ -8,8 +7,6 @@ import type { import { HostedKeyRateLimiter } from './hosted-key-rate-limiter' import type { CustomRateLimit, PerRequestRateLimit } from './types' -vi.mock('@sim/logger', () => loggerMock) - interface MockAdapter { consumeTokens: Mock getTokenStatus: Mock diff --git a/apps/sim/lib/core/rate-limiter/rate-limiter.test.ts b/apps/sim/lib/core/rate-limiter/rate-limiter.test.ts index 658febd7d6c..23f0f90b892 100644 --- a/apps/sim/lib/core/rate-limiter/rate-limiter.test.ts +++ b/apps/sim/lib/core/rate-limiter/rate-limiter.test.ts @@ -1,10 +1,8 @@ -import { loggerMock } from '@sim/testing' import { beforeEach, describe, expect, it, type Mock, vi } from 'vitest' import { RateLimiter } from './rate-limiter' import type { ConsumeResult, RateLimitStorageAdapter, TokenStatus } from './storage' import { MANUAL_EXECUTION_LIMIT, RATE_LIMITS, RateLimitError } from './types' -vi.mock('@sim/logger', () => loggerMock) vi.mock('@/lib/core/config/feature-flags', () => ({ isBillingEnabled: true })) interface MockAdapter { diff --git a/apps/sim/lib/core/rate-limiter/rate-limiter.ts b/apps/sim/lib/core/rate-limiter/rate-limiter.ts index 85366e80400..da5ce07d74e 100644 --- a/apps/sim/lib/core/rate-limiter/rate-limiter.ts +++ b/apps/sim/lib/core/rate-limiter/rate-limiter.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { isOrgScopedSubscription } from '@/lib/billing/subscriptions/utils' -import { toError } from '@/lib/core/utils/helpers' import { createStorageAdapter, type RateLimitStorageAdapter } from './storage' import { getRateLimit, diff --git a/apps/sim/lib/core/rate-limiter/storage/factory.test.ts b/apps/sim/lib/core/rate-limiter/storage/factory.test.ts index 17fd5958b63..bd797d4beb2 100644 --- a/apps/sim/lib/core/rate-limiter/storage/factory.test.ts +++ b/apps/sim/lib/core/rate-limiter/storage/factory.test.ts @@ -1,25 +1,18 @@ -import { loggerMock } from '@sim/testing' +import { redisConfigMock, redisConfigMockFns } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetRedisClient, mockOnRedisReconnect, mockGetStorageMethod, reconnectCallbacks } = - vi.hoisted(() => { - const callbacks: Array<() => void> = [] - return { - mockGetRedisClient: vi.fn(() => null), - mockOnRedisReconnect: vi.fn((cb: () => void) => { - callbacks.push(cb) - }), - mockGetStorageMethod: vi.fn(() => 'db'), - reconnectCallbacks: callbacks, - } - }) +const { mockGetStorageMethod, reconnectCallbacks } = vi.hoisted(() => { + const callbacks: Array<() => void> = [] + return { + mockGetStorageMethod: vi.fn(() => 'db'), + reconnectCallbacks: callbacks, + } +}) -vi.mock('@sim/logger', () => loggerMock) +const mockGetRedisClient = redisConfigMockFns.mockGetRedisClient +const mockOnRedisReconnect = redisConfigMockFns.mockOnRedisReconnect -vi.mock('@/lib/core/config/redis', () => ({ - getRedisClient: mockGetRedisClient, - onRedisReconnect: mockOnRedisReconnect, -})) +vi.mock('@/lib/core/config/redis', () => redisConfigMock) vi.mock('@/lib/core/storage', () => ({ getStorageMethod: mockGetStorageMethod, @@ -39,6 +32,9 @@ describe('rate limit storage factory', () => { beforeEach(() => { mockGetRedisClient.mockReset().mockReturnValue(null) mockGetStorageMethod.mockReset().mockReturnValue('db') + mockOnRedisReconnect.mockImplementation((cb: () => void) => { + reconnectCallbacks.push(cb) + }) resetStorageAdapter() }) diff --git a/apps/sim/lib/core/security/csp.test.ts b/apps/sim/lib/core/security/csp.test.ts index ad1b4a9ad8b..44f2dcf5fc1 100644 --- a/apps/sim/lib/core/security/csp.test.ts +++ b/apps/sim/lib/core/security/csp.test.ts @@ -1,4 +1,4 @@ -import { createEnvMock } from '@sim/testing' +import { createEnvMock, featureFlagsMock } from '@sim/testing' import { afterEach, describe, expect, it, vi } from 'vitest' vi.mock('@/lib/core/config/env', () => @@ -17,11 +17,7 @@ vi.mock('@/lib/core/config/env', () => }) ) -vi.mock('@/lib/core/config/feature-flags', () => ({ - isDev: false, - isHosted: false, - isReactGrabEnabled: false, -})) +vi.mock('@/lib/core/config/feature-flags', () => featureFlagsMock) import { addCSPSource, diff --git a/apps/sim/lib/core/security/encryption.test.ts b/apps/sim/lib/core/security/encryption.test.ts index 43a0391684a..fef678cf98f 100644 --- a/apps/sim/lib/core/security/encryption.test.ts +++ b/apps/sim/lib/core/security/encryption.test.ts @@ -1,4 +1,4 @@ -import { createEnvMock, loggerMock } from '@sim/testing' +import { createEnvMock } from '@sim/testing' import { afterEach, describe, expect, it, vi } from 'vitest' vi.mock('@/lib/core/config/env', () => @@ -7,8 +7,6 @@ vi.mock('@/lib/core/config/env', () => }) ) -vi.mock('@sim/logger', () => loggerMock) - import { env } from '@/lib/core/config/env' import { decryptSecret, encryptSecret, generatePassword } from './encryption' diff --git a/apps/sim/lib/core/security/input-validation.server.ts b/apps/sim/lib/core/security/input-validation.server.ts index 7dcb89093c5..041d44c654d 100644 --- a/apps/sim/lib/core/security/input-validation.server.ts +++ b/apps/sim/lib/core/security/input-validation.server.ts @@ -3,10 +3,10 @@ import http from 'http' import https from 'https' import type { LookupFunction } from 'net' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import * as ipaddr from 'ipaddr.js' import { isHosted } from '@/lib/core/config/feature-flags' import { type ValidationResult, validateExternalUrl } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('InputValidation') diff --git a/apps/sim/lib/core/security/input-validation.test.ts b/apps/sim/lib/core/security/input-validation.test.ts index f08578494da..4086ee5341f 100644 --- a/apps/sim/lib/core/security/input-validation.test.ts +++ b/apps/sim/lib/core/security/input-validation.test.ts @@ -1,4 +1,4 @@ -import { loggerMock } from '@sim/testing' +import { featureFlagsMock } from '@sim/testing' import { describe, expect, it, vi } from 'vitest' import { validateAirtableId, @@ -26,10 +26,7 @@ import { import { validateUrlWithDNS } from '@/lib/core/security/input-validation.server' import { sanitizeForLogging } from '@/lib/core/security/redaction' -vi.mock('@sim/logger', () => loggerMock) -vi.mock('@/lib/core/config/feature-flags', () => ({ - isHosted: false, -})) +vi.mock('@/lib/core/config/feature-flags', () => featureFlagsMock) describe('validatePathSegment', () => { describe('valid inputs', () => { diff --git a/apps/sim/lib/core/telemetry.ts b/apps/sim/lib/core/telemetry.ts index e9508f0e247..5adb530e00d 100644 --- a/apps/sim/lib/core/telemetry.ts +++ b/apps/sim/lib/core/telemetry.ts @@ -18,7 +18,7 @@ import { context, type Span, SpanStatusCode, trace } from '@opentelemetry/api' import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { TraceSpan } from '@/lib/logs/types' /** diff --git a/apps/sim/lib/core/utils.test.ts b/apps/sim/lib/core/utils.test.ts index 6540b5960d9..5aa5a91804f 100644 --- a/apps/sim/lib/core/utils.test.ts +++ b/apps/sim/lib/core/utils.test.ts @@ -1,15 +1,15 @@ import { createEnvMock } from '@sim/testing' -import { afterEach, describe, expect, it, vi } from 'vitest' -import { getRotatingApiKey } from '@/lib/core/config/api-keys' -import { decryptSecret, encryptSecret } from '@/lib/core/security/encryption' -import { cn } from '@/lib/core/utils/cn' import { formatDate, formatDateTime, formatDuration, formatTime, getTimezoneAbbreviation, -} from '@/lib/core/utils/formatting' +} from '@sim/utils/formatting' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { getRotatingApiKey } from '@/lib/core/config/api-keys' +import { decryptSecret, encryptSecret } from '@/lib/core/security/encryption' +import { cn } from '@/lib/core/utils/cn' import { convertScheduleOptionsToCron } from '@/lib/core/utils/scheduling' import { getInvalidCharacters, isValidName, validateName } from '@/lib/core/utils/validation' diff --git a/apps/sim/lib/core/utils/helpers.ts b/apps/sim/lib/core/utils/helpers.ts deleted file mode 100644 index 0b952ae5180..00000000000 --- a/apps/sim/lib/core/utils/helpers.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Returns a promise that resolves after the specified duration. - * Replaces the common `new Promise(resolve => setTimeout(resolve, ms))` pattern. - */ -export function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)) -} - -/** - * Normalizes an unknown caught value into an Error instance. - * Replaces the common `e instanceof Error ? e : new Error(String(e))` pattern in catch clauses. - */ -export function toError(value: unknown): Error { - if (value instanceof Error) return value - if (typeof value === 'string') return new Error(value) - return new Error(String(value)) -} diff --git a/apps/sim/lib/core/utils/pg-error.test.ts b/apps/sim/lib/core/utils/pg-error.test.ts deleted file mode 100644 index b671b68c062..00000000000 --- a/apps/sim/lib/core/utils/pg-error.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @vitest-environment node - */ -import { describe, expect, it } from 'vitest' -import { getPostgresErrorCode } from '@/lib/core/utils/pg-error' - -describe('getPostgresErrorCode', () => { - it('reads code from Error.code', () => { - const err = new Error('fail') as Error & { code: string } - err.code = '23505' - expect(getPostgresErrorCode(err)).toBe('23505') - }) - - it('reads code from Error.cause', () => { - const err = new Error('fail', { cause: { code: '23505' } }) - expect(getPostgresErrorCode(err)).toBe('23505') - }) - - it('walks nested Error causes', () => { - const pgErr = new Error('unique_violation') as Error & { code: string } - pgErr.code = '23505' - const err = new Error('outer', { cause: new Error('inner', { cause: pgErr }) }) - expect(getPostgresErrorCode(err)).toBe('23505') - }) - - it('returns undefined for non-errors', () => { - expect(getPostgresErrorCode(undefined)).toBeUndefined() - expect(getPostgresErrorCode('23505')).toBeUndefined() - }) -}) diff --git a/apps/sim/lib/core/utils/request.ts b/apps/sim/lib/core/utils/request.ts index 9d60cf9c51b..ec9d300c080 100644 --- a/apps/sim/lib/core/utils/request.ts +++ b/apps/sim/lib/core/utils/request.ts @@ -1,4 +1,4 @@ -import { generateId } from '@/lib/core/utils/uuid' +import { generateId } from '@sim/utils/id' /** * Generate a short request ID for correlation */ diff --git a/apps/sim/lib/credentials/access.ts b/apps/sim/lib/credentials/access.ts index f1a7341b5ce..490fb35c2c4 100644 --- a/apps/sim/lib/credentials/access.ts +++ b/apps/sim/lib/credentials/access.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import { credential, credentialMember, workspace } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, inArray, ne } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' import { checkWorkspaceAccess } from '@/lib/workspaces/permissions/utils' const logger = createLogger('CredentialAccess') diff --git a/apps/sim/lib/credentials/draft-hooks.ts b/apps/sim/lib/credentials/draft-hooks.ts index 6c1840c1030..cacff50418e 100644 --- a/apps/sim/lib/credentials/draft-hooks.ts +++ b/apps/sim/lib/credentials/draft-hooks.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import * as schema from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, sql } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' const logger = createLogger('CredentialDraftHooks') diff --git a/apps/sim/lib/credentials/environment.ts b/apps/sim/lib/credentials/environment.ts index c41ae9488e5..ad4bed88876 100644 --- a/apps/sim/lib/credentials/environment.ts +++ b/apps/sim/lib/credentials/environment.ts @@ -1,7 +1,7 @@ import { db } from '@sim/db' import { credential, credentialMember, permissions, workspace } from '@sim/db/schema' +import { generateId } from '@sim/utils/id' import { and, eq, inArray, isNull, notInArray } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' interface AccessibleEnvCredential { type: 'env_workspace' | 'env_personal' diff --git a/apps/sim/lib/credentials/oauth.ts b/apps/sim/lib/credentials/oauth.ts index 840b99030b7..0e4b10a10e9 100644 --- a/apps/sim/lib/credentials/oauth.ts +++ b/apps/sim/lib/credentials/oauth.ts @@ -1,7 +1,7 @@ import { db } from '@sim/db' import { account, credential, credentialMember } from '@sim/db/schema' +import { generateId } from '@sim/utils/id' import { and, eq, inArray, notInArray } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' import { getServiceConfigByProviderId } from '@/lib/oauth' /** Provider IDs that are not real OAuth integrations (login-only social providers and password) */ diff --git a/apps/sim/lib/environment/utils.ts b/apps/sim/lib/environment/utils.ts index 1ab6f5da100..226e2cb33b7 100644 --- a/apps/sim/lib/environment/utils.ts +++ b/apps/sim/lib/environment/utils.ts @@ -1,9 +1,9 @@ import { db } from '@sim/db' import { environment, workspaceEnvironment } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq, inArray } from 'drizzle-orm' import { decryptSecret, encryptSecret } from '@/lib/core/security/encryption' -import { generateId } from '@/lib/core/utils/uuid' import { getAccessibleEnvCredentials, syncPersonalEnvCredentialsForUser, diff --git a/apps/sim/lib/execution/buffered-stream.ts b/apps/sim/lib/execution/buffered-stream.ts index a811faf1d28..a61cc1e4dca 100644 --- a/apps/sim/lib/execution/buffered-stream.ts +++ b/apps/sim/lib/execution/buffered-stream.ts @@ -1,5 +1,6 @@ import { createLogger } from '@sim/logger' -import { sleep, toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' import { type ExecutionStreamStatus, getExecutionMeta, diff --git a/apps/sim/lib/execution/cancellation.test.ts b/apps/sim/lib/execution/cancellation.test.ts index d68fe46a2bf..0f587800f99 100644 --- a/apps/sim/lib/execution/cancellation.test.ts +++ b/apps/sim/lib/execution/cancellation.test.ts @@ -1,16 +1,13 @@ -import { loggerMock } from '@sim/testing' +import { redisConfigMock, redisConfigMockFns } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetRedisClient, mockRedisSet } = vi.hoisted(() => ({ - mockGetRedisClient: vi.fn(), +const { mockRedisSet } = vi.hoisted(() => ({ mockRedisSet: vi.fn(), })) -vi.mock('@sim/logger', () => loggerMock) +const mockGetRedisClient = redisConfigMockFns.mockGetRedisClient -vi.mock('@/lib/core/config/redis', () => ({ - getRedisClient: mockGetRedisClient, -})) +vi.mock('@/lib/core/config/redis', () => redisConfigMock) import { markExecutionCancelled } from './cancellation' import { diff --git a/apps/sim/lib/execution/event-buffer.ts b/apps/sim/lib/execution/event-buffer.ts index ccf7bab9d2b..04009b4868a 100644 --- a/apps/sim/lib/execution/event-buffer.ts +++ b/apps/sim/lib/execution/event-buffer.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { getRedisClient } from '@/lib/core/config/redis' -import { toError } from '@/lib/core/utils/helpers' import type { ExecutionEvent } from '@/lib/workflows/executor/execution-events' const logger = createLogger('ExecutionEventBuffer') diff --git a/apps/sim/lib/execution/isolated-vm.test.ts b/apps/sim/lib/execution/isolated-vm.test.ts index 5b4edc86d45..d5b4e775865 100644 --- a/apps/sim/lib/execution/isolated-vm.test.ts +++ b/apps/sim/lib/execution/isolated-vm.test.ts @@ -2,7 +2,12 @@ * @vitest-environment node */ import { EventEmitter } from 'node:events' -import { loggerMock } from '@sim/testing' +import { + inputValidationMock, + inputValidationMockFns, + redisConfigMock, + redisConfigMockFns, +} from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' type MockProc = EventEmitter & { @@ -117,54 +122,41 @@ function createReadyFetchProxyProc(fetchMessage: { url: string; optionsJson?: st return proc } -const { mockSpawn, mockExecSync, mockSecureFetch, mockSanitizeUrl, mockGetRedisClient, mockEnv } = - vi.hoisted(() => ({ - mockSpawn: vi.fn(), - mockExecSync: vi.fn(() => Buffer.from('v23.11.0')), - mockSecureFetch: vi.fn(async () => ({ - ok: true, - status: 200, - statusText: 'OK', - headers: new Map(), - text: async () => '', - json: async () => ({}), - arrayBuffer: async () => new ArrayBuffer(0), - })), - mockSanitizeUrl: vi.fn((url: string) => url), - mockGetRedisClient: vi.fn(() => null), - mockEnv: { - IVM_POOL_SIZE: '1', - IVM_MAX_CONCURRENT: '100', - IVM_MAX_PER_WORKER: '100', - IVM_WORKER_IDLE_TIMEOUT_MS: '60000', - IVM_MAX_QUEUE_SIZE: '10', - IVM_MAX_ACTIVE_PER_OWNER: '100', - IVM_MAX_QUEUED_PER_OWNER: '10', - IVM_MAX_OWNER_WEIGHT: '5', - IVM_DISTRIBUTED_MAX_INFLIGHT_PER_OWNER: '100', - IVM_DISTRIBUTED_LEASE_MIN_TTL_MS: '1000', - IVM_QUEUE_TIMEOUT_MS: '1000', - IVM_MAX_FETCH_RESPONSE_BYTES: '', - IVM_MAX_FETCH_RESPONSE_CHARS: '', - IVM_MAX_FETCH_URL_LENGTH: '', - IVM_MAX_FETCH_OPTIONS_JSON_CHARS: '', - REDIS_URL: '', - } as Record, - })) - -vi.mock('@sim/logger', () => loggerMock) -vi.mock('@/lib/core/security/input-validation.server', () => ({ - secureFetchWithValidation: mockSecureFetch, +const { mockSpawn, mockExecSync, mockSanitizeUrl, mockEnv } = vi.hoisted(() => ({ + mockSpawn: vi.fn(), + mockExecSync: vi.fn(() => Buffer.from('v23.11.0')), + mockSanitizeUrl: vi.fn((url: string) => url), + mockEnv: { + IVM_POOL_SIZE: '1', + IVM_MAX_CONCURRENT: '100', + IVM_MAX_PER_WORKER: '100', + IVM_WORKER_IDLE_TIMEOUT_MS: '60000', + IVM_MAX_QUEUE_SIZE: '10', + IVM_MAX_ACTIVE_PER_OWNER: '100', + IVM_MAX_QUEUED_PER_OWNER: '10', + IVM_MAX_OWNER_WEIGHT: '5', + IVM_DISTRIBUTED_MAX_INFLIGHT_PER_OWNER: '100', + IVM_DISTRIBUTED_LEASE_MIN_TTL_MS: '1000', + IVM_QUEUE_TIMEOUT_MS: '1000', + IVM_MAX_FETCH_RESPONSE_BYTES: '', + IVM_MAX_FETCH_RESPONSE_CHARS: '', + IVM_MAX_FETCH_URL_LENGTH: '', + IVM_MAX_FETCH_OPTIONS_JSON_CHARS: '', + REDIS_URL: '', + } as Record, })) + +const mockSecureFetch = inputValidationMockFns.mockSecureFetchWithValidation +const mockGetRedisClient = redisConfigMockFns.mockGetRedisClient + +vi.mock('@/lib/core/security/input-validation.server', () => inputValidationMock) vi.mock('@/lib/core/utils/logging', () => ({ sanitizeUrlForLog: mockSanitizeUrl, })) vi.mock('@/lib/core/config/env', () => ({ env: mockEnv, })) -vi.mock('@/lib/core/config/redis', () => ({ - getRedisClient: mockGetRedisClient, -})) +vi.mock('@/lib/core/config/redis', () => redisConfigMock) vi.mock('node:child_process', () => ({ execSync: mockExecSync, spawn: mockSpawn, diff --git a/apps/sim/lib/execution/isolated-vm.ts b/apps/sim/lib/execution/isolated-vm.ts index c19349d443b..62221a1ea97 100644 --- a/apps/sim/lib/execution/isolated-vm.ts +++ b/apps/sim/lib/execution/isolated-vm.ts @@ -3,13 +3,13 @@ import fs from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { env } from '@/lib/core/config/env' import { getRedisClient } from '@/lib/core/config/redis' import { type SecureFetchOptions, secureFetchWithValidation, } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' import { sanitizeUrlForLog } from '@/lib/core/utils/logging' const logger = createLogger('IsolatedVMExecution') diff --git a/apps/sim/lib/execution/preprocessing.test.ts b/apps/sim/lib/execution/preprocessing.test.ts index 90262a7c8cb..e76891d1476 100644 --- a/apps/sim/lib/execution/preprocessing.test.ts +++ b/apps/sim/lib/execution/preprocessing.test.ts @@ -2,6 +2,7 @@ * @vitest-environment node */ +import { loggingSessionMock, schemaMock } from '@sim/testing' import { describe, expect, it, vi } from 'vitest' const { mockGetWorkspaceBilledAccountUserId } = vi.hoisted(() => ({ @@ -9,15 +10,7 @@ const { mockGetWorkspaceBilledAccountUserId } = vi.hoisted(() => ({ })) vi.mock('@sim/db', () => ({ db: {} })) -vi.mock('@sim/db/schema', () => ({ workflow: {} })) -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ eq: vi.fn() })) vi.mock('@/lib/billing/calculations/usage-monitor', () => ({ checkServerSideUsageLimits: vi.fn(), @@ -31,9 +24,7 @@ vi.mock('@/lib/core/execution-limits', () => ({ vi.mock('@/lib/core/rate-limiter/rate-limiter', () => ({ RateLimiter: vi.fn(), })) -vi.mock('@/lib/logs/execution/logging-session', () => ({ - LoggingSession: vi.fn(), -})) +vi.mock('@/lib/logs/execution/logging-session', () => loggingSessionMock) vi.mock('@/lib/workspaces/utils', () => ({ getWorkspaceBilledAccountUserId: mockGetWorkspaceBilledAccountUserId, })) diff --git a/apps/sim/lib/execution/preprocessing.webhook-correlation.test.ts b/apps/sim/lib/execution/preprocessing.webhook-correlation.test.ts index 51a22501e89..4f9af7ef28b 100644 --- a/apps/sim/lib/execution/preprocessing.webhook-correlation.test.ts +++ b/apps/sim/lib/execution/preprocessing.webhook-correlation.test.ts @@ -2,6 +2,7 @@ * @vitest-environment node */ +import { loggingSessionMock, schemaMock } from '@sim/testing' import { describe, expect, it, vi } from 'vitest' const { mockGetWorkspaceBilledAccountUserId } = vi.hoisted(() => ({ @@ -9,15 +10,7 @@ const { mockGetWorkspaceBilledAccountUserId } = vi.hoisted(() => ({ })) vi.mock('@sim/db', () => ({ db: {} })) -vi.mock('@sim/db/schema', () => ({ workflow: {} })) -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ eq: vi.fn() })) vi.mock('@/lib/billing/calculations/usage-monitor', () => ({ checkServerSideUsageLimits: vi.fn(), @@ -31,9 +24,7 @@ vi.mock('@/lib/core/execution-limits', () => ({ vi.mock('@/lib/core/rate-limiter/rate-limiter', () => ({ RateLimiter: vi.fn(), })) -vi.mock('@/lib/logs/execution/logging-session', () => ({ - LoggingSession: vi.fn(), -})) +vi.mock('@/lib/logs/execution/logging-session', () => loggingSessionMock) vi.mock('@/lib/workspaces/utils', () => ({ getWorkspaceBilledAccountUserId: mockGetWorkspaceBilledAccountUserId, })) diff --git a/apps/sim/lib/execution/sandbox/bundles/build.ts b/apps/sim/lib/execution/sandbox/bundles/build.ts index 995bf3ce552..5e6ab81645d 100644 --- a/apps/sim/lib/execution/sandbox/bundles/build.ts +++ b/apps/sim/lib/execution/sandbox/bundles/build.ts @@ -13,6 +13,9 @@ import { mkdirSync, rmSync, writeFileSync } from 'node:fs' import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' +import { createLogger } from '@sim/logger' + +const logger = createLogger('SandboxBundleBuild') interface BunBuildResult { success: boolean @@ -107,7 +110,7 @@ async function main(): Promise { if (!result.success) { for (const log of result.logs) { - console.error(log) + logger.error(String(log)) } throw new Error(`Failed to build sandbox bundle: ${spec.name}`) } @@ -119,13 +122,13 @@ async function main(): Promise { const code = await result.outputs[0].text() const banner = `// sandbox bundle: ${spec.name}\n// generated by apps/sim/lib/execution/sandbox/bundles/build.ts\n// do not edit by hand. run \`bun run build:sandbox-bundles\` to regenerate.\n` writeFileSync(join(BUNDLES_DIR, spec.outFile), banner + code, 'utf-8') - console.log(`built ${spec.outFile} (${code.length.toLocaleString()} chars)`) + logger.info(`built ${spec.outFile} (${code.length.toLocaleString()} chars)`) } rmSync(ENTRIES_DIR, { recursive: true, force: true }) } main().catch((err) => { - console.error(err) + logger.error('sandbox bundle build failed', err) process.exit(1) }) diff --git a/apps/sim/lib/execution/sandbox/bundles/docx.cjs b/apps/sim/lib/execution/sandbox/bundles/docx.cjs index 84ffc65fa2e..f94ae48b832 100644 --- a/apps/sim/lib/execution/sandbox/bundles/docx.cjs +++ b/apps/sim/lib/execution/sandbox/bundles/docx.cjs @@ -1,27 +1,27 @@ // sandbox bundle: docx // generated by apps/sim/lib/execution/sandbox/bundles/build.ts // do not edit by hand. run `bun run build:sandbox-bundles` to regenerate. -(()=>{var F7=Object.create;var{getPrototypeOf:N7,defineProperty:F6,getOwnPropertyNames:R7}=Object;var D7=Object.prototype.hasOwnProperty;var A7=(U,$,Y)=>{Y=U!=null?F7(N7(U)):{};let Z=$||!U||!U.__esModule?F6(Y,"default",{value:U,enumerable:!0}):Y;for(let J of R7(U))if(!D7.call(Z,J))F6(Z,J,{get:()=>U[J],enumerable:!0});return Z};var P7=(U,$)=>()=>($||U(($={exports:{}}).exports,$),$.exports);var T7=(U,$)=>{for(var Y in $)F6(U,Y,{get:$[Y],enumerable:!0,configurable:!0,set:(Z)=>$[Y]=()=>Z})};var i$=P7((vX,p$)=>{var A0=p$.exports={},i0,r0;function S6(){throw new Error("setTimeout has not been defined")}function v6(){throw new Error("clearTimeout has not been defined")}(function(){try{if(typeof setTimeout==="function")i0=setTimeout;else i0=S6}catch(U){i0=S6}try{if(typeof clearTimeout==="function")r0=clearTimeout;else r0=v6}catch(U){r0=v6}})();function m$(U){if(i0===setTimeout)return setTimeout(U,0);if((i0===S6||!i0)&&setTimeout)return i0=setTimeout,setTimeout(U,0);try{return i0(U,0)}catch($){try{return i0.call(null,U,0)}catch(Y){return i0.call(this,U,0)}}}function Zw(U){if(r0===clearTimeout)return clearTimeout(U);if((r0===v6||!r0)&&clearTimeout)return r0=clearTimeout,clearTimeout(U);try{return r0(U)}catch($){try{return r0.call(null,U)}catch(Y){return r0.call(this,U)}}}var B1=[],g1=!1,T1,O2=-1;function Qw(){if(!g1||!T1)return;if(g1=!1,T1.length)B1=T1.concat(B1);else O2=-1;if(B1.length)l$()}function l$(){if(g1)return;var U=m$(Qw);g1=!0;var $=B1.length;while($){T1=B1,B1=[];while(++O2<$)if(T1)T1[O2].run();O2=-1,$=B1.length}T1=null,g1=!1,Zw(U)}A0.nextTick=function(U){var $=new Array(arguments.length-1);if(arguments.length>1)for(var Y=1;Y0)throw new Error("Invalid string. Length must be a multiple of 4");var Y=U.indexOf("=");if(Y===-1)Y=$;var Z=Y===$?0:4-Y%4;return[Y,Z]}function O7(U,$){return(U+$)*3/4-$}function E7(U){var $,Y=C7(U),Z=Y[0],J=Y[1],G=new Uint8Array(O7(Z,J)),w=0,Q=J>0?Z-4:Z,q;for(q=0;q>16&255,G[w++]=$>>8&255,G[w++]=$&255;if(J===2)$=u0[U.charCodeAt(q)]<<2|u0[U.charCodeAt(q+1)]>>4,G[w++]=$&255;if(J===1)$=u0[U.charCodeAt(q)]<<10|u0[U.charCodeAt(q+1)]<<4|u0[U.charCodeAt(q+2)]>>2,G[w++]=$>>8&255,G[w++]=$&255;return G}function k7(U){return a0[U>>18&63]+a0[U>>12&63]+a0[U>>6&63]+a0[U&63]}function S7(U,$,Y){var Z,J=[];for(var G=$;GQ?Q:w+G));if(Z===1)$=U[Y-1],J.push(a0[$>>2]+a0[$<<4&63]+"==");else if(Z===2)$=(U[Y-2]<<8)+U[Y-1],J.push(a0[$>>10]+a0[$>>4&63]+a0[$<<2&63]+"=");return J.join("")}function T2(U,$,Y,Z,J){var G,w,Q=J*8-Z-1,q=(1<>1,R=-7,W=Y?J-1:0,E=Y?-1:1,D=U[$+W];W+=E,G=D&(1<<-R)-1,D>>=-R,R+=Q;for(;R>0;G=G*256+U[$+W],W+=E,R-=8);w=G&(1<<-R)-1,G>>=-R,R+=Z;for(;R>0;w=w*256+U[$+W],W+=E,R-=8);if(G===0)G=1-z;else if(G===q)return w?NaN:(D?-1:1)*(1/0);else w=w+Math.pow(2,Z),G=G-z;return(D?-1:1)*w*Math.pow(2,G-Z)}function k$(U,$,Y,Z,J,G){var w,Q,q,z=G*8-J-1,R=(1<>1,E=J===23?Math.pow(2,-24)-Math.pow(2,-77):0,D=Z?0:G-1,C=Z?1:-1,H=$<0||$===0&&1/$<0?1:0;if($=Math.abs($),isNaN($)||$===1/0)Q=isNaN($)?1:0,w=R;else{if(w=Math.floor(Math.log($)/Math.LN2),$*(q=Math.pow(2,-w))<1)w--,q*=2;if(w+W>=1)$+=E/q;else $+=E*Math.pow(2,1-W);if($*q>=2)w++,q/=2;if(w+W>=R)Q=0,w=R;else if(w+W>=1)Q=($*q-1)*Math.pow(2,J),w=w+W;else Q=$*Math.pow(2,W-1)*Math.pow(2,J),w=0}for(;J>=8;U[Y+D]=Q&255,D+=C,Q/=256,J-=8);w=w<0;U[Y+D]=w&255,D+=C,w/=256,z-=8);U[Y+D-C]|=H*128}var T$=typeof Symbol==="function"&&typeof Symbol.for==="function"?Symbol.for("nodejs.util.inspect.custom"):null;var R6=2147483647;var{btoa:AX,atob:PX,File:TX,Blob:CX}=globalThis;function w1(U){if(U>R6)throw new RangeError('The value "'+U+'" is invalid for option "size"');let $=new Uint8Array(U);return Object.setPrototypeOf($,G0.prototype),$}function C6(U,$,Y){return class Z extends Y{constructor(){super();Object.defineProperty(this,"message",{value:$.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${U}]`,this.stack,delete this.name}get code(){return U}set code(J){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:J,writable:!0})}toString(){return`${this.name} [${U}]: ${this.message}`}}}var v7=C6("ERR_BUFFER_OUT_OF_BOUNDS",function(U){if(U)return`${U} is outside of buffer bounds`;return"Attempt to access memory outside buffer bounds"},RangeError),_7=C6("ERR_INVALID_ARG_TYPE",function(U,$){return`The "${U}" argument must be of type number. Received type ${typeof $}`},TypeError),D6=C6("ERR_OUT_OF_RANGE",function(U,$,Y){let Z=`The value of "${U}" is out of range.`,J=Y;if(Number.isInteger(Y)&&Math.abs(Y)>4294967296)J=E$(String(Y));else if(typeof Y==="bigint"){if(J=String(Y),Y>BigInt(2)**BigInt(32)||Y<-(BigInt(2)**BigInt(32)))J=E$(J);J+="n"}return Z+=` It must be ${$}. Received ${J}`,Z},RangeError);function G0(U,$,Y){if(typeof U==="number"){if(typeof $==="string")throw new TypeError('The "string" argument must be of type string. Received type number');return O6(U)}return S$(U,$,Y)}Object.defineProperty(G0.prototype,"parent",{enumerable:!0,get:function(){if(!G0.isBuffer(this))return;return this.buffer}});Object.defineProperty(G0.prototype,"offset",{enumerable:!0,get:function(){if(!G0.isBuffer(this))return;return this.byteOffset}});G0.poolSize=8192;function S$(U,$,Y){if(typeof U==="string")return b7(U,$);if(ArrayBuffer.isView(U))return g7(U);if(U==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof U);if(p0(U,ArrayBuffer)||U&&p0(U.buffer,ArrayBuffer))return P6(U,$,Y);if(typeof SharedArrayBuffer!=="undefined"&&(p0(U,SharedArrayBuffer)||U&&p0(U.buffer,SharedArrayBuffer)))return P6(U,$,Y);if(typeof U==="number")throw new TypeError('The "value" argument must not be of type number. Received type number');let Z=U.valueOf&&U.valueOf();if(Z!=null&&Z!==U)return G0.from(Z,$,Y);let J=x7(U);if(J)return J;if(typeof Symbol!=="undefined"&&Symbol.toPrimitive!=null&&typeof U[Symbol.toPrimitive]==="function")return G0.from(U[Symbol.toPrimitive]("string"),$,Y);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof U)}G0.from=function(U,$,Y){return S$(U,$,Y)};Object.setPrototypeOf(G0.prototype,Uint8Array.prototype);Object.setPrototypeOf(G0,Uint8Array);function v$(U){if(typeof U!=="number")throw new TypeError('"size" argument must be of type number');else if(U<0)throw new RangeError('The value "'+U+'" is invalid for option "size"')}function y7(U,$,Y){if(v$(U),U<=0)return w1(U);if($!==void 0)return typeof Y==="string"?w1(U).fill($,Y):w1(U).fill($);return w1(U)}G0.alloc=function(U,$,Y){return y7(U,$,Y)};function O6(U){return v$(U),w1(U<0?0:E6(U)|0)}G0.allocUnsafe=function(U){return O6(U)};G0.allocUnsafeSlow=function(U){return O6(U)};function b7(U,$){if(typeof $!=="string"||$==="")$="utf8";if(!G0.isEncoding($))throw new TypeError("Unknown encoding: "+$);let Y=_$(U,$)|0,Z=w1(Y),J=Z.write(U,$);if(J!==Y)Z=Z.slice(0,J);return Z}function A6(U){let $=U.length<0?0:E6(U.length)|0,Y=w1($);for(let Z=0;Z<$;Z+=1)Y[Z]=U[Z]&255;return Y}function g7(U){if(p0(U,Uint8Array)){let $=new Uint8Array(U);return P6($.buffer,$.byteOffset,$.byteLength)}return A6(U)}function P6(U,$,Y){if($<0||U.byteLength<$)throw new RangeError('"offset" is outside of buffer bounds');if(U.byteLength<$+(Y||0))throw new RangeError('"length" is outside of buffer bounds');let Z;if($===void 0&&Y===void 0)Z=new Uint8Array(U);else if(Y===void 0)Z=new Uint8Array(U,$);else Z=new Uint8Array(U,$,Y);return Object.setPrototypeOf(Z,G0.prototype),Z}function x7(U){if(G0.isBuffer(U)){let $=E6(U.length)|0,Y=w1($);if(Y.length===0)return Y;return U.copy(Y,0,0,$),Y}if(U.length!==void 0){if(typeof U.length!=="number"||numberIsNaN(U.length))return w1(0);return A6(U)}if(U.type==="Buffer"&&Array.isArray(U.data))return A6(U.data)}function E6(U){if(U>=R6)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+R6.toString(16)+" bytes");return U|0}G0.isBuffer=function U($){return $!=null&&$._isBuffer===!0&&$!==G0.prototype};G0.compare=function U($,Y){if(p0($,Uint8Array))$=G0.from($,$.offset,$.byteLength);if(p0(Y,Uint8Array))Y=G0.from(Y,Y.offset,Y.byteLength);if(!G0.isBuffer($)||!G0.isBuffer(Y))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if($===Y)return 0;let Z=$.length,J=Y.length;for(let G=0,w=Math.min(Z,J);GJ.length){if(!G0.isBuffer(w))w=G0.from(w);w.copy(J,G)}else Uint8Array.prototype.set.call(J,w,G);else if(!G0.isBuffer(w))throw new TypeError('"list" argument must be an Array of Buffers');else w.copy(J,G);G+=w.length}return J};function _$(U,$){if(G0.isBuffer(U))return U.length;if(ArrayBuffer.isView(U)||p0(U,ArrayBuffer))return U.byteLength;if(typeof U!=="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof U);let Y=U.length,Z=arguments.length>2&&arguments[2]===!0;if(!Z&&Y===0)return 0;let J=!1;for(;;)switch($){case"ascii":case"latin1":case"binary":return Y;case"utf8":case"utf-8":return T6(U).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Y*2;case"hex":return Y>>>1;case"base64":return c$(U).length;default:if(J)return Z?-1:T6(U).length;$=(""+$).toLowerCase(),J=!0}}G0.byteLength=_$;function f7(U,$,Y){let Z=!1;if($===void 0||$<0)$=0;if($>this.length)return"";if(Y===void 0||Y>this.length)Y=this.length;if(Y<=0)return"";if(Y>>>=0,$>>>=0,Y<=$)return"";if(!U)U="utf8";while(!0)switch(U){case"hex":return r7(this,$,Y);case"utf8":case"utf-8":return b$(this,$,Y);case"ascii":return p7(this,$,Y);case"latin1":case"binary":return i7(this,$,Y);case"base64":return l7(this,$,Y);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return s7(this,$,Y);default:if(Z)throw new TypeError("Unknown encoding: "+U);U=(U+"").toLowerCase(),Z=!0}}G0.prototype._isBuffer=!0;function P1(U,$,Y){let Z=U[$];U[$]=U[Y],U[Y]=Z}G0.prototype.swap16=function U(){let $=this.length;if($%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let Y=0;Y<$;Y+=2)P1(this,Y,Y+1);return this};G0.prototype.swap32=function U(){let $=this.length;if($%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let Y=0;Y<$;Y+=4)P1(this,Y,Y+3),P1(this,Y+1,Y+2);return this};G0.prototype.swap64=function U(){let $=this.length;if($%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(let Y=0;Y<$;Y+=8)P1(this,Y,Y+7),P1(this,Y+1,Y+6),P1(this,Y+2,Y+5),P1(this,Y+3,Y+4);return this};G0.prototype.toString=function U(){let $=this.length;if($===0)return"";if(arguments.length===0)return b$(this,0,$);return f7.apply(this,arguments)};G0.prototype.toLocaleString=G0.prototype.toString;G0.prototype.equals=function U($){if(!G0.isBuffer($))throw new TypeError("Argument must be a Buffer");if(this===$)return!0;return G0.compare(this,$)===0};G0.prototype.inspect=function U(){let $="",Y=exports_buffer.INSPECT_MAX_BYTES;if($=this.toString("hex",0,Y).replace(/(.{2})/g,"$1 ").trim(),this.length>Y)$+=" ... ";return""};if(T$)G0.prototype[T$]=G0.prototype.inspect;G0.prototype.compare=function U($,Y,Z,J,G){if(p0($,Uint8Array))$=G0.from($,$.offset,$.byteLength);if(!G0.isBuffer($))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof $);if(Y===void 0)Y=0;if(Z===void 0)Z=$?$.length:0;if(J===void 0)J=0;if(G===void 0)G=this.length;if(Y<0||Z>$.length||J<0||G>this.length)throw new RangeError("out of range index");if(J>=G&&Y>=Z)return 0;if(J>=G)return-1;if(Y>=Z)return 1;if(Y>>>=0,Z>>>=0,J>>>=0,G>>>=0,this===$)return 0;let w=G-J,Q=Z-Y,q=Math.min(w,Q),z=this.slice(J,G),R=$.slice(Y,Z);for(let W=0;W2147483647)Y=2147483647;else if(Y<-2147483648)Y=-2147483648;if(Y=+Y,Number.isNaN(Y))Y=J?0:U.length-1;if(Y<0)Y=U.length+Y;if(Y>=U.length)if(J)return-1;else Y=U.length-1;else if(Y<0)if(J)Y=0;else return-1;if(typeof $==="string")$=G0.from($,Z);if(G0.isBuffer($)){if($.length===0)return-1;return C$(U,$,Y,Z,J)}else if(typeof $==="number"){if($=$&255,typeof Uint8Array.prototype.indexOf==="function")if(J)return Uint8Array.prototype.indexOf.call(U,$,Y);else return Uint8Array.prototype.lastIndexOf.call(U,$,Y);return C$(U,[$],Y,Z,J)}throw new TypeError("val must be string, number or Buffer")}function C$(U,$,Y,Z,J){let G=1,w=U.length,Q=$.length;if(Z!==void 0){if(Z=String(Z).toLowerCase(),Z==="ucs2"||Z==="ucs-2"||Z==="utf16le"||Z==="utf-16le"){if(U.length<2||$.length<2)return-1;G=2,w/=2,Q/=2,Y/=2}}function q(R,W){if(G===1)return R[W];else return R.readUInt16BE(W*G)}let z;if(J){let R=-1;for(z=Y;zw)Y=w-Q;for(z=Y;z>=0;z--){let R=!0;for(let W=0;WJ)Z=J;let G=$.length;if(Z>G/2)Z=G/2;let w;for(w=0;w>>0,isFinite(Z)){if(Z=Z>>>0,J===void 0)J="utf8"}else J=Z,Z=void 0;else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");let G=this.length-Y;if(Z===void 0||Z>G)Z=G;if($.length>0&&(Z<0||Y<0)||Y>this.length)throw new RangeError("Attempt to write outside buffer bounds");if(!J)J="utf8";let w=!1;for(;;)switch(J){case"hex":return h7(this,$,Y,Z);case"utf8":case"utf-8":return u7(this,$,Y,Z);case"ascii":case"latin1":case"binary":return d7(this,$,Y,Z);case"base64":return c7(this,$,Y,Z);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return m7(this,$,Y,Z);default:if(w)throw new TypeError("Unknown encoding: "+J);J=(""+J).toLowerCase(),w=!0}};G0.prototype.toJSON=function U(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function l7(U,$,Y){if($===0&&Y===U.length)return P$(U);else return P$(U.slice($,Y))}function b$(U,$,Y){Y=Math.min(U.length,Y);let Z=[],J=$;while(J239?4:G>223?3:G>191?2:1;if(J+Q<=Y){let q,z,R,W;switch(Q){case 1:if(G<128)w=G;break;case 2:if(q=U[J+1],(q&192)===128){if(W=(G&31)<<6|q&63,W>127)w=W}break;case 3:if(q=U[J+1],z=U[J+2],(q&192)===128&&(z&192)===128){if(W=(G&15)<<12|(q&63)<<6|z&63,W>2047&&(W<55296||W>57343))w=W}break;case 4:if(q=U[J+1],z=U[J+2],R=U[J+3],(q&192)===128&&(z&192)===128&&(R&192)===128){if(W=(G&15)<<18|(q&63)<<12|(z&63)<<6|R&63,W>65535&&W<1114112)w=W}}}if(w===null)w=65533,Q=1;else if(w>65535)w-=65536,Z.push(w>>>10&1023|55296),w=56320|w&1023;Z.push(w),J+=Q}return a7(Z)}var O$=4096;function a7(U){let $=U.length;if($<=O$)return String.fromCharCode.apply(String,U);let Y="",Z=0;while(Z<$)Y+=String.fromCharCode.apply(String,U.slice(Z,Z+=O$));return Y}function p7(U,$,Y){let Z="";Y=Math.min(U.length,Y);for(let J=$;JZ)Y=Z;let J="";for(let G=$;GZ)$=Z;if(Y<0){if(Y+=Z,Y<0)Y=0}else if(Y>Z)Y=Z;if(Y<$)Y=$;let J=this.subarray($,Y);return Object.setPrototypeOf(J,G0.prototype),J};function k0(U,$,Y){if(U%1!==0||U<0)throw new RangeError("offset is not uint");if(U+$>Y)throw new RangeError("Trying to access beyond buffer length")}G0.prototype.readUintLE=G0.prototype.readUIntLE=function U($,Y,Z){if($=$>>>0,Y=Y>>>0,!Z)k0($,Y,this.length);let J=this[$],G=1,w=0;while(++w>>0,Y=Y>>>0,!Z)k0($,Y,this.length);let J=this[$+--Y],G=1;while(Y>0&&(G*=256))J+=this[$+--Y]*G;return J};G0.prototype.readUint8=G0.prototype.readUInt8=function U($,Y){if($=$>>>0,!Y)k0($,1,this.length);return this[$]};G0.prototype.readUint16LE=G0.prototype.readUInt16LE=function U($,Y){if($=$>>>0,!Y)k0($,2,this.length);return this[$]|this[$+1]<<8};G0.prototype.readUint16BE=G0.prototype.readUInt16BE=function U($,Y){if($=$>>>0,!Y)k0($,2,this.length);return this[$]<<8|this[$+1]};G0.prototype.readUint32LE=G0.prototype.readUInt32LE=function U($,Y){if($=$>>>0,!Y)k0($,4,this.length);return(this[$]|this[$+1]<<8|this[$+2]<<16)+this[$+3]*16777216};G0.prototype.readUint32BE=G0.prototype.readUInt32BE=function U($,Y){if($=$>>>0,!Y)k0($,4,this.length);return this[$]*16777216+(this[$+1]<<16|this[$+2]<<8|this[$+3])};G0.prototype.readBigUInt64LE=z1(function U($){$=$>>>0,b1($,"offset");let Y=this[$],Z=this[$+7];if(Y===void 0||Z===void 0)U2($,this.length-8);let J=Y+this[++$]*256+this[++$]*65536+this[++$]*16777216,G=this[++$]+this[++$]*256+this[++$]*65536+Z*16777216;return BigInt(J)+(BigInt(G)<>>0,b1($,"offset");let Y=this[$],Z=this[$+7];if(Y===void 0||Z===void 0)U2($,this.length-8);let J=Y*16777216+this[++$]*65536+this[++$]*256+this[++$],G=this[++$]*16777216+this[++$]*65536+this[++$]*256+Z;return(BigInt(J)<>>0,Y=Y>>>0,!Z)k0($,Y,this.length);let J=this[$],G=1,w=0;while(++w=G)J-=Math.pow(2,8*Y);return J};G0.prototype.readIntBE=function U($,Y,Z){if($=$>>>0,Y=Y>>>0,!Z)k0($,Y,this.length);let J=Y,G=1,w=this[$+--J];while(J>0&&(G*=256))w+=this[$+--J]*G;if(G*=128,w>=G)w-=Math.pow(2,8*Y);return w};G0.prototype.readInt8=function U($,Y){if($=$>>>0,!Y)k0($,1,this.length);if(!(this[$]&128))return this[$];return(255-this[$]+1)*-1};G0.prototype.readInt16LE=function U($,Y){if($=$>>>0,!Y)k0($,2,this.length);let Z=this[$]|this[$+1]<<8;return Z&32768?Z|4294901760:Z};G0.prototype.readInt16BE=function U($,Y){if($=$>>>0,!Y)k0($,2,this.length);let Z=this[$+1]|this[$]<<8;return Z&32768?Z|4294901760:Z};G0.prototype.readInt32LE=function U($,Y){if($=$>>>0,!Y)k0($,4,this.length);return this[$]|this[$+1]<<8|this[$+2]<<16|this[$+3]<<24};G0.prototype.readInt32BE=function U($,Y){if($=$>>>0,!Y)k0($,4,this.length);return this[$]<<24|this[$+1]<<16|this[$+2]<<8|this[$+3]};G0.prototype.readBigInt64LE=z1(function U($){$=$>>>0,b1($,"offset");let Y=this[$],Z=this[$+7];if(Y===void 0||Z===void 0)U2($,this.length-8);let J=this[$+4]+this[$+5]*256+this[$+6]*65536+(Z<<24);return(BigInt(J)<>>0,b1($,"offset");let Y=this[$],Z=this[$+7];if(Y===void 0||Z===void 0)U2($,this.length-8);let J=(Y<<24)+this[++$]*65536+this[++$]*256+this[++$];return(BigInt(J)<>>0,!Y)k0($,4,this.length);return T2(this,$,!0,23,4)};G0.prototype.readFloatBE=function U($,Y){if($=$>>>0,!Y)k0($,4,this.length);return T2(this,$,!1,23,4)};G0.prototype.readDoubleLE=function U($,Y){if($=$>>>0,!Y)k0($,8,this.length);return T2(this,$,!0,52,8)};G0.prototype.readDoubleBE=function U($,Y){if($=$>>>0,!Y)k0($,8,this.length);return T2(this,$,!1,52,8)};function b0(U,$,Y,Z,J,G){if(!G0.isBuffer(U))throw new TypeError('"buffer" argument must be a Buffer instance');if($>J||$U.length)throw new RangeError("Index out of range")}G0.prototype.writeUintLE=G0.prototype.writeUIntLE=function U($,Y,Z,J){if($=+$,Y=Y>>>0,Z=Z>>>0,!J){let Q=Math.pow(2,8*Z)-1;b0(this,$,Y,Z,Q,0)}let G=1,w=0;this[Y]=$&255;while(++w>>0,Z=Z>>>0,!J){let Q=Math.pow(2,8*Z)-1;b0(this,$,Y,Z,Q,0)}let G=Z-1,w=1;this[Y+G]=$&255;while(--G>=0&&(w*=256))this[Y+G]=$/w&255;return Y+Z};G0.prototype.writeUint8=G0.prototype.writeUInt8=function U($,Y,Z){if($=+$,Y=Y>>>0,!Z)b0(this,$,Y,1,255,0);return this[Y]=$&255,Y+1};G0.prototype.writeUint16LE=G0.prototype.writeUInt16LE=function U($,Y,Z){if($=+$,Y=Y>>>0,!Z)b0(this,$,Y,2,65535,0);return this[Y]=$&255,this[Y+1]=$>>>8,Y+2};G0.prototype.writeUint16BE=G0.prototype.writeUInt16BE=function U($,Y,Z){if($=+$,Y=Y>>>0,!Z)b0(this,$,Y,2,65535,0);return this[Y]=$>>>8,this[Y+1]=$&255,Y+2};G0.prototype.writeUint32LE=G0.prototype.writeUInt32LE=function U($,Y,Z){if($=+$,Y=Y>>>0,!Z)b0(this,$,Y,4,4294967295,0);return this[Y+3]=$>>>24,this[Y+2]=$>>>16,this[Y+1]=$>>>8,this[Y]=$&255,Y+4};G0.prototype.writeUint32BE=G0.prototype.writeUInt32BE=function U($,Y,Z){if($=+$,Y=Y>>>0,!Z)b0(this,$,Y,4,4294967295,0);return this[Y]=$>>>24,this[Y+1]=$>>>16,this[Y+2]=$>>>8,this[Y+3]=$&255,Y+4};function g$(U,$,Y,Z,J){d$($,Z,J,U,Y,7);let G=Number($&BigInt(4294967295));U[Y++]=G,G=G>>8,U[Y++]=G,G=G>>8,U[Y++]=G,G=G>>8,U[Y++]=G;let w=Number($>>BigInt(32)&BigInt(4294967295));return U[Y++]=w,w=w>>8,U[Y++]=w,w=w>>8,U[Y++]=w,w=w>>8,U[Y++]=w,Y}function x$(U,$,Y,Z,J){d$($,Z,J,U,Y,7);let G=Number($&BigInt(4294967295));U[Y+7]=G,G=G>>8,U[Y+6]=G,G=G>>8,U[Y+5]=G,G=G>>8,U[Y+4]=G;let w=Number($>>BigInt(32)&BigInt(4294967295));return U[Y+3]=w,w=w>>8,U[Y+2]=w,w=w>>8,U[Y+1]=w,w=w>>8,U[Y]=w,Y+8}G0.prototype.writeBigUInt64LE=z1(function U($,Y=0){return g$(this,$,Y,BigInt(0),BigInt("0xffffffffffffffff"))});G0.prototype.writeBigUInt64BE=z1(function U($,Y=0){return x$(this,$,Y,BigInt(0),BigInt("0xffffffffffffffff"))});G0.prototype.writeIntLE=function U($,Y,Z,J){if($=+$,Y=Y>>>0,!J){let q=Math.pow(2,8*Z-1);b0(this,$,Y,Z,q-1,-q)}let G=0,w=1,Q=0;this[Y]=$&255;while(++G>0)-Q&255}return Y+Z};G0.prototype.writeIntBE=function U($,Y,Z,J){if($=+$,Y=Y>>>0,!J){let q=Math.pow(2,8*Z-1);b0(this,$,Y,Z,q-1,-q)}let G=Z-1,w=1,Q=0;this[Y+G]=$&255;while(--G>=0&&(w*=256)){if($<0&&Q===0&&this[Y+G+1]!==0)Q=1;this[Y+G]=($/w>>0)-Q&255}return Y+Z};G0.prototype.writeInt8=function U($,Y,Z){if($=+$,Y=Y>>>0,!Z)b0(this,$,Y,1,127,-128);if($<0)$=255+$+1;return this[Y]=$&255,Y+1};G0.prototype.writeInt16LE=function U($,Y,Z){if($=+$,Y=Y>>>0,!Z)b0(this,$,Y,2,32767,-32768);return this[Y]=$&255,this[Y+1]=$>>>8,Y+2};G0.prototype.writeInt16BE=function U($,Y,Z){if($=+$,Y=Y>>>0,!Z)b0(this,$,Y,2,32767,-32768);return this[Y]=$>>>8,this[Y+1]=$&255,Y+2};G0.prototype.writeInt32LE=function U($,Y,Z){if($=+$,Y=Y>>>0,!Z)b0(this,$,Y,4,2147483647,-2147483648);return this[Y]=$&255,this[Y+1]=$>>>8,this[Y+2]=$>>>16,this[Y+3]=$>>>24,Y+4};G0.prototype.writeInt32BE=function U($,Y,Z){if($=+$,Y=Y>>>0,!Z)b0(this,$,Y,4,2147483647,-2147483648);if($<0)$=4294967295+$+1;return this[Y]=$>>>24,this[Y+1]=$>>>16,this[Y+2]=$>>>8,this[Y+3]=$&255,Y+4};G0.prototype.writeBigInt64LE=z1(function U($,Y=0){return g$(this,$,Y,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});G0.prototype.writeBigInt64BE=z1(function U($,Y=0){return x$(this,$,Y,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});function f$(U,$,Y,Z,J,G){if(Y+Z>U.length)throw new RangeError("Index out of range");if(Y<0)throw new RangeError("Index out of range")}function h$(U,$,Y,Z,J){if($=+$,Y=Y>>>0,!J)f$(U,$,Y,4,340282346638528860000000000000000000000,-340282346638528860000000000000000000000);return k$(U,$,Y,Z,23,4),Y+4}G0.prototype.writeFloatLE=function U($,Y,Z){return h$(this,$,Y,!0,Z)};G0.prototype.writeFloatBE=function U($,Y,Z){return h$(this,$,Y,!1,Z)};function u$(U,$,Y,Z,J){if($=+$,Y=Y>>>0,!J)f$(U,$,Y,8,179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,-179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);return k$(U,$,Y,Z,52,8),Y+8}G0.prototype.writeDoubleLE=function U($,Y,Z){return u$(this,$,Y,!0,Z)};G0.prototype.writeDoubleBE=function U($,Y,Z){return u$(this,$,Y,!1,Z)};G0.prototype.copy=function U($,Y,Z,J){if(!G0.isBuffer($))throw new TypeError("argument should be a Buffer");if(!Z)Z=0;if(!J&&J!==0)J=this.length;if(Y>=$.length)Y=$.length;if(!Y)Y=0;if(J>0&&J=this.length)throw new RangeError("Index out of range");if(J<0)throw new RangeError("sourceEnd out of bounds");if(J>this.length)J=this.length;if($.length-Y>>0,Z=Z===void 0?this.length:Z>>>0,!$)$=0;let G;if(typeof $==="number")for(G=Y;G=Z+4;Y-=3)$=`_${U.slice(Y-3,Y)}${$}`;return`${U.slice(0,Y)}${$}`}function n7(U,$,Y){if(b1($,"offset"),U[$]===void 0||U[$+Y]===void 0)U2($,U.length-(Y+1))}function d$(U,$,Y,Z,J,G){if(U>Y||U<$){let w=typeof $==="bigint"?"n":"",Q;if(G>3)if($===0||$===BigInt(0))Q=`>= 0${w} and < 2${w} ** ${(G+1)*8}${w}`;else Q=`>= -(2${w} ** ${(G+1)*8-1}${w}) and < 2 ** ${(G+1)*8-1}${w}`;else Q=`>= ${$}${w} and <= ${Y}${w}`;throw new D6("value",Q,U)}n7(Z,J,G)}function b1(U,$){if(typeof U!=="number")throw new _7($,"number",U)}function U2(U,$,Y){if(Math.floor(U)!==U)throw b1(U,Y),new D6(Y||"offset","an integer",U);if($<0)throw new v7;throw new D6(Y||"offset",`>= ${Y?1:0} and <= ${$}`,U)}var o7=/[^+/0-9A-Za-z-_]/g;function t7(U){if(U=U.split("=")[0],U=U.trim().replace(o7,""),U.length<2)return"";while(U.length%4!==0)U=U+"=";return U}function T6(U,$){$=$||1/0;let Y,Z=U.length,J=null,G=[];for(let w=0;w55295&&Y<57344){if(!J){if(Y>56319){if(($-=3)>-1)G.push(239,191,189);continue}else if(w+1===Z){if(($-=3)>-1)G.push(239,191,189);continue}J=Y;continue}if(Y<56320){if(($-=3)>-1)G.push(239,191,189);J=Y;continue}Y=(J-55296<<10|Y-56320)+65536}else if(J){if(($-=3)>-1)G.push(239,191,189)}if(J=null,Y<128){if(($-=1)<0)break;G.push(Y)}else if(Y<2048){if(($-=2)<0)break;G.push(Y>>6|192,Y&63|128)}else if(Y<65536){if(($-=3)<0)break;G.push(Y>>12|224,Y>>6&63|128,Y&63|128)}else if(Y<1114112){if(($-=4)<0)break;G.push(Y>>18|240,Y>>12&63|128,Y>>6&63|128,Y&63|128)}else throw new Error("Invalid code point")}return G}function e7(U){let $=[];for(let Y=0;Y>8,J=Y%256,G.push(J),G.push(Z)}return G}function c$(U){return E7(t7(U))}function C2(U,$,Y,Z){let J;for(J=0;J=$.length||J>=U.length)break;$[J+Y]=U[J]}return J}function p0(U,$){return U instanceof $||U!=null&&U.constructor!=null&&U.constructor.name!=null&&U.constructor.name===$.name}var $w=function(){let U=new Array(256);for(let $=0;$<16;++$){let Y=$*16;for(let Z=0;Z<16;++Z)U[Y+Z]="0123456789abcdef"[$]+"0123456789abcdef"[Z]}return U}();function z1(U){return typeof BigInt==="undefined"?Yw:U}function Yw(){throw new Error("BigInt not supported")}function k6(U){return()=>{throw new Error(U+" is not implemented for node:buffer browser polyfill")}}var OX=k6("resolveObjectURL"),EX=k6("isUtf8");var kX=k6("transcode");var RX=A7(i$());var F$={};T7(F$,{unsignedDecimalNumber:()=>W2,universalMeasureValue:()=>H2,uniqueUuid:()=>tQ,uniqueNumericIdCreator:()=>N2,uniqueId:()=>R2,uCharHexNumber:()=>D9,twipsMeasureValue:()=>T0,standardizeData:()=>mJ,signedTwipsMeasureValue:()=>e0,signedHpsMeasureValue:()=>GB,shortHexNumber:()=>DQ,sectionPageSizeDefaults:()=>h2,sectionMarginDefaults:()=>F1,positiveUniversalMeasureValue:()=>r9,pointMeasureValue:()=>CQ,percentageValue:()=>PQ,patchDocument:()=>jX,patchDetector:()=>FX,measurementOrPercentValue:()=>s9,longHexNumber:()=>JB,hpsMeasureValue:()=>AQ,hexColorValue:()=>S1,hashedId:()=>A9,encodeUtf8:()=>B2,eighthPointMeasureValue:()=>TQ,docPropertiesUniqueNumericIdGen:()=>nQ,decimalNumber:()=>S0,dateTimeValue:()=>OQ,createWrapTopAndBottom:()=>bJ,createWrapTight:()=>yJ,createWrapSquare:()=>_J,createWrapNone:()=>C9,createVerticalPosition:()=>JJ,createVerticalAlign:()=>fU,createUnderline:()=>mQ,createTransformation:()=>XU,createTableWidthElement:()=>L2,createTableRowHeight:()=>kK,createTableLook:()=>CK,createTableLayout:()=>PK,createTableFloatProperties:()=>AK,createTabStopItem:()=>PG,createTabStop:()=>TG,createStringElement:()=>u1,createSpacing:()=>AG,createSimplePos:()=>$J,createShading:()=>j2,createSectionType:()=>nK,createRunFonts:()=>g2,createParagraphStyle:()=>K2,createPageSize:()=>rK,createPageNumberType:()=>iK,createPageMargin:()=>pK,createOutlineLevel:()=>yG,createMathSuperScriptProperties:()=>iG,createMathSuperScriptElement:()=>n1,createMathSubSuperScriptProperties:()=>oG,createMathSubScriptProperties:()=>sG,createMathSubScriptElement:()=>s1,createMathPreSubSuperScriptProperties:()=>eG,createMathNAryProperties:()=>TU,createMathLimitLocation:()=>cG,createMathBase:()=>y0,createMathAccentCharacter:()=>dG,createLineNumberType:()=>aK,createIndent:()=>kQ,createHorizontalPosition:()=>QJ,createHeaderFooterReference:()=>f2,createFrameProperties:()=>xG,createEmphasisMark:()=>YU,createDotEmphasisMark:()=>XB,createDocumentGrid:()=>lK,createColumns:()=>mK,createBorderElement:()=>N0,createBodyProperties:()=>KJ,createAlignment:()=>n9,convertToXmlComponent:()=>$6,convertMillimetersToTwip:()=>EB,convertInchesToTwip:()=>d0,concreteNumUniqueNumericIdGen:()=>sQ,bookmarkUniqueNumericIdGen:()=>oQ,abstractNumUniqueNumericIdGen:()=>rQ,YearShort:()=>wG,YearLong:()=>XG,XmlComponent:()=>o,XmlAttributeComponent:()=>V0,WpsShapeRun:()=>aJ,WpgGroupRun:()=>pJ,WidthType:()=>l2,WORKAROUND4:()=>Xq,WORKAROUND3:()=>QB,WORKAROUND2:()=>fq,VerticalPositionRelativeFrom:()=>UJ,VerticalPositionAlign:()=>wB,VerticalMergeType:()=>dU,VerticalMergeRevisionType:()=>Mq,VerticalMerge:()=>a2,VerticalAnchor:()=>GJ,VerticalAlignTable:()=>HK,VerticalAlignSection:()=>jK,VerticalAlign:()=>Wq,UnderlineType:()=>ZU,ThematicBreak:()=>t9,Textbox:()=>G7,TextWrappingType:()=>G2,TextWrappingSide:()=>vJ,TextRun:()=>p1,TextEffect:()=>MB,TextDirection:()=>zq,TableRowPropertiesChange:()=>lU,TableRowProperties:()=>L6,TableRow:()=>SK,TableProperties:()=>I6,TableOfContents:()=>e5,TableLayoutType:()=>Pq,TableCellBorders:()=>hU,TableCell:()=>q6,TableBorders:()=>X6,TableAnchorType:()=>Fq,Table:()=>EK,TabStopType:()=>O9,TabStopPosition:()=>oB,Tab:()=>MU,TDirection:()=>cU,SymbolRun:()=>GU,Styles:()=>X2,StyleLevel:()=>U7,StyleForParagraph:()=>y1,StyleForCharacter:()=>D1,StringValueElement:()=>Y1,StringEnumValueElement:()=>EQ,StringContainer:()=>I1,SpaceType:()=>g0,SoftHyphen:()=>JG,SimpleMailMergeField:()=>nJ,SimpleField:()=>J6,ShadingType:()=>qB,SequentialIdentifier:()=>rJ,Separator:()=>VG,SectionType:()=>bq,SectionPropertiesChange:()=>iU,SectionProperties:()=>V6,RunPropertiesDefaults:()=>B$,RunPropertiesChange:()=>JU,RunProperties:()=>J1,Run:()=>C0,RelativeVerticalPosition:()=>Rq,RelativeHorizontalPosition:()=>Nq,PrettifyType:()=>B7,PositionalTabRelativeTo:()=>iB,PositionalTabLeader:()=>rB,PositionalTabAlignment:()=>pB,PositionalTab:()=>FG,PatchType:()=>y9,ParagraphRunProperties:()=>QU,ParagraphPropertiesDefaults:()=>w$,ParagraphPropertiesChange:()=>DU,ParagraphProperties:()=>Z1,Paragraph:()=>h0,PageTextDirectionType:()=>yq,PageTextDirection:()=>pU,PageReference:()=>gG,PageOrientation:()=>i2,PageNumberSeparator:()=>_q,PageNumberElement:()=>WG,PageNumber:()=>N1,PageBreakBefore:()=>HU,PageBreak:()=>RG,PageBorders:()=>aU,PageBorderZOrder:()=>vq,PageBorderOffsetFrom:()=>Sq,PageBorderDisplay:()=>kq,Packer:()=>YX,OverlapType:()=>Dq,OnOffElement:()=>B0,Numbering:()=>J$,NumberedItemReferenceFormat:()=>vG,NumberedItemReference:()=>_G,NumberValueElement:()=>E1,NumberProperties:()=>q2,NumberFormat:()=>BB,NoBreakHyphen:()=>QG,NextAttributeComponent:()=>n2,MonthShort:()=>KG,MonthLong:()=>qG,Media:()=>M6,MathSuperScript:()=>rG,MathSum:()=>mG,MathSubSuperScript:()=>tG,MathSubScript:()=>nG,MathSquareBrackets:()=>GK,MathRun:()=>hG,MathRoundBrackets:()=>JK,MathRadicalProperties:()=>OU,MathRadical:()=>ZK,MathPreSubSuperScript:()=>UK,MathNumerator:()=>PU,MathLimitUpper:()=>aG,MathLimitLower:()=>pG,MathLimit:()=>w6,MathIntegral:()=>lG,MathFunctionProperties:()=>kU,MathFunctionName:()=>EU,MathFunction:()=>QK,MathFraction:()=>uG,MathDenominator:()=>AU,MathDegree:()=>CU,MathCurlyBrackets:()=>KK,MathAngledBrackets:()=>wK,Math:()=>wq,LineRuleType:()=>v1,LineNumberRestartFormat:()=>Eq,LevelSuffix:()=>hq,LevelOverride:()=>Q$,LevelFormat:()=>n0,LevelForOverride:()=>F5,LevelBase:()=>W6,Level:()=>Z$,LeaderType:()=>nB,LastRenderedPageBreak:()=>jG,InternalHyperlink:()=>jU,InsertedTextRun:()=>XK,InsertedTableRow:()=>vU,InsertedTableCell:()=>yU,InitializableXmlComponent:()=>Y6,ImportedXmlComponent:()=>p9,ImportedRootElementAttributes:()=>i9,ImageRun:()=>lJ,IgnoreIfEmptyXmlComponent:()=>Q1,HyperlinkType:()=>tB,HpsMeasureElement:()=>w2,HorizontalPositionRelativeFrom:()=>eQ,HorizontalPositionAlign:()=>KB,HighlightColor:()=>WB,HeightRule:()=>Cq,HeadingLevel:()=>sB,HeaderWrapper:()=>Y$,HeaderFooterType:()=>S9,HeaderFooterReferenceType:()=>k1,Header:()=>$7,GridSpan:()=>uU,FrameWrap:()=>Kq,FrameAnchorType:()=>Gq,FootnoteReferenceRun:()=>Z7,FootnoteReferenceElement:()=>LG,FootnoteReference:()=>V$,FooterWrapper:()=>U$,Footer:()=>Y7,FootNotes:()=>$$,FootNoteReferenceRunAttributes:()=>L$,FileChild:()=>r1,File:()=>o5,ExternalHyperlink:()=>K6,Endnotes:()=>eU,EndnoteReferenceRunAttributes:()=>M$,EndnoteReferenceRun:()=>Q7,EndnoteReference:()=>VU,EndnoteIdReference:()=>W$,EmptyElement:()=>E0,EmphasisMarkType:()=>$U,EMPTY_OBJECT:()=>tZ,DropCapType:()=>Jq,Drawing:()=>D2,DocumentGridType:()=>Oq,DocumentDefaults:()=>q$,DocumentBackgroundAttributes:()=>sU,DocumentBackground:()=>nU,DocumentAttributes:()=>o1,DocumentAttributeNamespaces:()=>p2,Document:()=>o5,DeletedTextRun:()=>MK,DeletedTableRow:()=>_U,DeletedTableCell:()=>bU,DayShort:()=>GG,DayLong:()=>BG,ContinuationSeparator:()=>MG,ConcreteNumbering:()=>s2,ConcreteHyperlink:()=>_1,Comments:()=>LU,CommentReference:()=>ZG,CommentRangeStart:()=>$G,CommentRangeEnd:()=>YG,Comment:()=>IU,ColumnBreak:()=>DG,Column:()=>tK,CheckBoxUtil:()=>H$,CheckBoxSymbolElement:()=>I2,CheckBox:()=>J7,CharacterSet:()=>Uq,CellMergeAttributes:()=>gU,CellMerge:()=>xU,CarriageReturn:()=>HG,BuilderElement:()=>X0,BorderStyle:()=>Q6,Border:()=>o9,BookmarkStart:()=>FU,BookmarkEnd:()=>NU,Bookmark:()=>zU,Body:()=>rU,BaseXmlComponent:()=>m1,Attributes:()=>O0,AnnotationReference:()=>IG,AlignmentType:()=>m0,AbstractNumbering:()=>r2});var{defineProperty:Jw,defineProperties:Gw,getOwnPropertyDescriptors:Kw,getOwnPropertySymbols:m2}=Object,sZ=Object.prototype.hasOwnProperty,nZ=Object.prototype.propertyIsEnumerable,z9=(U,$,Y)=>($ in U)?Jw(U,$,{enumerable:!0,configurable:!0,writable:!0,value:Y}):U[$]=Y,W0=(U,$)=>{for(var Y in $||($={}))if(sZ.call($,Y))z9(U,Y,$[Y]);if(m2){for(var Y of m2($))if(nZ.call($,Y))z9(U,Y,$[Y])}return U},R0=(U,$)=>Gw(U,Kw($)),oZ=(U,$)=>{var Y={};for(var Z in U)if(sZ.call(U,Z)&&$.indexOf(Z)<0)Y[Z]=U[Z];if(U!=null&&m2){for(var Z of m2(U))if($.indexOf(Z)<0&&nZ.call(U,Z))Y[Z]=U[Z]}return Y},Y0=(U,$,Y)=>z9(U,typeof $!=="symbol"?$+"":$,Y),b9=(U,$,Y)=>{return new Promise((Z,J)=>{var G=(q)=>{try{Q(Y.next(q))}catch(z){J(z)}},w=(q)=>{try{Q(Y.throw(q))}catch(z){J(z)}},Q=(q)=>q.done?Z(q.value):Promise.resolve(q.value).then(G,w);Q((Y=Y.apply(U,$)).next())})};class m1{constructor(U){Y0(this,"rootKey"),this.rootKey=U}}var tZ=Object.seal({});class o extends m1{constructor(U){super(U);Y0(this,"root"),this.root=new Array}prepForXml(U){var $;U.stack.push(this);let Y=this.root.map((Z)=>{if(Z instanceof m1)return Z.prepForXml(U);return Z}).filter((Z)=>Z!==void 0);return U.stack.pop(),{[this.rootKey]:Y.length?Y.length===1&&(($=Y[0])==null?void 0:$._attr)?Y[0]:Y:tZ}}addChildElement(U){return this.root.push(U),this}}class Q1 extends o{constructor(U,$){super(U);Y0(this,"includeIfEmpty"),this.includeIfEmpty=$}prepForXml(U){let $=super.prepForXml(U);if(this.includeIfEmpty)return $;if($&&(typeof $[this.rootKey]!=="object"||Object.keys($[this.rootKey]).length))return $;return}}class V0 extends m1{constructor(U){super("_attr");Y0(this,"xmlKeys"),this.root=U}prepForXml(U){let $={};return Object.entries(this.root).forEach(([Y,Z])=>{if(Z!==void 0){let J=this.xmlKeys&&this.xmlKeys[Y]||Y;$[J]=Z}}),{_attr:$}}}class n2 extends m1{constructor(U){super("_attr");this.root=U}prepForXml(U){return{_attr:Object.values(this.root).filter(({value:Y})=>Y!==void 0).reduce((Y,{key:Z,value:J})=>R0(W0({},Y),{[Z]:J}),{})}}}class O0 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val",color:"w:color",fill:"w:fill",space:"w:space",sz:"w:sz",type:"w:type",rsidR:"w:rsidR",rsidRPr:"w:rsidRPr",rsidSect:"w:rsidSect",w:"w:w",h:"w:h",top:"w:top",right:"w:right",bottom:"w:bottom",left:"w:left",header:"w:header",footer:"w:footer",gutter:"w:gutter",linePitch:"w:linePitch",pos:"w:pos"})}}var c0=typeof globalThis!=="undefined"?globalThis:typeof window!=="undefined"?window:typeof global!=="undefined"?global:typeof self!=="undefined"?self:{};function g9(U){return U&&U.__esModule&&Object.prototype.hasOwnProperty.call(U,"default")?U.default:U}var _6={},E2={exports:{}},r$;function x9(){if(r$)return E2.exports;r$=1;var U=typeof Reflect==="object"?Reflect:null,$=U&&typeof U.apply==="function"?U.apply:function I(A,y,g){return Function.prototype.apply.call(A,y,g)},Y;if(U&&typeof U.ownKeys==="function")Y=U.ownKeys;else if(Object.getOwnPropertySymbols)Y=function I(A){return Object.getOwnPropertyNames(A).concat(Object.getOwnPropertySymbols(A))};else Y=function I(A){return Object.getOwnPropertyNames(A)};function Z(I){if(console&&console.warn)console.warn(I)}var J=Number.isNaN||function I(A){return A!==A};function G(){G.init.call(this)}E2.exports=G,E2.exports.once=X,G.EventEmitter=G,G.prototype._events=void 0,G.prototype._eventsCount=0,G.prototype._maxListeners=void 0;var w=10;function Q(I){if(typeof I!=="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof I)}Object.defineProperty(G,"defaultMaxListeners",{enumerable:!0,get:function(){return w},set:function(I){if(typeof I!=="number"||I<0||J(I))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+I+".");w=I}}),G.init=function(){if(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)this._events=Object.create(null),this._eventsCount=0;this._maxListeners=this._maxListeners||void 0},G.prototype.setMaxListeners=function I(A){if(typeof A!=="number"||A<0||J(A))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+A+".");return this._maxListeners=A,this};function q(I){if(I._maxListeners===void 0)return G.defaultMaxListeners;return I._maxListeners}G.prototype.getMaxListeners=function I(){return q(this)},G.prototype.emit=function I(A){var y=[];for(var g=1;g0)s=y[0];if(s instanceof Error)throw s;var q0=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw q0.context=s,q0}var S=k[A];if(S===void 0)return!1;if(typeof S==="function")$(S,this,y);else{var h=S.length,F=C(S,h);for(var g=0;g0&&s.length>d&&!s.warned){s.warned=!0;var q0=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(A)+" listeners added. Use emitter.setMaxListeners() to increase limit");q0.name="MaxListenersExceededWarning",q0.emitter=I,q0.type=A,q0.count=s.length,Z(q0)}}return I}G.prototype.addListener=function I(A,y){return z(this,A,y,!1)},G.prototype.on=G.prototype.addListener,G.prototype.prependListener=function I(A,y){return z(this,A,y,!0)};function R(){if(!this.fired){if(this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0)return this.listener.call(this.target);return this.listener.apply(this.target,arguments)}}function W(I,A,y){var g={fired:!1,wrapFn:void 0,target:I,type:A,listener:y},d=R.bind(g);return d.listener=y,g.wrapFn=d,d}G.prototype.once=function I(A,y){return Q(y),this.on(A,W(this,A,y)),this},G.prototype.prependOnceListener=function I(A,y){return Q(y),this.prependListener(A,W(this,A,y)),this},G.prototype.removeListener=function I(A,y){var g,d,k,s,q0;if(Q(y),d=this._events,d===void 0)return this;if(g=d[A],g===void 0)return this;if(g===y||g.listener===y){if(--this._eventsCount===0)this._events=Object.create(null);else if(delete d[A],d.removeListener)this.emit("removeListener",A,g.listener||y)}else if(typeof g!=="function"){k=-1;for(s=g.length-1;s>=0;s--)if(g[s]===y||g[s].listener===y){q0=g[s].listener,k=s;break}if(k<0)return this;if(k===0)g.shift();else H(g,k);if(g.length===1)d[A]=g[0];if(d.removeListener!==void 0)this.emit("removeListener",A,q0||y)}return this},G.prototype.off=G.prototype.removeListener,G.prototype.removeAllListeners=function I(A){var y,g,d;if(g=this._events,g===void 0)return this;if(g.removeListener===void 0){if(arguments.length===0)this._events=Object.create(null),this._eventsCount=0;else if(g[A]!==void 0)if(--this._eventsCount===0)this._events=Object.create(null);else delete g[A];return this}if(arguments.length===0){var k=Object.keys(g),s;for(d=0;d=0;d--)this.removeListener(A,y[d]);return this};function E(I,A,y){var g=I._events;if(g===void 0)return[];var d=g[A];if(d===void 0)return[];if(typeof d==="function")return y?[d.listener||d]:[d];return y?O(d):C(d,d.length)}G.prototype.listeners=function I(A){return E(this,A,!0)},G.prototype.rawListeners=function I(A){return E(this,A,!1)},G.listenerCount=function(I,A){if(typeof I.listenerCount==="function")return I.listenerCount(A);else return D.call(I,A)},G.prototype.listenerCount=D;function D(I){var A=this._events;if(A!==void 0){var y=A[I];if(typeof y==="function")return 1;else if(y!==void 0)return y.length}return 0}G.prototype.eventNames=function I(){return this._eventsCount>0?Y(this._events):[]};function C(I,A){var y=new Array(A);for(var g=0;g1)for(var Y=1;Y0)throw new Error("Invalid string. Length must be a multiple of 4");var H=D.indexOf("=");if(H===-1)H=C;var O=H===C?0:4-H%4;return[H,O]}function Q(D){var C=w(D),H=C[0],O=C[1];return(H+O)*3/4-O}function q(D,C,H){return(C+H)*3/4-H}function z(D){var C,H=w(D),O=H[0],X=H[1],j=new Y(q(D,O,X)),L=0,I=X>0?O-4:O,A;for(A=0;A>16&255,j[L++]=C>>8&255,j[L++]=C&255;if(X===2)C=$[D.charCodeAt(A)]<<2|$[D.charCodeAt(A+1)]>>4,j[L++]=C&255;if(X===1)C=$[D.charCodeAt(A)]<<10|$[D.charCodeAt(A+1)]<<4|$[D.charCodeAt(A+2)]>>2,j[L++]=C>>8&255,j[L++]=C&255;return j}function R(D){return U[D>>18&63]+U[D>>12&63]+U[D>>6&63]+U[D&63]}function W(D,C,H){var O,X=[];for(var j=C;jI?I:L+j));if(O===1)C=D[H-1],X.push(U[C>>2]+U[C<<4&63]+"==");else if(O===2)C=(D[H-2]<<8)+D[H-1],X.push(U[C>>10]+U[C>>4&63]+U[C<<2&63]+"=");return X.join("")}return $2}var S2={},t$;function Lw(){if(t$)return S2;return t$=1,S2.read=function(U,$,Y,Z,J){var G,w,Q=J*8-Z-1,q=(1<>1,R=-7,W=Y?J-1:0,E=Y?-1:1,D=U[$+W];W+=E,G=D&(1<<-R)-1,D>>=-R,R+=Q;for(;R>0;G=G*256+U[$+W],W+=E,R-=8);w=G&(1<<-R)-1,G>>=-R,R+=Z;for(;R>0;w=w*256+U[$+W],W+=E,R-=8);if(G===0)G=1-z;else if(G===q)return w?NaN:(D?-1:1)*(1/0);else w=w+Math.pow(2,Z),G=G-z;return(D?-1:1)*w*Math.pow(2,G-Z)},S2.write=function(U,$,Y,Z,J,G){var w,Q,q,z=G*8-J-1,R=(1<>1,E=J===23?Math.pow(2,-24)-Math.pow(2,-77):0,D=Z?0:G-1,C=Z?1:-1,H=$<0||$===0&&1/$<0?1:0;if($=Math.abs($),isNaN($)||$===1/0)Q=isNaN($)?1:0,w=R;else{if(w=Math.floor(Math.log($)/Math.LN2),$*(q=Math.pow(2,-w))<1)w--,q*=2;if(w+W>=1)$+=E/q;else $+=E*Math.pow(2,1-W);if($*q>=2)w++,q/=2;if(w+W>=R)Q=0,w=R;else if(w+W>=1)Q=($*q-1)*Math.pow(2,J),w=w+W;else Q=$*Math.pow(2,W-1)*Math.pow(2,J),w=0}for(;J>=8;U[Y+D]=Q&255,D+=C,Q/=256,J-=8);w=w<0;U[Y+D]=w&255,D+=C,w/=256,z-=8);U[Y+D-C]|=H*128},S2}var e$;function o2(){if(e$)return b6;return e$=1,function(U){var $=Iw(),Y=Lw(),Z=typeof Symbol==="function"&&typeof Symbol.for==="function"?Symbol.for("nodejs.util.inspect.custom"):null;U.Buffer=Q,U.SlowBuffer=j,U.INSPECT_MAX_BYTES=50;var J=2147483647;if(U.kMaxLength=J,Q.TYPED_ARRAY_SUPPORT=G(),!Q.TYPED_ARRAY_SUPPORT&&typeof console!=="undefined"&&typeof console.error==="function")console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.");function G(){try{var T=new Uint8Array(1),K={foo:function(){return 42}};return Object.setPrototypeOf(K,Uint8Array.prototype),Object.setPrototypeOf(T,K),T.foo()===42}catch(B){return!1}}Object.defineProperty(Q.prototype,"parent",{enumerable:!0,get:function(){if(!Q.isBuffer(this))return;return this.buffer}}),Object.defineProperty(Q.prototype,"offset",{enumerable:!0,get:function(){if(!Q.isBuffer(this))return;return this.byteOffset}});function w(T){if(T>J)throw new RangeError('The value "'+T+'" is invalid for option "size"');var K=new Uint8Array(T);return Object.setPrototypeOf(K,Q.prototype),K}function Q(T,K,B){if(typeof T==="number"){if(typeof K==="string")throw new TypeError('The "string" argument must be of type string. Received type number');return W(T)}return q(T,K,B)}Q.poolSize=8192;function q(T,K,B){if(typeof T==="string")return E(T,K);if(ArrayBuffer.isView(T))return C(T);if(T==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof T);if(e(T,ArrayBuffer)||T&&e(T.buffer,ArrayBuffer))return H(T,K,B);if(typeof SharedArrayBuffer!=="undefined"&&(e(T,SharedArrayBuffer)||T&&e(T.buffer,SharedArrayBuffer)))return H(T,K,B);if(typeof T==="number")throw new TypeError('The "value" argument must not be of type number. Received type number');var M=T.valueOf&&T.valueOf();if(M!=null&&M!==T)return Q.from(M,K,B);var x=O(T);if(x)return x;if(typeof Symbol!=="undefined"&&Symbol.toPrimitive!=null&&typeof T[Symbol.toPrimitive]==="function")return Q.from(T[Symbol.toPrimitive]("string"),K,B);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof T)}Q.from=function(T,K,B){return q(T,K,B)},Object.setPrototypeOf(Q.prototype,Uint8Array.prototype),Object.setPrototypeOf(Q,Uint8Array);function z(T){if(typeof T!=="number")throw new TypeError('"size" argument must be of type number');else if(T<0)throw new RangeError('The value "'+T+'" is invalid for option "size"')}function R(T,K,B){if(z(T),T<=0)return w(T);if(K!==void 0)return typeof B==="string"?w(T).fill(K,B):w(T).fill(K);return w(T)}Q.alloc=function(T,K,B){return R(T,K,B)};function W(T){return z(T),w(T<0?0:X(T)|0)}Q.allocUnsafe=function(T){return W(T)},Q.allocUnsafeSlow=function(T){return W(T)};function E(T,K){if(typeof K!=="string"||K==="")K="utf8";if(!Q.isEncoding(K))throw new TypeError("Unknown encoding: "+K);var B=L(T,K)|0,M=w(B),x=M.write(T,K);if(x!==B)M=M.slice(0,x);return M}function D(T){var K=T.length<0?0:X(T.length)|0,B=w(K);for(var M=0;M=J)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+J.toString(16)+" bytes");return T|0}function j(T){if(+T!=T)T=0;return Q.alloc(+T)}Q.isBuffer=function T(K){return K!=null&&K._isBuffer===!0&&K!==Q.prototype},Q.compare=function T(K,B){if(e(K,Uint8Array))K=Q.from(K,K.offset,K.byteLength);if(e(B,Uint8Array))B=Q.from(B,B.offset,B.byteLength);if(!Q.isBuffer(K)||!Q.isBuffer(B))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(K===B)return 0;var M=K.length,x=B.length;for(var l=0,u=Math.min(M,x);lx.length)Q.from(u).copy(x,l);else Uint8Array.prototype.set.call(x,u,l);else if(!Q.isBuffer(u))throw new TypeError('"list" argument must be an Array of Buffers');else u.copy(x,l);l+=u.length}return x};function L(T,K){if(Q.isBuffer(T))return T.length;if(ArrayBuffer.isView(T)||e(T,ArrayBuffer))return T.byteLength;if(typeof T!=="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof T);var B=T.length,M=arguments.length>2&&arguments[2]===!0;if(!M&&B===0)return 0;var x=!1;for(;;)switch(K){case"ascii":case"latin1":case"binary":return B;case"utf8":case"utf-8":return N(T).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return B*2;case"hex":return B>>>1;case"base64":return v(T).length;default:if(x)return M?-1:N(T).length;K=(""+K).toLowerCase(),x=!0}}Q.byteLength=L;function I(T,K,B){var M=!1;if(K===void 0||K<0)K=0;if(K>this.length)return"";if(B===void 0||B>this.length)B=this.length;if(B<=0)return"";if(B>>>=0,K>>>=0,B<=K)return"";if(!T)T="utf8";while(!0)switch(T){case"hex":return $0(this,K,B);case"utf8":case"utf-8":return F(this,K,B);case"ascii":return m(this,K,B);case"latin1":case"binary":return J0(this,K,B);case"base64":return h(this,K,B);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return I0(this,K,B);default:if(M)throw new TypeError("Unknown encoding: "+T);T=(T+"").toLowerCase(),M=!0}}Q.prototype._isBuffer=!0;function A(T,K,B){var M=T[K];T[K]=T[B],T[B]=M}if(Q.prototype.swap16=function T(){var K=this.length;if(K%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var B=0;BB)K+=" ... ";return""},Z)Q.prototype[Z]=Q.prototype.inspect;Q.prototype.compare=function T(K,B,M,x,l){if(e(K,Uint8Array))K=Q.from(K,K.offset,K.byteLength);if(!Q.isBuffer(K))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof K);if(B===void 0)B=0;if(M===void 0)M=K?K.length:0;if(x===void 0)x=0;if(l===void 0)l=this.length;if(B<0||M>K.length||x<0||l>this.length)throw new RangeError("out of range index");if(x>=l&&B>=M)return 0;if(x>=l)return-1;if(B>=M)return 1;if(B>>>=0,M>>>=0,x>>>=0,l>>>=0,this===K)return 0;var u=l-x,Q0=M-B,w0=Math.min(u,Q0),K0=this.slice(x,l),L0=K.slice(B,M);for(var M0=0;M02147483647)B=2147483647;else if(B<-2147483648)B=-2147483648;if(B=+B,V(B))B=x?0:T.length-1;if(B<0)B=T.length+B;if(B>=T.length)if(x)return-1;else B=T.length-1;else if(B<0)if(x)B=0;else return-1;if(typeof K==="string")K=Q.from(K,M);if(Q.isBuffer(K)){if(K.length===0)return-1;return g(T,K,B,M,x)}else if(typeof K==="number"){if(K=K&255,typeof Uint8Array.prototype.indexOf==="function")if(x)return Uint8Array.prototype.indexOf.call(T,K,B);else return Uint8Array.prototype.lastIndexOf.call(T,K,B);return g(T,[K],B,M,x)}throw new TypeError("val must be string, number or Buffer")}function g(T,K,B,M,x){var l=1,u=T.length,Q0=K.length;if(M!==void 0){if(M=String(M).toLowerCase(),M==="ucs2"||M==="ucs-2"||M==="utf16le"||M==="utf-16le"){if(T.length<2||K.length<2)return-1;l=2,u/=2,Q0/=2,B/=2}}function w0(v0,j1){if(l===1)return v0[j1];else return v0.readUInt16BE(j1*l)}var K0;if(x){var L0=-1;for(K0=B;K0u)B=u-Q0;for(K0=B;K0>=0;K0--){var M0=!0;for(var H0=0;H0x)M=x;var l=K.length;if(M>l/2)M=l/2;for(var u=0;u>>0,isFinite(M)){if(M=M>>>0,x===void 0)x="utf8"}else x=M,M=void 0;else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");var l=this.length-B;if(M===void 0||M>l)M=l;if(K.length>0&&(M<0||B<0)||B>this.length)throw new RangeError("Attempt to write outside buffer bounds");if(!x)x="utf8";var u=!1;for(;;)switch(x){case"hex":return d(this,K,B,M);case"utf8":case"utf-8":return k(this,K,B,M);case"ascii":case"latin1":case"binary":return s(this,K,B,M);case"base64":return q0(this,K,B,M);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,K,B,M);default:if(u)throw new TypeError("Unknown encoding: "+x);x=(""+x).toLowerCase(),u=!0}},Q.prototype.toJSON=function T(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function h(T,K,B){if(K===0&&B===T.length)return $.fromByteArray(T);else return $.fromByteArray(T.slice(K,B))}function F(T,K,B){B=Math.min(T.length,B);var M=[],x=K;while(x239?4:l>223?3:l>191?2:1;if(x+Q0<=B){var w0,K0,L0,M0;switch(Q0){case 1:if(l<128)u=l;break;case 2:if(w0=T[x+1],(w0&192)===128){if(M0=(l&31)<<6|w0&63,M0>127)u=M0}break;case 3:if(w0=T[x+1],K0=T[x+2],(w0&192)===128&&(K0&192)===128){if(M0=(l&15)<<12|(w0&63)<<6|K0&63,M0>2047&&(M0<55296||M0>57343))u=M0}break;case 4:if(w0=T[x+1],K0=T[x+2],L0=T[x+3],(w0&192)===128&&(K0&192)===128&&(L0&192)===128){if(M0=(l&15)<<18|(w0&63)<<12|(K0&63)<<6|L0&63,M0>65535&&M0<1114112)u=M0}}}if(u===null)u=65533,Q0=1;else if(u>65535)u-=65536,M.push(u>>>10&1023|55296),u=56320|u&1023;M.push(u),x+=Q0}return U0(M)}var a=4096;function U0(T){var K=T.length;if(K<=a)return String.fromCharCode.apply(String,T);var B="",M=0;while(MM)B=M;var x="";for(var l=K;lM)K=M;if(B<0){if(B+=M,B<0)B=0}else if(B>M)B=M;if(BB)throw new RangeError("Trying to access beyond buffer length")}Q.prototype.readUintLE=Q.prototype.readUIntLE=function T(K,B,M){if(K=K>>>0,B=B>>>0,!M)i(K,B,this.length);var x=this[K],l=1,u=0;while(++u>>0,B=B>>>0,!M)i(K,B,this.length);var x=this[K+--B],l=1;while(B>0&&(l*=256))x+=this[K+--B]*l;return x},Q.prototype.readUint8=Q.prototype.readUInt8=function T(K,B){if(K=K>>>0,!B)i(K,1,this.length);return this[K]},Q.prototype.readUint16LE=Q.prototype.readUInt16LE=function T(K,B){if(K=K>>>0,!B)i(K,2,this.length);return this[K]|this[K+1]<<8},Q.prototype.readUint16BE=Q.prototype.readUInt16BE=function T(K,B){if(K=K>>>0,!B)i(K,2,this.length);return this[K]<<8|this[K+1]},Q.prototype.readUint32LE=Q.prototype.readUInt32LE=function T(K,B){if(K=K>>>0,!B)i(K,4,this.length);return(this[K]|this[K+1]<<8|this[K+2]<<16)+this[K+3]*16777216},Q.prototype.readUint32BE=Q.prototype.readUInt32BE=function T(K,B){if(K=K>>>0,!B)i(K,4,this.length);return this[K]*16777216+(this[K+1]<<16|this[K+2]<<8|this[K+3])},Q.prototype.readIntLE=function T(K,B,M){if(K=K>>>0,B=B>>>0,!M)i(K,B,this.length);var x=this[K],l=1,u=0;while(++u=l)x-=Math.pow(2,8*B);return x},Q.prototype.readIntBE=function T(K,B,M){if(K=K>>>0,B=B>>>0,!M)i(K,B,this.length);var x=B,l=1,u=this[K+--x];while(x>0&&(l*=256))u+=this[K+--x]*l;if(l*=128,u>=l)u-=Math.pow(2,8*B);return u},Q.prototype.readInt8=function T(K,B){if(K=K>>>0,!B)i(K,1,this.length);if(!(this[K]&128))return this[K];return(255-this[K]+1)*-1},Q.prototype.readInt16LE=function T(K,B){if(K=K>>>0,!B)i(K,2,this.length);var M=this[K]|this[K+1]<<8;return M&32768?M|4294901760:M},Q.prototype.readInt16BE=function T(K,B){if(K=K>>>0,!B)i(K,2,this.length);var M=this[K+1]|this[K]<<8;return M&32768?M|4294901760:M},Q.prototype.readInt32LE=function T(K,B){if(K=K>>>0,!B)i(K,4,this.length);return this[K]|this[K+1]<<8|this[K+2]<<16|this[K+3]<<24},Q.prototype.readInt32BE=function T(K,B){if(K=K>>>0,!B)i(K,4,this.length);return this[K]<<24|this[K+1]<<16|this[K+2]<<8|this[K+3]},Q.prototype.readFloatLE=function T(K,B){if(K=K>>>0,!B)i(K,4,this.length);return Y.read(this,K,!0,23,4)},Q.prototype.readFloatBE=function T(K,B){if(K=K>>>0,!B)i(K,4,this.length);return Y.read(this,K,!1,23,4)},Q.prototype.readDoubleLE=function T(K,B){if(K=K>>>0,!B)i(K,8,this.length);return Y.read(this,K,!0,52,8)},Q.prototype.readDoubleBE=function T(K,B){if(K=K>>>0,!B)i(K,8,this.length);return Y.read(this,K,!1,52,8)};function _(T,K,B,M,x,l){if(!Q.isBuffer(T))throw new TypeError('"buffer" argument must be a Buffer instance');if(K>x||KT.length)throw new RangeError("Index out of range")}Q.prototype.writeUintLE=Q.prototype.writeUIntLE=function T(K,B,M,x){if(K=+K,B=B>>>0,M=M>>>0,!x){var l=Math.pow(2,8*M)-1;_(this,K,B,M,l,0)}var u=1,Q0=0;this[B]=K&255;while(++Q0>>0,M=M>>>0,!x){var l=Math.pow(2,8*M)-1;_(this,K,B,M,l,0)}var u=M-1,Q0=1;this[B+u]=K&255;while(--u>=0&&(Q0*=256))this[B+u]=K/Q0&255;return B+M},Q.prototype.writeUint8=Q.prototype.writeUInt8=function T(K,B,M){if(K=+K,B=B>>>0,!M)_(this,K,B,1,255,0);return this[B]=K&255,B+1},Q.prototype.writeUint16LE=Q.prototype.writeUInt16LE=function T(K,B,M){if(K=+K,B=B>>>0,!M)_(this,K,B,2,65535,0);return this[B]=K&255,this[B+1]=K>>>8,B+2},Q.prototype.writeUint16BE=Q.prototype.writeUInt16BE=function T(K,B,M){if(K=+K,B=B>>>0,!M)_(this,K,B,2,65535,0);return this[B]=K>>>8,this[B+1]=K&255,B+2},Q.prototype.writeUint32LE=Q.prototype.writeUInt32LE=function T(K,B,M){if(K=+K,B=B>>>0,!M)_(this,K,B,4,4294967295,0);return this[B+3]=K>>>24,this[B+2]=K>>>16,this[B+1]=K>>>8,this[B]=K&255,B+4},Q.prototype.writeUint32BE=Q.prototype.writeUInt32BE=function T(K,B,M){if(K=+K,B=B>>>0,!M)_(this,K,B,4,4294967295,0);return this[B]=K>>>24,this[B+1]=K>>>16,this[B+2]=K>>>8,this[B+3]=K&255,B+4},Q.prototype.writeIntLE=function T(K,B,M,x){if(K=+K,B=B>>>0,!x){var l=Math.pow(2,8*M-1);_(this,K,B,M,l-1,-l)}var u=0,Q0=1,w0=0;this[B]=K&255;while(++u>0)-w0&255}return B+M},Q.prototype.writeIntBE=function T(K,B,M,x){if(K=+K,B=B>>>0,!x){var l=Math.pow(2,8*M-1);_(this,K,B,M,l-1,-l)}var u=M-1,Q0=1,w0=0;this[B+u]=K&255;while(--u>=0&&(Q0*=256)){if(K<0&&w0===0&&this[B+u+1]!==0)w0=1;this[B+u]=(K/Q0>>0)-w0&255}return B+M},Q.prototype.writeInt8=function T(K,B,M){if(K=+K,B=B>>>0,!M)_(this,K,B,1,127,-128);if(K<0)K=255+K+1;return this[B]=K&255,B+1},Q.prototype.writeInt16LE=function T(K,B,M){if(K=+K,B=B>>>0,!M)_(this,K,B,2,32767,-32768);return this[B]=K&255,this[B+1]=K>>>8,B+2},Q.prototype.writeInt16BE=function T(K,B,M){if(K=+K,B=B>>>0,!M)_(this,K,B,2,32767,-32768);return this[B]=K>>>8,this[B+1]=K&255,B+2},Q.prototype.writeInt32LE=function T(K,B,M){if(K=+K,B=B>>>0,!M)_(this,K,B,4,2147483647,-2147483648);return this[B]=K&255,this[B+1]=K>>>8,this[B+2]=K>>>16,this[B+3]=K>>>24,B+4},Q.prototype.writeInt32BE=function T(K,B,M){if(K=+K,B=B>>>0,!M)_(this,K,B,4,2147483647,-2147483648);if(K<0)K=4294967295+K+1;return this[B]=K>>>24,this[B+1]=K>>>16,this[B+2]=K>>>8,this[B+3]=K&255,B+4};function r(T,K,B,M,x,l){if(B+M>T.length)throw new RangeError("Index out of range");if(B<0)throw new RangeError("Index out of range")}function n(T,K,B,M,x){if(K=+K,B=B>>>0,!x)r(T,K,B,4);return Y.write(T,K,B,M,23,4),B+4}Q.prototype.writeFloatLE=function T(K,B,M){return n(this,K,B,!0,M)},Q.prototype.writeFloatBE=function T(K,B,M){return n(this,K,B,!1,M)};function Z0(T,K,B,M,x){if(K=+K,B=B>>>0,!x)r(T,K,B,8);return Y.write(T,K,B,M,52,8),B+8}Q.prototype.writeDoubleLE=function T(K,B,M){return Z0(this,K,B,!0,M)},Q.prototype.writeDoubleBE=function T(K,B,M){return Z0(this,K,B,!1,M)},Q.prototype.copy=function T(K,B,M,x){if(!Q.isBuffer(K))throw new TypeError("argument should be a Buffer");if(!M)M=0;if(!x&&x!==0)x=this.length;if(B>=K.length)B=K.length;if(!B)B=0;if(x>0&&x=this.length)throw new RangeError("Index out of range");if(x<0)throw new RangeError("sourceEnd out of bounds");if(x>this.length)x=this.length;if(K.length-B>>0,M=M===void 0?this.length:M>>>0,!K)K=0;var u;if(typeof K==="number")for(u=B;u55295&&B<57344){if(!x){if(B>56319){if((K-=3)>-1)l.push(239,191,189);continue}else if(u+1===M){if((K-=3)>-1)l.push(239,191,189);continue}x=B;continue}if(B<56320){if((K-=3)>-1)l.push(239,191,189);x=B;continue}B=(x-55296<<10|B-56320)+65536}else if(x){if((K-=3)>-1)l.push(239,191,189)}if(x=null,B<128){if((K-=1)<0)break;l.push(B)}else if(B<2048){if((K-=2)<0)break;l.push(B>>6|192,B&63|128)}else if(B<65536){if((K-=3)<0)break;l.push(B>>12|224,B>>6&63|128,B&63|128)}else if(B<1114112){if((K-=4)<0)break;l.push(B>>18|240,B>>12&63|128,B>>6&63|128,B&63|128)}else throw new Error("Invalid code point")}return l}function c(T){var K=[];for(var B=0;B>8,x=B%256,l.push(x),l.push(M)}return l}function v(T){return $.toByteArray(P(T))}function b(T,K,B,M){for(var x=0;x=K.length||x>=T.length)break;K[x+B]=T[x]}return x}function e(T,K){return T instanceof K||T!=null&&T.constructor!=null&&T.constructor.name!=null&&T.constructor.name===K.name}function V(T){return T!==T}var t=function(){var T="0123456789abcdef",K=new Array(256);for(var B=0;B<16;++B){var M=B*16;for(var x=0;x<16;++x)K[M+x]=T[B]+T[x]}return K}()}(b6),b6}var g6={},x6={},f6,UY;function QQ(){if(UY)return f6;return UY=1,f6=function U(){if(typeof Symbol!=="function"||typeof Object.getOwnPropertySymbols!=="function")return!1;if(typeof Symbol.iterator==="symbol")return!0;var $={},Y=Symbol("test"),Z=Object(Y);if(typeof Y==="string")return!1;if(Object.prototype.toString.call(Y)!=="[object Symbol]")return!1;if(Object.prototype.toString.call(Z)!=="[object Symbol]")return!1;var J=42;$[Y]=J;for(var G in $)return!1;if(typeof Object.keys==="function"&&Object.keys($).length!==0)return!1;if(typeof Object.getOwnPropertyNames==="function"&&Object.getOwnPropertyNames($).length!==0)return!1;var w=Object.getOwnPropertySymbols($);if(w.length!==1||w[0]!==Y)return!1;if(!Object.prototype.propertyIsEnumerable.call($,Y))return!1;if(typeof Object.getOwnPropertyDescriptor==="function"){var Q=Object.getOwnPropertyDescriptor($,Y);if(Q.value!==J||Q.enumerable!==!0)return!1}return!0},f6}var h6,$Y;function f9(){if($Y)return h6;$Y=1;var U=QQ();return h6=function $(){return U()&&!!Symbol.toStringTag},h6}var u6,YY;function JQ(){if(YY)return u6;return YY=1,u6=Object,u6}var d6,ZY;function Vw(){if(ZY)return d6;return ZY=1,d6=Error,d6}var c6,QY;function Mw(){if(QY)return c6;return QY=1,c6=EvalError,c6}var m6,JY;function Ww(){if(JY)return m6;return JY=1,m6=RangeError,m6}var l6,GY;function Hw(){if(GY)return l6;return GY=1,l6=ReferenceError,l6}var a6,KY;function GQ(){if(KY)return a6;return KY=1,a6=SyntaxError,a6}var p6,wY;function t2(){if(wY)return p6;return wY=1,p6=TypeError,p6}var i6,BY;function jw(){if(BY)return i6;return BY=1,i6=URIError,i6}var r6,qY;function zw(){if(qY)return r6;return qY=1,r6=Math.abs,r6}var s6,XY;function Fw(){if(XY)return s6;return XY=1,s6=Math.floor,s6}var n6,IY;function Nw(){if(IY)return n6;return IY=1,n6=Math.max,n6}var o6,LY;function Rw(){if(LY)return o6;return LY=1,o6=Math.min,o6}var t6,VY;function Dw(){if(VY)return t6;return VY=1,t6=Math.pow,t6}var e6,MY;function Aw(){if(MY)return e6;return MY=1,e6=Math.round,e6}var U8,WY;function Pw(){if(WY)return U8;return WY=1,U8=Number.isNaN||function U($){return $!==$},U8}var $8,HY;function Tw(){if(HY)return $8;HY=1;var U=Pw();return $8=function $(Y){if(U(Y)||Y===0)return Y;return Y<0?-1:1},$8}var Y8,jY;function Cw(){if(jY)return Y8;return jY=1,Y8=Object.getOwnPropertyDescriptor,Y8}var Z8,zY;function V2(){if(zY)return Z8;zY=1;var U=Cw();if(U)try{U([],"length")}catch($){U=null}return Z8=U,Z8}var Q8,FY;function e2(){if(FY)return Q8;FY=1;var U=Object.defineProperty||!1;if(U)try{U({},"a",{value:1})}catch($){U=!1}return Q8=U,Q8}var J8,NY;function Ow(){if(NY)return J8;NY=1;var U=typeof Symbol!=="undefined"&&Symbol,$=QQ();return J8=function Y(){if(typeof U!=="function")return!1;if(typeof Symbol!=="function")return!1;if(typeof U("foo")!=="symbol")return!1;if(typeof Symbol("bar")!=="symbol")return!1;return $()},J8}var G8,RY;function KQ(){if(RY)return G8;return RY=1,G8=typeof Reflect!=="undefined"&&Reflect.getPrototypeOf||null,G8}var K8,DY;function wQ(){if(DY)return K8;DY=1;var U=JQ();return K8=U.getPrototypeOf||null,K8}var w8,AY;function Ew(){if(AY)return w8;AY=1;var U="Function.prototype.bind called on incompatible ",$=Object.prototype.toString,Y=Math.max,Z="[object Function]",J=function Q(q,z){var R=[];for(var W=0;W1&&typeof v!=="boolean")throw new Q('"allowMissing" argument must be a boolean');if(n(/^%?[^%]*%?$/,f)===null)throw new w("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var b=P(f),e=b.length>0?b[0]:"",V=N("%"+e+"%",v),t=V.name,T=V.value,K=!1,B=V.alias;if(B)e=B[0],i(b,I0([0,1],B));for(var M=1,x=!0;M=b.length){var w0=j(T,l);if(x=!!w0,x&&"get"in w0&&!("originalValue"in w0.get))T=w0.get;else T=T[l]}else x=$0(T,l),T=T[l];if(x&&!K)F[t]=T}}return T},j8}var z8,bY;function IQ(){if(bY)return z8;bY=1;var U=XQ(),$=d9(),Y=$([U("%String.prototype.indexOf%")]);return z8=function Z(J,G){var w=U(J,!!G);if(typeof w==="function"&&Y(J,".prototype.")>-1)return $([w]);return w},z8}var F8,gY;function _w(){if(gY)return F8;gY=1;var U=f9()(),$=IQ(),Y=$("Object.prototype.toString"),Z=function w(Q){if(U&&Q&&typeof Q==="object"&&Symbol.toStringTag in Q)return!1;return Y(Q)==="[object Arguments]"},J=function w(Q){if(Z(Q))return!0;return Q!==null&&typeof Q==="object"&&"length"in Q&&typeof Q.length==="number"&&Q.length>=0&&Y(Q)!=="[object Array]"&&"callee"in Q&&Y(Q.callee)==="[object Function]"},G=function(){return Z(arguments)}();return Z.isLegacyArguments=J,F8=G?Z:J,F8}var N8,xY;function yw(){if(xY)return N8;xY=1;var U=Object.prototype.toString,$=Function.prototype.toString,Y=/^\s*(?:function)?\*/,Z=f9()(),J=Object.getPrototypeOf,G=function(){if(!Z)return!1;try{return Function("return function*() {}")()}catch(Q){}},w;return N8=function Q(q){if(typeof q!=="function")return!1;if(Y.test($.call(q)))return!0;if(!Z){var z=U.call(q);return z==="[object GeneratorFunction]"}if(!J)return!1;if(typeof w==="undefined"){var R=G();w=R?J(R):!1}return J(q)===w},N8}var R8,fY;function bw(){if(fY)return R8;fY=1;var U=Function.prototype.toString,$=typeof Reflect==="object"&&Reflect!==null&&Reflect.apply,Y,Z;if(typeof $==="function"&&typeof Object.defineProperty==="function")try{Y=Object.defineProperty({},"length",{get:function(){throw Z}}),Z={},$(function(){throw 42},null,Y)}catch(j){if(j!==Z)$=null}else $=null;var J=/^\s*class\b/,G=function j(L){try{var I=U.call(L);return J.test(I)}catch(A){return!1}},w=function j(L){try{if(G(L))return!1;return U.call(L),!0}catch(I){return!1}},Q=Object.prototype.toString,q="[object Object]",z="[object Function]",R="[object GeneratorFunction]",W="[object HTMLAllCollection]",E="[object HTML document.all class]",D="[object HTMLCollection]",C=typeof Symbol==="function"&&!!Symbol.toStringTag,H=!(0 in[,]),O=function j(){return!1};if(typeof document==="object"){var X=document.all;if(Q.call(X)===Q.call(document.all))O=function j(L){if((H||!L)&&(typeof L==="undefined"||typeof L==="object"))try{var I=Q.call(L);return(I===W||I===E||I===D||I===q)&&L("")==null}catch(A){}return!1}}return R8=$?function j(L){if(O(L))return!0;if(!L)return!1;if(typeof L!=="function"&&typeof L!=="object")return!1;try{$(L,null,Y)}catch(I){if(I!==Z)return!1}return!G(L)&&w(L)}:function j(L){if(O(L))return!0;if(!L)return!1;if(typeof L!=="function"&&typeof L!=="object")return!1;if(C)return w(L);if(G(L))return!1;var I=Q.call(L);if(I!==z&&I!==R&&!/^\[object HTML/.test(I))return!1;return w(L)},R8}var D8,hY;function gw(){if(hY)return D8;hY=1;var U=bw(),$=Object.prototype.toString,Y=Object.prototype.hasOwnProperty,Z=function Q(q,z,R){for(var W=0,E=q.length;W=3)W=R;if(w(q))Z(q,z,W);else if(typeof q==="string")J(q,z,W);else G(q,z,W)},D8}var A8,uY;function xw(){if(uY)return A8;return uY=1,A8=["Float32Array","Float64Array","Int8Array","Int16Array","Int32Array","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array"],A8}var P8,dY;function fw(){if(dY)return P8;dY=1;var U=xw(),$=typeof globalThis==="undefined"?c0:globalThis;return P8=function Y(){var Z=[];for(var J=0;J3&&typeof arguments[3]!=="boolean"&&arguments[3]!==null)throw new Y("`nonEnumerable`, if provided, must be a boolean or null");if(arguments.length>4&&typeof arguments[4]!=="boolean"&&arguments[4]!==null)throw new Y("`nonWritable`, if provided, must be a boolean or null");if(arguments.length>5&&typeof arguments[5]!=="boolean"&&arguments[5]!==null)throw new Y("`nonConfigurable`, if provided, must be a boolean or null");if(arguments.length>6&&typeof arguments[6]!=="boolean")throw new Y("`loose`, if provided, must be a boolean");var q=arguments.length>3?arguments[3]:null,z=arguments.length>4?arguments[4]:null,R=arguments.length>5?arguments[5]:null,W=arguments.length>6?arguments[6]:!1,E=!!Z&&Z(G,w);if(U)U(G,w,{configurable:R===null&&E?E.configurable:!R,enumerable:q===null&&E?E.enumerable:!q,value:Q,writable:z===null&&E?E.writable:!z});else if(W||!q&&!z&&!R)G[w]=Q;else throw new $("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.")},C8}var O8,mY;function uw(){if(mY)return O8;mY=1;var U=e2(),$=function Y(){return!!U};return $.hasArrayLengthDefineBug=function Y(){if(!U)return null;try{return U([],"length",{value:1}).length!==1}catch(Z){return!0}},O8=$,O8}var E8,lY;function dw(){if(lY)return E8;lY=1;var U=XQ(),$=hw(),Y=uw()(),Z=V2(),J=t2(),G=U("%Math.floor%");return E8=function w(Q,q){if(typeof Q!=="function")throw new J("`fn` is not a function");if(typeof q!=="number"||q<0||q>4294967295||G(q)!==q)throw new J("`length` must be a positive 32-bit integer");var z=arguments.length>2&&!!arguments[2],R=!0,W=!0;if("length"in Q&&Z){var E=Z(Q,"length");if(E&&!E.configurable)R=!1;if(E&&!E.writable)W=!1}if(R||W||!z)if(Y)$(Q,"length",q,!0,!0);else $(Q,"length",q);return Q},E8}var k8,aY;function cw(){if(aY)return k8;aY=1;var U=M2(),$=u9(),Y=BQ();return k8=function Z(){return Y(U,$,arguments)},k8}var pY;function mw(){if(pY)return T8.exports;return pY=1,function(U){var $=dw(),Y=e2(),Z=d9(),J=cw();if(U.exports=function G(w){var Q=Z(arguments),q=w.length-(arguments.length-1);return $(Q,1+(q>0?q:0),!0)},Y)Y(U.exports,"apply",{value:J});else U.exports.apply=J}(T8),T8.exports}var S8,iY;function LQ(){if(iY)return S8;iY=1;var U=gw(),$=fw(),Y=mw(),Z=IQ(),J=V2(),G=qQ(),w=Z("Object.prototype.toString"),Q=f9()(),q=typeof globalThis==="undefined"?c0:globalThis,z=$(),R=Z("String.prototype.slice"),W=Z("Array.prototype.indexOf",!0)||function H(O,X){for(var j=0;j-1)return X;if(X!=="Object")return!1;return C(O)}if(!J)return null;return D(O)},S8}var v8,rY;function lw(){if(rY)return v8;rY=1;var U=LQ();return v8=function $(Y){return!!U(Y)},v8}var sY;function aw(){if(sY)return x6;return sY=1,function(U){var $=_w(),Y=yw(),Z=LQ(),J=lw();function G(M){return M.call.bind(M)}var w=typeof BigInt!=="undefined",Q=typeof Symbol!=="undefined",q=G(Object.prototype.toString),z=G(Number.prototype.valueOf),R=G(String.prototype.valueOf),W=G(Boolean.prototype.valueOf);if(w)var E=G(BigInt.prototype.valueOf);if(Q)var D=G(Symbol.prototype.valueOf);function C(M,x){if(typeof M!=="object")return!1;try{return x(M),!0}catch(l){return!1}}U.isArgumentsObject=$,U.isGeneratorFunction=Y,U.isTypedArray=J;function H(M){return typeof Promise!=="undefined"&&M instanceof Promise||M!==null&&typeof M==="object"&&typeof M.then==="function"&&typeof M.catch==="function"}U.isPromise=H;function O(M){if(typeof ArrayBuffer!=="undefined"&&ArrayBuffer.isView)return ArrayBuffer.isView(M);return J(M)||r(M)}U.isArrayBufferView=O;function X(M){return Z(M)==="Uint8Array"}U.isUint8Array=X;function j(M){return Z(M)==="Uint8ClampedArray"}U.isUint8ClampedArray=j;function L(M){return Z(M)==="Uint16Array"}U.isUint16Array=L;function I(M){return Z(M)==="Uint32Array"}U.isUint32Array=I;function A(M){return Z(M)==="Int8Array"}U.isInt8Array=A;function y(M){return Z(M)==="Int16Array"}U.isInt16Array=y;function g(M){return Z(M)==="Int32Array"}U.isInt32Array=g;function d(M){return Z(M)==="Float32Array"}U.isFloat32Array=d;function k(M){return Z(M)==="Float64Array"}U.isFloat64Array=k;function s(M){return Z(M)==="BigInt64Array"}U.isBigInt64Array=s;function q0(M){return Z(M)==="BigUint64Array"}U.isBigUint64Array=q0;function S(M){return q(M)==="[object Map]"}S.working=typeof Map!=="undefined"&&S(new Map);function h(M){if(typeof Map==="undefined")return!1;return S.working?S(M):M instanceof Map}U.isMap=h;function F(M){return q(M)==="[object Set]"}F.working=typeof Set!=="undefined"&&F(new Set);function a(M){if(typeof Set==="undefined")return!1;return F.working?F(M):M instanceof Set}U.isSet=a;function U0(M){return q(M)==="[object WeakMap]"}U0.working=typeof WeakMap!=="undefined"&&U0(new WeakMap);function m(M){if(typeof WeakMap==="undefined")return!1;return U0.working?U0(M):M instanceof WeakMap}U.isWeakMap=m;function J0(M){return q(M)==="[object WeakSet]"}J0.working=typeof WeakSet!=="undefined"&&J0(new WeakSet);function $0(M){return J0(M)}U.isWeakSet=$0;function I0(M){return q(M)==="[object ArrayBuffer]"}I0.working=typeof ArrayBuffer!=="undefined"&&I0(new ArrayBuffer);function i(M){if(typeof ArrayBuffer==="undefined")return!1;return I0.working?I0(M):M instanceof ArrayBuffer}U.isArrayBuffer=i;function _(M){return q(M)==="[object DataView]"}_.working=typeof ArrayBuffer!=="undefined"&&typeof DataView!=="undefined"&&_(new DataView(new ArrayBuffer(1),0,1));function r(M){if(typeof DataView==="undefined")return!1;return _.working?_(M):M instanceof DataView}U.isDataView=r;var n=typeof SharedArrayBuffer!=="undefined"?SharedArrayBuffer:void 0;function Z0(M){return q(M)==="[object SharedArrayBuffer]"}function p(M){if(typeof n==="undefined")return!1;if(typeof Z0.working==="undefined")Z0.working=Z0(new n);return Z0.working?Z0(M):M instanceof n}U.isSharedArrayBuffer=p;function P(M){return q(M)==="[object AsyncFunction]"}U.isAsyncFunction=P;function N(M){return q(M)==="[object Map Iterator]"}U.isMapIterator=N;function c(M){return q(M)==="[object Set Iterator]"}U.isSetIterator=c;function f(M){return q(M)==="[object Generator]"}U.isGeneratorObject=f;function v(M){return q(M)==="[object WebAssembly.Module]"}U.isWebAssemblyCompiledModule=v;function b(M){return C(M,z)}U.isNumberObject=b;function e(M){return C(M,R)}U.isStringObject=e;function V(M){return C(M,W)}U.isBooleanObject=V;function t(M){return w&&C(M,E)}U.isBigIntObject=t;function T(M){return Q&&C(M,D)}U.isSymbolObject=T;function K(M){return b(M)||e(M)||V(M)||t(M)||T(M)}U.isBoxedPrimitive=K;function B(M){return typeof Uint8Array!=="undefined"&&(i(M)||p(M))}U.isAnyArrayBuffer=B,["isProxy","isExternal","isModuleNamespaceObject"].forEach(function(M){Object.defineProperty(U,M,{enumerable:!1,value:function(){throw new Error(M+" is not supported in userland")}})})}(x6),x6}var _8,nY;function pw(){if(nY)return _8;return nY=1,_8=function U($){return $&&typeof $==="object"&&typeof $.copy==="function"&&typeof $.fill==="function"&&typeof $.readUInt8==="function"},_8}var oY;function VQ(){if(oY)return g6;return oY=1,function(U){var $=Object.getOwnPropertyDescriptors||function _(r){var n=Object.keys(r),Z0={};for(var p=0;p=p)return c;switch(c){case"%s":return String(Z0[n++]);case"%d":return Number(Z0[n++]);case"%j":try{return JSON.stringify(Z0[n++])}catch(f){return"[Circular]"}default:return c}});for(var N=Z0[n];n=3)n.depth=arguments[2];if(arguments.length>=4)n.colors=arguments[3];if(X(r))n.showHidden=r;else if(r)U._extend(n,r);if(g(n.showHidden))n.showHidden=!1;if(g(n.depth))n.depth=2;if(g(n.colors))n.colors=!1;if(g(n.customInspect))n.customInspect=!0;if(n.colors)n.stylize=Q;return R(n,_,n.depth)}U.inspect=w,w.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},w.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"};function Q(_,r){var n=w.styles[r];if(n)return"\x1B["+w.colors[n][0]+"m"+_+"\x1B["+w.colors[n][1]+"m";else return _}function q(_,r){return _}function z(_){var r={};return _.forEach(function(n,Z0){r[n]=!0}),r}function R(_,r,n){if(_.customInspect&&r&&S(r.inspect)&&r.inspect!==U.inspect&&!(r.constructor&&r.constructor.prototype===r)){var Z0=r.inspect(n,_);if(!A(Z0))Z0=R(_,Z0,n);return Z0}var p=W(_,r);if(p)return p;var P=Object.keys(r),N=z(P);if(_.showHidden)P=Object.getOwnPropertyNames(r);if(q0(r)&&(P.indexOf("message")>=0||P.indexOf("description")>=0))return E(r);if(P.length===0){if(S(r)){var c=r.name?": "+r.name:"";return _.stylize("[Function"+c+"]","special")}if(d(r))return _.stylize(RegExp.prototype.toString.call(r),"regexp");if(s(r))return _.stylize(Date.prototype.toString.call(r),"date");if(q0(r))return E(r)}var f="",v=!1,b=["{","}"];if(O(r))v=!0,b=["[","]"];if(S(r)){var e=r.name?": "+r.name:"";f=" [Function"+e+"]"}if(d(r))f=" "+RegExp.prototype.toString.call(r);if(s(r))f=" "+Date.prototype.toUTCString.call(r);if(q0(r))f=" "+E(r);if(P.length===0&&(!v||r.length==0))return b[0]+f+b[1];if(n<0)if(d(r))return _.stylize(RegExp.prototype.toString.call(r),"regexp");else return _.stylize("[Object]","special");_.seen.push(r);var V;if(v)V=D(_,r,n,N,P);else V=P.map(function(t){return C(_,r,n,N,t,v)});return _.seen.pop(),H(V,f,b)}function W(_,r){if(g(r))return _.stylize("undefined","undefined");if(A(r)){var n="'"+JSON.stringify(r).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return _.stylize(n,"string")}if(I(r))return _.stylize(""+r,"number");if(X(r))return _.stylize(""+r,"boolean");if(j(r))return _.stylize("null","null")}function E(_){return"["+Error.prototype.toString.call(_)+"]"}function D(_,r,n,Z0,p){var P=[];for(var N=0,c=r.length;N{var F7=Object.create;var{getPrototypeOf:N7,defineProperty:F8,getOwnPropertyNames:R7}=Object;var D7=Object.prototype.hasOwnProperty;function A7($){return this[$]}var P7,T7,C7=($,U,Y)=>{var Z=$!=null&&typeof $==="object";if(Z){var J=U?P7??=new WeakMap:T7??=new WeakMap,G=J.get($);if(G)return G}Y=$!=null?F7(N7($)):{};let X=U||!$||!$.__esModule?F8(Y,"default",{value:$,enumerable:!0}):Y;for(let Q of R7($))if(!D7.call(X,Q))F8(X,Q,{get:A7.bind($,Q),enumerable:!0});if(Z)J.set($,X);return X};var O7=($,U)=>()=>(U||$((U={exports:{}}).exports,U),U.exports);var k7=($)=>$;function E7($,U){this[$]=k7.bind(null,U)}var S7=($,U)=>{for(var Y in U)F8($,Y,{get:U[Y],enumerable:!0,configurable:!0,set:E7.bind(U,Y)})};var iU=O7((hB,pU)=>{var A0=pU.exports={},i0,r0;function S8(){throw Error("setTimeout has not been defined")}function v8(){throw Error("clearTimeout has not been defined")}(function(){try{if(typeof setTimeout==="function")i0=setTimeout;else i0=S8}catch($){i0=S8}try{if(typeof clearTimeout==="function")r0=clearTimeout;else r0=v8}catch($){r0=v8}})();function mU($){if(i0===setTimeout)return setTimeout($,0);if((i0===S8||!i0)&&setTimeout)return i0=setTimeout,setTimeout($,0);try{return i0($,0)}catch(U){try{return i0.call(null,$,0)}catch(Y){return i0.call(this,$,0)}}}function Xq($){if(r0===clearTimeout)return clearTimeout($);if((r0===v8||!r0)&&clearTimeout)return r0=clearTimeout,clearTimeout($);try{return r0($)}catch(U){try{return r0.call(null,$)}catch(Y){return r0.call(this,$)}}}var X2=[],g2=!1,T2,O1=-1;function Vq(){if(!g2||!T2)return;if(g2=!1,T2.length)X2=T2.concat(X2);else O1=-1;if(X2.length)lU()}function lU(){if(g2)return;var $=mU(Vq);g2=!0;var U=X2.length;while(U){T2=X2,X2=[];while(++O11)for(var Y=1;Y"u")DU.global=globalThis;var a0=[],u0=[],N8="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(A2=0,AU=N8.length;A20)throw Error("Invalid string. Length must be a multiple of 4");var Y=$.indexOf("=");if(Y===-1)Y=U;var Z=Y===U?0:4-Y%4;return[Y,Z]}function _7($,U){return($+U)*3/4-U}function y7($){var U,Y=v7($),Z=Y[0],J=Y[1],G=new Uint8Array(_7(Z,J)),X=0,Q=J>0?Z-4:Z,B;for(B=0;B>16&255,G[X++]=U>>8&255,G[X++]=U&255;if(J===2)U=u0[$.charCodeAt(B)]<<2|u0[$.charCodeAt(B+1)]>>4,G[X++]=U&255;if(J===1)U=u0[$.charCodeAt(B)]<<10|u0[$.charCodeAt(B+1)]<<4|u0[$.charCodeAt(B+2)]>>2,G[X++]=U>>8&255,G[X++]=U&255;return G}function b7($){return a0[$>>18&63]+a0[$>>12&63]+a0[$>>6&63]+a0[$&63]}function g7($,U,Y){var Z,J=[];for(var G=U;GQ?Q:X+G));if(Z===1)U=$[Y-1],J.push(a0[U>>2]+a0[U<<4&63]+"==");else if(Z===2)U=($[Y-2]<<8)+$[Y-1],J.push(a0[U>>10]+a0[U>>4&63]+a0[U<<2&63]+"=");return J.join("")}function T1($,U,Y,Z,J){var G,X,Q=J*8-Z-1,B=(1<>1,z=-7,W=Y?J-1:0,k=Y?-1:1,D=$[U+W];W+=k,G=D&(1<<-z)-1,D>>=-z,z+=Q;for(;z>0;G=G*256+$[U+W],W+=k,z-=8);X=G&(1<<-z)-1,G>>=-z,z+=Z;for(;z>0;X=X*256+$[U+W],W+=k,z-=8);if(G===0)G=1-F;else if(G===B)return X?NaN:(D?-1:1)*(1/0);else X=X+Math.pow(2,Z),G=G-F;return(D?-1:1)*X*Math.pow(2,G-Z)}function EU($,U,Y,Z,J,G){var X,Q,B,F=G*8-J-1,z=(1<>1,k=J===23?Math.pow(2,-24)-Math.pow(2,-77):0,D=Z?0:G-1,C=Z?1:-1,H=U<0||U===0&&1/U<0?1:0;if(U=Math.abs(U),isNaN(U)||U===1/0)Q=isNaN(U)?1:0,X=z;else{if(X=Math.floor(Math.log(U)/Math.LN2),U*(B=Math.pow(2,-X))<1)X--,B*=2;if(X+W>=1)U+=k/B;else U+=k*Math.pow(2,1-W);if(U*B>=2)X++,B/=2;if(X+W>=z)Q=0,X=z;else if(X+W>=1)Q=(U*B-1)*Math.pow(2,J),X=X+W;else Q=U*Math.pow(2,W-1)*Math.pow(2,J),X=0}for(;J>=8;$[Y+D]=Q&255,D+=C,Q/=256,J-=8);X=X<0;$[Y+D]=X&255,D+=C,X/=256,F-=8);$[Y+D-C]|=H*128}var TU=typeof Symbol==="function"&&typeof Symbol.for==="function"?Symbol.for("nodejs.util.inspect.custom"):null,x7=50,R8=2147483647;var{btoa:EB,atob:SB,File:vB,Blob:_B}=globalThis;function q2($){if($>R8)throw RangeError('The value "'+$+'" is invalid for option "size"');let U=new Uint8Array($);return Object.setPrototypeOf(U,G0.prototype),U}function C8($,U,Y){return class extends Y{constructor(){super();Object.defineProperty(this,"message",{value:U.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${$}]`,this.stack,delete this.name}get code(){return $}set code(Z){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:Z,writable:!0})}toString(){return`${this.name} [${$}]: ${this.message}`}}}var f7=C8("ERR_BUFFER_OUT_OF_BOUNDS",function($){if($)return`${$} is outside of buffer bounds`;return"Attempt to access memory outside buffer bounds"},RangeError),h7=C8("ERR_INVALID_ARG_TYPE",function($,U){return`The "${$}" argument must be of type number. Received type ${typeof U}`},TypeError),D8=C8("ERR_OUT_OF_RANGE",function($,U,Y){let Z=`The value of "${$}" is out of range.`,J=Y;if(Number.isInteger(Y)&&Math.abs(Y)>4294967296)J=kU(String(Y));else if(typeof Y==="bigint"){if(J=String(Y),Y>BigInt(2)**BigInt(32)||Y<-(BigInt(2)**BigInt(32)))J=kU(J);J+="n"}return Z+=` It must be ${U}. Received ${J}`,Z},RangeError);function G0($,U,Y){if(typeof $==="number"){if(typeof U==="string")throw TypeError('The "string" argument must be of type string. Received type number');return O8($)}return SU($,U,Y)}Object.defineProperty(G0.prototype,"parent",{enumerable:!0,get:function(){if(!G0.isBuffer(this))return;return this.buffer}});Object.defineProperty(G0.prototype,"offset",{enumerable:!0,get:function(){if(!G0.isBuffer(this))return;return this.byteOffset}});G0.poolSize=8192;function SU($,U,Y){if(typeof $==="string")return d7($,U);if(ArrayBuffer.isView($))return c7($);if($==null)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof $);if(p0($,ArrayBuffer)||$&&p0($.buffer,ArrayBuffer))return P8($,U,Y);if(typeof SharedArrayBuffer<"u"&&(p0($,SharedArrayBuffer)||$&&p0($.buffer,SharedArrayBuffer)))return P8($,U,Y);if(typeof $==="number")throw TypeError('The "value" argument must not be of type number. Received type number');let Z=$.valueOf&&$.valueOf();if(Z!=null&&Z!==$)return G0.from(Z,U,Y);let J=m7($);if(J)return J;if(typeof Symbol<"u"&&Symbol.toPrimitive!=null&&typeof $[Symbol.toPrimitive]==="function")return G0.from($[Symbol.toPrimitive]("string"),U,Y);throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof $)}G0.from=function($,U,Y){return SU($,U,Y)};Object.setPrototypeOf(G0.prototype,Uint8Array.prototype);Object.setPrototypeOf(G0,Uint8Array);function vU($){if(typeof $!=="number")throw TypeError('"size" argument must be of type number');else if($<0)throw RangeError('The value "'+$+'" is invalid for option "size"')}function u7($,U,Y){if(vU($),$<=0)return q2($);if(U!==void 0)return typeof Y==="string"?q2($).fill(U,Y):q2($).fill(U);return q2($)}G0.alloc=function($,U,Y){return u7($,U,Y)};function O8($){return vU($),q2($<0?0:k8($)|0)}G0.allocUnsafe=function($){return O8($)};G0.allocUnsafeSlow=function($){return O8($)};function d7($,U){if(typeof U!=="string"||U==="")U="utf8";if(!G0.isEncoding(U))throw TypeError("Unknown encoding: "+U);let Y=_U($,U)|0,Z=q2(Y),J=Z.write($,U);if(J!==Y)Z=Z.slice(0,J);return Z}function A8($){let U=$.length<0?0:k8($.length)|0,Y=q2(U);for(let Z=0;Z=R8)throw RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+R8.toString(16)+" bytes");return $|0}G0.isBuffer=function($){return $!=null&&$._isBuffer===!0&&$!==G0.prototype};G0.compare=function($,U){if(p0($,Uint8Array))$=G0.from($,$.offset,$.byteLength);if(p0(U,Uint8Array))U=G0.from(U,U.offset,U.byteLength);if(!G0.isBuffer($)||!G0.isBuffer(U))throw TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if($===U)return 0;let Y=$.length,Z=U.length;for(let J=0,G=Math.min(Y,Z);JZ.length){if(!G0.isBuffer(G))G=G0.from(G);G.copy(Z,J)}else Uint8Array.prototype.set.call(Z,G,J);else if(!G0.isBuffer(G))throw TypeError('"list" argument must be an Array of Buffers');else G.copy(Z,J);J+=G.length}return Z};function _U($,U){if(G0.isBuffer($))return $.length;if(ArrayBuffer.isView($)||p0($,ArrayBuffer))return $.byteLength;if(typeof $!=="string")throw TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof $);let Y=$.length,Z=arguments.length>2&&arguments[2]===!0;if(!Z&&Y===0)return 0;let J=!1;for(;;)switch(U){case"ascii":case"latin1":case"binary":return Y;case"utf8":case"utf-8":return T8($).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Y*2;case"hex":return Y>>>1;case"base64":return cU($).length;default:if(J)return Z?-1:T8($).length;U=(""+U).toLowerCase(),J=!0}}G0.byteLength=_U;function l7($,U,Y){let Z=!1;if(U===void 0||U<0)U=0;if(U>this.length)return"";if(Y===void 0||Y>this.length)Y=this.length;if(Y<=0)return"";if(Y>>>=0,U>>>=0,Y<=U)return"";if(!$)$="utf8";while(!0)switch($){case"hex":return $q(this,U,Y);case"utf8":case"utf-8":return bU(this,U,Y);case"ascii":return t7(this,U,Y);case"latin1":case"binary":return e7(this,U,Y);case"base64":return n7(this,U,Y);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Uq(this,U,Y);default:if(Z)throw TypeError("Unknown encoding: "+$);$=($+"").toLowerCase(),Z=!0}}G0.prototype._isBuffer=!0;function P2($,U,Y){let Z=$[U];$[U]=$[Y],$[Y]=Z}G0.prototype.swap16=function(){let $=this.length;if($%2!==0)throw RangeError("Buffer size must be a multiple of 16-bits");for(let U=0;U<$;U+=2)P2(this,U,U+1);return this};G0.prototype.swap32=function(){let $=this.length;if($%4!==0)throw RangeError("Buffer size must be a multiple of 32-bits");for(let U=0;U<$;U+=4)P2(this,U,U+3),P2(this,U+1,U+2);return this};G0.prototype.swap64=function(){let $=this.length;if($%8!==0)throw RangeError("Buffer size must be a multiple of 64-bits");for(let U=0;U<$;U+=8)P2(this,U,U+7),P2(this,U+1,U+6),P2(this,U+2,U+5),P2(this,U+3,U+4);return this};G0.prototype.toString=function(){let $=this.length;if($===0)return"";if(arguments.length===0)return bU(this,0,$);return l7.apply(this,arguments)};G0.prototype.toLocaleString=G0.prototype.toString;G0.prototype.equals=function($){if(!G0.isBuffer($))throw TypeError("Argument must be a Buffer");if(this===$)return!0;return G0.compare(this,$)===0};G0.prototype.inspect=function(){let $="",U=x7;if($=this.toString("hex",0,U).replace(/(.{2})/g,"$1 ").trim(),this.length>U)$+=" ... ";return""};if(TU)G0.prototype[TU]=G0.prototype.inspect;G0.prototype.compare=function($,U,Y,Z,J){if(p0($,Uint8Array))$=G0.from($,$.offset,$.byteLength);if(!G0.isBuffer($))throw TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof $);if(U===void 0)U=0;if(Y===void 0)Y=$?$.length:0;if(Z===void 0)Z=0;if(J===void 0)J=this.length;if(U<0||Y>$.length||Z<0||J>this.length)throw RangeError("out of range index");if(Z>=J&&U>=Y)return 0;if(Z>=J)return-1;if(U>=Y)return 1;if(U>>>=0,Y>>>=0,Z>>>=0,J>>>=0,this===$)return 0;let G=J-Z,X=Y-U,Q=Math.min(G,X),B=this.slice(Z,J),F=$.slice(U,Y);for(let z=0;z2147483647)Y=2147483647;else if(Y<-2147483648)Y=-2147483648;if(Y=+Y,Number.isNaN(Y))Y=J?0:$.length-1;if(Y<0)Y=$.length+Y;if(Y>=$.length)if(J)return-1;else Y=$.length-1;else if(Y<0)if(J)Y=0;else return-1;if(typeof U==="string")U=G0.from(U,Z);if(G0.isBuffer(U)){if(U.length===0)return-1;return CU($,U,Y,Z,J)}else if(typeof U==="number"){if(U=U&255,typeof Uint8Array.prototype.indexOf==="function")if(J)return Uint8Array.prototype.indexOf.call($,U,Y);else return Uint8Array.prototype.lastIndexOf.call($,U,Y);return CU($,[U],Y,Z,J)}throw TypeError("val must be string, number or Buffer")}function CU($,U,Y,Z,J){let G=1,X=$.length,Q=U.length;if(Z!==void 0){if(Z=String(Z).toLowerCase(),Z==="ucs2"||Z==="ucs-2"||Z==="utf16le"||Z==="utf-16le"){if($.length<2||U.length<2)return-1;G=2,X/=2,Q/=2,Y/=2}}function B(z,W){if(G===1)return z[W];else return z.readUInt16BE(W*G)}let F;if(J){let z=-1;for(F=Y;FX)Y=X-Q;for(F=Y;F>=0;F--){let z=!0;for(let W=0;WJ)Z=J;let G=U.length;if(Z>G/2)Z=G/2;let X;for(X=0;X>>0,isFinite(Y)){if(Y=Y>>>0,Z===void 0)Z="utf8"}else Z=Y,Y=void 0;else throw Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");let J=this.length-U;if(Y===void 0||Y>J)Y=J;if($.length>0&&(Y<0||U<0)||U>this.length)throw RangeError("Attempt to write outside buffer bounds");if(!Z)Z="utf8";let G=!1;for(;;)switch(Z){case"hex":return a7(this,$,U,Y);case"utf8":case"utf-8":return p7(this,$,U,Y);case"ascii":case"latin1":case"binary":return i7(this,$,U,Y);case"base64":return r7(this,$,U,Y);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return s7(this,$,U,Y);default:if(G)throw TypeError("Unknown encoding: "+Z);Z=(""+Z).toLowerCase(),G=!0}};G0.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function n7($,U,Y){if(U===0&&Y===$.length)return PU($);else return PU($.slice(U,Y))}function bU($,U,Y){Y=Math.min($.length,Y);let Z=[],J=U;while(J239?4:G>223?3:G>191?2:1;if(J+Q<=Y){let B,F,z,W;switch(Q){case 1:if(G<128)X=G;break;case 2:if(B=$[J+1],(B&192)===128){if(W=(G&31)<<6|B&63,W>127)X=W}break;case 3:if(B=$[J+1],F=$[J+2],(B&192)===128&&(F&192)===128){if(W=(G&15)<<12|(B&63)<<6|F&63,W>2047&&(W<55296||W>57343))X=W}break;case 4:if(B=$[J+1],F=$[J+2],z=$[J+3],(B&192)===128&&(F&192)===128&&(z&192)===128){if(W=(G&15)<<18|(B&63)<<12|(F&63)<<6|z&63,W>65535&&W<1114112)X=W}}}if(X===null)X=65533,Q=1;else if(X>65535)X-=65536,Z.push(X>>>10&1023|55296),X=56320|X&1023;Z.push(X),J+=Q}return o7(Z)}var OU=4096;function o7($){let U=$.length;if(U<=OU)return String.fromCharCode.apply(String,$);let Y="",Z=0;while(ZZ)Y=Z;let J="";for(let G=U;GY)$=Y;if(U<0){if(U+=Y,U<0)U=0}else if(U>Y)U=Y;if(U<$)U=$;let Z=this.subarray($,U);return Object.setPrototypeOf(Z,G0.prototype),Z};function E0($,U,Y){if($%1!==0||$<0)throw RangeError("offset is not uint");if($+U>Y)throw RangeError("Trying to access beyond buffer length")}G0.prototype.readUintLE=G0.prototype.readUIntLE=function($,U,Y){if($=$>>>0,U=U>>>0,!Y)E0($,U,this.length);let Z=this[$],J=1,G=0;while(++G>>0,U=U>>>0,!Y)E0($,U,this.length);let Z=this[$+--U],J=1;while(U>0&&(J*=256))Z+=this[$+--U]*J;return Z};G0.prototype.readUint8=G0.prototype.readUInt8=function($,U){if($=$>>>0,!U)E0($,1,this.length);return this[$]};G0.prototype.readUint16LE=G0.prototype.readUInt16LE=function($,U){if($=$>>>0,!U)E0($,2,this.length);return this[$]|this[$+1]<<8};G0.prototype.readUint16BE=G0.prototype.readUInt16BE=function($,U){if($=$>>>0,!U)E0($,2,this.length);return this[$]<<8|this[$+1]};G0.prototype.readUint32LE=G0.prototype.readUInt32LE=function($,U){if($=$>>>0,!U)E0($,4,this.length);return(this[$]|this[$+1]<<8|this[$+2]<<16)+this[$+3]*16777216};G0.prototype.readUint32BE=G0.prototype.readUInt32BE=function($,U){if($=$>>>0,!U)E0($,4,this.length);return this[$]*16777216+(this[$+1]<<16|this[$+2]<<8|this[$+3])};G0.prototype.readBigUInt64LE=z2(function($){$=$>>>0,b2($,"offset");let U=this[$],Y=this[$+7];if(U===void 0||Y===void 0)$1($,this.length-8);let Z=U+this[++$]*256+this[++$]*65536+this[++$]*16777216,J=this[++$]+this[++$]*256+this[++$]*65536+Y*16777216;return BigInt(Z)+(BigInt(J)<>>0,b2($,"offset");let U=this[$],Y=this[$+7];if(U===void 0||Y===void 0)$1($,this.length-8);let Z=U*16777216+this[++$]*65536+this[++$]*256+this[++$],J=this[++$]*16777216+this[++$]*65536+this[++$]*256+Y;return(BigInt(Z)<>>0,U=U>>>0,!Y)E0($,U,this.length);let Z=this[$],J=1,G=0;while(++G=J)Z-=Math.pow(2,8*U);return Z};G0.prototype.readIntBE=function($,U,Y){if($=$>>>0,U=U>>>0,!Y)E0($,U,this.length);let Z=U,J=1,G=this[$+--Z];while(Z>0&&(J*=256))G+=this[$+--Z]*J;if(J*=128,G>=J)G-=Math.pow(2,8*U);return G};G0.prototype.readInt8=function($,U){if($=$>>>0,!U)E0($,1,this.length);if(!(this[$]&128))return this[$];return(255-this[$]+1)*-1};G0.prototype.readInt16LE=function($,U){if($=$>>>0,!U)E0($,2,this.length);let Y=this[$]|this[$+1]<<8;return Y&32768?Y|4294901760:Y};G0.prototype.readInt16BE=function($,U){if($=$>>>0,!U)E0($,2,this.length);let Y=this[$+1]|this[$]<<8;return Y&32768?Y|4294901760:Y};G0.prototype.readInt32LE=function($,U){if($=$>>>0,!U)E0($,4,this.length);return this[$]|this[$+1]<<8|this[$+2]<<16|this[$+3]<<24};G0.prototype.readInt32BE=function($,U){if($=$>>>0,!U)E0($,4,this.length);return this[$]<<24|this[$+1]<<16|this[$+2]<<8|this[$+3]};G0.prototype.readBigInt64LE=z2(function($){$=$>>>0,b2($,"offset");let U=this[$],Y=this[$+7];if(U===void 0||Y===void 0)$1($,this.length-8);let Z=this[$+4]+this[$+5]*256+this[$+6]*65536+(Y<<24);return(BigInt(Z)<>>0,b2($,"offset");let U=this[$],Y=this[$+7];if(U===void 0||Y===void 0)$1($,this.length-8);let Z=(U<<24)+this[++$]*65536+this[++$]*256+this[++$];return(BigInt(Z)<>>0,!U)E0($,4,this.length);return T1(this,$,!0,23,4)};G0.prototype.readFloatBE=function($,U){if($=$>>>0,!U)E0($,4,this.length);return T1(this,$,!1,23,4)};G0.prototype.readDoubleLE=function($,U){if($=$>>>0,!U)E0($,8,this.length);return T1(this,$,!0,52,8)};G0.prototype.readDoubleBE=function($,U){if($=$>>>0,!U)E0($,8,this.length);return T1(this,$,!1,52,8)};function b0($,U,Y,Z,J,G){if(!G0.isBuffer($))throw TypeError('"buffer" argument must be a Buffer instance');if(U>J||U$.length)throw RangeError("Index out of range")}G0.prototype.writeUintLE=G0.prototype.writeUIntLE=function($,U,Y,Z){if($=+$,U=U>>>0,Y=Y>>>0,!Z){let X=Math.pow(2,8*Y)-1;b0(this,$,U,Y,X,0)}let J=1,G=0;this[U]=$&255;while(++G>>0,Y=Y>>>0,!Z){let X=Math.pow(2,8*Y)-1;b0(this,$,U,Y,X,0)}let J=Y-1,G=1;this[U+J]=$&255;while(--J>=0&&(G*=256))this[U+J]=$/G&255;return U+Y};G0.prototype.writeUint8=G0.prototype.writeUInt8=function($,U,Y){if($=+$,U=U>>>0,!Y)b0(this,$,U,1,255,0);return this[U]=$&255,U+1};G0.prototype.writeUint16LE=G0.prototype.writeUInt16LE=function($,U,Y){if($=+$,U=U>>>0,!Y)b0(this,$,U,2,65535,0);return this[U]=$&255,this[U+1]=$>>>8,U+2};G0.prototype.writeUint16BE=G0.prototype.writeUInt16BE=function($,U,Y){if($=+$,U=U>>>0,!Y)b0(this,$,U,2,65535,0);return this[U]=$>>>8,this[U+1]=$&255,U+2};G0.prototype.writeUint32LE=G0.prototype.writeUInt32LE=function($,U,Y){if($=+$,U=U>>>0,!Y)b0(this,$,U,4,4294967295,0);return this[U+3]=$>>>24,this[U+2]=$>>>16,this[U+1]=$>>>8,this[U]=$&255,U+4};G0.prototype.writeUint32BE=G0.prototype.writeUInt32BE=function($,U,Y){if($=+$,U=U>>>0,!Y)b0(this,$,U,4,4294967295,0);return this[U]=$>>>24,this[U+1]=$>>>16,this[U+2]=$>>>8,this[U+3]=$&255,U+4};function gU($,U,Y,Z,J){dU(U,Z,J,$,Y,7);let G=Number(U&BigInt(4294967295));$[Y++]=G,G=G>>8,$[Y++]=G,G=G>>8,$[Y++]=G,G=G>>8,$[Y++]=G;let X=Number(U>>BigInt(32)&BigInt(4294967295));return $[Y++]=X,X=X>>8,$[Y++]=X,X=X>>8,$[Y++]=X,X=X>>8,$[Y++]=X,Y}function xU($,U,Y,Z,J){dU(U,Z,J,$,Y,7);let G=Number(U&BigInt(4294967295));$[Y+7]=G,G=G>>8,$[Y+6]=G,G=G>>8,$[Y+5]=G,G=G>>8,$[Y+4]=G;let X=Number(U>>BigInt(32)&BigInt(4294967295));return $[Y+3]=X,X=X>>8,$[Y+2]=X,X=X>>8,$[Y+1]=X,X=X>>8,$[Y]=X,Y+8}G0.prototype.writeBigUInt64LE=z2(function($,U=0){return gU(this,$,U,BigInt(0),BigInt("0xffffffffffffffff"))});G0.prototype.writeBigUInt64BE=z2(function($,U=0){return xU(this,$,U,BigInt(0),BigInt("0xffffffffffffffff"))});G0.prototype.writeIntLE=function($,U,Y,Z){if($=+$,U=U>>>0,!Z){let Q=Math.pow(2,8*Y-1);b0(this,$,U,Y,Q-1,-Q)}let J=0,G=1,X=0;this[U]=$&255;while(++J>0)-X&255}return U+Y};G0.prototype.writeIntBE=function($,U,Y,Z){if($=+$,U=U>>>0,!Z){let Q=Math.pow(2,8*Y-1);b0(this,$,U,Y,Q-1,-Q)}let J=Y-1,G=1,X=0;this[U+J]=$&255;while(--J>=0&&(G*=256)){if($<0&&X===0&&this[U+J+1]!==0)X=1;this[U+J]=($/G>>0)-X&255}return U+Y};G0.prototype.writeInt8=function($,U,Y){if($=+$,U=U>>>0,!Y)b0(this,$,U,1,127,-128);if($<0)$=255+$+1;return this[U]=$&255,U+1};G0.prototype.writeInt16LE=function($,U,Y){if($=+$,U=U>>>0,!Y)b0(this,$,U,2,32767,-32768);return this[U]=$&255,this[U+1]=$>>>8,U+2};G0.prototype.writeInt16BE=function($,U,Y){if($=+$,U=U>>>0,!Y)b0(this,$,U,2,32767,-32768);return this[U]=$>>>8,this[U+1]=$&255,U+2};G0.prototype.writeInt32LE=function($,U,Y){if($=+$,U=U>>>0,!Y)b0(this,$,U,4,2147483647,-2147483648);return this[U]=$&255,this[U+1]=$>>>8,this[U+2]=$>>>16,this[U+3]=$>>>24,U+4};G0.prototype.writeInt32BE=function($,U,Y){if($=+$,U=U>>>0,!Y)b0(this,$,U,4,2147483647,-2147483648);if($<0)$=4294967295+$+1;return this[U]=$>>>24,this[U+1]=$>>>16,this[U+2]=$>>>8,this[U+3]=$&255,U+4};G0.prototype.writeBigInt64LE=z2(function($,U=0){return gU(this,$,U,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});G0.prototype.writeBigInt64BE=z2(function($,U=0){return xU(this,$,U,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});function fU($,U,Y,Z,J,G){if(Y+Z>$.length)throw RangeError("Index out of range");if(Y<0)throw RangeError("Index out of range")}function hU($,U,Y,Z,J){if(U=+U,Y=Y>>>0,!J)fU($,U,Y,4,340282346638528860000000000000000000000,-340282346638528860000000000000000000000);return EU($,U,Y,Z,23,4),Y+4}G0.prototype.writeFloatLE=function($,U,Y){return hU(this,$,U,!0,Y)};G0.prototype.writeFloatBE=function($,U,Y){return hU(this,$,U,!1,Y)};function uU($,U,Y,Z,J){if(U=+U,Y=Y>>>0,!J)fU($,U,Y,8,179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,-179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);return EU($,U,Y,Z,52,8),Y+8}G0.prototype.writeDoubleLE=function($,U,Y){return uU(this,$,U,!0,Y)};G0.prototype.writeDoubleBE=function($,U,Y){return uU(this,$,U,!1,Y)};G0.prototype.copy=function($,U,Y,Z){if(!G0.isBuffer($))throw TypeError("argument should be a Buffer");if(!Y)Y=0;if(!Z&&Z!==0)Z=this.length;if(U>=$.length)U=$.length;if(!U)U=0;if(Z>0&&Z=this.length)throw RangeError("Index out of range");if(Z<0)throw RangeError("sourceEnd out of bounds");if(Z>this.length)Z=this.length;if($.length-U>>0,Y=Y===void 0?this.length:Y>>>0,!$)$=0;let J;if(typeof $==="number")for(J=U;J=Z+4;Y-=3)U=`_${$.slice(Y-3,Y)}${U}`;return`${$.slice(0,Y)}${U}`}function Yq($,U,Y){if(b2(U,"offset"),$[U]===void 0||$[U+Y]===void 0)$1(U,$.length-(Y+1))}function dU($,U,Y,Z,J,G){if($>Y||$3)if(U===0||U===BigInt(0))Q=`>= 0${X} and < 2${X} ** ${(G+1)*8}${X}`;else Q=`>= -(2${X} ** ${(G+1)*8-1}${X}) and < 2 ** ${(G+1)*8-1}${X}`;else Q=`>= ${U}${X} and <= ${Y}${X}`;throw new D8("value",Q,$)}Yq(Z,J,G)}function b2($,U){if(typeof $!=="number")throw new h7(U,"number",$)}function $1($,U,Y){if(Math.floor($)!==$)throw b2($,Y),new D8(Y||"offset","an integer",$);if(U<0)throw new f7;throw new D8(Y||"offset",`>= ${Y?1:0} and <= ${U}`,$)}var Zq=/[^+/0-9A-Za-z-_]/g;function Qq($){if($=$.split("=")[0],$=$.trim().replace(Zq,""),$.length<2)return"";while($.length%4!==0)$=$+"=";return $}function T8($,U){U=U||1/0;let Y,Z=$.length,J=null,G=[];for(let X=0;X55295&&Y<57344){if(!J){if(Y>56319){if((U-=3)>-1)G.push(239,191,189);continue}else if(X+1===Z){if((U-=3)>-1)G.push(239,191,189);continue}J=Y;continue}if(Y<56320){if((U-=3)>-1)G.push(239,191,189);J=Y;continue}Y=(J-55296<<10|Y-56320)+65536}else if(J){if((U-=3)>-1)G.push(239,191,189)}if(J=null,Y<128){if((U-=1)<0)break;G.push(Y)}else if(Y<2048){if((U-=2)<0)break;G.push(Y>>6|192,Y&63|128)}else if(Y<65536){if((U-=3)<0)break;G.push(Y>>12|224,Y>>6&63|128,Y&63|128)}else if(Y<1114112){if((U-=4)<0)break;G.push(Y>>18|240,Y>>12&63|128,Y>>6&63|128,Y&63|128)}else throw Error("Invalid code point")}return G}function Jq($){let U=[];for(let Y=0;Y<$.length;++Y)U.push($.charCodeAt(Y)&255);return U}function Gq($,U){let Y,Z,J,G=[];for(let X=0;X<$.length;++X){if((U-=2)<0)break;Y=$.charCodeAt(X),Z=Y>>8,J=Y%256,G.push(J),G.push(Z)}return G}function cU($){return y7(Qq($))}function C1($,U,Y,Z){let J;for(J=0;J=U.length||J>=$.length)break;U[J+Y]=$[J]}return J}function p0($,U){return $ instanceof U||$!=null&&$.constructor!=null&&$.constructor.name!=null&&$.constructor.name===U.name}var Kq=function(){let $=Array(256);for(let U=0;U<16;++U){let Y=U*16;for(let Z=0;Z<16;++Z)$[Y+Z]="0123456789abcdef"[U]+"0123456789abcdef"[Z]}return $}();function z2($){return typeof BigInt>"u"?qq:$}function qq(){throw Error("BigInt not supported")}function E8($){return()=>{throw Error($+" is not implemented for node:buffer browser polyfill")}}var yB=E8("resolveObjectURL"),bB=E8("isUtf8");var gB=E8("transcode");var OB=C7(iU(),1);var FU={};S7(FU,{unsignedDecimalNumber:()=>W1,universalMeasureValue:()=>H1,uniqueUuid:()=>tQ,uniqueNumericIdCreator:()=>N1,uniqueId:()=>R1,uCharHexNumber:()=>D9,twipsMeasureValue:()=>T0,standardizeData:()=>mJ,signedTwipsMeasureValue:()=>e0,signedHpsMeasureValue:()=>LX,shortHexNumber:()=>DQ,sectionPageSizeDefaults:()=>h1,sectionMarginDefaults:()=>F2,positiveUniversalMeasureValue:()=>r9,pointMeasureValue:()=>CQ,percentageValue:()=>PQ,patchDocument:()=>AB,patchDetector:()=>TB,measurementOrPercentValue:()=>s9,longHexNumber:()=>BX,hpsMeasureValue:()=>AQ,hexColorValue:()=>S2,hashedId:()=>A9,encodeUtf8:()=>X1,eighthPointMeasureValue:()=>TQ,docPropertiesUniqueNumericIdGen:()=>nQ,decimalNumber:()=>S0,dateTimeValue:()=>OQ,createWrapTopAndBottom:()=>bJ,createWrapTight:()=>yJ,createWrapSquare:()=>_J,createWrapNone:()=>C9,createVerticalPosition:()=>JJ,createVerticalAlign:()=>f$,createUnderline:()=>mQ,createTransformation:()=>B$,createTableWidthElement:()=>M1,createTableRowHeight:()=>EK,createTableLook:()=>CK,createTableLayout:()=>PK,createTableFloatProperties:()=>AK,createTabStopItem:()=>PG,createTabStop:()=>TG,createStringElement:()=>u2,createSpacing:()=>AG,createSimplePos:()=>UJ,createShading:()=>j1,createSectionType:()=>nK,createRunFonts:()=>g1,createParagraphStyle:()=>K1,createPageSize:()=>rK,createPageNumberType:()=>iK,createPageMargin:()=>pK,createOutlineLevel:()=>yG,createMathSuperScriptProperties:()=>iG,createMathSuperScriptElement:()=>n2,createMathSubSuperScriptProperties:()=>oG,createMathSubScriptProperties:()=>sG,createMathSubScriptElement:()=>s2,createMathPreSubSuperScriptProperties:()=>eG,createMathNAryProperties:()=>T$,createMathLimitLocation:()=>cG,createMathBase:()=>y0,createMathAccentCharacter:()=>dG,createLineNumberType:()=>aK,createIndent:()=>EQ,createHorizontalPosition:()=>QJ,createHeaderFooterReference:()=>f1,createFrameProperties:()=>xG,createEmphasisMark:()=>Y$,createDotEmphasisMark:()=>HX,createDocumentGrid:()=>lK,createColumns:()=>mK,createBorderElement:()=>N0,createBodyProperties:()=>KJ,createAlignment:()=>n9,convertToXmlComponent:()=>U8,convertMillimetersToTwip:()=>bX,convertInchesToTwip:()=>d0,concreteNumUniqueNumericIdGen:()=>sQ,bookmarkUniqueNumericIdGen:()=>oQ,abstractNumUniqueNumericIdGen:()=>rQ,YearShort:()=>qG,YearLong:()=>BG,XmlComponent:()=>o,XmlAttributeComponent:()=>I0,WpsShapeRun:()=>aJ,WpgGroupRun:()=>pJ,WidthType:()=>l1,WORKAROUND4:()=>HV,WORKAROUND3:()=>VX,WORKAROUND2:()=>lV,VerticalPositionRelativeFrom:()=>$J,VerticalPositionAlign:()=>IX,VerticalMergeType:()=>d$,VerticalMergeRevisionType:()=>NV,VerticalMerge:()=>a1,VerticalAnchor:()=>GJ,VerticalAlignTable:()=>HK,VerticalAlignSection:()=>jK,VerticalAlign:()=>RV,UnderlineType:()=>Z$,ThematicBreak:()=>t9,Textbox:()=>G7,TextWrappingType:()=>G1,TextWrappingSide:()=>vJ,TextRun:()=>p2,TextEffect:()=>NX,TextDirection:()=>PV,TableRowPropertiesChange:()=>l$,TableRowProperties:()=>M8,TableRow:()=>SK,TableProperties:()=>L8,TableOfContents:()=>e5,TableLayoutType:()=>SV,TableCellBorders:()=>h$,TableCell:()=>V8,TableBorders:()=>B8,TableAnchorType:()=>TV,Table:()=>kK,TabStopType:()=>O9,TabStopPosition:()=>ZV,Tab:()=>w$,TDirection:()=>c$,SymbolRun:()=>G$,Styles:()=>B1,StyleLevel:()=>$7,StyleForParagraph:()=>y2,StyleForCharacter:()=>D2,StringValueElement:()=>Y2,StringEnumValueElement:()=>kQ,StringContainer:()=>L2,SpaceType:()=>g0,SoftHyphen:()=>JG,SimpleMailMergeField:()=>nJ,SimpleField:()=>J8,ShadingType:()=>WX,SequentialIdentifier:()=>rJ,Separator:()=>IG,SectionType:()=>dV,SectionPropertiesChange:()=>i$,SectionProperties:()=>I8,RunPropertiesDefaults:()=>XU,RunPropertiesChange:()=>J$,RunProperties:()=>J2,Run:()=>C0,RelativeVerticalPosition:()=>OV,RelativeHorizontalPosition:()=>CV,PrettifyType:()=>X7,PositionalTabRelativeTo:()=>eX,PositionalTabLeader:()=>$V,PositionalTabAlignment:()=>tX,PositionalTab:()=>FG,PatchType:()=>y9,ParagraphRunProperties:()=>Q$,ParagraphPropertiesDefaults:()=>qU,ParagraphPropertiesChange:()=>D$,ParagraphProperties:()=>Z2,Paragraph:()=>h0,PageTextDirectionType:()=>uV,PageTextDirection:()=>p$,PageReference:()=>gG,PageOrientation:()=>i1,PageNumberSeparator:()=>hV,PageNumberElement:()=>WG,PageNumber:()=>N2,PageBreakBefore:()=>H$,PageBreak:()=>RG,PageBorders:()=>a$,PageBorderZOrder:()=>fV,PageBorderOffsetFrom:()=>xV,PageBorderDisplay:()=>gV,Packer:()=>qB,OverlapType:()=>kV,OnOffElement:()=>X0,Numbering:()=>JU,NumberedItemReferenceFormat:()=>vG,NumberedItemReference:()=>_G,NumberValueElement:()=>k2,NumberProperties:()=>V1,NumberFormat:()=>wX,NoBreakHyphen:()=>QG,NextAttributeComponent:()=>n1,MonthShort:()=>KG,MonthLong:()=>VG,Media:()=>w8,MathSuperScript:()=>rG,MathSum:()=>mG,MathSubSuperScript:()=>tG,MathSubScript:()=>nG,MathSquareBrackets:()=>GK,MathRun:()=>hG,MathRoundBrackets:()=>JK,MathRadicalProperties:()=>O$,MathRadical:()=>ZK,MathPreSubSuperScript:()=>$K,MathNumerator:()=>P$,MathLimitUpper:()=>aG,MathLimitLower:()=>pG,MathLimit:()=>q8,MathIntegral:()=>lG,MathFunctionProperties:()=>E$,MathFunctionName:()=>k$,MathFunction:()=>QK,MathFraction:()=>uG,MathDenominator:()=>A$,MathDegree:()=>C$,MathCurlyBrackets:()=>KK,MathAngledBrackets:()=>qK,Math:()=>IV,LineRuleType:()=>v2,LineNumberRestartFormat:()=>bV,LevelSuffix:()=>aV,LevelOverride:()=>QU,LevelFormat:()=>n0,LevelForOverride:()=>F5,LevelBase:()=>W8,Level:()=>ZU,LeaderType:()=>YV,LastRenderedPageBreak:()=>jG,InternalHyperlink:()=>j$,InsertedTextRun:()=>BK,InsertedTableRow:()=>v$,InsertedTableCell:()=>y$,InitializableXmlComponent:()=>Y8,ImportedXmlComponent:()=>p9,ImportedRootElementAttributes:()=>i9,ImageRun:()=>lJ,IgnoreIfEmptyXmlComponent:()=>Q2,HyperlinkType:()=>QV,HpsMeasureElement:()=>q1,HorizontalPositionRelativeFrom:()=>eQ,HorizontalPositionAlign:()=>MX,HighlightColor:()=>RX,HeightRule:()=>_V,HeadingLevel:()=>UV,HeaderWrapper:()=>YU,HeaderFooterType:()=>S9,HeaderFooterReferenceType:()=>E2,Header:()=>U7,GridSpan:()=>u$,FrameWrap:()=>MV,FrameAnchorType:()=>LV,FootnoteReferenceRun:()=>Z7,FootnoteReferenceElement:()=>MG,FootnoteReference:()=>IU,FooterWrapper:()=>$U,Footer:()=>Y7,FootNotes:()=>UU,FootNoteReferenceRunAttributes:()=>MU,FileChild:()=>r2,File:()=>o5,ExternalHyperlink:()=>K8,Endnotes:()=>e$,EndnoteReferenceRunAttributes:()=>wU,EndnoteReferenceRun:()=>Q7,EndnoteReference:()=>I$,EndnoteIdReference:()=>WU,EmptyElement:()=>k0,EmphasisMarkType:()=>U$,EMPTY_OBJECT:()=>tZ,DropCapType:()=>BV,Drawing:()=>D1,DocumentGridType:()=>yV,DocumentDefaults:()=>VU,DocumentBackgroundAttributes:()=>s$,DocumentBackground:()=>n$,DocumentAttributes:()=>o2,DocumentAttributeNamespaces:()=>p1,Document:()=>o5,DeletedTextRun:()=>wK,DeletedTableRow:()=>_$,DeletedTableCell:()=>b$,DayShort:()=>GG,DayLong:()=>XG,ContinuationSeparator:()=>wG,ConcreteNumbering:()=>s1,ConcreteHyperlink:()=>_2,Comments:()=>M$,CommentReference:()=>ZG,CommentRangeStart:()=>UG,CommentRangeEnd:()=>YG,Comment:()=>L$,ColumnBreak:()=>DG,Column:()=>tK,CheckBoxUtil:()=>HU,CheckBoxSymbolElement:()=>L1,CheckBox:()=>J7,CharacterSet:()=>GV,CellMergeAttributes:()=>g$,CellMerge:()=>x$,CarriageReturn:()=>HG,BuilderElement:()=>B0,BorderStyle:()=>Q8,Border:()=>o9,BookmarkStart:()=>F$,BookmarkEnd:()=>N$,Bookmark:()=>z$,Body:()=>r$,BaseXmlComponent:()=>m2,Attributes:()=>O0,AnnotationReference:()=>LG,AlignmentType:()=>m0,AbstractNumbering:()=>r1});var{defineProperty:Bq,defineProperties:Lq,getOwnPropertyDescriptors:Mq,getOwnPropertySymbols:m1}=Object,sZ=Object.prototype.hasOwnProperty,nZ=Object.prototype.propertyIsEnumerable,z9=($,U,Y)=>(U in $)?Bq($,U,{enumerable:!0,configurable:!0,writable:!0,value:Y}):$[U]=Y,W0=($,U)=>{for(var Y in U||(U={}))if(sZ.call(U,Y))z9($,Y,U[Y]);if(m1){for(var Y of m1(U))if(nZ.call(U,Y))z9($,Y,U[Y])}return $},R0=($,U)=>Lq($,Mq(U)),oZ=($,U)=>{var Y={};for(var Z in $)if(sZ.call($,Z)&&U.indexOf(Z)<0)Y[Z]=$[Z];if($!=null&&m1){for(var Z of m1($))if(U.indexOf(Z)<0&&nZ.call($,Z))Y[Z]=$[Z]}return Y},Y0=($,U,Y)=>z9($,typeof U!=="symbol"?U+"":U,Y),b9=($,U,Y)=>{return new Promise((Z,J)=>{var G=(B)=>{try{Q(Y.next(B))}catch(F){J(F)}},X=(B)=>{try{Q(Y.throw(B))}catch(F){J(F)}},Q=(B)=>B.done?Z(B.value):Promise.resolve(B.value).then(G,X);Q((Y=Y.apply($,U)).next())})};class m2{constructor($){Y0(this,"rootKey"),this.rootKey=$}}var tZ=Object.seal({});class o extends m2{constructor($){super($);Y0(this,"root"),this.root=[]}prepForXml($){var U;$.stack.push(this);let Y=this.root.map((Z)=>{if(Z instanceof m2)return Z.prepForXml($);return Z}).filter((Z)=>Z!==void 0);return $.stack.pop(),{[this.rootKey]:Y.length?Y.length===1&&((U=Y[0])==null?void 0:U._attr)?Y[0]:Y:tZ}}addChildElement($){return this.root.push($),this}}class Q2 extends o{constructor($,U){super($);Y0(this,"includeIfEmpty"),this.includeIfEmpty=U}prepForXml($){let U=super.prepForXml($);if(this.includeIfEmpty)return U;if(U&&(typeof U[this.rootKey]!=="object"||Object.keys(U[this.rootKey]).length))return U;return}}class I0 extends m2{constructor($){super("_attr");Y0(this,"xmlKeys"),this.root=$}prepForXml($){let U={};return Object.entries(this.root).forEach(([Y,Z])=>{if(Z!==void 0){let J=this.xmlKeys&&this.xmlKeys[Y]||Y;U[J]=Z}}),{_attr:U}}}class n1 extends m2{constructor($){super("_attr");this.root=$}prepForXml($){return{_attr:Object.values(this.root).filter(({value:Y})=>Y!==void 0).reduce((Y,{key:Z,value:J})=>R0(W0({},Y),{[Z]:J}),{})}}}class O0 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val",color:"w:color",fill:"w:fill",space:"w:space",sz:"w:sz",type:"w:type",rsidR:"w:rsidR",rsidRPr:"w:rsidRPr",rsidSect:"w:rsidSect",w:"w:w",h:"w:h",top:"w:top",right:"w:right",bottom:"w:bottom",left:"w:left",header:"w:header",footer:"w:footer",gutter:"w:gutter",linePitch:"w:linePitch",pos:"w:pos"})}}var c0=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function g9($){return $&&$.__esModule&&Object.prototype.hasOwnProperty.call($,"default")?$.default:$}var _8={},k1={exports:{}},rU;function x9(){if(rU)return k1.exports;rU=1;var $=typeof Reflect==="object"?Reflect:null,U=$&&typeof $.apply==="function"?$.apply:function(A,y,g){return Function.prototype.apply.call(A,y,g)},Y;if($&&typeof $.ownKeys==="function")Y=$.ownKeys;else if(Object.getOwnPropertySymbols)Y=function(A){return Object.getOwnPropertyNames(A).concat(Object.getOwnPropertySymbols(A))};else Y=function(A){return Object.getOwnPropertyNames(A)};function Z(L){if(console&&console.warn)console.warn(L)}var J=Number.isNaN||function(A){return A!==A};function G(){G.init.call(this)}k1.exports=G,k1.exports.once=V,G.EventEmitter=G,G.prototype._events=void 0,G.prototype._eventsCount=0,G.prototype._maxListeners=void 0;var X=10;function Q(L){if(typeof L!=="function")throw TypeError('The "listener" argument must be of type Function. Received type '+typeof L)}Object.defineProperty(G,"defaultMaxListeners",{enumerable:!0,get:function(){return X},set:function(L){if(typeof L!=="number"||L<0||J(L))throw RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+L+".");X=L}}),G.init=function(){if(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)this._events=Object.create(null),this._eventsCount=0;this._maxListeners=this._maxListeners||void 0},G.prototype.setMaxListeners=function(A){if(typeof A!=="number"||A<0||J(A))throw RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+A+".");return this._maxListeners=A,this};function B(L){if(L._maxListeners===void 0)return G.defaultMaxListeners;return L._maxListeners}G.prototype.getMaxListeners=function(){return B(this)},G.prototype.emit=function(A){var y=[];for(var g=1;g0)s=y[0];if(s instanceof Error)throw s;var V0=Error("Unhandled error."+(s?" ("+s.message+")":""));throw V0.context=s,V0}var S=E[A];if(S===void 0)return!1;if(typeof S==="function")U(S,this,y);else{var h=S.length,N=C(S,h);for(var g=0;g0&&s.length>d&&!s.warned){s.warned=!0;var V0=Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(A)+" listeners added. Use emitter.setMaxListeners() to increase limit");V0.name="MaxListenersExceededWarning",V0.emitter=L,V0.type=A,V0.count=s.length,Z(V0)}}return L}G.prototype.addListener=function(A,y){return F(this,A,y,!1)},G.prototype.on=G.prototype.addListener,G.prototype.prependListener=function(A,y){return F(this,A,y,!0)};function z(){if(!this.fired){if(this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0)return this.listener.call(this.target);return this.listener.apply(this.target,arguments)}}function W(L,A,y){var g={fired:!1,wrapFn:void 0,target:L,type:A,listener:y},d=z.bind(g);return d.listener=y,g.wrapFn=d,d}G.prototype.once=function(A,y){return Q(y),this.on(A,W(this,A,y)),this},G.prototype.prependOnceListener=function(A,y){return Q(y),this.prependListener(A,W(this,A,y)),this},G.prototype.removeListener=function(A,y){var g,d,E,s,V0;if(Q(y),d=this._events,d===void 0)return this;if(g=d[A],g===void 0)return this;if(g===y||g.listener===y){if(--this._eventsCount===0)this._events=Object.create(null);else if(delete d[A],d.removeListener)this.emit("removeListener",A,g.listener||y)}else if(typeof g!=="function"){E=-1;for(s=g.length-1;s>=0;s--)if(g[s]===y||g[s].listener===y){V0=g[s].listener,E=s;break}if(E<0)return this;if(E===0)g.shift();else H(g,E);if(g.length===1)d[A]=g[0];if(d.removeListener!==void 0)this.emit("removeListener",A,V0||y)}return this},G.prototype.off=G.prototype.removeListener,G.prototype.removeAllListeners=function(A){var y,g,d;if(g=this._events,g===void 0)return this;if(g.removeListener===void 0){if(arguments.length===0)this._events=Object.create(null),this._eventsCount=0;else if(g[A]!==void 0)if(--this._eventsCount===0)this._events=Object.create(null);else delete g[A];return this}if(arguments.length===0){var E=Object.keys(g),s;for(d=0;d=0;d--)this.removeListener(A,y[d]);return this};function k(L,A,y){var g=L._events;if(g===void 0)return[];var d=g[A];if(d===void 0)return[];if(typeof d==="function")return y?[d.listener||d]:[d];return y?O(d):C(d,d.length)}G.prototype.listeners=function(A){return k(this,A,!0)},G.prototype.rawListeners=function(A){return k(this,A,!1)},G.listenerCount=function(L,A){if(typeof L.listenerCount==="function")return L.listenerCount(A);else return D.call(L,A)},G.prototype.listenerCount=D;function D(L){var A=this._events;if(A!==void 0){var y=A[L];if(typeof y==="function")return 1;else if(y!==void 0)return y.length}return 0}G.prototype.eventNames=function(){return this._eventsCount>0?Y(this._events):[]};function C(L,A){var y=Array(A);for(var g=0;g1)for(var Y=1;Y0)throw Error("Invalid string. Length must be a multiple of 4");var H=D.indexOf("=");if(H===-1)H=C;var O=H===C?0:4-H%4;return[H,O]}function Q(D){var C=X(D),H=C[0],O=C[1];return(H+O)*3/4-O}function B(D,C,H){return(C+H)*3/4-H}function F(D){var C,H=X(D),O=H[0],V=H[1],j=new Y(B(D,O,V)),M=0,L=V>0?O-4:O,A;for(A=0;A>16&255,j[M++]=C>>8&255,j[M++]=C&255;if(V===2)C=U[D.charCodeAt(A)]<<2|U[D.charCodeAt(A+1)]>>4,j[M++]=C&255;if(V===1)C=U[D.charCodeAt(A)]<<10|U[D.charCodeAt(A+1)]<<4|U[D.charCodeAt(A+2)]>>2,j[M++]=C>>8&255,j[M++]=C&255;return j}function z(D){return $[D>>18&63]+$[D>>12&63]+$[D>>6&63]+$[D&63]}function W(D,C,H){var O,V=[];for(var j=C;jL?L:M+j));if(O===1)C=D[H-1],V.push($[C>>2]+$[C<<4&63]+"==");else if(O===2)C=(D[H-2]<<8)+D[H-1],V.push($[C>>10]+$[C>>4&63]+$[C<<2&63]+"=");return V.join("")}return U1}var S1={},tU;function zq(){if(tU)return S1;return tU=1,S1.read=function($,U,Y,Z,J){var G,X,Q=J*8-Z-1,B=(1<>1,z=-7,W=Y?J-1:0,k=Y?-1:1,D=$[U+W];W+=k,G=D&(1<<-z)-1,D>>=-z,z+=Q;for(;z>0;G=G*256+$[U+W],W+=k,z-=8);X=G&(1<<-z)-1,G>>=-z,z+=Z;for(;z>0;X=X*256+$[U+W],W+=k,z-=8);if(G===0)G=1-F;else if(G===B)return X?NaN:(D?-1:1)*(1/0);else X=X+Math.pow(2,Z),G=G-F;return(D?-1:1)*X*Math.pow(2,G-Z)},S1.write=function($,U,Y,Z,J,G){var X,Q,B,F=G*8-J-1,z=(1<>1,k=J===23?Math.pow(2,-24)-Math.pow(2,-77):0,D=Z?0:G-1,C=Z?1:-1,H=U<0||U===0&&1/U<0?1:0;if(U=Math.abs(U),isNaN(U)||U===1/0)Q=isNaN(U)?1:0,X=z;else{if(X=Math.floor(Math.log(U)/Math.LN2),U*(B=Math.pow(2,-X))<1)X--,B*=2;if(X+W>=1)U+=k/B;else U+=k*Math.pow(2,1-W);if(U*B>=2)X++,B/=2;if(X+W>=z)Q=0,X=z;else if(X+W>=1)Q=(U*B-1)*Math.pow(2,J),X=X+W;else Q=U*Math.pow(2,W-1)*Math.pow(2,J),X=0}for(;J>=8;$[Y+D]=Q&255,D+=C,Q/=256,J-=8);X=X<0;$[Y+D]=X&255,D+=C,X/=256,F-=8);$[Y+D-C]|=H*128},S1}var eU;function o1(){if(eU)return b8;return eU=1,function($){var U=jq(),Y=zq(),Z=typeof Symbol==="function"&&typeof Symbol.for==="function"?Symbol.for("nodejs.util.inspect.custom"):null;$.Buffer=Q,$.SlowBuffer=j,$.INSPECT_MAX_BYTES=50;var J=2147483647;if($.kMaxLength=J,Q.TYPED_ARRAY_SUPPORT=G(),!Q.TYPED_ARRAY_SUPPORT&&typeof console<"u"&&typeof console.error==="function")console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.");function G(){try{var T=new Uint8Array(1),K={foo:function(){return 42}};return Object.setPrototypeOf(K,Uint8Array.prototype),Object.setPrototypeOf(T,K),T.foo()===42}catch(q){return!1}}Object.defineProperty(Q.prototype,"parent",{enumerable:!0,get:function(){if(!Q.isBuffer(this))return;return this.buffer}}),Object.defineProperty(Q.prototype,"offset",{enumerable:!0,get:function(){if(!Q.isBuffer(this))return;return this.byteOffset}});function X(T){if(T>J)throw RangeError('The value "'+T+'" is invalid for option "size"');var K=new Uint8Array(T);return Object.setPrototypeOf(K,Q.prototype),K}function Q(T,K,q){if(typeof T==="number"){if(typeof K==="string")throw TypeError('The "string" argument must be of type string. Received type number');return W(T)}return B(T,K,q)}Q.poolSize=8192;function B(T,K,q){if(typeof T==="string")return k(T,K);if(ArrayBuffer.isView(T))return C(T);if(T==null)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof T);if(e(T,ArrayBuffer)||T&&e(T.buffer,ArrayBuffer))return H(T,K,q);if(typeof SharedArrayBuffer<"u"&&(e(T,SharedArrayBuffer)||T&&e(T.buffer,SharedArrayBuffer)))return H(T,K,q);if(typeof T==="number")throw TypeError('The "value" argument must not be of type number. Received type number');var w=T.valueOf&&T.valueOf();if(w!=null&&w!==T)return Q.from(w,K,q);var x=O(T);if(x)return x;if(typeof Symbol<"u"&&Symbol.toPrimitive!=null&&typeof T[Symbol.toPrimitive]==="function")return Q.from(T[Symbol.toPrimitive]("string"),K,q);throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof T)}Q.from=function(T,K,q){return B(T,K,q)},Object.setPrototypeOf(Q.prototype,Uint8Array.prototype),Object.setPrototypeOf(Q,Uint8Array);function F(T){if(typeof T!=="number")throw TypeError('"size" argument must be of type number');else if(T<0)throw RangeError('The value "'+T+'" is invalid for option "size"')}function z(T,K,q){if(F(T),T<=0)return X(T);if(K!==void 0)return typeof q==="string"?X(T).fill(K,q):X(T).fill(K);return X(T)}Q.alloc=function(T,K,q){return z(T,K,q)};function W(T){return F(T),X(T<0?0:V(T)|0)}Q.allocUnsafe=function(T){return W(T)},Q.allocUnsafeSlow=function(T){return W(T)};function k(T,K){if(typeof K!=="string"||K==="")K="utf8";if(!Q.isEncoding(K))throw TypeError("Unknown encoding: "+K);var q=M(T,K)|0,w=X(q),x=w.write(T,K);if(x!==q)w=w.slice(0,x);return w}function D(T){var K=T.length<0?0:V(T.length)|0,q=X(K);for(var w=0;w=J)throw RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+J.toString(16)+" bytes");return T|0}function j(T){if(+T!=T)T=0;return Q.alloc(+T)}Q.isBuffer=function(K){return K!=null&&K._isBuffer===!0&&K!==Q.prototype},Q.compare=function(K,q){if(e(K,Uint8Array))K=Q.from(K,K.offset,K.byteLength);if(e(q,Uint8Array))q=Q.from(q,q.offset,q.byteLength);if(!Q.isBuffer(K)||!Q.isBuffer(q))throw TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(K===q)return 0;var w=K.length,x=q.length;for(var l=0,u=Math.min(w,x);lx.length)Q.from(u).copy(x,l);else Uint8Array.prototype.set.call(x,u,l);else if(!Q.isBuffer(u))throw TypeError('"list" argument must be an Array of Buffers');else u.copy(x,l);l+=u.length}return x};function M(T,K){if(Q.isBuffer(T))return T.length;if(ArrayBuffer.isView(T)||e(T,ArrayBuffer))return T.byteLength;if(typeof T!=="string")throw TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof T);var q=T.length,w=arguments.length>2&&arguments[2]===!0;if(!w&&q===0)return 0;var x=!1;for(;;)switch(K){case"ascii":case"latin1":case"binary":return q;case"utf8":case"utf-8":return R(T).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return q*2;case"hex":return q>>>1;case"base64":return v(T).length;default:if(x)return w?-1:R(T).length;K=(""+K).toLowerCase(),x=!0}}Q.byteLength=M;function L(T,K,q){var w=!1;if(K===void 0||K<0)K=0;if(K>this.length)return"";if(q===void 0||q>this.length)q=this.length;if(q<=0)return"";if(q>>>=0,K>>>=0,q<=K)return"";if(!T)T="utf8";while(!0)switch(T){case"hex":return U0(this,K,q);case"utf8":case"utf-8":return N(this,K,q);case"ascii":return m(this,K,q);case"latin1":case"binary":return J0(this,K,q);case"base64":return h(this,K,q);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return L0(this,K,q);default:if(w)throw TypeError("Unknown encoding: "+T);T=(T+"").toLowerCase(),w=!0}}Q.prototype._isBuffer=!0;function A(T,K,q){var w=T[K];T[K]=T[q],T[q]=w}if(Q.prototype.swap16=function(){var K=this.length;if(K%2!==0)throw RangeError("Buffer size must be a multiple of 16-bits");for(var q=0;qq)K+=" ... ";return""},Z)Q.prototype[Z]=Q.prototype.inspect;Q.prototype.compare=function(K,q,w,x,l){if(e(K,Uint8Array))K=Q.from(K,K.offset,K.byteLength);if(!Q.isBuffer(K))throw TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof K);if(q===void 0)q=0;if(w===void 0)w=K?K.length:0;if(x===void 0)x=0;if(l===void 0)l=this.length;if(q<0||w>K.length||x<0||l>this.length)throw RangeError("out of range index");if(x>=l&&q>=w)return 0;if(x>=l)return-1;if(q>=w)return 1;if(q>>>=0,w>>>=0,x>>>=0,l>>>=0,this===K)return 0;var u=l-x,Q0=w-q,q0=Math.min(u,Q0),K0=this.slice(x,l),M0=K.slice(q,w);for(var w0=0;w02147483647)q=2147483647;else if(q<-2147483648)q=-2147483648;if(q=+q,I(q))q=x?0:T.length-1;if(q<0)q=T.length+q;if(q>=T.length)if(x)return-1;else q=T.length-1;else if(q<0)if(x)q=0;else return-1;if(typeof K==="string")K=Q.from(K,w);if(Q.isBuffer(K)){if(K.length===0)return-1;return g(T,K,q,w,x)}else if(typeof K==="number"){if(K=K&255,typeof Uint8Array.prototype.indexOf==="function")if(x)return Uint8Array.prototype.indexOf.call(T,K,q);else return Uint8Array.prototype.lastIndexOf.call(T,K,q);return g(T,[K],q,w,x)}throw TypeError("val must be string, number or Buffer")}function g(T,K,q,w,x){var l=1,u=T.length,Q0=K.length;if(w!==void 0){if(w=String(w).toLowerCase(),w==="ucs2"||w==="ucs-2"||w==="utf16le"||w==="utf-16le"){if(T.length<2||K.length<2)return-1;l=2,u/=2,Q0/=2,q/=2}}function q0(v0,j2){if(l===1)return v0[j2];else return v0.readUInt16BE(j2*l)}var K0;if(x){var M0=-1;for(K0=q;K0u)q=u-Q0;for(K0=q;K0>=0;K0--){var w0=!0;for(var H0=0;H0x)w=x;var l=K.length;if(w>l/2)w=l/2;for(var u=0;u>>0,isFinite(w)){if(w=w>>>0,x===void 0)x="utf8"}else x=w,w=void 0;else throw Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");var l=this.length-q;if(w===void 0||w>l)w=l;if(K.length>0&&(w<0||q<0)||q>this.length)throw RangeError("Attempt to write outside buffer bounds");if(!x)x="utf8";var u=!1;for(;;)switch(x){case"hex":return d(this,K,q,w);case"utf8":case"utf-8":return E(this,K,q,w);case"ascii":case"latin1":case"binary":return s(this,K,q,w);case"base64":return V0(this,K,q,w);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,K,q,w);default:if(u)throw TypeError("Unknown encoding: "+x);x=(""+x).toLowerCase(),u=!0}},Q.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function h(T,K,q){if(K===0&&q===T.length)return U.fromByteArray(T);else return U.fromByteArray(T.slice(K,q))}function N(T,K,q){q=Math.min(T.length,q);var w=[],x=K;while(x239?4:l>223?3:l>191?2:1;if(x+Q0<=q){var q0,K0,M0,w0;switch(Q0){case 1:if(l<128)u=l;break;case 2:if(q0=T[x+1],(q0&192)===128){if(w0=(l&31)<<6|q0&63,w0>127)u=w0}break;case 3:if(q0=T[x+1],K0=T[x+2],(q0&192)===128&&(K0&192)===128){if(w0=(l&15)<<12|(q0&63)<<6|K0&63,w0>2047&&(w0<55296||w0>57343))u=w0}break;case 4:if(q0=T[x+1],K0=T[x+2],M0=T[x+3],(q0&192)===128&&(K0&192)===128&&(M0&192)===128){if(w0=(l&15)<<18|(q0&63)<<12|(K0&63)<<6|M0&63,w0>65535&&w0<1114112)u=w0}}}if(u===null)u=65533,Q0=1;else if(u>65535)u-=65536,w.push(u>>>10&1023|55296),u=56320|u&1023;w.push(u),x+=Q0}return $0(w)}var a=4096;function $0(T){var K=T.length;if(K<=a)return String.fromCharCode.apply(String,T);var q="",w=0;while(ww)q=w;var x="";for(var l=K;lw)K=w;if(q<0){if(q+=w,q<0)q=0}else if(q>w)q=w;if(qq)throw RangeError("Trying to access beyond buffer length")}Q.prototype.readUintLE=Q.prototype.readUIntLE=function(K,q,w){if(K=K>>>0,q=q>>>0,!w)i(K,q,this.length);var x=this[K],l=1,u=0;while(++u>>0,q=q>>>0,!w)i(K,q,this.length);var x=this[K+--q],l=1;while(q>0&&(l*=256))x+=this[K+--q]*l;return x},Q.prototype.readUint8=Q.prototype.readUInt8=function(K,q){if(K=K>>>0,!q)i(K,1,this.length);return this[K]},Q.prototype.readUint16LE=Q.prototype.readUInt16LE=function(K,q){if(K=K>>>0,!q)i(K,2,this.length);return this[K]|this[K+1]<<8},Q.prototype.readUint16BE=Q.prototype.readUInt16BE=function(K,q){if(K=K>>>0,!q)i(K,2,this.length);return this[K]<<8|this[K+1]},Q.prototype.readUint32LE=Q.prototype.readUInt32LE=function(K,q){if(K=K>>>0,!q)i(K,4,this.length);return(this[K]|this[K+1]<<8|this[K+2]<<16)+this[K+3]*16777216},Q.prototype.readUint32BE=Q.prototype.readUInt32BE=function(K,q){if(K=K>>>0,!q)i(K,4,this.length);return this[K]*16777216+(this[K+1]<<16|this[K+2]<<8|this[K+3])},Q.prototype.readIntLE=function(K,q,w){if(K=K>>>0,q=q>>>0,!w)i(K,q,this.length);var x=this[K],l=1,u=0;while(++u=l)x-=Math.pow(2,8*q);return x},Q.prototype.readIntBE=function(K,q,w){if(K=K>>>0,q=q>>>0,!w)i(K,q,this.length);var x=q,l=1,u=this[K+--x];while(x>0&&(l*=256))u+=this[K+--x]*l;if(l*=128,u>=l)u-=Math.pow(2,8*q);return u},Q.prototype.readInt8=function(K,q){if(K=K>>>0,!q)i(K,1,this.length);if(!(this[K]&128))return this[K];return(255-this[K]+1)*-1},Q.prototype.readInt16LE=function(K,q){if(K=K>>>0,!q)i(K,2,this.length);var w=this[K]|this[K+1]<<8;return w&32768?w|4294901760:w},Q.prototype.readInt16BE=function(K,q){if(K=K>>>0,!q)i(K,2,this.length);var w=this[K+1]|this[K]<<8;return w&32768?w|4294901760:w},Q.prototype.readInt32LE=function(K,q){if(K=K>>>0,!q)i(K,4,this.length);return this[K]|this[K+1]<<8|this[K+2]<<16|this[K+3]<<24},Q.prototype.readInt32BE=function(K,q){if(K=K>>>0,!q)i(K,4,this.length);return this[K]<<24|this[K+1]<<16|this[K+2]<<8|this[K+3]},Q.prototype.readFloatLE=function(K,q){if(K=K>>>0,!q)i(K,4,this.length);return Y.read(this,K,!0,23,4)},Q.prototype.readFloatBE=function(K,q){if(K=K>>>0,!q)i(K,4,this.length);return Y.read(this,K,!1,23,4)},Q.prototype.readDoubleLE=function(K,q){if(K=K>>>0,!q)i(K,8,this.length);return Y.read(this,K,!0,52,8)},Q.prototype.readDoubleBE=function(K,q){if(K=K>>>0,!q)i(K,8,this.length);return Y.read(this,K,!1,52,8)};function _(T,K,q,w,x,l){if(!Q.isBuffer(T))throw TypeError('"buffer" argument must be a Buffer instance');if(K>x||KT.length)throw RangeError("Index out of range")}Q.prototype.writeUintLE=Q.prototype.writeUIntLE=function(K,q,w,x){if(K=+K,q=q>>>0,w=w>>>0,!x){var l=Math.pow(2,8*w)-1;_(this,K,q,w,l,0)}var u=1,Q0=0;this[q]=K&255;while(++Q0>>0,w=w>>>0,!x){var l=Math.pow(2,8*w)-1;_(this,K,q,w,l,0)}var u=w-1,Q0=1;this[q+u]=K&255;while(--u>=0&&(Q0*=256))this[q+u]=K/Q0&255;return q+w},Q.prototype.writeUint8=Q.prototype.writeUInt8=function(K,q,w){if(K=+K,q=q>>>0,!w)_(this,K,q,1,255,0);return this[q]=K&255,q+1},Q.prototype.writeUint16LE=Q.prototype.writeUInt16LE=function(K,q,w){if(K=+K,q=q>>>0,!w)_(this,K,q,2,65535,0);return this[q]=K&255,this[q+1]=K>>>8,q+2},Q.prototype.writeUint16BE=Q.prototype.writeUInt16BE=function(K,q,w){if(K=+K,q=q>>>0,!w)_(this,K,q,2,65535,0);return this[q]=K>>>8,this[q+1]=K&255,q+2},Q.prototype.writeUint32LE=Q.prototype.writeUInt32LE=function(K,q,w){if(K=+K,q=q>>>0,!w)_(this,K,q,4,4294967295,0);return this[q+3]=K>>>24,this[q+2]=K>>>16,this[q+1]=K>>>8,this[q]=K&255,q+4},Q.prototype.writeUint32BE=Q.prototype.writeUInt32BE=function(K,q,w){if(K=+K,q=q>>>0,!w)_(this,K,q,4,4294967295,0);return this[q]=K>>>24,this[q+1]=K>>>16,this[q+2]=K>>>8,this[q+3]=K&255,q+4},Q.prototype.writeIntLE=function(K,q,w,x){if(K=+K,q=q>>>0,!x){var l=Math.pow(2,8*w-1);_(this,K,q,w,l-1,-l)}var u=0,Q0=1,q0=0;this[q]=K&255;while(++u>0)-q0&255}return q+w},Q.prototype.writeIntBE=function(K,q,w,x){if(K=+K,q=q>>>0,!x){var l=Math.pow(2,8*w-1);_(this,K,q,w,l-1,-l)}var u=w-1,Q0=1,q0=0;this[q+u]=K&255;while(--u>=0&&(Q0*=256)){if(K<0&&q0===0&&this[q+u+1]!==0)q0=1;this[q+u]=(K/Q0>>0)-q0&255}return q+w},Q.prototype.writeInt8=function(K,q,w){if(K=+K,q=q>>>0,!w)_(this,K,q,1,127,-128);if(K<0)K=255+K+1;return this[q]=K&255,q+1},Q.prototype.writeInt16LE=function(K,q,w){if(K=+K,q=q>>>0,!w)_(this,K,q,2,32767,-32768);return this[q]=K&255,this[q+1]=K>>>8,q+2},Q.prototype.writeInt16BE=function(K,q,w){if(K=+K,q=q>>>0,!w)_(this,K,q,2,32767,-32768);return this[q]=K>>>8,this[q+1]=K&255,q+2},Q.prototype.writeInt32LE=function(K,q,w){if(K=+K,q=q>>>0,!w)_(this,K,q,4,2147483647,-2147483648);return this[q]=K&255,this[q+1]=K>>>8,this[q+2]=K>>>16,this[q+3]=K>>>24,q+4},Q.prototype.writeInt32BE=function(K,q,w){if(K=+K,q=q>>>0,!w)_(this,K,q,4,2147483647,-2147483648);if(K<0)K=4294967295+K+1;return this[q]=K>>>24,this[q+1]=K>>>16,this[q+2]=K>>>8,this[q+3]=K&255,q+4};function r(T,K,q,w,x,l){if(q+w>T.length)throw RangeError("Index out of range");if(q<0)throw RangeError("Index out of range")}function n(T,K,q,w,x){if(K=+K,q=q>>>0,!x)r(T,K,q,4);return Y.write(T,K,q,w,23,4),q+4}Q.prototype.writeFloatLE=function(K,q,w){return n(this,K,q,!0,w)},Q.prototype.writeFloatBE=function(K,q,w){return n(this,K,q,!1,w)};function Z0(T,K,q,w,x){if(K=+K,q=q>>>0,!x)r(T,K,q,8);return Y.write(T,K,q,w,52,8),q+8}Q.prototype.writeDoubleLE=function(K,q,w){return Z0(this,K,q,!0,w)},Q.prototype.writeDoubleBE=function(K,q,w){return Z0(this,K,q,!1,w)},Q.prototype.copy=function(K,q,w,x){if(!Q.isBuffer(K))throw TypeError("argument should be a Buffer");if(!w)w=0;if(!x&&x!==0)x=this.length;if(q>=K.length)q=K.length;if(!q)q=0;if(x>0&&x=this.length)throw RangeError("Index out of range");if(x<0)throw RangeError("sourceEnd out of bounds");if(x>this.length)x=this.length;if(K.length-q>>0,w=w===void 0?this.length:w>>>0,!K)K=0;var u;if(typeof K==="number")for(u=q;u55295&&q<57344){if(!x){if(q>56319){if((K-=3)>-1)l.push(239,191,189);continue}else if(u+1===w){if((K-=3)>-1)l.push(239,191,189);continue}x=q;continue}if(q<56320){if((K-=3)>-1)l.push(239,191,189);x=q;continue}q=(x-55296<<10|q-56320)+65536}else if(x){if((K-=3)>-1)l.push(239,191,189)}if(x=null,q<128){if((K-=1)<0)break;l.push(q)}else if(q<2048){if((K-=2)<0)break;l.push(q>>6|192,q&63|128)}else if(q<65536){if((K-=3)<0)break;l.push(q>>12|224,q>>6&63|128,q&63|128)}else if(q<1114112){if((K-=4)<0)break;l.push(q>>18|240,q>>12&63|128,q>>6&63|128,q&63|128)}else throw Error("Invalid code point")}return l}function c(T){var K=[];for(var q=0;q>8,x=q%256,l.push(x),l.push(w)}return l}function v(T){return U.toByteArray(P(T))}function b(T,K,q,w){for(var x=0;x=K.length||x>=T.length)break;K[x+q]=T[x]}return x}function e(T,K){return T instanceof K||T!=null&&T.constructor!=null&&T.constructor.name!=null&&T.constructor.name===K.name}function I(T){return T!==T}var t=function(){var T="0123456789abcdef",K=Array(256);for(var q=0;q<16;++q){var w=q*16;for(var x=0;x<16;++x)K[w+x]=T[q]+T[x]}return K}()}(b8),b8}var g8={},x8={},f8,$Y;function QQ(){if($Y)return f8;return $Y=1,f8=function(){if(typeof Symbol!=="function"||typeof Object.getOwnPropertySymbols!=="function")return!1;if(typeof Symbol.iterator==="symbol")return!0;var U={},Y=Symbol("test"),Z=Object(Y);if(typeof Y==="string")return!1;if(Object.prototype.toString.call(Y)!=="[object Symbol]")return!1;if(Object.prototype.toString.call(Z)!=="[object Symbol]")return!1;var J=42;U[Y]=J;for(var G in U)return!1;if(typeof Object.keys==="function"&&Object.keys(U).length!==0)return!1;if(typeof Object.getOwnPropertyNames==="function"&&Object.getOwnPropertyNames(U).length!==0)return!1;var X=Object.getOwnPropertySymbols(U);if(X.length!==1||X[0]!==Y)return!1;if(!Object.prototype.propertyIsEnumerable.call(U,Y))return!1;if(typeof Object.getOwnPropertyDescriptor==="function"){var Q=Object.getOwnPropertyDescriptor(U,Y);if(Q.value!==J||Q.enumerable!==!0)return!1}return!0},f8}var h8,UY;function f9(){if(UY)return h8;UY=1;var $=QQ();return h8=function(){return $()&&!!Symbol.toStringTag},h8}var u8,YY;function JQ(){if(YY)return u8;return YY=1,u8=Object,u8}var d8,ZY;function Fq(){if(ZY)return d8;return ZY=1,d8=Error,d8}var c8,QY;function Nq(){if(QY)return c8;return QY=1,c8=EvalError,c8}var m8,JY;function Rq(){if(JY)return m8;return JY=1,m8=RangeError,m8}var l8,GY;function Dq(){if(GY)return l8;return GY=1,l8=ReferenceError,l8}var a8,KY;function GQ(){if(KY)return a8;return KY=1,a8=SyntaxError,a8}var p8,qY;function t1(){if(qY)return p8;return qY=1,p8=TypeError,p8}var i8,XY;function Aq(){if(XY)return i8;return XY=1,i8=URIError,i8}var r8,VY;function Pq(){if(VY)return r8;return VY=1,r8=Math.abs,r8}var s8,BY;function Tq(){if(BY)return s8;return BY=1,s8=Math.floor,s8}var n8,LY;function Cq(){if(LY)return n8;return LY=1,n8=Math.max,n8}var o8,MY;function Oq(){if(MY)return o8;return MY=1,o8=Math.min,o8}var t8,IY;function kq(){if(IY)return t8;return IY=1,t8=Math.pow,t8}var e8,wY;function Eq(){if(wY)return e8;return wY=1,e8=Math.round,e8}var $6,WY;function Sq(){if(WY)return $6;return WY=1,$6=Number.isNaN||function(U){return U!==U},$6}var U6,HY;function vq(){if(HY)return U6;HY=1;var $=Sq();return U6=function(Y){if($(Y)||Y===0)return Y;return Y<0?-1:1},U6}var Y6,jY;function _q(){if(jY)return Y6;return jY=1,Y6=Object.getOwnPropertyDescriptor,Y6}var Z6,zY;function I1(){if(zY)return Z6;zY=1;var $=_q();if($)try{$([],"length")}catch(U){$=null}return Z6=$,Z6}var Q6,FY;function e1(){if(FY)return Q6;FY=1;var $=Object.defineProperty||!1;if($)try{$({},"a",{value:1})}catch(U){$=!1}return Q6=$,Q6}var J6,NY;function yq(){if(NY)return J6;NY=1;var $=typeof Symbol<"u"&&Symbol,U=QQ();return J6=function(){if(typeof $!=="function")return!1;if(typeof Symbol!=="function")return!1;if(typeof $("foo")!=="symbol")return!1;if(typeof Symbol("bar")!=="symbol")return!1;return U()},J6}var G6,RY;function KQ(){if(RY)return G6;return RY=1,G6=typeof Reflect<"u"&&Reflect.getPrototypeOf||null,G6}var K6,DY;function qQ(){if(DY)return K6;DY=1;var $=JQ();return K6=$.getPrototypeOf||null,K6}var q6,AY;function bq(){if(AY)return q6;AY=1;var $="Function.prototype.bind called on incompatible ",U=Object.prototype.toString,Y=Math.max,Z="[object Function]",J=function(B,F){var z=[];for(var W=0;W"u"||!g?$:g(Uint8Array),N={__proto__:null,"%AggregateError%":typeof AggregateError>"u"?$:AggregateError,"%Array%":Array,"%ArrayBuffer%":typeof ArrayBuffer>"u"?$:ArrayBuffer,"%ArrayIteratorPrototype%":y&&g?g([][Symbol.iterator]()):$,"%AsyncFromSyncIteratorPrototype%":$,"%AsyncFunction%":S,"%AsyncGenerator%":S,"%AsyncGeneratorFunction%":S,"%AsyncIteratorPrototype%":S,"%Atomics%":typeof Atomics>"u"?$:Atomics,"%BigInt%":typeof BigInt>"u"?$:BigInt,"%BigInt64Array%":typeof BigInt64Array>"u"?$:BigInt64Array,"%BigUint64Array%":typeof BigUint64Array>"u"?$:BigUint64Array,"%Boolean%":Boolean,"%DataView%":typeof DataView>"u"?$:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Y,"%eval%":eval,"%EvalError%":Z,"%Float16Array%":typeof Float16Array>"u"?$:Float16Array,"%Float32Array%":typeof Float32Array>"u"?$:Float32Array,"%Float64Array%":typeof Float64Array>"u"?$:Float64Array,"%FinalizationRegistry%":typeof FinalizationRegistry>"u"?$:FinalizationRegistry,"%Function%":O,"%GeneratorFunction%":S,"%Int8Array%":typeof Int8Array>"u"?$:Int8Array,"%Int16Array%":typeof Int16Array>"u"?$:Int16Array,"%Int32Array%":typeof Int32Array>"u"?$:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":y&&g?g(g([][Symbol.iterator]())):$,"%JSON%":typeof JSON==="object"?JSON:$,"%Map%":typeof Map>"u"?$:Map,"%MapIteratorPrototype%":typeof Map>"u"||!y||!g?$:g(new Map()[Symbol.iterator]()),"%Math%":Math,"%Number%":Number,"%Object%":U,"%Object.getOwnPropertyDescriptor%":j,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":typeof Promise>"u"?$:Promise,"%Proxy%":typeof Proxy>"u"?$:Proxy,"%RangeError%":J,"%ReferenceError%":G,"%Reflect%":typeof Reflect>"u"?$:Reflect,"%RegExp%":RegExp,"%Set%":typeof Set>"u"?$:Set,"%SetIteratorPrototype%":typeof Set>"u"||!y||!g?$:g(new Set()[Symbol.iterator]()),"%SharedArrayBuffer%":typeof SharedArrayBuffer>"u"?$:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":y&&g?g(""[Symbol.iterator]()):$,"%Symbol%":y?Symbol:$,"%SyntaxError%":X,"%ThrowTypeError%":A,"%TypedArray%":h,"%TypeError%":Q,"%Uint8Array%":typeof Uint8Array>"u"?$:Uint8Array,"%Uint8ClampedArray%":typeof Uint8ClampedArray>"u"?$:Uint8ClampedArray,"%Uint16Array%":typeof Uint16Array>"u"?$:Uint16Array,"%Uint32Array%":typeof Uint32Array>"u"?$:Uint32Array,"%URIError%":B,"%WeakMap%":typeof WeakMap>"u"?$:WeakMap,"%WeakRef%":typeof WeakRef>"u"?$:WeakRef,"%WeakSet%":typeof WeakSet>"u"?$:WeakSet,"%Function.prototype.call%":V0,"%Function.prototype.apply%":s,"%Object.defineProperty%":M,"%Object.getPrototypeOf%":d,"%Math.abs%":F,"%Math.floor%":z,"%Math.max%":W,"%Math.min%":k,"%Math.pow%":D,"%Math.round%":C,"%Math.sign%":H,"%Reflect.getPrototypeOf%":E};if(g)try{null.error}catch(c){var a=g(g(c));N["%Error.prototype%"]=a}var $0=function c(f){var v;if(f==="%AsyncFunction%")v=V("async function () {}");else if(f==="%GeneratorFunction%")v=V("function* () {}");else if(f==="%AsyncGeneratorFunction%")v=V("async function* () {}");else if(f==="%AsyncGenerator%"){var b=c("%AsyncGeneratorFunction%");if(b)v=b.prototype}else if(f==="%AsyncIteratorPrototype%"){var e=c("%AsyncGenerator%");if(e&&g)v=g(e.prototype)}return N[f]=v,v},m={__proto__:null,"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},J0=w1(),U0=fq(),L0=J0.call(V0,Array.prototype.concat),i=J0.call(s,Array.prototype.splice),_=J0.call(V0,String.prototype.replace),r=J0.call(V0,String.prototype.slice),n=J0.call(V0,RegExp.prototype.exec),Z0=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,p=/\\(\\)?/g,P=function(f){var v=r(f,0,1),b=r(f,-1);if(v==="%"&&b!=="%")throw new X("invalid intrinsic syntax, expected closing `%`");else if(b==="%"&&v!=="%")throw new X("invalid intrinsic syntax, expected opening `%`");var e=[];return _(f,Z0,function(I,t,T,K){e[e.length]=T?_(K,p,"$1"):t||I}),e},R=function(f,v){var b=f,e;if(U0(m,b))e=m[b],b="%"+e[0]+"%";if(U0(N,b)){var I=N[b];if(I===S)I=$0(b);if(typeof I>"u"&&!v)throw new Q("intrinsic "+f+" exists, but is not available. Please file an issue!");return{alias:e,name:b,value:I}}throw new X("intrinsic "+f+" does not exist!")};return j6=function(f,v){if(typeof f!=="string"||f.length===0)throw new Q("intrinsic name must be a non-empty string");if(arguments.length>1&&typeof v!=="boolean")throw new Q('"allowMissing" argument must be a boolean');if(n(/^%?[^%]*%?$/,f)===null)throw new X("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var b=P(f),e=b.length>0?b[0]:"",I=R("%"+e+"%",v),t=I.name,T=I.value,K=!1,q=I.alias;if(q)e=q[0],i(b,L0([0,1],q));for(var w=1,x=!0;w=b.length){var q0=j(T,l);if(x=!!q0,x&&"get"in q0&&!("originalValue"in q0.get))T=q0.get;else T=T[l]}else x=U0(T,l),T=T[l];if(x&&!K)N[t]=T}}return T},j6}var z6,bY;function LQ(){if(bY)return z6;bY=1;var $=BQ(),U=d9(),Y=U([$("%String.prototype.indexOf%")]);return z6=function(J,G){var X=$(J,!!G);if(typeof X==="function"&&Y(J,".prototype.")>-1)return U([X]);return X},z6}var F6,gY;function hq(){if(gY)return F6;gY=1;var $=f9()(),U=LQ(),Y=U("Object.prototype.toString"),Z=function(Q){if($&&Q&&typeof Q==="object"&&Symbol.toStringTag in Q)return!1;return Y(Q)==="[object Arguments]"},J=function(Q){if(Z(Q))return!0;return Q!==null&&typeof Q==="object"&&"length"in Q&&typeof Q.length==="number"&&Q.length>=0&&Y(Q)!=="[object Array]"&&"callee"in Q&&Y(Q.callee)==="[object Function]"},G=function(){return Z(arguments)}();return Z.isLegacyArguments=J,F6=G?Z:J,F6}var N6,xY;function uq(){if(xY)return N6;xY=1;var $=Object.prototype.toString,U=Function.prototype.toString,Y=/^\s*(?:function)?\*/,Z=f9()(),J=Object.getPrototypeOf,G=function(){if(!Z)return!1;try{return Function("return function*() {}")()}catch(Q){}},X;return N6=function(B){if(typeof B!=="function")return!1;if(Y.test(U.call(B)))return!0;if(!Z){var F=$.call(B);return F==="[object GeneratorFunction]"}if(!J)return!1;if(typeof X>"u"){var z=G();X=z?J(z):!1}return J(B)===X},N6}var R6,fY;function dq(){if(fY)return R6;fY=1;var $=Function.prototype.toString,U=typeof Reflect==="object"&&Reflect!==null&&Reflect.apply,Y,Z;if(typeof U==="function"&&typeof Object.defineProperty==="function")try{Y=Object.defineProperty({},"length",{get:function(){throw Z}}),Z={},U(function(){throw 42},null,Y)}catch(j){if(j!==Z)U=null}else U=null;var J=/^\s*class\b/,G=function(M){try{var L=$.call(M);return J.test(L)}catch(A){return!1}},X=function(M){try{if(G(M))return!1;return $.call(M),!0}catch(L){return!1}},Q=Object.prototype.toString,B="[object Object]",F="[object Function]",z="[object GeneratorFunction]",W="[object HTMLAllCollection]",k="[object HTML document.all class]",D="[object HTMLCollection]",C=typeof Symbol==="function"&&!!Symbol.toStringTag,H=!(0 in[,]),O=function(){return!1};if(typeof document==="object"){var V=document.all;if(Q.call(V)===Q.call(document.all))O=function(M){if((H||!M)&&(typeof M>"u"||typeof M==="object"))try{var L=Q.call(M);return(L===W||L===k||L===D||L===B)&&M("")==null}catch(A){}return!1}}return R6=U?function(M){if(O(M))return!0;if(!M)return!1;if(typeof M!=="function"&&typeof M!=="object")return!1;try{U(M,null,Y)}catch(L){if(L!==Z)return!1}return!G(M)&&X(M)}:function(M){if(O(M))return!0;if(!M)return!1;if(typeof M!=="function"&&typeof M!=="object")return!1;if(C)return X(M);if(G(M))return!1;var L=Q.call(M);if(L!==F&&L!==z&&!/^\[object HTML/.test(L))return!1;return X(M)},R6}var D6,hY;function cq(){if(hY)return D6;hY=1;var $=dq(),U=Object.prototype.toString,Y=Object.prototype.hasOwnProperty,Z=function(B,F,z){for(var W=0,k=B.length;W=3)W=z;if(X(B))Z(B,F,W);else if(typeof B==="string")J(B,F,W);else G(B,F,W)},D6}var A6,uY;function mq(){if(uY)return A6;return uY=1,A6=["Float32Array","Float64Array","Int8Array","Int16Array","Int32Array","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array"],A6}var P6,dY;function lq(){if(dY)return P6;dY=1;var $=mq(),U=typeof globalThis>"u"?c0:globalThis;return P6=function(){var Z=[];for(var J=0;J<$.length;J++)if(typeof U[$[J]]==="function")Z[Z.length]=$[J];return Z},P6}var T6={exports:{}},C6,cY;function aq(){if(cY)return C6;cY=1;var $=e1(),U=GQ(),Y=t1(),Z=I1();return C6=function(G,X,Q){if(!G||typeof G!=="object"&&typeof G!=="function")throw new Y("`obj` must be an object or a function`");if(typeof X!=="string"&&typeof X!=="symbol")throw new Y("`property` must be a string or a symbol`");if(arguments.length>3&&typeof arguments[3]!=="boolean"&&arguments[3]!==null)throw new Y("`nonEnumerable`, if provided, must be a boolean or null");if(arguments.length>4&&typeof arguments[4]!=="boolean"&&arguments[4]!==null)throw new Y("`nonWritable`, if provided, must be a boolean or null");if(arguments.length>5&&typeof arguments[5]!=="boolean"&&arguments[5]!==null)throw new Y("`nonConfigurable`, if provided, must be a boolean or null");if(arguments.length>6&&typeof arguments[6]!=="boolean")throw new Y("`loose`, if provided, must be a boolean");var B=arguments.length>3?arguments[3]:null,F=arguments.length>4?arguments[4]:null,z=arguments.length>5?arguments[5]:null,W=arguments.length>6?arguments[6]:!1,k=!!Z&&Z(G,X);if($)$(G,X,{configurable:z===null&&k?k.configurable:!z,enumerable:B===null&&k?k.enumerable:!B,value:Q,writable:F===null&&k?k.writable:!F});else if(W||!B&&!F&&!z)G[X]=Q;else throw new U("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.")},C6}var O6,mY;function pq(){if(mY)return O6;mY=1;var $=e1(),U=function(){return!!$};return U.hasArrayLengthDefineBug=function(){if(!$)return null;try{return $([],"length",{value:1}).length!==1}catch(Z){return!0}},O6=U,O6}var k6,lY;function iq(){if(lY)return k6;lY=1;var $=BQ(),U=aq(),Y=pq()(),Z=I1(),J=t1(),G=$("%Math.floor%");return k6=function(Q,B){if(typeof Q!=="function")throw new J("`fn` is not a function");if(typeof B!=="number"||B<0||B>4294967295||G(B)!==B)throw new J("`length` must be a positive 32-bit integer");var F=arguments.length>2&&!!arguments[2],z=!0,W=!0;if("length"in Q&&Z){var k=Z(Q,"length");if(k&&!k.configurable)z=!1;if(k&&!k.writable)W=!1}if(z||W||!F)if(Y)U(Q,"length",B,!0,!0);else U(Q,"length",B);return Q},k6}var E6,aY;function rq(){if(aY)return E6;aY=1;var $=w1(),U=u9(),Y=XQ();return E6=function(){return Y($,U,arguments)},E6}var pY;function sq(){if(pY)return T6.exports;return pY=1,function($){var U=iq(),Y=e1(),Z=d9(),J=rq();if($.exports=function(X){var Q=Z(arguments),B=X.length-(arguments.length-1);return U(Q,1+(B>0?B:0),!0)},Y)Y($.exports,"apply",{value:J});else $.exports.apply=J}(T6),T6.exports}var S6,iY;function MQ(){if(iY)return S6;iY=1;var $=cq(),U=lq(),Y=sq(),Z=LQ(),J=I1(),G=VQ(),X=Z("Object.prototype.toString"),Q=f9()(),B=typeof globalThis>"u"?c0:globalThis,F=U(),z=Z("String.prototype.slice"),W=Z("Array.prototype.indexOf",!0)||function(O,V){for(var j=0;j-1)return V;if(V!=="Object")return!1;return C(O)}if(!J)return null;return D(O)},S6}var v6,rY;function nq(){if(rY)return v6;rY=1;var $=MQ();return v6=function(Y){return!!$(Y)},v6}var sY;function oq(){if(sY)return x8;return sY=1,function($){var U=hq(),Y=uq(),Z=MQ(),J=nq();function G(w){return w.call.bind(w)}var X=typeof BigInt<"u",Q=typeof Symbol<"u",B=G(Object.prototype.toString),F=G(Number.prototype.valueOf),z=G(String.prototype.valueOf),W=G(Boolean.prototype.valueOf);if(X)var k=G(BigInt.prototype.valueOf);if(Q)var D=G(Symbol.prototype.valueOf);function C(w,x){if(typeof w!=="object")return!1;try{return x(w),!0}catch(l){return!1}}$.isArgumentsObject=U,$.isGeneratorFunction=Y,$.isTypedArray=J;function H(w){return typeof Promise<"u"&&w instanceof Promise||w!==null&&typeof w==="object"&&typeof w.then==="function"&&typeof w.catch==="function"}$.isPromise=H;function O(w){if(typeof ArrayBuffer<"u"&&ArrayBuffer.isView)return ArrayBuffer.isView(w);return J(w)||r(w)}$.isArrayBufferView=O;function V(w){return Z(w)==="Uint8Array"}$.isUint8Array=V;function j(w){return Z(w)==="Uint8ClampedArray"}$.isUint8ClampedArray=j;function M(w){return Z(w)==="Uint16Array"}$.isUint16Array=M;function L(w){return Z(w)==="Uint32Array"}$.isUint32Array=L;function A(w){return Z(w)==="Int8Array"}$.isInt8Array=A;function y(w){return Z(w)==="Int16Array"}$.isInt16Array=y;function g(w){return Z(w)==="Int32Array"}$.isInt32Array=g;function d(w){return Z(w)==="Float32Array"}$.isFloat32Array=d;function E(w){return Z(w)==="Float64Array"}$.isFloat64Array=E;function s(w){return Z(w)==="BigInt64Array"}$.isBigInt64Array=s;function V0(w){return Z(w)==="BigUint64Array"}$.isBigUint64Array=V0;function S(w){return B(w)==="[object Map]"}S.working=typeof Map<"u"&&S(new Map);function h(w){if(typeof Map>"u")return!1;return S.working?S(w):w instanceof Map}$.isMap=h;function N(w){return B(w)==="[object Set]"}N.working=typeof Set<"u"&&N(new Set);function a(w){if(typeof Set>"u")return!1;return N.working?N(w):w instanceof Set}$.isSet=a;function $0(w){return B(w)==="[object WeakMap]"}$0.working=typeof WeakMap<"u"&&$0(new WeakMap);function m(w){if(typeof WeakMap>"u")return!1;return $0.working?$0(w):w instanceof WeakMap}$.isWeakMap=m;function J0(w){return B(w)==="[object WeakSet]"}J0.working=typeof WeakSet<"u"&&J0(new WeakSet);function U0(w){return J0(w)}$.isWeakSet=U0;function L0(w){return B(w)==="[object ArrayBuffer]"}L0.working=typeof ArrayBuffer<"u"&&L0(new ArrayBuffer);function i(w){if(typeof ArrayBuffer>"u")return!1;return L0.working?L0(w):w instanceof ArrayBuffer}$.isArrayBuffer=i;function _(w){return B(w)==="[object DataView]"}_.working=typeof ArrayBuffer<"u"&&typeof DataView<"u"&&_(new DataView(new ArrayBuffer(1),0,1));function r(w){if(typeof DataView>"u")return!1;return _.working?_(w):w instanceof DataView}$.isDataView=r;var n=typeof SharedArrayBuffer<"u"?SharedArrayBuffer:void 0;function Z0(w){return B(w)==="[object SharedArrayBuffer]"}function p(w){if(typeof n>"u")return!1;if(typeof Z0.working>"u")Z0.working=Z0(new n);return Z0.working?Z0(w):w instanceof n}$.isSharedArrayBuffer=p;function P(w){return B(w)==="[object AsyncFunction]"}$.isAsyncFunction=P;function R(w){return B(w)==="[object Map Iterator]"}$.isMapIterator=R;function c(w){return B(w)==="[object Set Iterator]"}$.isSetIterator=c;function f(w){return B(w)==="[object Generator]"}$.isGeneratorObject=f;function v(w){return B(w)==="[object WebAssembly.Module]"}$.isWebAssemblyCompiledModule=v;function b(w){return C(w,F)}$.isNumberObject=b;function e(w){return C(w,z)}$.isStringObject=e;function I(w){return C(w,W)}$.isBooleanObject=I;function t(w){return X&&C(w,k)}$.isBigIntObject=t;function T(w){return Q&&C(w,D)}$.isSymbolObject=T;function K(w){return b(w)||e(w)||I(w)||t(w)||T(w)}$.isBoxedPrimitive=K;function q(w){return typeof Uint8Array<"u"&&(i(w)||p(w))}$.isAnyArrayBuffer=q,["isProxy","isExternal","isModuleNamespaceObject"].forEach(function(w){Object.defineProperty($,w,{enumerable:!1,value:function(){throw Error(w+" is not supported in userland")}})})}(x8),x8}var _6,nY;function tq(){if(nY)return _6;return nY=1,_6=function(U){return U&&typeof U==="object"&&typeof U.copy==="function"&&typeof U.fill==="function"&&typeof U.readUInt8==="function"},_6}var oY;function IQ(){if(oY)return g8;return oY=1,function($){var U=Object.getOwnPropertyDescriptors||function(r){var n=Object.keys(r),Z0={};for(var p=0;p=p)return c;switch(c){case"%s":return String(Z0[n++]);case"%d":return Number(Z0[n++]);case"%j":try{return JSON.stringify(Z0[n++])}catch(f){return"[Circular]"}default:return c}});for(var R=Z0[n];n"u")return function(){return $.deprecate(_,r).apply(this,arguments)};var n=!1;function Z0(){if(!n){if(j0.throwDeprecation)throw Error(r);else if(j0.traceDeprecation)console.trace(r);else console.error(r);n=!0}return _.apply(this,arguments)}return Z0};var Z={},J=/^$/;if(j0.env.NODE_DEBUG){var G=j0.env.NODE_DEBUG;G=G.replace(/[|\\{}()[\]^$+?.]/g,"\\$&").replace(/\*/g,".*").replace(/,/g,"$|^").toUpperCase(),J=new RegExp("^"+G+"$","i")}$.debuglog=function(_){if(_=_.toUpperCase(),!Z[_])if(J.test(_)){var r=j0.pid;Z[_]=function(){var n=$.format.apply($,arguments);console.error("%s %d: %s",_,r,n)}}else Z[_]=function(){};return Z[_]};function X(_,r){var n={seen:[],stylize:B};if(arguments.length>=3)n.depth=arguments[2];if(arguments.length>=4)n.colors=arguments[3];if(V(r))n.showHidden=r;else if(r)$._extend(n,r);if(g(n.showHidden))n.showHidden=!1;if(g(n.depth))n.depth=2;if(g(n.colors))n.colors=!1;if(g(n.customInspect))n.customInspect=!0;if(n.colors)n.stylize=Q;return z(n,_,n.depth)}$.inspect=X,X.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},X.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"};function Q(_,r){var n=X.styles[r];if(n)return"\x1B["+X.colors[n][0]+"m"+_+"\x1B["+X.colors[n][1]+"m";else return _}function B(_,r){return _}function F(_){var r={};return _.forEach(function(n,Z0){r[n]=!0}),r}function z(_,r,n){if(_.customInspect&&r&&S(r.inspect)&&r.inspect!==$.inspect&&!(r.constructor&&r.constructor.prototype===r)){var Z0=r.inspect(n,_);if(!A(Z0))Z0=z(_,Z0,n);return Z0}var p=W(_,r);if(p)return p;var P=Object.keys(r),R=F(P);if(_.showHidden)P=Object.getOwnPropertyNames(r);if(V0(r)&&(P.indexOf("message")>=0||P.indexOf("description")>=0))return k(r);if(P.length===0){if(S(r)){var c=r.name?": "+r.name:"";return _.stylize("[Function"+c+"]","special")}if(d(r))return _.stylize(RegExp.prototype.toString.call(r),"regexp");if(s(r))return _.stylize(Date.prototype.toString.call(r),"date");if(V0(r))return k(r)}var f="",v=!1,b=["{","}"];if(O(r))v=!0,b=["[","]"];if(S(r)){var e=r.name?": "+r.name:"";f=" [Function"+e+"]"}if(d(r))f=" "+RegExp.prototype.toString.call(r);if(s(r))f=" "+Date.prototype.toUTCString.call(r);if(V0(r))f=" "+k(r);if(P.length===0&&(!v||r.length==0))return b[0]+f+b[1];if(n<0)if(d(r))return _.stylize(RegExp.prototype.toString.call(r),"regexp");else return _.stylize("[Object]","special");_.seen.push(r);var I;if(v)I=D(_,r,n,R,P);else I=P.map(function(t){return C(_,r,n,R,t,v)});return _.seen.pop(),H(I,f,b)}function W(_,r){if(g(r))return _.stylize("undefined","undefined");if(A(r)){var n="'"+JSON.stringify(r).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return _.stylize(n,"string")}if(L(r))return _.stylize(""+r,"number");if(V(r))return _.stylize(""+r,"boolean");if(j(r))return _.stylize("null","null")}function k(_){return"["+Error.prototype.toString.call(_)+"]"}function D(_,r,n,Z0,p){var P=[];for(var R=0,c=r.length;R-1)if(P)c=c.split(` `).map(function(v){return" "+v}).join(` `).slice(2);else c=` `+c.split(` `).map(function(v){return" "+v}).join(` -`)}else c=_.stylize("[Circular]","special");if(g(N)){if(P&&p.match(/^\d+$/))return c;if(N=JSON.stringify(""+p),N.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/))N=N.slice(1,-1),N=_.stylize(N,"name");else N=N.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),N=_.stylize(N,"string")}return N+": "+c}function H(_,r,n){var Z0=_.reduce(function(p,P){if(P.indexOf(` +`)}else c=_.stylize("[Circular]","special");if(g(R)){if(P&&p.match(/^\d+$/))return c;if(R=JSON.stringify(""+p),R.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/))R=R.slice(1,-1),R=_.stylize(R,"name");else R=R.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),R=_.stylize(R,"string")}return R+": "+c}function H(_,r,n){var Z0=_.reduce(function(p,P){if(P.indexOf(` `)>=0);return p+P.replace(/\u001b\[\d\d?m/g,"").length+1},0);if(Z0>60)return n[0]+(r===""?"":r+` `)+" "+_.join(`, - `)+" "+n[1];return n[0]+r+" "+_.join(", ")+" "+n[1]}U.types=aw();function O(_){return Array.isArray(_)}U.isArray=O;function X(_){return typeof _==="boolean"}U.isBoolean=X;function j(_){return _===null}U.isNull=j;function L(_){return _==null}U.isNullOrUndefined=L;function I(_){return typeof _==="number"}U.isNumber=I;function A(_){return typeof _==="string"}U.isString=A;function y(_){return typeof _==="symbol"}U.isSymbol=y;function g(_){return _===void 0}U.isUndefined=g;function d(_){return k(_)&&F(_)==="[object RegExp]"}U.isRegExp=d,U.types.isRegExp=d;function k(_){return typeof _==="object"&&_!==null}U.isObject=k;function s(_){return k(_)&&F(_)==="[object Date]"}U.isDate=s,U.types.isDate=s;function q0(_){return k(_)&&(F(_)==="[object Error]"||_ instanceof Error)}U.isError=q0,U.types.isNativeError=q0;function S(_){return typeof _==="function"}U.isFunction=S;function h(_){return _===null||typeof _==="boolean"||typeof _==="number"||typeof _==="string"||typeof _==="symbol"||typeof _==="undefined"}U.isPrimitive=h,U.isBuffer=pw();function F(_){return Object.prototype.toString.call(_)}function a(_){return _<10?"0"+_.toString(10):_.toString(10)}var U0=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function m(){var _=new Date,r=[a(_.getHours()),a(_.getMinutes()),a(_.getSeconds())].join(":");return[_.getDate(),U0[_.getMonth()],r].join(" ")}U.log=function(){console.log("%s - %s",m(),U.format.apply(U,arguments))},U.inherits=R1(),U._extend=function(_,r){if(!r||!k(r))return _;var n=Object.keys(r),Z0=n.length;while(Z0--)_[n[Z0]]=r[n[Z0]];return _};function J0(_,r){return Object.prototype.hasOwnProperty.call(_,r)}var $0=typeof Symbol!=="undefined"?Symbol("util.promisify.custom"):void 0;U.promisify=function _(r){if(typeof r!=="function")throw new TypeError('The "original" argument must be of type Function');if($0&&r[$0]){var n=r[$0];if(typeof n!=="function")throw new TypeError('The "util.promisify.custom" argument must be of type Function');return Object.defineProperty(n,$0,{value:n,enumerable:!1,writable:!1,configurable:!0}),n}function n(){var Z0,p,P=new Promise(function(f,v){Z0=f,p=v}),N=[];for(var c=0;c0)this.tail.next=X;else this.head=X;this.tail=X,++this.length}},{key:"unshift",value:function H(O){var X={data:O,next:this.head};if(this.length===0)this.tail=X;this.head=X,++this.length}},{key:"shift",value:function H(){if(this.length===0)return;var O=this.head.data;if(this.length===1)this.head=this.tail=null;else this.head=this.head.next;return--this.length,O}},{key:"clear",value:function H(){this.head=this.tail=null,this.length=0}},{key:"join",value:function H(O){if(this.length===0)return"";var X=this.head,j=""+X.data;while(X=X.next)j+=O+X.data;return j}},{key:"concat",value:function H(O){if(this.length===0)return z.alloc(0);var X=z.allocUnsafe(O>>>0),j=this.head,L=0;while(j)D(j.data,X,L),L+=j.data.length,j=j.next;return X}},{key:"consume",value:function H(O,X){var j;if(OI.length?I.length:O;if(A===I.length)L+=I;else L+=I.slice(0,O);if(O-=A,O===0){if(A===I.length)if(++j,X.next)this.head=X.next;else this.head=this.tail=null;else this.head=X,X.data=I.slice(A);break}++j}return this.length-=j,L}},{key:"_getBuffer",value:function H(O){var X=z.allocUnsafe(O),j=this.head,L=1;j.data.copy(X),O-=j.data.length;while(j=j.next){var I=j.data,A=O>I.length?I.length:O;if(I.copy(X,X.length-O,0,A),O-=A,O===0){if(A===I.length)if(++L,j.next)this.head=j.next;else this.head=this.tail=null;else this.head=j,j.data=I.slice(A);break}++L}return this.length-=L,X}},{key:E,value:function H(O,X){return W(this,$($({},X),{},{depth:0,customInspect:!1}))}}]),C}(),y8}var b8,eY;function MQ(){if(eY)return b8;eY=1;function U(w,Q){var q=this,z=this._readableState&&this._readableState.destroyed,R=this._writableState&&this._writableState.destroyed;if(z||R){if(Q)Q(w);else if(w){if(!this._writableState)j0.nextTick(J,this,w);else if(!this._writableState.errorEmitted)this._writableState.errorEmitted=!0,j0.nextTick(J,this,w)}return this}if(this._readableState)this._readableState.destroyed=!0;if(this._writableState)this._writableState.destroyed=!0;return this._destroy(w||null,function(W){if(!Q&&W)if(!q._writableState)j0.nextTick($,q,W);else if(!q._writableState.errorEmitted)q._writableState.errorEmitted=!0,j0.nextTick($,q,W);else j0.nextTick(Y,q);else if(Q)j0.nextTick(Y,q),Q(W);else j0.nextTick(Y,q)}),this}function $(w,Q){J(w,Q),Y(w)}function Y(w){if(w._writableState&&!w._writableState.emitClose)return;if(w._readableState&&!w._readableState.emitClose)return;w.emit("close")}function Z(){if(this._readableState)this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1;if(this._writableState)this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1}function J(w,Q){w.emit("error",Q)}function G(w,Q){var{_readableState:q,_writableState:z}=w;if(q&&q.autoDestroy||z&&z.autoDestroy)w.destroy(Q);else w.emit("error",Q)}return b8={destroy:U,undestroy:Z,errorOrDestroy:G},b8}var g8={},UZ;function i1(){if(UZ)return g8;UZ=1;function U(Q,q){Q.prototype=Object.create(q.prototype),Q.prototype.constructor=Q,Q.__proto__=q}var $={};function Y(Q,q,z){if(!z)z=Error;function R(E,D,C){if(typeof q==="string")return q;else return q(E,D,C)}var W=function(E){U(D,E);function D(C,H,O){return E.call(this,R(C,H,O))||this}return D}(z);W.prototype.name=z.name,W.prototype.code=Q,$[Q]=W}function Z(Q,q){if(Array.isArray(Q)){var z=Q.length;if(Q=Q.map(function(R){return String(R)}),z>2)return"one of ".concat(q," ").concat(Q.slice(0,z-1).join(", "),", or ")+Q[z-1];else if(z===2)return"one of ".concat(q," ").concat(Q[0]," or ").concat(Q[1]);else return"of ".concat(q," ").concat(Q[0])}else return"of ".concat(q," ").concat(String(Q))}function J(Q,q,z){return Q.substr(0,q.length)===q}function G(Q,q,z){if(z===void 0||z>Q.length)z=Q.length;return Q.substring(z-q.length,z)===q}function w(Q,q,z){if(typeof z!=="number")z=0;if(z+q.length>Q.length)return!1;else return Q.indexOf(q,z)!==-1}return Y("ERR_INVALID_OPT_VALUE",function(Q,q){return'The value "'+q+'" is invalid for option "'+Q+'"'},TypeError),Y("ERR_INVALID_ARG_TYPE",function(Q,q,z){var R;if(typeof q==="string"&&J(q,"not "))R="must not be",q=q.replace(/^not /,"");else R="must be";var W;if(G(Q," argument"))W="The ".concat(Q," ").concat(R," ").concat(Z(q,"type"));else{var E=w(Q,".")?"property":"argument";W='The "'.concat(Q,'" ').concat(E," ").concat(R," ").concat(Z(q,"type"))}return W+=". Received type ".concat(typeof z),W},TypeError),Y("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),Y("ERR_METHOD_NOT_IMPLEMENTED",function(Q){return"The "+Q+" method is not implemented"}),Y("ERR_STREAM_PREMATURE_CLOSE","Premature close"),Y("ERR_STREAM_DESTROYED",function(Q){return"Cannot call "+Q+" after a stream was destroyed"}),Y("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),Y("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),Y("ERR_STREAM_WRITE_AFTER_END","write after end"),Y("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),Y("ERR_UNKNOWN_ENCODING",function(Q){return"Unknown encoding: "+Q},TypeError),Y("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),g8.codes=$,g8}var x8,$Z;function WQ(){if($Z)return x8;$Z=1;var U=i1().codes.ERR_INVALID_OPT_VALUE;function $(Z,J,G){return Z.highWaterMark!=null?Z.highWaterMark:J?Z[G]:null}function Y(Z,J,G,w){var Q=$(J,w,G);if(Q!=null){if(!(isFinite(Q)&&Math.floor(Q)===Q)||Q<0){var q=w?G:"highWaterMark";throw new U(q,Q)}return Math.floor(Q)}return Z.objectMode?16:16384}return x8={getHighWaterMark:Y},x8}var f8,YZ;function rw(){if(YZ)return f8;YZ=1,f8=U;function U(Y,Z){if($("noDeprecation"))return Y;var J=!1;function G(){if(!J){if($("throwDeprecation"))throw new Error(Z);else if($("traceDeprecation"))console.trace(Z);else console.warn(Z);J=!0}return Y.apply(this,arguments)}return G}function $(Y){try{if(!c0.localStorage)return!1}catch(J){return!1}var Z=c0.localStorage[Y];if(Z==null)return!1;return String(Z).toLowerCase()==="true"}return f8}var h8,ZZ;function HQ(){if(ZZ)return h8;ZZ=1,h8=d;function U(p){var P=this;this.next=null,this.entry=null,this.finish=function(){Z0(P,p)}}var $;d.WritableState=y;var Y={deprecate:rw()},Z=ZQ(),J=o2().Buffer,G=(typeof c0!=="undefined"?c0:typeof window!=="undefined"?window:typeof self!=="undefined"?self:{}).Uint8Array||function(){};function w(p){return J.from(p)}function Q(p){return J.isBuffer(p)||p instanceof G}var q=MQ(),z=WQ(),R=z.getHighWaterMark,W=i1().codes,E=W.ERR_INVALID_ARG_TYPE,D=W.ERR_METHOD_NOT_IMPLEMENTED,C=W.ERR_MULTIPLE_CALLBACK,H=W.ERR_STREAM_CANNOT_PIPE,O=W.ERR_STREAM_DESTROYED,X=W.ERR_STREAM_NULL_VALUES,j=W.ERR_STREAM_WRITE_AFTER_END,L=W.ERR_UNKNOWN_ENCODING,I=q.errorOrDestroy;R1()(d,Z);function A(){}function y(p,P,N){if($=$||l1(),p=p||{},typeof N!=="boolean")N=P instanceof $;if(this.objectMode=!!p.objectMode,N)this.objectMode=this.objectMode||!!p.writableObjectMode;this.highWaterMark=R(this,p,"writableHighWaterMark",N),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var c=p.decodeStrings===!1;this.decodeStrings=!c,this.defaultEncoding=p.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(f){U0(P,f)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=p.emitClose!==!1,this.autoDestroy=!!p.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new U(this)}y.prototype.getBuffer=function p(){var P=this.bufferedRequest,N=[];while(P)N.push(P),P=P.next;return N},function(){try{Object.defineProperty(y.prototype,"buffer",{get:Y.deprecate(function p(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(p){}}();var g;if(typeof Symbol==="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==="function")g=Function.prototype[Symbol.hasInstance],Object.defineProperty(d,Symbol.hasInstance,{value:function p(P){if(g.call(this,P))return!0;if(this!==d)return!1;return P&&P._writableState instanceof y}});else g=function p(P){return P instanceof this};function d(p){$=$||l1();var P=this instanceof $;if(!P&&!g.call(d,this))return new d(p);if(this._writableState=new y(p,this,P),this.writable=!0,p){if(typeof p.write==="function")this._write=p.write;if(typeof p.writev==="function")this._writev=p.writev;if(typeof p.destroy==="function")this._destroy=p.destroy;if(typeof p.final==="function")this._final=p.final}Z.call(this)}d.prototype.pipe=function(){I(this,new H)};function k(p,P){var N=new j;I(p,N),j0.nextTick(P,N)}function s(p,P,N,c){var f;if(N===null)f=new X;else if(typeof N!=="string"&&!P.objectMode)f=new E("chunk",["string","Buffer"],N);if(f)return I(p,f),j0.nextTick(c,f),!1;return!0}d.prototype.write=function(p,P,N){var c=this._writableState,f=!1,v=!c.objectMode&&Q(p);if(v&&!J.isBuffer(p))p=w(p);if(typeof P==="function")N=P,P=null;if(v)P="buffer";else if(!P)P=c.defaultEncoding;if(typeof N!=="function")N=A;if(c.ending)k(this,N);else if(v||s(this,c,p,N))c.pendingcb++,f=S(this,c,v,p,P,N);return f},d.prototype.cork=function(){this._writableState.corked++},d.prototype.uncork=function(){var p=this._writableState;if(p.corked){if(p.corked--,!p.writing&&!p.corked&&!p.bufferProcessing&&p.bufferedRequest)$0(this,p)}},d.prototype.setDefaultEncoding=function p(P){if(typeof P==="string")P=P.toLowerCase();if(!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((P+"").toLowerCase())>-1))throw new L(P);return this._writableState.defaultEncoding=P,this},Object.defineProperty(d.prototype,"writableBuffer",{enumerable:!1,get:function p(){return this._writableState&&this._writableState.getBuffer()}});function q0(p,P,N){if(!p.objectMode&&p.decodeStrings!==!1&&typeof P==="string")P=J.from(P,N);return P}Object.defineProperty(d.prototype,"writableHighWaterMark",{enumerable:!1,get:function p(){return this._writableState.highWaterMark}});function S(p,P,N,c,f,v){if(!N){var b=q0(P,c,f);if(c!==b)N=!0,f="buffer",c=b}var e=P.objectMode?1:c.length;P.length+=e;var V=P.length>5===6)return 2;else if(X>>4===14)return 3;else if(X>>3===30)return 4;return X>>6===2?-1:-2}function w(X,j,L){var I=j.length-1;if(I=0){if(A>0)X.lastNeed=A-1;return A}if(--I=0){if(A>0)X.lastNeed=A-2;return A}if(--I=0){if(A>0)if(A===2)A=0;else X.lastNeed=A-3;return A}return 0}function Q(X,j,L){if((j[0]&192)!==128)return X.lastNeed=0,"�";if(X.lastNeed>1&&j.length>1){if((j[1]&192)!==128)return X.lastNeed=1,"�";if(X.lastNeed>2&&j.length>2){if((j[2]&192)!==128)return X.lastNeed=2,"�"}}}function q(X){var j=this.lastTotal-this.lastNeed,L=Q(this,X);if(L!==void 0)return L;if(this.lastNeed<=X.length)return X.copy(this.lastChar,j,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);X.copy(this.lastChar,j,0,X.length),this.lastNeed-=X.length}function z(X,j){var L=w(this,X,j);if(!this.lastNeed)return X.toString("utf8",j);this.lastTotal=L;var I=X.length-(L-this.lastNeed);return X.copy(this.lastChar,0,I),X.toString("utf8",j,I)}function R(X){var j=X&&X.length?this.write(X):"";if(this.lastNeed)return j+"�";return j}function W(X,j){if((X.length-j)%2===0){var L=X.toString("utf16le",j);if(L){var I=L.charCodeAt(L.length-1);if(I>=55296&&I<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=X[X.length-2],this.lastChar[1]=X[X.length-1],L.slice(0,-1)}return L}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=X[X.length-1],X.toString("utf16le",j,X.length-1)}function E(X){var j=X&&X.length?this.write(X):"";if(this.lastNeed){var L=this.lastTotal-this.lastNeed;return j+this.lastChar.toString("utf16le",0,L)}return j}function D(X,j){var L=(X.length-j)%3;if(L===0)return X.toString("base64",j);if(this.lastNeed=3-L,this.lastTotal=3,L===1)this.lastChar[0]=X[X.length-1];else this.lastChar[0]=X[X.length-2],this.lastChar[1]=X[X.length-1];return X.toString("base64",j,X.length-L)}function C(X){var j=X&&X.length?this.write(X):"";if(this.lastNeed)return j+this.lastChar.toString("base64",0,3-this.lastNeed);return j}function H(X){return X.toString(this.encoding)}function O(X){return X&&X.length?this.write(X):""}return d8}var c8,KZ;function c9(){if(KZ)return c8;KZ=1;var U=i1().codes.ERR_STREAM_PREMATURE_CLOSE;function $(G){var w=!1;return function(){if(w)return;w=!0;for(var Q=arguments.length,q=new Array(Q),z=0;z0){if(typeof b!=="string"&&!T.objectMode&&Object.getPrototypeOf(b)!==Z.prototype)b=G(b);if(V)if(T.endEmitted)A(v,new X);else q0(v,T,b,!0);else if(T.ended)A(v,new H);else if(T.destroyed)return!1;else if(T.reading=!1,T.decoder&&!e)if(b=T.decoder.write(b),T.objectMode||b.length!==0)q0(v,T,b,!1);else $0(v,T);else q0(v,T,b,!1)}else if(!V)T.reading=!1,$0(v,T)}return!T.ended&&(T.length=h)v=h;else v--,v|=v>>>1,v|=v>>>2,v|=v>>>4,v|=v>>>8,v|=v>>>16,v++;return v}function a(v,b){if(v<=0||b.length===0&&b.ended)return 0;if(b.objectMode)return 1;if(v!==v)if(b.flowing&&b.length)return b.buffer.head.data.length;else return b.length;if(v>b.highWaterMark)b.highWaterMark=F(v);if(v<=b.length)return v;if(!b.ended)return b.needReadable=!0,0;return b.length}k.prototype.read=function(v){q("read",v),v=parseInt(v,10);var b=this._readableState,e=v;if(v!==0)b.emittedReadable=!1;if(v===0&&b.needReadable&&((b.highWaterMark!==0?b.length>=b.highWaterMark:b.length>0)||b.ended)){if(q("read: emitReadable",b.length,b.ended),b.length===0&&b.ended)N(this);else m(this);return null}if(v=a(v,b),v===0&&b.ended){if(b.length===0)N(this);return null}var V=b.needReadable;if(q("need readable",V),b.length===0||b.length-v0)t=P(v,b);else t=null;if(t===null)b.needReadable=b.length<=b.highWaterMark,v=0;else b.length-=v,b.awaitDrain=0;if(b.length===0){if(!b.ended)b.needReadable=!0;if(e!==v&&b.ended)N(this)}if(t!==null)this.emit("data",t);return t};function U0(v,b){if(q("onEofChunk"),b.ended)return;if(b.decoder){var e=b.decoder.end();if(e&&e.length)b.buffer.push(e),b.length+=b.objectMode?1:e.length}if(b.ended=!0,b.sync)m(v);else if(b.needReadable=!1,!b.emittedReadable)b.emittedReadable=!0,J0(v)}function m(v){var b=v._readableState;if(q("emitReadable",b.needReadable,b.emittedReadable),b.needReadable=!1,!b.emittedReadable)q("emitReadable",b.flowing),b.emittedReadable=!0,j0.nextTick(J0,v)}function J0(v){var b=v._readableState;if(q("emitReadable_",b.destroyed,b.length,b.ended),!b.destroyed&&(b.length||b.ended))v.emit("readable"),b.emittedReadable=!1;b.needReadable=!b.flowing&&!b.ended&&b.length<=b.highWaterMark,p(v)}function $0(v,b){if(!b.readingMore)b.readingMore=!0,j0.nextTick(I0,v,b)}function I0(v,b){while(!b.reading&&!b.ended&&(b.length1&&f(V.pipes,v)!==-1)&&!x)q("false write response, pause",V.awaitDrain),V.awaitDrain++;e.pause()}}function Q0(M0){if(q("onerror",M0),L0(),v.removeListener("error",Q0),$(v,"error")===0)A(v,M0)}g(v,"error",Q0);function w0(){v.removeListener("finish",K0),L0()}v.once("close",w0);function K0(){q("onfinish"),v.removeListener("close",w0),L0()}v.once("finish",K0);function L0(){q("unpipe"),e.unpipe(v)}if(v.emit("pipe",e),!V.flowing)q("pipe resume"),e.resume();return v};function i(v){return function b(){var e=v._readableState;if(q("pipeOnDrain",e.awaitDrain),e.awaitDrain)e.awaitDrain--;if(e.awaitDrain===0&&$(v,"data"))e.flowing=!0,p(v)}}k.prototype.unpipe=function(v){var b=this._readableState,e={hasUnpiped:!1};if(b.pipesCount===0)return this;if(b.pipesCount===1){if(v&&v!==b.pipes)return this;if(!v)v=b.pipes;if(b.pipes=null,b.pipesCount=0,b.flowing=!1,v)v.emit("unpipe",this,e);return this}if(!v){var{pipes:V,pipesCount:t}=b;b.pipes=null,b.pipesCount=0,b.flowing=!1;for(var T=0;T0,V.flowing!==!1)this.resume()}else if(v==="readable"){if(!V.endEmitted&&!V.readableListening){if(V.readableListening=V.needReadable=!0,V.flowing=!1,V.emittedReadable=!1,q("on readable",V.length,V.reading),V.length)m(this);else if(!V.reading)j0.nextTick(r,this)}}return e},k.prototype.addListener=k.prototype.on,k.prototype.removeListener=function(v,b){var e=Y.prototype.removeListener.call(this,v,b);if(v==="readable")j0.nextTick(_,this);return e},k.prototype.removeAllListeners=function(v){var b=Y.prototype.removeAllListeners.apply(this,arguments);if(v==="readable"||v===void 0)j0.nextTick(_,this);return b};function _(v){var b=v._readableState;if(b.readableListening=v.listenerCount("readable")>0,b.resumeScheduled&&!b.paused)b.flowing=!0;else if(v.listenerCount("data")>0)v.resume()}function r(v){q("readable nexttick read 0"),v.read(0)}k.prototype.resume=function(){var v=this._readableState;if(!v.flowing)q("resume"),v.flowing=!v.readableListening,n(this,v);return v.paused=!1,this};function n(v,b){if(!b.resumeScheduled)b.resumeScheduled=!0,j0.nextTick(Z0,v,b)}function Z0(v,b){if(q("resume",b.reading),!b.reading)v.read(0);if(b.resumeScheduled=!1,v.emit("resume"),p(v),b.flowing&&!b.reading)v.read(0)}k.prototype.pause=function(){if(q("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1)q("pause"),this._readableState.flowing=!1,this.emit("pause");return this._readableState.paused=!0,this};function p(v){var b=v._readableState;q("flow",b.flowing);while(b.flowing&&v.read()!==null);}if(k.prototype.wrap=function(v){var b=this,e=this._readableState,V=!1;v.on("end",function(){if(q("wrapped end"),e.decoder&&!e.ended){var K=e.decoder.end();if(K&&K.length)b.push(K)}b.push(null)}),v.on("data",function(K){if(q("wrapped data"),e.decoder)K=e.decoder.write(K);if(e.objectMode&&(K===null||K===void 0))return;else if(!e.objectMode&&(!K||!K.length))return;var B=b.push(K);if(!B)V=!0,v.pause()});for(var t in v)if(this[t]===void 0&&typeof v[t]==="function")this[t]=function K(B){return function M(){return v[B].apply(v,arguments)}}(t);for(var T=0;T=b.length){if(b.decoder)e=b.buffer.join("");else if(b.buffer.length===1)e=b.buffer.first();else e=b.buffer.concat(b.length);b.buffer.clear()}else e=b.buffer.consume(v,b.decoder);return e}function N(v){var b=v._readableState;if(q("endReadable",b.endEmitted),!b.endEmitted)b.ended=!0,j0.nextTick(c,b,v)}function c(v,b){if(q("endReadableNT",v.endEmitted,v.length),!v.endEmitted&&v.length===0){if(v.endEmitted=!0,b.readable=!1,b.emit("end"),v.autoDestroy){var e=b._writableState;if(!e||e.autoDestroy&&e.finished)b.destroy()}}}if(typeof Symbol==="function")k.from=function(v,b){if(I===void 0)I=ow();return I(k,v,b)};function f(v,b){for(var e=0,V=v.length;e0;return Q(j,I,A,function(y){if(!O)O=y;if(y)X.forEach(q);if(I)return;X.forEach(q),H(O)})});return D.reduce(z)}return r8=W,r8}var s8,VZ;function m9(){if(VZ)return s8;VZ=1,s8=Y;var U=x9().EventEmitter,$=R1();$(Y,U),Y.Readable=jQ(),Y.Writable=HQ(),Y.Duplex=l1(),Y.Transform=zQ(),Y.PassThrough=tw(),Y.finished=c9(),Y.pipeline=ew(),Y.Stream=Y;function Y(){U.call(this)}return Y.prototype.pipe=function(Z,J){var G=this;function w(D){if(Z.writable){if(Z.write(D)===!1&&G.pause)G.pause()}}G.on("data",w);function Q(){if(G.readable&&G.resume)G.resume()}if(Z.on("drain",Q),!Z._isStdio&&(!J||J.end!==!1))G.on("end",z),G.on("close",R);var q=!1;function z(){if(q)return;q=!0,Z.end()}function R(){if(q)return;if(q=!0,typeof Z.destroy==="function")Z.destroy()}function W(D){if(E(),U.listenerCount(this,"error")===0)throw D}G.on("error",W),Z.on("error",W);function E(){G.removeListener("data",w),Z.removeListener("drain",Q),G.removeListener("end",z),G.removeListener("close",R),G.removeListener("error",W),Z.removeListener("error",W),G.removeListener("end",E),G.removeListener("close",E),Z.removeListener("close",E)}return G.on("end",E),G.on("close",E),Z.on("close",E),Z.emit("pipe",G),Z},s8}var MZ;function UB(){if(MZ)return _6;return MZ=1,function(U){(function($){$.parser=function(P,N){return new Z(P,N)},$.SAXParser=Z,$.SAXStream=R,$.createStream=z,$.MAX_BUFFER_LENGTH=65536;var Y=["comment","sgmlDecl","textNode","tagName","doctype","procInstName","procInstBody","entity","attribName","attribValue","cdata","script"];$.EVENTS=["text","processinginstruction","sgmldeclaration","doctype","comment","opentagstart","attribute","opentag","closetag","opencdata","cdata","closecdata","error","end","ready","script","opennamespace","closenamespace"];function Z(P,N){if(!(this instanceof Z))return new Z(P,N);var c=this;if(G(c),c.q=c.c="",c.bufferCheckPosition=$.MAX_BUFFER_LENGTH,c.opt=N||{},c.opt.lowercase=c.opt.lowercase||c.opt.lowercasetags,c.looseCase=c.opt.lowercase?"toLowerCase":"toUpperCase",c.tags=[],c.closed=c.closedRoot=c.sawRoot=!1,c.tag=c.error=null,c.strict=!!P,c.noscript=!!(P||c.opt.noscript),c.state=k.BEGIN,c.strictEntities=c.opt.strictEntities,c.ENTITIES=c.strictEntities?Object.create($.XML_ENTITIES):Object.create($.ENTITIES),c.attribList=[],c.opt.xmlns)c.ns=Object.create(H);if(c.trackPosition=c.opt.position!==!1,c.trackPosition)c.position=c.line=c.column=0;q0(c,"onready")}if(!Object.create)Object.create=function(P){function N(){}N.prototype=P;var c=new N;return c};if(!Object.keys)Object.keys=function(P){var N=[];for(var c in P)if(P.hasOwnProperty(c))N.push(c);return N};function J(P){var N=Math.max($.MAX_BUFFER_LENGTH,10),c=0;for(var f=0,v=Y.length;fN)switch(Y[f]){case"textNode":h(P);break;case"cdata":S(P,"oncdata",P.cdata),P.cdata="";break;case"script":S(P,"onscript",P.script),P.script="";break;default:a(P,"Max buffer length exceeded: "+Y[f])}c=Math.max(c,b)}var e=$.MAX_BUFFER_LENGTH-c;P.bufferCheckPosition=e+P.position}function G(P){for(var N=0,c=Y.length;N"||I(P)}function g(P,N){return P.test(N)}function d(P,N){return!g(P,N)}var k=0;$.STATE={BEGIN:k++,BEGIN_WHITESPACE:k++,TEXT:k++,TEXT_ENTITY:k++,OPEN_WAKA:k++,SGML_DECL:k++,SGML_DECL_QUOTED:k++,DOCTYPE:k++,DOCTYPE_QUOTED:k++,DOCTYPE_DTD:k++,DOCTYPE_DTD_QUOTED:k++,COMMENT_STARTING:k++,COMMENT:k++,COMMENT_ENDING:k++,COMMENT_ENDED:k++,CDATA:k++,CDATA_ENDING:k++,CDATA_ENDING_2:k++,PROC_INST:k++,PROC_INST_BODY:k++,PROC_INST_ENDING:k++,OPEN_TAG:k++,OPEN_TAG_SLASH:k++,ATTRIB:k++,ATTRIB_NAME:k++,ATTRIB_NAME_SAW_WHITE:k++,ATTRIB_VALUE:k++,ATTRIB_VALUE_QUOTED:k++,ATTRIB_VALUE_CLOSED:k++,ATTRIB_VALUE_UNQUOTED:k++,ATTRIB_VALUE_ENTITY_Q:k++,ATTRIB_VALUE_ENTITY_U:k++,CLOSE_TAG:k++,CLOSE_TAG_SAW_WHITE:k++,SCRIPT:k++,SCRIPT_ENDING:k++},$.XML_ENTITIES={amp:"&",gt:">",lt:"<",quot:'"',apos:"'"},$.ENTITIES={amp:"&",gt:">",lt:"<",quot:'"',apos:"'",AElig:198,Aacute:193,Acirc:194,Agrave:192,Aring:197,Atilde:195,Auml:196,Ccedil:199,ETH:208,Eacute:201,Ecirc:202,Egrave:200,Euml:203,Iacute:205,Icirc:206,Igrave:204,Iuml:207,Ntilde:209,Oacute:211,Ocirc:212,Ograve:210,Oslash:216,Otilde:213,Ouml:214,THORN:222,Uacute:218,Ucirc:219,Ugrave:217,Uuml:220,Yacute:221,aacute:225,acirc:226,aelig:230,agrave:224,aring:229,atilde:227,auml:228,ccedil:231,eacute:233,ecirc:234,egrave:232,eth:240,euml:235,iacute:237,icirc:238,igrave:236,iuml:239,ntilde:241,oacute:243,ocirc:244,ograve:242,oslash:248,otilde:245,ouml:246,szlig:223,thorn:254,uacute:250,ucirc:251,ugrave:249,uuml:252,yacute:253,yuml:255,copy:169,reg:174,nbsp:160,iexcl:161,cent:162,pound:163,curren:164,yen:165,brvbar:166,sect:167,uml:168,ordf:170,laquo:171,not:172,shy:173,macr:175,deg:176,plusmn:177,sup1:185,sup2:178,sup3:179,acute:180,micro:181,para:182,middot:183,cedil:184,ordm:186,raquo:187,frac14:188,frac12:189,frac34:190,iquest:191,times:215,divide:247,OElig:338,oelig:339,Scaron:352,scaron:353,Yuml:376,fnof:402,circ:710,tilde:732,Alpha:913,Beta:914,Gamma:915,Delta:916,Epsilon:917,Zeta:918,Eta:919,Theta:920,Iota:921,Kappa:922,Lambda:923,Mu:924,Nu:925,Xi:926,Omicron:927,Pi:928,Rho:929,Sigma:931,Tau:932,Upsilon:933,Phi:934,Chi:935,Psi:936,Omega:937,alpha:945,beta:946,gamma:947,delta:948,epsilon:949,zeta:950,eta:951,theta:952,iota:953,kappa:954,lambda:955,mu:956,nu:957,xi:958,omicron:959,pi:960,rho:961,sigmaf:962,sigma:963,tau:964,upsilon:965,phi:966,chi:967,psi:968,omega:969,thetasym:977,upsih:978,piv:982,ensp:8194,emsp:8195,thinsp:8201,zwnj:8204,zwj:8205,lrm:8206,rlm:8207,ndash:8211,mdash:8212,lsquo:8216,rsquo:8217,sbquo:8218,ldquo:8220,rdquo:8221,bdquo:8222,dagger:8224,Dagger:8225,bull:8226,hellip:8230,permil:8240,prime:8242,Prime:8243,lsaquo:8249,rsaquo:8250,oline:8254,frasl:8260,euro:8364,image:8465,weierp:8472,real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,int:8747,there4:8756,sim:8764,cong:8773,asymp:8776,ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830},Object.keys($.ENTITIES).forEach(function(P){var N=$.ENTITIES[P],c=typeof N==="number"?String.fromCharCode(N):N;$.ENTITIES[P]=c});for(var s in $.STATE)$.STATE[$.STATE[s]]=s;k=$.STATE;function q0(P,N,c){P[N]&&P[N](c)}function S(P,N,c){if(P.textNode)h(P);q0(P,N,c)}function h(P){if(P.textNode=F(P.opt,P.textNode),P.textNode)q0(P,"ontext",P.textNode);P.textNode=""}function F(P,N){if(P.trim)N=N.trim();if(P.normalize)N=N.replace(/\s+/g," ");return N}function a(P,N){if(h(P),P.trackPosition)N+=` + `)+" "+n[1];return n[0]+r+" "+_.join(", ")+" "+n[1]}$.types=oq();function O(_){return Array.isArray(_)}$.isArray=O;function V(_){return typeof _==="boolean"}$.isBoolean=V;function j(_){return _===null}$.isNull=j;function M(_){return _==null}$.isNullOrUndefined=M;function L(_){return typeof _==="number"}$.isNumber=L;function A(_){return typeof _==="string"}$.isString=A;function y(_){return typeof _==="symbol"}$.isSymbol=y;function g(_){return _===void 0}$.isUndefined=g;function d(_){return E(_)&&N(_)==="[object RegExp]"}$.isRegExp=d,$.types.isRegExp=d;function E(_){return typeof _==="object"&&_!==null}$.isObject=E;function s(_){return E(_)&&N(_)==="[object Date]"}$.isDate=s,$.types.isDate=s;function V0(_){return E(_)&&(N(_)==="[object Error]"||_ instanceof Error)}$.isError=V0,$.types.isNativeError=V0;function S(_){return typeof _==="function"}$.isFunction=S;function h(_){return _===null||typeof _==="boolean"||typeof _==="number"||typeof _==="string"||typeof _==="symbol"||typeof _>"u"}$.isPrimitive=h,$.isBuffer=tq();function N(_){return Object.prototype.toString.call(_)}function a(_){return _<10?"0"+_.toString(10):_.toString(10)}var $0=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function m(){var _=new Date,r=[a(_.getHours()),a(_.getMinutes()),a(_.getSeconds())].join(":");return[_.getDate(),$0[_.getMonth()],r].join(" ")}$.log=function(){console.log("%s - %s",m(),$.format.apply($,arguments))},$.inherits=R2(),$._extend=function(_,r){if(!r||!E(r))return _;var n=Object.keys(r),Z0=n.length;while(Z0--)_[n[Z0]]=r[n[Z0]];return _};function J0(_,r){return Object.prototype.hasOwnProperty.call(_,r)}var U0=typeof Symbol<"u"?Symbol("util.promisify.custom"):void 0;$.promisify=function(r){if(typeof r!=="function")throw TypeError('The "original" argument must be of type Function');if(U0&&r[U0]){var n=r[U0];if(typeof n!=="function")throw TypeError('The "util.promisify.custom" argument must be of type Function');return Object.defineProperty(n,U0,{value:n,enumerable:!1,writable:!1,configurable:!0}),n}function n(){var Z0,p,P=new Promise(function(f,v){Z0=f,p=v}),R=[];for(var c=0;c0)this.tail.next=V;else this.head=V;this.tail=V,++this.length}},{key:"unshift",value:function(O){var V={data:O,next:this.head};if(this.length===0)this.tail=V;this.head=V,++this.length}},{key:"shift",value:function(){if(this.length===0)return;var O=this.head.data;if(this.length===1)this.head=this.tail=null;else this.head=this.head.next;return--this.length,O}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(O){if(this.length===0)return"";var V=this.head,j=""+V.data;while(V=V.next)j+=O+V.data;return j}},{key:"concat",value:function(O){if(this.length===0)return F.alloc(0);var V=F.allocUnsafe(O>>>0),j=this.head,M=0;while(j)D(j.data,V,M),M+=j.data.length,j=j.next;return V}},{key:"consume",value:function(O,V){var j;if(OL.length?L.length:O;if(A===L.length)M+=L;else M+=L.slice(0,O);if(O-=A,O===0){if(A===L.length)if(++j,V.next)this.head=V.next;else this.head=this.tail=null;else this.head=V,V.data=L.slice(A);break}++j}return this.length-=j,M}},{key:"_getBuffer",value:function(O){var V=F.allocUnsafe(O),j=this.head,M=1;j.data.copy(V),O-=j.data.length;while(j=j.next){var L=j.data,A=O>L.length?L.length:O;if(L.copy(V,V.length-O,0,A),O-=A,O===0){if(A===L.length)if(++M,j.next)this.head=j.next;else this.head=this.tail=null;else this.head=j,j.data=L.slice(A);break}++M}return this.length-=M,V}},{key:k,value:function(O,V){return W(this,U(U({},V),{},{depth:0,customInspect:!1}))}}]),C}(),y6}var b6,eY;function wQ(){if(eY)return b6;eY=1;function $(X,Q){var B=this,F=this._readableState&&this._readableState.destroyed,z=this._writableState&&this._writableState.destroyed;if(F||z){if(Q)Q(X);else if(X){if(!this._writableState)j0.nextTick(J,this,X);else if(!this._writableState.errorEmitted)this._writableState.errorEmitted=!0,j0.nextTick(J,this,X)}return this}if(this._readableState)this._readableState.destroyed=!0;if(this._writableState)this._writableState.destroyed=!0;return this._destroy(X||null,function(W){if(!Q&&W)if(!B._writableState)j0.nextTick(U,B,W);else if(!B._writableState.errorEmitted)B._writableState.errorEmitted=!0,j0.nextTick(U,B,W);else j0.nextTick(Y,B);else if(Q)j0.nextTick(Y,B),Q(W);else j0.nextTick(Y,B)}),this}function U(X,Q){J(X,Q),Y(X)}function Y(X){if(X._writableState&&!X._writableState.emitClose)return;if(X._readableState&&!X._readableState.emitClose)return;X.emit("close")}function Z(){if(this._readableState)this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1;if(this._writableState)this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1}function J(X,Q){X.emit("error",Q)}function G(X,Q){var{_readableState:B,_writableState:F}=X;if(B&&B.autoDestroy||F&&F.autoDestroy)X.destroy(Q);else X.emit("error",Q)}return b6={destroy:$,undestroy:Z,errorOrDestroy:G},b6}var g6={},$Z;function i2(){if($Z)return g6;$Z=1;function $(Q,B){Q.prototype=Object.create(B.prototype),Q.prototype.constructor=Q,Q.__proto__=B}var U={};function Y(Q,B,F){if(!F)F=Error;function z(k,D,C){if(typeof B==="string")return B;else return B(k,D,C)}var W=function(k){$(D,k);function D(C,H,O){return k.call(this,z(C,H,O))||this}return D}(F);W.prototype.name=F.name,W.prototype.code=Q,U[Q]=W}function Z(Q,B){if(Array.isArray(Q)){var F=Q.length;if(Q=Q.map(function(z){return String(z)}),F>2)return"one of ".concat(B," ").concat(Q.slice(0,F-1).join(", "),", or ")+Q[F-1];else if(F===2)return"one of ".concat(B," ").concat(Q[0]," or ").concat(Q[1]);else return"of ".concat(B," ").concat(Q[0])}else return"of ".concat(B," ").concat(String(Q))}function J(Q,B,F){return Q.substr(0,B.length)===B}function G(Q,B,F){if(F===void 0||F>Q.length)F=Q.length;return Q.substring(F-B.length,F)===B}function X(Q,B,F){if(typeof F!=="number")F=0;if(F+B.length>Q.length)return!1;else return Q.indexOf(B,F)!==-1}return Y("ERR_INVALID_OPT_VALUE",function(Q,B){return'The value "'+B+'" is invalid for option "'+Q+'"'},TypeError),Y("ERR_INVALID_ARG_TYPE",function(Q,B,F){var z;if(typeof B==="string"&&J(B,"not "))z="must not be",B=B.replace(/^not /,"");else z="must be";var W;if(G(Q," argument"))W="The ".concat(Q," ").concat(z," ").concat(Z(B,"type"));else{var k=X(Q,".")?"property":"argument";W='The "'.concat(Q,'" ').concat(k," ").concat(z," ").concat(Z(B,"type"))}return W+=". Received type ".concat(typeof F),W},TypeError),Y("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),Y("ERR_METHOD_NOT_IMPLEMENTED",function(Q){return"The "+Q+" method is not implemented"}),Y("ERR_STREAM_PREMATURE_CLOSE","Premature close"),Y("ERR_STREAM_DESTROYED",function(Q){return"Cannot call "+Q+" after a stream was destroyed"}),Y("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),Y("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),Y("ERR_STREAM_WRITE_AFTER_END","write after end"),Y("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),Y("ERR_UNKNOWN_ENCODING",function(Q){return"Unknown encoding: "+Q},TypeError),Y("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),g6.codes=U,g6}var x6,UZ;function WQ(){if(UZ)return x6;UZ=1;var $=i2().codes.ERR_INVALID_OPT_VALUE;function U(Z,J,G){return Z.highWaterMark!=null?Z.highWaterMark:J?Z[G]:null}function Y(Z,J,G,X){var Q=U(J,X,G);if(Q!=null){if(!(isFinite(Q)&&Math.floor(Q)===Q)||Q<0){var B=X?G:"highWaterMark";throw new $(B,Q)}return Math.floor(Q)}return Z.objectMode?16:16384}return x6={getHighWaterMark:Y},x6}var f6,YZ;function $X(){if(YZ)return f6;YZ=1,f6=$;function $(Y,Z){if(U("noDeprecation"))return Y;var J=!1;function G(){if(!J){if(U("throwDeprecation"))throw Error(Z);else if(U("traceDeprecation"))console.trace(Z);else console.warn(Z);J=!0}return Y.apply(this,arguments)}return G}function U(Y){try{if(!c0.localStorage)return!1}catch(J){return!1}var Z=c0.localStorage[Y];if(Z==null)return!1;return String(Z).toLowerCase()==="true"}return f6}var h6,ZZ;function HQ(){if(ZZ)return h6;ZZ=1,h6=d;function $(p){var P=this;this.next=null,this.entry=null,this.finish=function(){Z0(P,p)}}var U;d.WritableState=y;var Y={deprecate:$X()},Z=ZQ(),J=o1().Buffer,G=(typeof c0<"u"?c0:typeof window<"u"?window:typeof self<"u"?self:{}).Uint8Array||function(){};function X(p){return J.from(p)}function Q(p){return J.isBuffer(p)||p instanceof G}var B=wQ(),F=WQ(),z=F.getHighWaterMark,W=i2().codes,k=W.ERR_INVALID_ARG_TYPE,D=W.ERR_METHOD_NOT_IMPLEMENTED,C=W.ERR_MULTIPLE_CALLBACK,H=W.ERR_STREAM_CANNOT_PIPE,O=W.ERR_STREAM_DESTROYED,V=W.ERR_STREAM_NULL_VALUES,j=W.ERR_STREAM_WRITE_AFTER_END,M=W.ERR_UNKNOWN_ENCODING,L=B.errorOrDestroy;R2()(d,Z);function A(){}function y(p,P,R){if(U=U||l2(),p=p||{},typeof R!=="boolean")R=P instanceof U;if(this.objectMode=!!p.objectMode,R)this.objectMode=this.objectMode||!!p.writableObjectMode;this.highWaterMark=z(this,p,"writableHighWaterMark",R),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var c=p.decodeStrings===!1;this.decodeStrings=!c,this.defaultEncoding=p.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(f){$0(P,f)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=p.emitClose!==!1,this.autoDestroy=!!p.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new $(this)}y.prototype.getBuffer=function(){var P=this.bufferedRequest,R=[];while(P)R.push(P),P=P.next;return R},function(){try{Object.defineProperty(y.prototype,"buffer",{get:Y.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(p){}}();var g;if(typeof Symbol==="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==="function")g=Function.prototype[Symbol.hasInstance],Object.defineProperty(d,Symbol.hasInstance,{value:function(P){if(g.call(this,P))return!0;if(this!==d)return!1;return P&&P._writableState instanceof y}});else g=function(P){return P instanceof this};function d(p){U=U||l2();var P=this instanceof U;if(!P&&!g.call(d,this))return new d(p);if(this._writableState=new y(p,this,P),this.writable=!0,p){if(typeof p.write==="function")this._write=p.write;if(typeof p.writev==="function")this._writev=p.writev;if(typeof p.destroy==="function")this._destroy=p.destroy;if(typeof p.final==="function")this._final=p.final}Z.call(this)}d.prototype.pipe=function(){L(this,new H)};function E(p,P){var R=new j;L(p,R),j0.nextTick(P,R)}function s(p,P,R,c){var f;if(R===null)f=new V;else if(typeof R!=="string"&&!P.objectMode)f=new k("chunk",["string","Buffer"],R);if(f)return L(p,f),j0.nextTick(c,f),!1;return!0}d.prototype.write=function(p,P,R){var c=this._writableState,f=!1,v=!c.objectMode&&Q(p);if(v&&!J.isBuffer(p))p=X(p);if(typeof P==="function")R=P,P=null;if(v)P="buffer";else if(!P)P=c.defaultEncoding;if(typeof R!=="function")R=A;if(c.ending)E(this,R);else if(v||s(this,c,p,R))c.pendingcb++,f=S(this,c,v,p,P,R);return f},d.prototype.cork=function(){this._writableState.corked++},d.prototype.uncork=function(){var p=this._writableState;if(p.corked){if(p.corked--,!p.writing&&!p.corked&&!p.bufferProcessing&&p.bufferedRequest)U0(this,p)}},d.prototype.setDefaultEncoding=function(P){if(typeof P==="string")P=P.toLowerCase();if(!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((P+"").toLowerCase())>-1))throw new M(P);return this._writableState.defaultEncoding=P,this},Object.defineProperty(d.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function V0(p,P,R){if(!p.objectMode&&p.decodeStrings!==!1&&typeof P==="string")P=J.from(P,R);return P}Object.defineProperty(d.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function S(p,P,R,c,f,v){if(!R){var b=V0(P,c,f);if(c!==b)R=!0,f="buffer",c=b}var e=P.objectMode?1:c.length;P.length+=e;var I=P.length>5===6)return 2;else if(V>>4===14)return 3;else if(V>>3===30)return 4;return V>>6===2?-1:-2}function X(V,j,M){var L=j.length-1;if(L=0){if(A>0)V.lastNeed=A-1;return A}if(--L=0){if(A>0)V.lastNeed=A-2;return A}if(--L=0){if(A>0)if(A===2)A=0;else V.lastNeed=A-3;return A}return 0}function Q(V,j,M){if((j[0]&192)!==128)return V.lastNeed=0,"�";if(V.lastNeed>1&&j.length>1){if((j[1]&192)!==128)return V.lastNeed=1,"�";if(V.lastNeed>2&&j.length>2){if((j[2]&192)!==128)return V.lastNeed=2,"�"}}}function B(V){var j=this.lastTotal-this.lastNeed,M=Q(this,V);if(M!==void 0)return M;if(this.lastNeed<=V.length)return V.copy(this.lastChar,j,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);V.copy(this.lastChar,j,0,V.length),this.lastNeed-=V.length}function F(V,j){var M=X(this,V,j);if(!this.lastNeed)return V.toString("utf8",j);this.lastTotal=M;var L=V.length-(M-this.lastNeed);return V.copy(this.lastChar,0,L),V.toString("utf8",j,L)}function z(V){var j=V&&V.length?this.write(V):"";if(this.lastNeed)return j+"�";return j}function W(V,j){if((V.length-j)%2===0){var M=V.toString("utf16le",j);if(M){var L=M.charCodeAt(M.length-1);if(L>=55296&&L<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=V[V.length-2],this.lastChar[1]=V[V.length-1],M.slice(0,-1)}return M}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=V[V.length-1],V.toString("utf16le",j,V.length-1)}function k(V){var j=V&&V.length?this.write(V):"";if(this.lastNeed){var M=this.lastTotal-this.lastNeed;return j+this.lastChar.toString("utf16le",0,M)}return j}function D(V,j){var M=(V.length-j)%3;if(M===0)return V.toString("base64",j);if(this.lastNeed=3-M,this.lastTotal=3,M===1)this.lastChar[0]=V[V.length-1];else this.lastChar[0]=V[V.length-2],this.lastChar[1]=V[V.length-1];return V.toString("base64",j,V.length-M)}function C(V){var j=V&&V.length?this.write(V):"";if(this.lastNeed)return j+this.lastChar.toString("base64",0,3-this.lastNeed);return j}function H(V){return V.toString(this.encoding)}function O(V){return V&&V.length?this.write(V):""}return d6}var c6,KZ;function c9(){if(KZ)return c6;KZ=1;var $=i2().codes.ERR_STREAM_PREMATURE_CLOSE;function U(G){var X=!1;return function(){if(X)return;X=!0;for(var Q=arguments.length,B=Array(Q),F=0;F0){if(typeof b!=="string"&&!T.objectMode&&Object.getPrototypeOf(b)!==Z.prototype)b=G(b);if(I)if(T.endEmitted)A(v,new V);else V0(v,T,b,!0);else if(T.ended)A(v,new H);else if(T.destroyed)return!1;else if(T.reading=!1,T.decoder&&!e)if(b=T.decoder.write(b),T.objectMode||b.length!==0)V0(v,T,b,!1);else U0(v,T);else V0(v,T,b,!1)}else if(!I)T.reading=!1,U0(v,T)}return!T.ended&&(T.length=h)v=h;else v--,v|=v>>>1,v|=v>>>2,v|=v>>>4,v|=v>>>8,v|=v>>>16,v++;return v}function a(v,b){if(v<=0||b.length===0&&b.ended)return 0;if(b.objectMode)return 1;if(v!==v)if(b.flowing&&b.length)return b.buffer.head.data.length;else return b.length;if(v>b.highWaterMark)b.highWaterMark=N(v);if(v<=b.length)return v;if(!b.ended)return b.needReadable=!0,0;return b.length}E.prototype.read=function(v){B("read",v),v=parseInt(v,10);var b=this._readableState,e=v;if(v!==0)b.emittedReadable=!1;if(v===0&&b.needReadable&&((b.highWaterMark!==0?b.length>=b.highWaterMark:b.length>0)||b.ended)){if(B("read: emitReadable",b.length,b.ended),b.length===0&&b.ended)R(this);else m(this);return null}if(v=a(v,b),v===0&&b.ended){if(b.length===0)R(this);return null}var I=b.needReadable;if(B("need readable",I),b.length===0||b.length-v0)t=P(v,b);else t=null;if(t===null)b.needReadable=b.length<=b.highWaterMark,v=0;else b.length-=v,b.awaitDrain=0;if(b.length===0){if(!b.ended)b.needReadable=!0;if(e!==v&&b.ended)R(this)}if(t!==null)this.emit("data",t);return t};function $0(v,b){if(B("onEofChunk"),b.ended)return;if(b.decoder){var e=b.decoder.end();if(e&&e.length)b.buffer.push(e),b.length+=b.objectMode?1:e.length}if(b.ended=!0,b.sync)m(v);else if(b.needReadable=!1,!b.emittedReadable)b.emittedReadable=!0,J0(v)}function m(v){var b=v._readableState;if(B("emitReadable",b.needReadable,b.emittedReadable),b.needReadable=!1,!b.emittedReadable)B("emitReadable",b.flowing),b.emittedReadable=!0,j0.nextTick(J0,v)}function J0(v){var b=v._readableState;if(B("emitReadable_",b.destroyed,b.length,b.ended),!b.destroyed&&(b.length||b.ended))v.emit("readable"),b.emittedReadable=!1;b.needReadable=!b.flowing&&!b.ended&&b.length<=b.highWaterMark,p(v)}function U0(v,b){if(!b.readingMore)b.readingMore=!0,j0.nextTick(L0,v,b)}function L0(v,b){while(!b.reading&&!b.ended&&(b.length1&&f(I.pipes,v)!==-1)&&!x)B("false write response, pause",I.awaitDrain),I.awaitDrain++;e.pause()}}function Q0(w0){if(B("onerror",w0),M0(),v.removeListener("error",Q0),U(v,"error")===0)A(v,w0)}g(v,"error",Q0);function q0(){v.removeListener("finish",K0),M0()}v.once("close",q0);function K0(){B("onfinish"),v.removeListener("close",q0),M0()}v.once("finish",K0);function M0(){B("unpipe"),e.unpipe(v)}if(v.emit("pipe",e),!I.flowing)B("pipe resume"),e.resume();return v};function i(v){return function(){var e=v._readableState;if(B("pipeOnDrain",e.awaitDrain),e.awaitDrain)e.awaitDrain--;if(e.awaitDrain===0&&U(v,"data"))e.flowing=!0,p(v)}}E.prototype.unpipe=function(v){var b=this._readableState,e={hasUnpiped:!1};if(b.pipesCount===0)return this;if(b.pipesCount===1){if(v&&v!==b.pipes)return this;if(!v)v=b.pipes;if(b.pipes=null,b.pipesCount=0,b.flowing=!1,v)v.emit("unpipe",this,e);return this}if(!v){var{pipes:I,pipesCount:t}=b;b.pipes=null,b.pipesCount=0,b.flowing=!1;for(var T=0;T0,I.flowing!==!1)this.resume()}else if(v==="readable"){if(!I.endEmitted&&!I.readableListening){if(I.readableListening=I.needReadable=!0,I.flowing=!1,I.emittedReadable=!1,B("on readable",I.length,I.reading),I.length)m(this);else if(!I.reading)j0.nextTick(r,this)}}return e},E.prototype.addListener=E.prototype.on,E.prototype.removeListener=function(v,b){var e=Y.prototype.removeListener.call(this,v,b);if(v==="readable")j0.nextTick(_,this);return e},E.prototype.removeAllListeners=function(v){var b=Y.prototype.removeAllListeners.apply(this,arguments);if(v==="readable"||v===void 0)j0.nextTick(_,this);return b};function _(v){var b=v._readableState;if(b.readableListening=v.listenerCount("readable")>0,b.resumeScheduled&&!b.paused)b.flowing=!0;else if(v.listenerCount("data")>0)v.resume()}function r(v){B("readable nexttick read 0"),v.read(0)}E.prototype.resume=function(){var v=this._readableState;if(!v.flowing)B("resume"),v.flowing=!v.readableListening,n(this,v);return v.paused=!1,this};function n(v,b){if(!b.resumeScheduled)b.resumeScheduled=!0,j0.nextTick(Z0,v,b)}function Z0(v,b){if(B("resume",b.reading),!b.reading)v.read(0);if(b.resumeScheduled=!1,v.emit("resume"),p(v),b.flowing&&!b.reading)v.read(0)}E.prototype.pause=function(){if(B("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1)B("pause"),this._readableState.flowing=!1,this.emit("pause");return this._readableState.paused=!0,this};function p(v){var b=v._readableState;B("flow",b.flowing);while(b.flowing&&v.read()!==null);}if(E.prototype.wrap=function(v){var b=this,e=this._readableState,I=!1;v.on("end",function(){if(B("wrapped end"),e.decoder&&!e.ended){var K=e.decoder.end();if(K&&K.length)b.push(K)}b.push(null)}),v.on("data",function(K){if(B("wrapped data"),e.decoder)K=e.decoder.write(K);if(e.objectMode&&(K===null||K===void 0))return;else if(!e.objectMode&&(!K||!K.length))return;var q=b.push(K);if(!q)I=!0,v.pause()});for(var t in v)if(this[t]===void 0&&typeof v[t]==="function")this[t]=function(q){return function(){return v[q].apply(v,arguments)}}(t);for(var T=0;T=b.length){if(b.decoder)e=b.buffer.join("");else if(b.buffer.length===1)e=b.buffer.first();else e=b.buffer.concat(b.length);b.buffer.clear()}else e=b.buffer.consume(v,b.decoder);return e}function R(v){var b=v._readableState;if(B("endReadable",b.endEmitted),!b.endEmitted)b.ended=!0,j0.nextTick(c,b,v)}function c(v,b){if(B("endReadableNT",v.endEmitted,v.length),!v.endEmitted&&v.length===0){if(v.endEmitted=!0,b.readable=!1,b.emit("end"),v.autoDestroy){var e=b._writableState;if(!e||e.autoDestroy&&e.finished)b.destroy()}}}if(typeof Symbol==="function")E.from=function(v,b){if(L===void 0)L=ZX();return L(E,v,b)};function f(v,b){for(var e=0,I=v.length;e0;return Q(j,L,A,function(y){if(!O)O=y;if(y)V.forEach(B);if(L)return;V.forEach(B),H(O)})});return D.reduce(F)}return r6=W,r6}var s6,IZ;function m9(){if(IZ)return s6;IZ=1,s6=Y;var $=x9().EventEmitter,U=R2();U(Y,$),Y.Readable=jQ(),Y.Writable=HQ(),Y.Duplex=l2(),Y.Transform=zQ(),Y.PassThrough=QX(),Y.finished=c9(),Y.pipeline=JX(),Y.Stream=Y;function Y(){$.call(this)}return Y.prototype.pipe=function(Z,J){var G=this;function X(D){if(Z.writable){if(Z.write(D)===!1&&G.pause)G.pause()}}G.on("data",X);function Q(){if(G.readable&&G.resume)G.resume()}if(Z.on("drain",Q),!Z._isStdio&&(!J||J.end!==!1))G.on("end",F),G.on("close",z);var B=!1;function F(){if(B)return;B=!0,Z.end()}function z(){if(B)return;if(B=!0,typeof Z.destroy==="function")Z.destroy()}function W(D){if(k(),$.listenerCount(this,"error")===0)throw D}G.on("error",W),Z.on("error",W);function k(){G.removeListener("data",X),Z.removeListener("drain",Q),G.removeListener("end",F),G.removeListener("close",z),G.removeListener("error",W),Z.removeListener("error",W),G.removeListener("end",k),G.removeListener("close",k),Z.removeListener("close",k)}return G.on("end",k),G.on("close",k),Z.on("close",k),Z.emit("pipe",G),Z},s6}var wZ;function GX(){if(wZ)return _8;return wZ=1,function($){(function(U){U.parser=function(P,R){return new Z(P,R)},U.SAXParser=Z,U.SAXStream=z,U.createStream=F,U.MAX_BUFFER_LENGTH=65536;var Y=["comment","sgmlDecl","textNode","tagName","doctype","procInstName","procInstBody","entity","attribName","attribValue","cdata","script"];U.EVENTS=["text","processinginstruction","sgmldeclaration","doctype","comment","opentagstart","attribute","opentag","closetag","opencdata","cdata","closecdata","error","end","ready","script","opennamespace","closenamespace"];function Z(P,R){if(!(this instanceof Z))return new Z(P,R);var c=this;if(G(c),c.q=c.c="",c.bufferCheckPosition=U.MAX_BUFFER_LENGTH,c.opt=R||{},c.opt.lowercase=c.opt.lowercase||c.opt.lowercasetags,c.looseCase=c.opt.lowercase?"toLowerCase":"toUpperCase",c.tags=[],c.closed=c.closedRoot=c.sawRoot=!1,c.tag=c.error=null,c.strict=!!P,c.noscript=!!(P||c.opt.noscript),c.state=E.BEGIN,c.strictEntities=c.opt.strictEntities,c.ENTITIES=c.strictEntities?Object.create(U.XML_ENTITIES):Object.create(U.ENTITIES),c.attribList=[],c.opt.xmlns)c.ns=Object.create(H);if(c.trackPosition=c.opt.position!==!1,c.trackPosition)c.position=c.line=c.column=0;V0(c,"onready")}if(!Object.create)Object.create=function(P){function R(){}R.prototype=P;var c=new R;return c};if(!Object.keys)Object.keys=function(P){var R=[];for(var c in P)if(P.hasOwnProperty(c))R.push(c);return R};function J(P){var R=Math.max(U.MAX_BUFFER_LENGTH,10),c=0;for(var f=0,v=Y.length;fR)switch(Y[f]){case"textNode":h(P);break;case"cdata":S(P,"oncdata",P.cdata),P.cdata="";break;case"script":S(P,"onscript",P.script),P.script="";break;default:a(P,"Max buffer length exceeded: "+Y[f])}c=Math.max(c,b)}var e=U.MAX_BUFFER_LENGTH-c;P.bufferCheckPosition=e+P.position}function G(P){for(var R=0,c=Y.length;R"||L(P)}function g(P,R){return P.test(R)}function d(P,R){return!g(P,R)}var E=0;U.STATE={BEGIN:E++,BEGIN_WHITESPACE:E++,TEXT:E++,TEXT_ENTITY:E++,OPEN_WAKA:E++,SGML_DECL:E++,SGML_DECL_QUOTED:E++,DOCTYPE:E++,DOCTYPE_QUOTED:E++,DOCTYPE_DTD:E++,DOCTYPE_DTD_QUOTED:E++,COMMENT_STARTING:E++,COMMENT:E++,COMMENT_ENDING:E++,COMMENT_ENDED:E++,CDATA:E++,CDATA_ENDING:E++,CDATA_ENDING_2:E++,PROC_INST:E++,PROC_INST_BODY:E++,PROC_INST_ENDING:E++,OPEN_TAG:E++,OPEN_TAG_SLASH:E++,ATTRIB:E++,ATTRIB_NAME:E++,ATTRIB_NAME_SAW_WHITE:E++,ATTRIB_VALUE:E++,ATTRIB_VALUE_QUOTED:E++,ATTRIB_VALUE_CLOSED:E++,ATTRIB_VALUE_UNQUOTED:E++,ATTRIB_VALUE_ENTITY_Q:E++,ATTRIB_VALUE_ENTITY_U:E++,CLOSE_TAG:E++,CLOSE_TAG_SAW_WHITE:E++,SCRIPT:E++,SCRIPT_ENDING:E++},U.XML_ENTITIES={amp:"&",gt:">",lt:"<",quot:'"',apos:"'"},U.ENTITIES={amp:"&",gt:">",lt:"<",quot:'"',apos:"'",AElig:198,Aacute:193,Acirc:194,Agrave:192,Aring:197,Atilde:195,Auml:196,Ccedil:199,ETH:208,Eacute:201,Ecirc:202,Egrave:200,Euml:203,Iacute:205,Icirc:206,Igrave:204,Iuml:207,Ntilde:209,Oacute:211,Ocirc:212,Ograve:210,Oslash:216,Otilde:213,Ouml:214,THORN:222,Uacute:218,Ucirc:219,Ugrave:217,Uuml:220,Yacute:221,aacute:225,acirc:226,aelig:230,agrave:224,aring:229,atilde:227,auml:228,ccedil:231,eacute:233,ecirc:234,egrave:232,eth:240,euml:235,iacute:237,icirc:238,igrave:236,iuml:239,ntilde:241,oacute:243,ocirc:244,ograve:242,oslash:248,otilde:245,ouml:246,szlig:223,thorn:254,uacute:250,ucirc:251,ugrave:249,uuml:252,yacute:253,yuml:255,copy:169,reg:174,nbsp:160,iexcl:161,cent:162,pound:163,curren:164,yen:165,brvbar:166,sect:167,uml:168,ordf:170,laquo:171,not:172,shy:173,macr:175,deg:176,plusmn:177,sup1:185,sup2:178,sup3:179,acute:180,micro:181,para:182,middot:183,cedil:184,ordm:186,raquo:187,frac14:188,frac12:189,frac34:190,iquest:191,times:215,divide:247,OElig:338,oelig:339,Scaron:352,scaron:353,Yuml:376,fnof:402,circ:710,tilde:732,Alpha:913,Beta:914,Gamma:915,Delta:916,Epsilon:917,Zeta:918,Eta:919,Theta:920,Iota:921,Kappa:922,Lambda:923,Mu:924,Nu:925,Xi:926,Omicron:927,Pi:928,Rho:929,Sigma:931,Tau:932,Upsilon:933,Phi:934,Chi:935,Psi:936,Omega:937,alpha:945,beta:946,gamma:947,delta:948,epsilon:949,zeta:950,eta:951,theta:952,iota:953,kappa:954,lambda:955,mu:956,nu:957,xi:958,omicron:959,pi:960,rho:961,sigmaf:962,sigma:963,tau:964,upsilon:965,phi:966,chi:967,psi:968,omega:969,thetasym:977,upsih:978,piv:982,ensp:8194,emsp:8195,thinsp:8201,zwnj:8204,zwj:8205,lrm:8206,rlm:8207,ndash:8211,mdash:8212,lsquo:8216,rsquo:8217,sbquo:8218,ldquo:8220,rdquo:8221,bdquo:8222,dagger:8224,Dagger:8225,bull:8226,hellip:8230,permil:8240,prime:8242,Prime:8243,lsaquo:8249,rsaquo:8250,oline:8254,frasl:8260,euro:8364,image:8465,weierp:8472,real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,int:8747,there4:8756,sim:8764,cong:8773,asymp:8776,ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830},Object.keys(U.ENTITIES).forEach(function(P){var R=U.ENTITIES[P],c=typeof R==="number"?String.fromCharCode(R):R;U.ENTITIES[P]=c});for(var s in U.STATE)U.STATE[U.STATE[s]]=s;E=U.STATE;function V0(P,R,c){P[R]&&P[R](c)}function S(P,R,c){if(P.textNode)h(P);V0(P,R,c)}function h(P){if(P.textNode=N(P.opt,P.textNode),P.textNode)V0(P,"ontext",P.textNode);P.textNode=""}function N(P,R){if(P.trim)R=R.trim();if(P.normalize)R=R.replace(/\s+/g," ");return R}function a(P,R){if(h(P),P.trackPosition)R+=` Line: `+P.line+` Column: `+P.column+` -Char: `+P.c;return N=new Error(N),P.error=N,q0(P,"onerror",N),P}function U0(P){if(P.sawRoot&&!P.closedRoot)m(P,"Unclosed root tag");if(P.state!==k.BEGIN&&P.state!==k.BEGIN_WHITESPACE&&P.state!==k.TEXT)a(P,"Unexpected end");return h(P),P.c="",P.closed=!0,q0(P,"onend"),Z.call(P,P.strict,P.opt),P}function m(P,N){if(typeof P!=="object"||!(P instanceof Z))throw new Error("bad call to strictFail");if(P.strict)a(P,N)}function J0(P){if(!P.strict)P.tagName=P.tagName[P.looseCase]();var N=P.tags[P.tags.length-1]||P,c=P.tag={name:P.tagName,attributes:{}};if(P.opt.xmlns)c.ns=N.ns;P.attribList.length=0,S(P,"onopentagstart",c)}function $0(P,N){var c=P.indexOf(":"),f=c<0?["",P]:P.split(":"),v=f[0],b=f[1];if(N&&P==="xmlns")v="xmlns",b="";return{prefix:v,local:b}}function I0(P){if(!P.strict)P.attribName=P.attribName[P.looseCase]();if(P.attribList.indexOf(P.attribName)!==-1||P.tag.attributes.hasOwnProperty(P.attribName)){P.attribName=P.attribValue="";return}if(P.opt.xmlns){var N=$0(P.attribName,!0),c=N.prefix,f=N.local;if(c==="xmlns")if(f==="xml"&&P.attribValue!==D)m(P,"xml: prefix must be bound to "+D+` +Char: `+P.c;return R=Error(R),P.error=R,V0(P,"onerror",R),P}function $0(P){if(P.sawRoot&&!P.closedRoot)m(P,"Unclosed root tag");if(P.state!==E.BEGIN&&P.state!==E.BEGIN_WHITESPACE&&P.state!==E.TEXT)a(P,"Unexpected end");return h(P),P.c="",P.closed=!0,V0(P,"onend"),Z.call(P,P.strict,P.opt),P}function m(P,R){if(typeof P!=="object"||!(P instanceof Z))throw Error("bad call to strictFail");if(P.strict)a(P,R)}function J0(P){if(!P.strict)P.tagName=P.tagName[P.looseCase]();var R=P.tags[P.tags.length-1]||P,c=P.tag={name:P.tagName,attributes:{}};if(P.opt.xmlns)c.ns=R.ns;P.attribList.length=0,S(P,"onopentagstart",c)}function U0(P,R){var c=P.indexOf(":"),f=c<0?["",P]:P.split(":"),v=f[0],b=f[1];if(R&&P==="xmlns")v="xmlns",b="";return{prefix:v,local:b}}function L0(P){if(!P.strict)P.attribName=P.attribName[P.looseCase]();if(P.attribList.indexOf(P.attribName)!==-1||P.tag.attributes.hasOwnProperty(P.attribName)){P.attribName=P.attribValue="";return}if(P.opt.xmlns){var R=U0(P.attribName,!0),c=R.prefix,f=R.local;if(c==="xmlns")if(f==="xml"&&P.attribValue!==D)m(P,"xml: prefix must be bound to "+D+` Actual: `+P.attribValue);else if(f==="xmlns"&&P.attribValue!==C)m(P,"xmlns: prefix must be bound to "+C+` -Actual: `+P.attribValue);else{var v=P.tag,b=P.tags[P.tags.length-1]||P;if(v.ns===b.ns)v.ns=Object.create(b.ns);v.ns[f]=P.attribValue}P.attribList.push([P.attribName,P.attribValue])}else P.tag.attributes[P.attribName]=P.attribValue,S(P,"onattribute",{name:P.attribName,value:P.attribValue});P.attribName=P.attribValue=""}function i(P,N){if(P.opt.xmlns){var c=P.tag,f=$0(P.tagName);if(c.prefix=f.prefix,c.local=f.local,c.uri=c.ns[f.prefix]||"",c.prefix&&!c.uri)m(P,"Unbound namespace prefix: "+JSON.stringify(P.tagName)),c.uri=f.prefix;var v=P.tags[P.tags.length-1]||P;if(c.ns&&v.ns!==c.ns)Object.keys(c.ns).forEach(function(u){S(P,"onopennamespace",{prefix:u,uri:c.ns[u]})});for(var b=0,e=P.attribList.length;b",P.tagName="",P.state=k.SCRIPT;return}S(P,"onscript",P.script),P.script=""}var N=P.tags.length,c=P.tagName;if(!P.strict)c=c[P.looseCase]();var f=c;while(N--){var v=P.tags[N];if(v.name!==f)m(P,"Unexpected close tag");else break}if(N<0){m(P,"Unmatched closing tag: "+P.tagName),P.textNode+="",P.state=k.TEXT;return}P.tagName=c;var b=P.tags.length;while(b-- >N){var e=P.tag=P.tags.pop();P.tagName=P.tag.name,S(P,"onclosetag",P.tagName);var V={};for(var t in e.ns)V[t]=e.ns[t];var T=P.tags[P.tags.length-1]||P;if(P.opt.xmlns&&e.ns!==T.ns)Object.keys(e.ns).forEach(function(K){var B=e.ns[K];S(P,"onclosenamespace",{prefix:K,uri:B})})}if(N===0)P.closedRoot=!0;P.tagName=P.attribValue=P.attribName="",P.attribList.length=0,P.state=k.TEXT}function r(P){var N=P.entity,c=N.toLowerCase(),f,v="";if(P.ENTITIES[N])return P.ENTITIES[N];if(P.ENTITIES[c])return P.ENTITIES[c];if(N=c,N.charAt(0)==="#")if(N.charAt(1)==="x")N=N.slice(2),f=parseInt(N,16),v=f.toString(16);else N=N.slice(1),f=parseInt(N,10),v=f.toString(10);if(N=N.replace(/^0+/,""),isNaN(f)||v.toLowerCase()!==N)return m(P,"Invalid character entity"),"&"+P.entity+";";return String.fromCodePoint(f)}function n(P,N){if(N==="<")P.state=k.OPEN_WAKA,P.startTagPosition=P.position;else if(!I(N))m(P,"Non-whitespace before first tag."),P.textNode=N,P.state=k.TEXT}function Z0(P,N){var c="";if(N")S(N,"onsgmldeclaration",N.sgmlDecl),N.sgmlDecl="",N.state=k.TEXT;else if(A(f))N.state=k.SGML_DECL_QUOTED,N.sgmlDecl+=f;else N.sgmlDecl+=f;continue;case k.SGML_DECL_QUOTED:if(f===N.q)N.state=k.SGML_DECL,N.q="";N.sgmlDecl+=f;continue;case k.DOCTYPE:if(f===">")N.state=k.TEXT,S(N,"ondoctype",N.doctype),N.doctype=!0;else if(N.doctype+=f,f==="[")N.state=k.DOCTYPE_DTD;else if(A(f))N.state=k.DOCTYPE_QUOTED,N.q=f;continue;case k.DOCTYPE_QUOTED:if(N.doctype+=f,f===N.q)N.q="",N.state=k.DOCTYPE;continue;case k.DOCTYPE_DTD:if(N.doctype+=f,f==="]")N.state=k.DOCTYPE;else if(A(f))N.state=k.DOCTYPE_DTD_QUOTED,N.q=f;continue;case k.DOCTYPE_DTD_QUOTED:if(N.doctype+=f,f===N.q)N.state=k.DOCTYPE_DTD,N.q="";continue;case k.COMMENT:if(f==="-")N.state=k.COMMENT_ENDING;else N.comment+=f;continue;case k.COMMENT_ENDING:if(f==="-"){if(N.state=k.COMMENT_ENDED,N.comment=F(N.opt,N.comment),N.comment)S(N,"oncomment",N.comment);N.comment=""}else N.comment+="-"+f,N.state=k.COMMENT;continue;case k.COMMENT_ENDED:if(f!==">")m(N,"Malformed comment"),N.comment+="--"+f,N.state=k.COMMENT;else N.state=k.TEXT;continue;case k.CDATA:if(f==="]")N.state=k.CDATA_ENDING;else N.cdata+=f;continue;case k.CDATA_ENDING:if(f==="]")N.state=k.CDATA_ENDING_2;else N.cdata+="]"+f,N.state=k.CDATA;continue;case k.CDATA_ENDING_2:if(f===">"){if(N.cdata)S(N,"oncdata",N.cdata);S(N,"onclosecdata"),N.cdata="",N.state=k.TEXT}else if(f==="]")N.cdata+="]";else N.cdata+="]]"+f,N.state=k.CDATA;continue;case k.PROC_INST:if(f==="?")N.state=k.PROC_INST_ENDING;else if(I(f))N.state=k.PROC_INST_BODY;else N.procInstName+=f;continue;case k.PROC_INST_BODY:if(!N.procInstBody&&I(f))continue;else if(f==="?")N.state=k.PROC_INST_ENDING;else N.procInstBody+=f;continue;case k.PROC_INST_ENDING:if(f===">")S(N,"onprocessinginstruction",{name:N.procInstName,body:N.procInstBody}),N.procInstName=N.procInstBody="",N.state=k.TEXT;else N.procInstBody+="?"+f,N.state=k.PROC_INST_BODY;continue;case k.OPEN_TAG:if(g(X,f))N.tagName+=f;else if(J0(N),f===">")i(N);else if(f==="/")N.state=k.OPEN_TAG_SLASH;else{if(!I(f))m(N,"Invalid character in tag name");N.state=k.ATTRIB}continue;case k.OPEN_TAG_SLASH:if(f===">")i(N,!0),_(N);else m(N,"Forward-slash in opening tag not followed by >"),N.state=k.ATTRIB;continue;case k.ATTRIB:if(I(f))continue;else if(f===">")i(N);else if(f==="/")N.state=k.OPEN_TAG_SLASH;else if(g(O,f))N.attribName=f,N.attribValue="",N.state=k.ATTRIB_NAME;else m(N,"Invalid attribute name");continue;case k.ATTRIB_NAME:if(f==="=")N.state=k.ATTRIB_VALUE;else if(f===">")m(N,"Attribute without value"),N.attribValue=N.attribName,I0(N),i(N);else if(I(f))N.state=k.ATTRIB_NAME_SAW_WHITE;else if(g(X,f))N.attribName+=f;else m(N,"Invalid attribute name");continue;case k.ATTRIB_NAME_SAW_WHITE:if(f==="=")N.state=k.ATTRIB_VALUE;else if(I(f))continue;else if(m(N,"Attribute without value"),N.tag.attributes[N.attribName]="",N.attribValue="",S(N,"onattribute",{name:N.attribName,value:""}),N.attribName="",f===">")i(N);else if(g(O,f))N.attribName=f,N.state=k.ATTRIB_NAME;else m(N,"Invalid attribute name"),N.state=k.ATTRIB;continue;case k.ATTRIB_VALUE:if(I(f))continue;else if(A(f))N.q=f,N.state=k.ATTRIB_VALUE_QUOTED;else m(N,"Unquoted attribute value"),N.state=k.ATTRIB_VALUE_UNQUOTED,N.attribValue=f;continue;case k.ATTRIB_VALUE_QUOTED:if(f!==N.q){if(f==="&")N.state=k.ATTRIB_VALUE_ENTITY_Q;else N.attribValue+=f;continue}I0(N),N.q="",N.state=k.ATTRIB_VALUE_CLOSED;continue;case k.ATTRIB_VALUE_CLOSED:if(I(f))N.state=k.ATTRIB;else if(f===">")i(N);else if(f==="/")N.state=k.OPEN_TAG_SLASH;else if(g(O,f))m(N,"No whitespace between attributes"),N.attribName=f,N.attribValue="",N.state=k.ATTRIB_NAME;else m(N,"Invalid attribute name");continue;case k.ATTRIB_VALUE_UNQUOTED:if(!y(f)){if(f==="&")N.state=k.ATTRIB_VALUE_ENTITY_U;else N.attribValue+=f;continue}if(I0(N),f===">")i(N);else N.state=k.ATTRIB;continue;case k.CLOSE_TAG:if(!N.tagName)if(I(f))continue;else if(d(O,f))if(N.script)N.script+="")_(N);else if(g(X,f))N.tagName+=f;else if(N.script)N.script+="")_(N);else m(N,"Invalid characters in closing tag");continue;case k.TEXT_ENTITY:case k.ATTRIB_VALUE_ENTITY_Q:case k.ATTRIB_VALUE_ENTITY_U:var e,V;switch(N.state){case k.TEXT_ENTITY:e=k.TEXT,V="textNode";break;case k.ATTRIB_VALUE_ENTITY_Q:e=k.ATTRIB_VALUE_QUOTED,V="attribValue";break;case k.ATTRIB_VALUE_ENTITY_U:e=k.ATTRIB_VALUE_UNQUOTED,V="attribValue";break}if(f===";")N[V]+=r(N),N.entity="",N.state=e;else if(g(N.entity.length?L:j,f))N.entity+=f;else m(N,"Invalid character in entity name"),N[V]+="&"+N.entity+f,N.entity="",N.state=e;continue;default:throw new Error(N,"Unknown state: "+N.state)}}if(N.position>=N.bufferCheckPosition)J(N);return N}if(!String.fromCodePoint)(function(){var P=String.fromCharCode,N=Math.floor,c=function(){var f=16384,v=[],b,e,V=-1,t=arguments.length;if(!t)return"";var T="";while(++V1114111||N(K)!==K)throw RangeError("Invalid code point: "+K);if(K<=65535)v.push(K);else K-=65536,b=(K>>10)+55296,e=K%1024+56320,v.push(b,e);if(V+1===t||v.length>f)T+=P.apply(null,v),v.length=0}return T};if(Object.defineProperty)Object.defineProperty(String,"fromCodePoint",{value:c,configurable:!0,writable:!0});else String.fromCodePoint=c})()})(U)}(_6),_6}var n8,WZ;function l9(){if(WZ)return n8;return WZ=1,n8={isArray:function(U){if(Array.isArray)return Array.isArray(U);return Object.prototype.toString.call(U)==="[object Array]"}},n8}var o8,HZ;function a9(){if(HZ)return o8;HZ=1;var U=l9().isArray;return o8={copyOptions:function($){var Y,Z={};for(Y in $)if($.hasOwnProperty(Y))Z[Y]=$[Y];return Z},ensureFlagExists:function($,Y){if(!($ in Y)||typeof Y[$]!=="boolean")Y[$]=!1},ensureSpacesExists:function($){if(!("spaces"in $)||typeof $.spaces!=="number"&&typeof $.spaces!=="string")$.spaces=0},ensureAlwaysArrayExists:function($){if(!("alwaysArray"in $)||typeof $.alwaysArray!=="boolean"&&!U($.alwaysArray))$.alwaysArray=!1},ensureKeyExists:function($,Y){if(!($+"Key"in Y)||typeof Y[$+"Key"]!=="string")Y[$+"Key"]=Y.compact?"_"+$:$},checkFnExists:function($,Y){return $+"Fn"in Y}},o8}var t8,jZ;function FQ(){if(jZ)return t8;jZ=1;var U=UB(),$=a9(),Y=l9().isArray,Z,J;function G(X){return Z=$.copyOptions(X),$.ensureFlagExists("ignoreDeclaration",Z),$.ensureFlagExists("ignoreInstruction",Z),$.ensureFlagExists("ignoreAttributes",Z),$.ensureFlagExists("ignoreText",Z),$.ensureFlagExists("ignoreComment",Z),$.ensureFlagExists("ignoreCdata",Z),$.ensureFlagExists("ignoreDoctype",Z),$.ensureFlagExists("compact",Z),$.ensureFlagExists("alwaysChildren",Z),$.ensureFlagExists("addParent",Z),$.ensureFlagExists("trim",Z),$.ensureFlagExists("nativeType",Z),$.ensureFlagExists("nativeTypeAttributes",Z),$.ensureFlagExists("sanitize",Z),$.ensureFlagExists("instructionHasAttributes",Z),$.ensureFlagExists("captureSpacesBetweenElements",Z),$.ensureAlwaysArrayExists(Z),$.ensureKeyExists("declaration",Z),$.ensureKeyExists("instruction",Z),$.ensureKeyExists("attributes",Z),$.ensureKeyExists("text",Z),$.ensureKeyExists("comment",Z),$.ensureKeyExists("cdata",Z),$.ensureKeyExists("doctype",Z),$.ensureKeyExists("type",Z),$.ensureKeyExists("name",Z),$.ensureKeyExists("elements",Z),$.ensureKeyExists("parent",Z),$.checkFnExists("doctype",Z),$.checkFnExists("instruction",Z),$.checkFnExists("cdata",Z),$.checkFnExists("comment",Z),$.checkFnExists("text",Z),$.checkFnExists("instructionName",Z),$.checkFnExists("elementName",Z),$.checkFnExists("attributeName",Z),$.checkFnExists("attributeValue",Z),$.checkFnExists("attributes",Z),Z}function w(X){var j=Number(X);if(!isNaN(j))return j;var L=X.toLowerCase();if(L==="true")return!0;else if(L==="false")return!1;return X}function Q(X,j){var L;if(Z.compact){if(!J[Z[X+"Key"]]&&(Y(Z.alwaysArray)?Z.alwaysArray.indexOf(Z[X+"Key"])!==-1:Z.alwaysArray))J[Z[X+"Key"]]=[];if(J[Z[X+"Key"]]&&!Y(J[Z[X+"Key"]]))J[Z[X+"Key"]]=[J[Z[X+"Key"]]];if(X+"Fn"in Z&&typeof j==="string")j=Z[X+"Fn"](j,J);if(X==="instruction"&&(("instructionFn"in Z)||("instructionNameFn"in Z))){for(L in j)if(j.hasOwnProperty(L))if("instructionFn"in Z)j[L]=Z.instructionFn(j[L],L,J);else{var I=j[L];delete j[L],j[Z.instructionNameFn(L,I,J)]=I}}if(Y(J[Z[X+"Key"]]))J[Z[X+"Key"]].push(j);else J[Z[X+"Key"]]=j}else{if(!J[Z.elementsKey])J[Z.elementsKey]=[];var A={};if(A[Z.typeKey]=X,X==="instruction"){for(L in j)if(j.hasOwnProperty(L))break;if(A[Z.nameKey]="instructionNameFn"in Z?Z.instructionNameFn(L,j,J):L,Z.instructionHasAttributes){if(A[Z.attributesKey]=j[L][Z.attributesKey],"instructionFn"in Z)A[Z.attributesKey]=Z.instructionFn(A[Z.attributesKey],L,J)}else{if("instructionFn"in Z)j[L]=Z.instructionFn(j[L],L,J);A[Z.instructionKey]=j[L]}}else{if(X+"Fn"in Z)j=Z[X+"Fn"](j,J);A[Z[X+"Key"]]=j}if(Z.addParent)A[Z.parentKey]=J;J[Z.elementsKey].push(A)}}function q(X){if("attributesFn"in Z&&X)X=Z.attributesFn(X,J);if((Z.trim||("attributeValueFn"in Z)||("attributeNameFn"in Z)||Z.nativeTypeAttributes)&&X){var j;for(j in X)if(X.hasOwnProperty(j)){if(Z.trim)X[j]=X[j].trim();if(Z.nativeTypeAttributes)X[j]=w(X[j]);if("attributeValueFn"in Z)X[j]=Z.attributeValueFn(X[j],j,J);if("attributeNameFn"in Z){var L=X[j];delete X[j],X[Z.attributeNameFn(j,X[j],J)]=L}}}return X}function z(X){var j={};if(X.body&&(X.name.toLowerCase()==="xml"||Z.instructionHasAttributes)){var L=/([\w:-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|(\w+))\s*/g,I;while((I=L.exec(X.body))!==null)j[I[1]]=I[2]||I[3]||I[4];j=q(j)}if(X.name.toLowerCase()==="xml"){if(Z.ignoreDeclaration)return;if(J[Z.declarationKey]={},Object.keys(j).length)J[Z.declarationKey][Z.attributesKey]=j;if(Z.addParent)J[Z.declarationKey][Z.parentKey]=J}else{if(Z.ignoreInstruction)return;if(Z.trim)X.body=X.body.trim();var A={};if(Z.instructionHasAttributes&&Object.keys(j).length)A[X.name]={},A[X.name][Z.attributesKey]=j;else A[X.name]=X.body;Q("instruction",A)}}function R(X,j){var L;if(typeof X==="object")j=X.attributes,X=X.name;if(j=q(j),"elementNameFn"in Z)X=Z.elementNameFn(X,J);if(Z.compact){if(L={},!Z.ignoreAttributes&&j&&Object.keys(j).length){L[Z.attributesKey]={};var I;for(I in j)if(j.hasOwnProperty(I))L[Z.attributesKey][I]=j[I]}if(!(X in J)&&(Y(Z.alwaysArray)?Z.alwaysArray.indexOf(X)!==-1:Z.alwaysArray))J[X]=[];if(J[X]&&!Y(J[X]))J[X]=[J[X]];if(Y(J[X]))J[X].push(L);else J[X]=L}else{if(!J[Z.elementsKey])J[Z.elementsKey]=[];if(L={},L[Z.typeKey]="element",L[Z.nameKey]=X,!Z.ignoreAttributes&&j&&Object.keys(j).length)L[Z.attributesKey]=j;if(Z.alwaysChildren)L[Z.elementsKey]=[];J[Z.elementsKey].push(L)}L[Z.parentKey]=J,J=L}function W(X){if(Z.ignoreText)return;if(!X.trim()&&!Z.captureSpacesBetweenElements)return;if(Z.trim)X=X.trim();if(Z.nativeType)X=w(X);if(Z.sanitize)X=X.replace(/&/g,"&").replace(//g,">");Q("text",X)}function E(X){if(Z.ignoreComment)return;if(Z.trim)X=X.trim();Q("comment",X)}function D(X){var j=J[Z.parentKey];if(!Z.addParent)delete J[Z.parentKey];J=j}function C(X){if(Z.ignoreCdata)return;if(Z.trim)X=X.trim();Q("cdata",X)}function H(X){if(Z.ignoreDoctype)return;if(X=X.replace(/^ /,""),Z.trim)X=X.trim();Q("doctype",X)}function O(X){X.note=X}return t8=function(X,j){var L=U.parser(!0,{}),I={};if(J=I,Z=G(j),L.opt={strictEntities:!0},L.onopentag=R,L.ontext=W,L.oncomment=E,L.onclosetag=D,L.onerror=O,L.oncdata=C,L.ondoctype=H,L.onprocessinginstruction=z,L.write(X).close(),I[Z.elementsKey]){var A=I[Z.elementsKey];delete I[Z.elementsKey],I[Z.elementsKey]=A,delete I.text}return I},t8}var e8,zZ;function $B(){if(zZ)return e8;zZ=1;var U=a9(),$=FQ();function Y(Z){var J=U.copyOptions(Z);return U.ensureSpacesExists(J),J}return e8=function(Z,J){var G,w,Q,q;if(G=Y(J),w=$(Z,G),q="compact"in G&&G.compact?"_parent":"parent","addParent"in G&&G.addParent)Q=JSON.stringify(w,function(z,R){return z===q?"_":R},G.spaces);else Q=JSON.stringify(w,null,G.spaces);return Q.replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")},e8}var U9,FZ;function NQ(){if(FZ)return U9;FZ=1;var U=a9(),$=l9().isArray,Y,Z;function J(L){var I=U.copyOptions(L);if(U.ensureFlagExists("ignoreDeclaration",I),U.ensureFlagExists("ignoreInstruction",I),U.ensureFlagExists("ignoreAttributes",I),U.ensureFlagExists("ignoreText",I),U.ensureFlagExists("ignoreComment",I),U.ensureFlagExists("ignoreCdata",I),U.ensureFlagExists("ignoreDoctype",I),U.ensureFlagExists("compact",I),U.ensureFlagExists("indentText",I),U.ensureFlagExists("indentCdata",I),U.ensureFlagExists("indentAttributes",I),U.ensureFlagExists("indentInstruction",I),U.ensureFlagExists("fullTagEmptyElement",I),U.ensureFlagExists("noQuotesForNativeAttributes",I),U.ensureSpacesExists(I),typeof I.spaces==="number")I.spaces=Array(I.spaces+1).join(" ");return U.ensureKeyExists("declaration",I),U.ensureKeyExists("instruction",I),U.ensureKeyExists("attributes",I),U.ensureKeyExists("text",I),U.ensureKeyExists("comment",I),U.ensureKeyExists("cdata",I),U.ensureKeyExists("doctype",I),U.ensureKeyExists("type",I),U.ensureKeyExists("name",I),U.ensureKeyExists("elements",I),U.checkFnExists("doctype",I),U.checkFnExists("instruction",I),U.checkFnExists("cdata",I),U.checkFnExists("comment",I),U.checkFnExists("text",I),U.checkFnExists("instructionName",I),U.checkFnExists("elementName",I),U.checkFnExists("attributeName",I),U.checkFnExists("attributeValue",I),U.checkFnExists("attributes",I),U.checkFnExists("fullTagEmptyElement",I),I}function G(L,I,A){return(!A&&L.spaces?` -`:"")+Array(I+1).join(L.spaces)}function w(L,I,A){if(I.ignoreAttributes)return"";if("attributesFn"in I)L=I.attributesFn(L,Z,Y);var y,g,d,k,s=[];for(y in L)if(L.hasOwnProperty(y)&&L[y]!==null&&L[y]!==void 0)k=I.noQuotesForNativeAttributes&&typeof L[y]!=="string"?"":'"',g=""+L[y],g=g.replace(/"/g,"""),d="attributeNameFn"in I?I.attributeNameFn(y,g,Z,Y):y,s.push(I.spaces&&I.indentAttributes?G(I,A+1,!1):" "),s.push(d+"="+k+("attributeValueFn"in I?I.attributeValueFn(g,y,Z,Y):g)+k);if(L&&Object.keys(L).length&&I.spaces&&I.indentAttributes)s.push(G(I,A,!1));return s.join("")}function Q(L,I,A){return Y=L,Z="xml",I.ignoreDeclaration?"":""}function q(L,I,A){if(I.ignoreInstruction)return"";var y;for(y in L)if(L.hasOwnProperty(y))break;var g="instructionNameFn"in I?I.instructionNameFn(y,L[y],Z,Y):y;if(typeof L[y]==="object")return Y=L,Z=g,"";else{var d=L[y]?L[y]:"";if("instructionFn"in I)d=I.instructionFn(d,y,Z,Y);return""}}function z(L,I){return I.ignoreComment?"":""}function R(L,I){return I.ignoreCdata?"":"","]]]]>"))+"]]>"}function W(L,I){return I.ignoreDoctype?"":""}function E(L,I){if(I.ignoreText)return"";return L=""+L,L=L.replace(/&/g,"&"),L=L.replace(/&/g,"&").replace(//g,">"),"textFn"in I?I.textFn(L,Z,Y):L}function D(L,I){var A;if(L.elements&&L.elements.length)for(A=0;A"),L[I.elementsKey]&&L[I.elementsKey].length)y.push(H(L[I.elementsKey],I,A+1)),Y=L,Z=L.name;y.push(I.spaces&&D(L,I)?` -`+Array(A+1).join(I.spaces):""),y.push("")}else y.push("/>");return y.join("")}function H(L,I,A,y){return L.reduce(function(g,d){var k=G(I,A,y&&!g);switch(d.type){case"element":return g+k+C(d,I,A);case"comment":return g+k+z(d[I.commentKey],I);case"doctype":return g+k+W(d[I.doctypeKey],I);case"cdata":return g+(I.indentCdata?k:"")+R(d[I.cdataKey],I);case"text":return g+(I.indentText?k:"")+E(d[I.textKey],I);case"instruction":var s={};return s[d[I.nameKey]]=d[I.attributesKey]?d:d[I.instructionKey],g+(I.indentInstruction?k:"")+q(s,I,A)}},"")}function O(L,I,A){var y;for(y in L)if(L.hasOwnProperty(y))switch(y){case I.parentKey:case I.attributesKey:break;case I.textKey:if(I.indentText||A)return!0;break;case I.cdataKey:if(I.indentCdata||A)return!0;break;case I.instructionKey:if(I.indentInstruction||A)return!0;break;case I.doctypeKey:case I.commentKey:return!0;default:return!0}return!1}function X(L,I,A,y,g){Y=L,Z=I;var d="elementNameFn"in A?A.elementNameFn(I,L):I;if(typeof L==="undefined"||L===null||L==="")return"fullTagEmptyElementFn"in A&&A.fullTagEmptyElementFn(I,L)||A.fullTagEmptyElement?"<"+d+">":"<"+d+"/>";var k=[];if(I){if(k.push("<"+d),typeof L!=="object")return k.push(">"+E(L,A)+""),k.join("");if(L[A.attributesKey])k.push(w(L[A.attributesKey],A,y));var s=O(L,A,!0)||L[A.attributesKey]&&L[A.attributesKey]["xml:space"]==="preserve";if(!s)if("fullTagEmptyElementFn"in A)s=A.fullTagEmptyElementFn(I,L);else s=A.fullTagEmptyElement;if(s)k.push(">");else return k.push("/>"),k.join("")}if(k.push(j(L,A,y+1,!1)),Y=L,Z=I,I)k.push((g?G(A,y,!1):"")+"");return k.join("")}function j(L,I,A,y){var g,d,k,s=[];for(d in L)if(L.hasOwnProperty(d)){k=$(L[d])?L[d]:[L[d]];for(g=0;g{switch(U.type){case void 0:case"element":let $=new p9(U.name,U.attributes),Y=U.elements||[];for(let Z of Y){let J=$6(Z);if(J!==void 0)$.push(J)}return $;case"text":return U.text;default:return}};class RQ extends V0{}class p9 extends o{static fromXmlString(U){let $=U6.xml2js(U,{compact:!1});return $6($)}constructor(U,$){super(U);if($)this.root.push(new RQ($))}push(U){this.root.push(U)}}class i9 extends o{constructor(U){super("");this._attr=U}prepForXml(U){return{_attr:this._attr}}}var QB="";class Y6 extends o{constructor(U,$){super(U);if($)this.root=$.root}}var S0=(U)=>{if(isNaN(U))throw new Error(`Invalid value '${U}' specified. Must be an integer.`);return Math.floor(U)},W2=(U)=>{let $=S0(U);if($<0)throw new Error(`Invalid value '${U}' specified. Must be a positive integer.`);return $},Z6=(U,$)=>{let Y=$*2;if(U.length!==Y||isNaN(Number(`0x${U}`)))throw new Error(`Invalid hex value '${U}'. Expected ${Y} digit hex value`);return U},JB=(U)=>Z6(U,4),DQ=(U)=>Z6(U,2),D9=(U)=>Z6(U,1),H2=(U)=>{let $=U.slice(-2),Y=U.substring(0,U.length-2);return`${Number(Y)}${$}`},r9=(U)=>{let $=H2(U);if(parseFloat($)<0)throw new Error(`Invalid value '${$}' specified. Expected a positive number.`);return $},S1=(U)=>{if(U==="auto")return U;let $=U.charAt(0)==="#"?U.substring(1):U;return Z6($,3)},e0=(U)=>typeof U==="string"?H2(U):S0(U),AQ=(U)=>typeof U==="string"?r9(U):W2(U),GB=(U)=>typeof U==="string"?H2(U):S0(U),T0=(U)=>typeof U==="string"?r9(U):W2(U),PQ=(U)=>{let $=U.substring(0,U.length-1);return`${Number($)}%`},s9=(U)=>{if(typeof U==="number")return S0(U);if(U.slice(-1)==="%")return PQ(U);return H2(U)},TQ=W2,CQ=W2,OQ=(U)=>U.toISOString();class B0 extends o{constructor(U,$=!0){super(U);if($!==!0)this.root.push(new O0({val:$}))}}class w2 extends o{constructor(U,$){super(U);this.root.push(new O0({val:AQ($)}))}}class E0 extends o{}class Y1 extends o{constructor(U,$){super(U);this.root.push(new O0({val:$}))}}var u1=(U,$)=>new X0({name:U,attributes:{value:{key:"w:val",value:$}}});class E1 extends o{constructor(U,$){super(U);this.root.push(new O0({val:$}))}}class EQ extends o{constructor(U,$){super(U);this.root.push(new O0({val:$}))}}class I1 extends o{constructor(U,$){super(U);this.root.push($)}}class X0 extends o{constructor({name:U,attributes:$,children:Y}){super(U);if($)this.root.push(new n2($));if(Y)this.root.push(...Y)}}var m0={START:"start",CENTER:"center",END:"end",BOTH:"both",MEDIUM_KASHIDA:"mediumKashida",DISTRIBUTE:"distribute",NUM_TAB:"numTab",HIGH_KASHIDA:"highKashida",LOW_KASHIDA:"lowKashida",THAI_DISTRIBUTE:"thaiDistribute",LEFT:"left",RIGHT:"right",JUSTIFIED:"both"},n9=(U)=>new X0({name:"w:jc",attributes:{val:{key:"w:val",value:U}}}),N0=(U,{color:$,size:Y,space:Z,style:J})=>new X0({name:U,attributes:{style:{key:"w:val",value:J},color:{key:"w:color",value:$===void 0?void 0:S1($)},size:{key:"w:sz",value:Y===void 0?void 0:TQ(Y)},space:{key:"w:space",value:Z===void 0?void 0:CQ(Z)}}}),Q6={SINGLE:"single",DASH_DOT_STROKED:"dashDotStroked",DASHED:"dashed",DASH_SMALL_GAP:"dashSmallGap",DOT_DASH:"dotDash",DOT_DOT_DASH:"dotDotDash",DOTTED:"dotted",DOUBLE:"double",DOUBLE_WAVE:"doubleWave",INSET:"inset",NIL:"nil",NONE:"none",OUTSET:"outset",THICK:"thick",THICK_THIN_LARGE_GAP:"thickThinLargeGap",THICK_THIN_MEDIUM_GAP:"thickThinMediumGap",THICK_THIN_SMALL_GAP:"thickThinSmallGap",THIN_THICK_LARGE_GAP:"thinThickLargeGap",THIN_THICK_MEDIUM_GAP:"thinThickMediumGap",THIN_THICK_SMALL_GAP:"thinThickSmallGap",THIN_THICK_THIN_LARGE_GAP:"thinThickThinLargeGap",THIN_THICK_THIN_MEDIUM_GAP:"thinThickThinMediumGap",THIN_THICK_THIN_SMALL_GAP:"thinThickThinSmallGap",THREE_D_EMBOSS:"threeDEmboss",THREE_D_ENGRAVE:"threeDEngrave",TRIPLE:"triple",WAVE:"wave"};class o9 extends Q1{constructor(U){super("w:pBdr");if(U.top)this.root.push(N0("w:top",U.top));if(U.bottom)this.root.push(N0("w:bottom",U.bottom));if(U.left)this.root.push(N0("w:left",U.left));if(U.right)this.root.push(N0("w:right",U.right));if(U.between)this.root.push(N0("w:between",U.between))}}class t9 extends o{constructor(){super("w:pBdr");let U=N0("w:bottom",{color:"auto",space:1,style:Q6.SINGLE,size:6});this.root.push(U)}}var kQ=({start:U,end:$,left:Y,right:Z,hanging:J,firstLine:G})=>new X0({name:"w:ind",attributes:{start:{key:"w:start",value:U===void 0?void 0:e0(U)},end:{key:"w:end",value:$===void 0?void 0:e0($)},left:{key:"w:left",value:Y===void 0?void 0:e0(Y)},right:{key:"w:right",value:Z===void 0?void 0:e0(Z)},hanging:{key:"w:hanging",value:J===void 0?void 0:T0(J)},firstLine:{key:"w:firstLine",value:G===void 0?void 0:T0(G)}}}),SQ=()=>new X0({name:"w:br"}),e9={BEGIN:"begin",END:"end",SEPARATE:"separate"},UU=(U,$)=>new X0({name:"w:fldChar",attributes:{type:{key:"w:fldCharType",value:U},dirty:{key:"w:dirty",value:$}}}),U1=(U)=>UU(e9.BEGIN,U),V1=(U)=>UU(e9.SEPARATE,U),$1=(U)=>UU(e9.END,U),KB={CENTER:"center",INSIDE:"inside",LEFT:"left",OUTSIDE:"outside",RIGHT:"right"},wB={BOTTOM:"bottom",CENTER:"center",INSIDE:"inside",OUTSIDE:"outside",TOP:"top"},BB={DECIMAL:"decimal",UPPER_ROMAN:"upperRoman",LOWER_ROMAN:"lowerRoman",UPPER_LETTER:"upperLetter",LOWER_LETTER:"lowerLetter",ORDINAL:"ordinal",CARDINAL_TEXT:"cardinalText",ORDINAL_TEXT:"ordinalText",HEX:"hex",CHICAGO:"chicago",IDEOGRAPH_DIGITAL:"ideographDigital",JAPANESE_COUNTING:"japaneseCounting",AIUEO:"aiueo",IROHA:"iroha",DECIMAL_FULL_WIDTH:"decimalFullWidth",DECIMAL_HALF_WIDTH:"decimalHalfWidth",JAPANESE_LEGAL:"japaneseLegal",JAPANESE_DIGITAL_TEN_THOUSAND:"japaneseDigitalTenThousand",DECIMAL_ENCLOSED_CIRCLE:"decimalEnclosedCircle",DECIMAL_FULL_WIDTH_2:"decimalFullWidth2",AIUEO_FULL_WIDTH:"aiueoFullWidth",IROHA_FULL_WIDTH:"irohaFullWidth",DECIMAL_ZERO:"decimalZero",BULLET:"bullet",GANADA:"ganada",CHOSUNG:"chosung",DECIMAL_ENCLOSED_FULL_STOP:"decimalEnclosedFullstop",DECIMAL_ENCLOSED_PAREN:"decimalEnclosedParen",DECIMAL_ENCLOSED_CIRCLE_CHINESE:"decimalEnclosedCircleChinese",IDEOGRAPH_ENCLOSED_CIRCLE:"ideographEnclosedCircle",IDEOGRAPH_TRADITIONAL:"ideographTraditional",IDEOGRAPH_ZODIAC:"ideographZodiac",IDEOGRAPH_ZODIAC_TRADITIONAL:"ideographZodiacTraditional",TAIWANESE_COUNTING:"taiwaneseCounting",IDEOGRAPH_LEGAL_TRADITIONAL:"ideographLegalTraditional",TAIWANESE_COUNTING_THOUSAND:"taiwaneseCountingThousand",TAIWANESE_DIGITAL:"taiwaneseDigital",CHINESE_COUNTING:"chineseCounting",CHINESE_LEGAL_SIMPLIFIED:"chineseLegalSimplified",CHINESE_COUNTING_TEN_THOUSAND:"chineseCountingThousand",KOREAN_DIGITAL:"koreanDigital",KOREAN_COUNTING:"koreanCounting",KOREAN_LEGAL:"koreanLegal",KOREAN_DIGITAL_2:"koreanDigital2",VIETNAMESE_COUNTING:"vietnameseCounting",RUSSIAN_LOWER:"russianLower",RUSSIAN_UPPER:"russianUpper",NONE:"none",NUMBER_IN_DASH:"numberInDash",HEBREW_1:"hebrew1",HEBREW_2:"hebrew2",ARABIC_ALPHA:"arabicAlpha",ARABIC_ABJAD:"arabicAbjad",HINDI_VOWELS:"hindiVowels",HINDI_CONSONANTS:"hindiConsonants",HINDI_NUMBERS:"hindiNumbers",HINDI_COUNTING:"hindiCounting",THAI_LETTERS:"thaiLetters",THAI_NUMBERS:"thaiNumbers",THAI_COUNTING:"thaiCounting",BAHT_TEXT:"bahtText",DOLLAR_TEXT:"dollarText"},g0={DEFAULT:"default",PRESERVE:"preserve"};class x0 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{space:"xml:space"})}}class vQ extends o{constructor(){super("w:instrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("PAGE")}}class _Q extends o{constructor(){super("w:instrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("NUMPAGES")}}class yQ extends o{constructor(){super("w:instrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("SECTIONPAGES")}}class bQ extends o{constructor(){super("w:instrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("SECTION")}}var j2=({fill:U,color:$,type:Y})=>new X0({name:"w:shd",attributes:{fill:{key:"w:fill",value:U===void 0?void 0:S1(U)},color:{key:"w:color",value:$===void 0?void 0:S1($)},type:{key:"w:val",value:Y}}}),qB={CLEAR:"clear",DIAGONAL_CROSS:"diagCross",DIAGONAL_STRIPE:"diagStripe",HORIZONTAL_CROSS:"horzCross",HORIZONTAL_STRIPE:"horzStripe",NIL:"nil",PERCENT_5:"pct5",PERCENT_10:"pct10",PERCENT_12:"pct12",PERCENT_15:"pct15",PERCENT_20:"pct20",PERCENT_25:"pct25",PERCENT_30:"pct30",PERCENT_35:"pct35",PERCENT_37:"pct37",PERCENT_40:"pct40",PERCENT_45:"pct45",PERCENT_50:"pct50",PERCENT_55:"pct55",PERCENT_60:"pct60",PERCENT_62:"pct62",PERCENT_65:"pct65",PERCENT_70:"pct70",PERCENT_75:"pct75",PERCENT_80:"pct80",PERCENT_85:"pct85",PERCENT_87:"pct87",PERCENT_90:"pct90",PERCENT_95:"pct95",REVERSE_DIAGONAL_STRIPE:"reverseDiagStripe",SOLID:"solid",THIN_DIAGONAL_CROSS:"thinDiagCross",THIN_DIAGONAL_STRIPE:"thinDiagStripe",THIN_HORIZONTAL_CROSS:"thinHorzCross",THIN_REVERSE_DIAGONAL_STRIPE:"thinReverseDiagStripe",THIN_VERTICAL_STRIPE:"thinVertStripe",VERTICAL_STRIPE:"vertStripe"};class _0 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id",author:"w:author",date:"w:date"})}}class gQ extends o{constructor(U){super("w:del");this.root.push(new _0({id:U.id,author:U.author,date:U.date}))}}class xQ extends o{constructor(U){super("w:ins");this.root.push(new _0({id:U.id,author:U.author,date:U.date}))}}var $U={DOT:"dot"},YU=(U=$U.DOT)=>new X0({name:"w:em",attributes:{val:{key:"w:val",value:U}}}),XB=()=>YU($U.DOT);class fQ extends o{constructor(U){super("w:spacing");this.root.push(new O0({val:e0(U)}))}}class hQ extends o{constructor(U){super("w:color");this.root.push(new O0({val:S1(U)}))}}class uQ extends o{constructor(U){super("w:highlight");this.root.push(new O0({val:U}))}}class dQ extends o{constructor(U){super("w:highlightCs");this.root.push(new O0({val:U}))}}var IB=(U)=>new X0({name:"w:lang",attributes:{value:{key:"w:val",value:U.value},eastAsia:{key:"w:eastAsia",value:U.eastAsia},bidirectional:{key:"w:bidi",value:U.bidirectional}}}),g2=(U,$)=>{if(typeof U==="string"){let Z=U;return new X0({name:"w:rFonts",attributes:{ascii:{key:"w:ascii",value:Z},cs:{key:"w:cs",value:Z},eastAsia:{key:"w:eastAsia",value:Z},hAnsi:{key:"w:hAnsi",value:Z},hint:{key:"w:hint",value:$}}})}let Y=U;return new X0({name:"w:rFonts",attributes:{ascii:{key:"w:ascii",value:Y.ascii},cs:{key:"w:cs",value:Y.cs},eastAsia:{key:"w:eastAsia",value:Y.eastAsia},hAnsi:{key:"w:hAnsi",value:Y.hAnsi},hint:{key:"w:hint",value:Y.hint}}})},cQ=(U)=>new X0({name:"w:vertAlign",attributes:{val:{key:"w:val",value:U}}}),LB=()=>cQ("superscript"),VB=()=>cQ("subscript"),ZU={SINGLE:"single",WORDS:"words",DOUBLE:"double",THICK:"thick",DOTTED:"dotted",DOTTEDHEAVY:"dottedHeavy",DASH:"dash",DASHEDHEAVY:"dashedHeavy",DASHLONG:"dashLong",DASHLONGHEAVY:"dashLongHeavy",DOTDASH:"dotDash",DASHDOTHEAVY:"dashDotHeavy",DOTDOTDASH:"dotDotDash",DASHDOTDOTHEAVY:"dashDotDotHeavy",WAVE:"wave",WAVYHEAVY:"wavyHeavy",WAVYDOUBLE:"wavyDouble",NONE:"none"},mQ=(U=ZU.SINGLE,$)=>new X0({name:"w:u",attributes:{val:{key:"w:val",value:U},color:{key:"w:color",value:$===void 0?void 0:S1($)}}}),MB={BLINK_BACKGROUND:"blinkBackground",LIGHTS:"lights",ANTS_BLACK:"antsBlack",ANTS_RED:"antsRed",SHIMMER:"shimmer",SPARKLE:"sparkle",NONE:"none"},WB={BLACK:"black",BLUE:"blue",CYAN:"cyan",DARK_BLUE:"darkBlue",DARK_CYAN:"darkCyan",DARK_GRAY:"darkGray",DARK_GREEN:"darkGreen",DARK_MAGENTA:"darkMagenta",DARK_RED:"darkRed",DARK_YELLOW:"darkYellow",GREEN:"green",LIGHT_GRAY:"lightGray",MAGENTA:"magenta",NONE:"none",RED:"red",WHITE:"white",YELLOW:"yellow"};class J1 extends Q1{constructor(U){var $,Y;super("w:rPr");if(!U)return;if(U.style)this.push(new Y1("w:rStyle",U.style));if(U.font)if(typeof U.font==="string")this.push(g2(U.font));else if("name"in U.font)this.push(g2(U.font.name,U.font.hint));else this.push(g2(U.font));if(U.bold!==void 0)this.push(new B0("w:b",U.bold));if(U.boldComplexScript===void 0&&U.bold!==void 0||U.boldComplexScript)this.push(new B0("w:bCs",($=U.boldComplexScript)!=null?$:U.bold));if(U.italics!==void 0)this.push(new B0("w:i",U.italics));if(U.italicsComplexScript===void 0&&U.italics!==void 0||U.italicsComplexScript)this.push(new B0("w:iCs",(Y=U.italicsComplexScript)!=null?Y:U.italics));if(U.smallCaps!==void 0)this.push(new B0("w:smallCaps",U.smallCaps));else if(U.allCaps!==void 0)this.push(new B0("w:caps",U.allCaps));if(U.strike!==void 0)this.push(new B0("w:strike",U.strike));if(U.doubleStrike!==void 0)this.push(new B0("w:dstrike",U.doubleStrike));if(U.emboss!==void 0)this.push(new B0("w:emboss",U.emboss));if(U.imprint!==void 0)this.push(new B0("w:imprint",U.imprint));if(U.noProof!==void 0)this.push(new B0("w:noProof",U.noProof));if(U.snapToGrid!==void 0)this.push(new B0("w:snapToGrid",U.snapToGrid));if(U.vanish)this.push(new B0("w:vanish",U.vanish));if(U.color)this.push(new hQ(U.color));if(U.characterSpacing)this.push(new fQ(U.characterSpacing));if(U.scale!==void 0)this.push(new E1("w:w",U.scale));if(U.kern)this.push(new w2("w:kern",U.kern));if(U.position)this.push(new Y1("w:position",U.position));if(U.size!==void 0)this.push(new w2("w:sz",U.size));let Z=U.sizeComplexScript===void 0||U.sizeComplexScript===!0?U.size:U.sizeComplexScript;if(Z)this.push(new w2("w:szCs",Z));if(U.highlight)this.push(new uQ(U.highlight));let J=U.highlightComplexScript===void 0||U.highlightComplexScript===!0?U.highlight:U.highlightComplexScript;if(J)this.push(new dQ(J));if(U.underline)this.push(mQ(U.underline.type,U.underline.color));if(U.effect)this.push(new Y1("w:effect",U.effect));if(U.border)this.push(N0("w:bdr",U.border));if(U.shading)this.push(j2(U.shading));if(U.subScript)this.push(VB());if(U.superScript)this.push(LB());if(U.rightToLeft!==void 0)this.push(new B0("w:rtl",U.rightToLeft));if(U.emphasisMark)this.push(YU(U.emphasisMark.type));if(U.language)this.push(IB(U.language));if(U.specVanish)this.push(new B0("w:specVanish",U.vanish));if(U.math)this.push(new B0("w:oMath",U.math));if(U.revision)this.push(new JU(U.revision))}push(U){this.root.push(U)}}class QU extends J1{constructor(U){super(U);if(U==null?void 0:U.insertion)this.push(new xQ(U.insertion));if(U==null?void 0:U.deletion)this.push(new gQ(U.deletion))}}class JU extends o{constructor(U){super("w:rPrChange");this.root.push(new _0({id:U.id,author:U.author,date:U.date})),this.addChildElement(new J1(U))}}class a1 extends o{constructor(U){var $;super("w:t");if(typeof U==="string")this.root.push(new x0({space:g0.PRESERVE})),this.root.push(U);else this.root.push(new x0({space:($=U.space)!=null?$:g0.DEFAULT})),this.root.push(U.text)}}var N1={CURRENT:"CURRENT",TOTAL_PAGES:"TOTAL_PAGES",TOTAL_PAGES_IN_SECTION:"TOTAL_PAGES_IN_SECTION",CURRENT_SECTION:"SECTION"};class C0 extends o{constructor(U){super("w:r");if(Y0(this,"properties"),this.properties=new J1(U),this.root.push(this.properties),U.break)for(let $=0;$>6|192,F[a++]=m&63|128;else if(Y(S,U0))m=65536+((m&1023)<<10)+(S.charCodeAt(++U0)&1023),F[a++]=m>>18|240,F[a++]=m>>12&63|128,F[a++]=m>>6&63|128,F[a++]=m&63|128;else F[a++]=m>>12|224,F[a++]=m>>6&63|128,F[a++]=m&63|128}}else if(h==="hex"){if(S=S.replace(/[^a-z0-9]+/ig,""),S.length%2!==0)S="0"+S;for(U0=0;U0>>24|S>>>8&65280|S<<8&16711680|(S&255)<<24;return h>>>0}z0.htonl=G;function w(S,h){var F="";for(var a=0;a>>0}return m}z0.join32=z;function R(S,h){var F=new Array(S.length*4);for(var a=0,U0=0;a>>24,F[U0+1]=m>>>16&255,F[U0+2]=m>>>8&255,F[U0+3]=m&255;else F[U0+3]=m>>>24,F[U0+2]=m>>>16&255,F[U0+1]=m>>>8&255,F[U0]=m&255}return F}z0.split32=R;function W(S,h){return S>>>h|S<<32-h}z0.rotr32=W;function E(S,h){return S<>>32-h}z0.rotl32=E;function D(S,h){return S+h>>>0}z0.sum32=D;function C(S,h,F){return S+h+F>>>0}z0.sum32_3=C;function H(S,h,F,a){return S+h+F+a>>>0}z0.sum32_4=H;function O(S,h,F,a,U0){return S+h+F+a+U0>>>0}z0.sum32_5=O;function X(S,h,F,a){var U0=S[h],m=S[h+1],J0=a+m>>>0,$0=(J0>>0,S[h+1]=J0}z0.sum64=X;function j(S,h,F,a){var U0=h+a>>>0,m=(U0>>0}z0.sum64_hi=j;function L(S,h,F,a){var U0=h+a;return U0>>>0}z0.sum64_lo=L;function I(S,h,F,a,U0,m,J0,$0){var I0=0,i=h;i=i+a>>>0,I0+=i>>0,I0+=i>>0,I0+=i<$0?1:0;var _=S+F+U0+J0+I0;return _>>>0}z0.sum64_4_hi=I;function A(S,h,F,a,U0,m,J0,$0){var I0=h+a+m+$0;return I0>>>0}z0.sum64_4_lo=A;function y(S,h,F,a,U0,m,J0,$0,I0,i){var _=0,r=h;r=r+a>>>0,_+=r>>0,_+=r>>0,_+=r<$0?1:0,r=r+i>>>0,_+=r>>0}z0.sum64_5_hi=y;function g(S,h,F,a,U0,m,J0,$0,I0,i){var _=h+a+m+$0+i;return _>>>0}z0.sum64_5_lo=g;function d(S,h,F){var a=h<<32-F|S>>>F;return a>>>0}z0.rotr64_hi=d;function k(S,h,F){var a=S<<32-F|h>>>F;return a>>>0}z0.rotr64_lo=k;function s(S,h,F){return S>>>F}z0.shr64_hi=s;function q0(S,h,F){var a=S<<32-F|h>>>F;return a>>>0}return z0.shr64_lo=q0,z0}var J9={},TZ;function F2(){if(TZ)return J9;TZ=1;var U=G1(),$=z2();function Y(){this.pending=null,this.pendingTotal=0,this.blockSize=this.constructor.blockSize,this.outSize=this.constructor.outSize,this.hmacStrength=this.constructor.hmacStrength,this.padLength=this.constructor.padLength/8,this.endian="big",this._delta8=this.blockSize/8,this._delta32=this.blockSize/32}return J9.BlockHash=Y,Y.prototype.update=function Z(J,G){if(J=U.toArray(J,G),!this.pending)this.pending=J;else this.pending=this.pending.concat(J);if(this.pendingTotal+=J.length,this.pending.length>=this._delta8){J=this.pending;var w=J.length%this._delta8;if(this.pending=J.slice(J.length-w,J.length),this.pending.length===0)this.pending=null;J=U.join32(J,0,J.length-w,this.endian);for(var Q=0;Q>>24&255,Q[q++]=J>>>16&255,Q[q++]=J>>>8&255,Q[q++]=J&255}else{Q[q++]=J&255,Q[q++]=J>>>8&255,Q[q++]=J>>>16&255,Q[q++]=J>>>24&255,Q[q++]=0,Q[q++]=0,Q[q++]=0,Q[q++]=0;for(z=8;z>>3}s0.g0_256=q;function z(R){return $(R,17)^$(R,19)^R>>>10}return s0.g1_256=z,s0}var G9,OZ;function HB(){if(OZ)return G9;OZ=1;var U=G1(),$=F2(),Y=aQ(),Z=U.rotl32,J=U.sum32,G=U.sum32_5,w=Y.ft_1,Q=$.BlockHash,q=[1518500249,1859775393,2400959708,3395469782];function z(){if(!(this instanceof z))return new z;Q.call(this),this.h=[1732584193,4023233417,2562383102,271733878,3285377520],this.W=new Array(80)}return U.inherits(z,Q),G9=z,z.blockSize=512,z.outSize=160,z.hmacStrength=80,z.padLength=64,z.prototype._update=function R(W,E){var D=this.W;for(var C=0;C<16;C++)D[C]=W[E+C];for(;Cthis.blockSize)J=new this.Hash().update(J).digest();$(J.length<=this.blockSize);for(var G=J.length;G{return(Y=$)=>{let Z="",J=Y|0;while(J--)Z+=U[Math.random()*U.length|0];return Z}},OB=(U=21)=>{let $="",Y=U|0;while(Y--)$+=TB[Math.random()*64|0];return $},EB=(U)=>Math.floor(U/25.4*72*20),d0=(U)=>Math.floor(U*72*20),N2=(U=0)=>{let $=U;return()=>++$},rQ=()=>N2(),sQ=()=>N2(1),nQ=()=>N2(),oQ=()=>N2(),R2=()=>OB().toLowerCase(),A9=(U)=>PB.sha1().update(U instanceof ArrayBuffer?new Uint8Array(U):U).digest("hex"),Y2=(U)=>CB("1234567890abcdef",U)(),tQ=()=>`${Y2(8)}-${Y2(4)}-${Y2(4)}-${Y2(4)}-${Y2(12)}`,B2=(U)=>new Uint8Array(new TextEncoder().encode(U)),eQ={CHARACTER:"character",COLUMN:"column",INSIDE_MARGIN:"insideMargin",LEFT_MARGIN:"leftMargin",MARGIN:"margin",OUTSIDE_MARGIN:"outsideMargin",PAGE:"page",RIGHT_MARGIN:"rightMargin"},UJ={BOTTOM_MARGIN:"bottomMargin",INSIDE_MARGIN:"insideMargin",LINE:"line",MARGIN:"margin",OUTSIDE_MARGIN:"outsideMargin",PAGE:"page",PARAGRAPH:"paragraph",TOP_MARGIN:"topMargin"},$J=()=>new X0({name:"wp:simplePos",attributes:{x:{key:"x",value:0},y:{key:"y",value:0}}}),YJ=(U)=>new X0({name:"wp:align",children:[U]}),ZJ=(U)=>new X0({name:"wp:posOffset",children:[U.toString()]}),QJ=({relative:U,align:$,offset:Y})=>new X0({name:"wp:positionH",attributes:{relativeFrom:{key:"relativeFrom",value:U!=null?U:eQ.PAGE}},children:[(()=>{if($)return YJ($);else if(Y!==void 0)return ZJ(Y);else throw new Error("There is no configuration provided for floating position (Align or offset)")})()]}),JJ=({relative:U,align:$,offset:Y})=>new X0({name:"wp:positionV",attributes:{relativeFrom:{key:"relativeFrom",value:U!=null?U:UJ.PAGE}},children:[(()=>{if($)return YJ($);else if(Y!==void 0)return ZJ(Y);else throw new Error("There is no configuration provided for floating position (Align or offset)")})()]}),GJ=((U)=>{return U.CENTER="ctr",U.TOP="t",U.BOTTOM="b",U})(GJ||{}),KJ=(U={})=>{var $,Y,Z,J;return new X0({name:"wps:bodyPr",attributes:{lIns:{key:"lIns",value:($=U.margins)==null?void 0:$.left},rIns:{key:"rIns",value:(Y=U.margins)==null?void 0:Y.right},tIns:{key:"tIns",value:(Z=U.margins)==null?void 0:Z.top},bIns:{key:"bIns",value:(J=U.margins)==null?void 0:J.bottom},anchor:{key:"anchor",value:U.verticalAnchor}},children:[...U.noAutoFit?[new B0("a:noAutofit",U.noAutoFit)]:[]]})},kB=(U={txBox:"1"})=>new X0({name:"wps:cNvSpPr",attributes:{txBox:{key:"txBox",value:U.txBox}}}),SB=(U)=>new X0({name:"w:txbxContent",children:[...U]}),vB=(U)=>new X0({name:"wps:txbx",children:[SB(U)]});class wJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{cx:"cx",cy:"cy"})}}class BJ extends o{constructor(U,$){super("a:ext");Y0(this,"attributes"),this.attributes=new wJ({cx:U,cy:$}),this.root.push(this.attributes)}}class qJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{x:"x",y:"y"})}}class XJ extends o{constructor(U,$){super("a:off");this.root.push(new qJ({x:U!=null?U:0,y:$!=null?$:0}))}}class IJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{flipVertical:"flipV",flipHorizontal:"flipH",rotation:"rot"})}}class KU extends o{constructor(U){var $,Y,Z,J,G,w;super("a:xfrm");Y0(this,"extents"),Y0(this,"offset"),this.root.push(new IJ({flipVertical:($=U.flip)==null?void 0:$.vertical,flipHorizontal:(Y=U.flip)==null?void 0:Y.horizontal,rotation:U.rotation})),this.offset=new XJ((J=(Z=U.offset)==null?void 0:Z.emus)==null?void 0:J.x,(w=(G=U.offset)==null?void 0:G.emus)==null?void 0:w.y),this.extents=new BJ(U.emus.x,U.emus.y),this.root.push(this.offset),this.root.push(this.extents)}}var LJ=()=>new X0({name:"a:noFill"}),_B=(U)=>new X0({name:"a:srgbClr",attributes:{value:{key:"val",value:U.value}}}),yB=(U)=>new X0({name:"a:schemeClr",attributes:{value:{key:"val",value:U.value}}}),P9=(U)=>new X0({name:"a:solidFill",children:[U.type==="rgb"?_B(U):yB(U)]}),bB=(U)=>new X0({name:"a:ln",attributes:{width:{key:"w",value:U.width},cap:{key:"cap",value:U.cap},compoundLine:{key:"cmpd",value:U.compoundLine},align:{key:"algn",value:U.align}},children:[U.type==="noFill"?LJ():U.solidFillType==="rgb"?P9({type:"rgb",value:U.value}):P9({type:"scheme",value:U.value})]});class VJ extends o{constructor(){super("a:avLst")}}class MJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{prst:"prst"})}}class WJ extends o{constructor(){super("a:prstGeom");this.root.push(new MJ({prst:"rect"})),this.root.push(new VJ)}}class HJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{bwMode:"bwMode"})}}class wU extends o{constructor({element:U,outline:$,solidFill:Y,transform:Z}){super(`${U}:spPr`);if(Y0(this,"form"),this.root.push(new HJ({bwMode:"auto"})),this.form=new KU(Z),this.root.push(this.form),this.root.push(new WJ),$)this.root.push(LJ()),this.root.push(bB($));if(Y)this.root.push(P9(Y))}}var xZ=(U)=>new X0({name:"wps:wsp",children:[kB(U.nonVisualProperties),new wU({element:"wps",transform:U.transformation,outline:U.outline,solidFill:U.solidFill}),vB(U.children),KJ(U.bodyProperties)]});class x2 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{uri:"uri"})}}var gB=(U)=>new X0({name:"asvg:svgBlip",attributes:{asvg:{key:"xmlns:asvg",value:"http://schemas.microsoft.com/office/drawing/2016/SVG/main"},embed:{key:"r:embed",value:`rId{${U.fileName}}`}}}),xB=(U)=>new X0({name:"a:ext",attributes:{uri:{key:"uri",value:"{96DAC541-7B7A-43D3-8B79-37D633B846F1}"}},children:[gB(U)]}),fB=(U)=>new X0({name:"a:extLst",children:[xB(U)]}),hB=(U)=>new X0({name:"a:blip",attributes:{embed:{key:"r:embed",value:`rId{${U.type==="svg"?U.fallback.fileName:U.fileName}}`},cstate:{key:"cstate",value:"none"}},children:U.type==="svg"?[fB(U)]:[]});class jJ extends o{constructor(){super("a:srcRect")}}class zJ extends o{constructor(){super("a:fillRect")}}class FJ extends o{constructor(){super("a:stretch");this.root.push(new zJ)}}class NJ extends o{constructor(U){super("pic:blipFill");this.root.push(hB(U)),this.root.push(new jJ),this.root.push(new FJ)}}class RJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{noChangeAspect:"noChangeAspect",noChangeArrowheads:"noChangeArrowheads"})}}class DJ extends o{constructor(){super("a:picLocks");this.root.push(new RJ({noChangeAspect:1,noChangeArrowheads:1}))}}class AJ extends o{constructor(){super("pic:cNvPicPr");this.root.push(new DJ)}}var PJ=(U,$)=>new X0({name:"a:hlinkClick",attributes:R0(W0({},$?{xmlns:{key:"xmlns:a",value:"http://schemas.openxmlformats.org/drawingml/2006/main"}}:{}),{id:{key:"r:id",value:`rId${U}`}})});class TJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"id",name:"name",descr:"descr"})}}class CJ extends o{constructor(){super("pic:cNvPr");this.root.push(new TJ({id:0,name:"",descr:""}))}prepForXml(U){for(let $=U.stack.length-1;$>=0;$--){let Y=U.stack[$];if(!(Y instanceof _1))continue;this.root.push(PJ(Y.linkId,!1));break}return super.prepForXml(U)}}class OJ extends o{constructor(){super("pic:nvPicPr");this.root.push(new CJ),this.root.push(new AJ)}}class EJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{xmlns:"xmlns:pic"})}}class T9 extends o{constructor({mediaData:U,transform:$,outline:Y}){super("pic:pic");this.root.push(new EJ({xmlns:"http://schemas.openxmlformats.org/drawingml/2006/picture"})),this.root.push(new OJ),this.root.push(new NJ(U)),this.root.push(new wU({element:"pic",transform:$,outline:Y}))}}var uB=(U)=>new X0({name:"wpg:grpSpPr",children:[new KU(U)]}),dB=()=>new X0({name:"wpg:cNvGrpSpPr"}),cB=(U)=>new X0({name:"wpg:wgp",children:[dB(),uB(U.transformation),...U.children]});class kJ extends o{constructor({mediaData:U,transform:$,outline:Y,solidFill:Z}){super("a:graphicData");if(U.type==="wps"){this.root.push(new x2({uri:"http://schemas.microsoft.com/office/word/2010/wordprocessingShape"}));let J=xZ(R0(W0({},U.data),{transformation:$,outline:Y,solidFill:Z}));this.root.push(J)}else if(U.type==="wpg"){this.root.push(new x2({uri:"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"}));let G=U.children.map((Q)=>{if(Q.type==="wps")return xZ(R0(W0({},Q.data),{transformation:Q.transformation,outline:Q.outline,solidFill:Q.solidFill}));else return new T9({mediaData:Q,transform:Q.transformation,outline:Q.outline})}),w=cB({children:G,transformation:$});this.root.push(w)}else{this.root.push(new x2({uri:"http://schemas.openxmlformats.org/drawingml/2006/picture"}));let G=new T9({mediaData:U,transform:$,outline:Y});this.root.push(G)}}}class SJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{a:"xmlns:a"})}}class BU extends o{constructor({mediaData:U,transform:$,outline:Y,solidFill:Z}){super("a:graphic");Y0(this,"data"),this.root.push(new SJ({a:"http://schemas.openxmlformats.org/drawingml/2006/main"})),this.data=new kJ({mediaData:U,transform:$,outline:Y,solidFill:Z}),this.root.push(this.data)}}var G2={NONE:0,SQUARE:1,TIGHT:2,TOP_AND_BOTTOM:3},vJ={BOTH_SIDES:"bothSides",LEFT:"left",RIGHT:"right",LARGEST:"largest"},C9=()=>new X0({name:"wp:wrapNone"}),_J=(U,$={top:0,bottom:0,left:0,right:0})=>new X0({name:"wp:wrapSquare",attributes:{wrapText:{key:"wrapText",value:U.side||vJ.BOTH_SIDES},distT:{key:"distT",value:$.top},distB:{key:"distB",value:$.bottom},distL:{key:"distL",value:$.left},distR:{key:"distR",value:$.right}}}),yJ=(U={top:0,bottom:0})=>new X0({name:"wp:wrapTight",attributes:{distT:{key:"distT",value:U.top},distB:{key:"distB",value:U.bottom}}}),bJ=(U={top:0,bottom:0})=>new X0({name:"wp:wrapTopAndBottom",attributes:{distT:{key:"distT",value:U.top},distB:{key:"distB",value:U.bottom}}});class qU extends o{constructor({name:U,description:$,title:Y,id:Z}={name:"",description:"",title:""}){super("wp:docPr");Y0(this,"docPropertiesUniqueNumericId",nQ());let J={id:{key:"id",value:Z!=null?Z:this.docPropertiesUniqueNumericId()},name:{key:"name",value:U}};if($!==null&&$!==void 0)J.description={key:"descr",value:$};if(Y!==null&&Y!==void 0)J.title={key:"title",value:Y};this.root.push(new n2(J))}prepForXml(U){for(let $=U.stack.length-1;$>=0;$--){let Y=U.stack[$];if(!(Y instanceof _1))continue;this.root.push(PJ(Y.linkId,!0));break}return super.prepForXml(U)}}var gJ=({top:U,right:$,bottom:Y,left:Z})=>new X0({name:"wp:effectExtent",attributes:{top:{key:"t",value:U},right:{key:"r",value:$},bottom:{key:"b",value:Y},left:{key:"l",value:Z}}}),xJ=({x:U,y:$})=>new X0({name:"wp:extent",attributes:{x:{key:"cx",value:U},y:{key:"cy",value:$}}});class fJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{xmlns:"xmlns:a",noChangeAspect:"noChangeAspect"})}}class hJ extends o{constructor(){super("a:graphicFrameLocks");this.root.push(new fJ({xmlns:"http://schemas.openxmlformats.org/drawingml/2006/main",noChangeAspect:1}))}}var uJ=()=>new X0({name:"wp:cNvGraphicFramePr",children:[new hJ]});class dJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{distT:"distT",distB:"distB",distL:"distL",distR:"distR",allowOverlap:"allowOverlap",behindDoc:"behindDoc",layoutInCell:"layoutInCell",locked:"locked",relativeHeight:"relativeHeight",simplePos:"simplePos"})}}class cJ extends o{constructor({mediaData:U,transform:$,drawingOptions:Y}){super("wp:anchor");let Z=W0({allowOverlap:!0,behindDocument:!1,lockAnchor:!1,layoutInCell:!0,verticalPosition:{},horizontalPosition:{}},Y.floating);if(this.root.push(new dJ({distT:Z.margins?Z.margins.top||0:0,distB:Z.margins?Z.margins.bottom||0:0,distL:Z.margins?Z.margins.left||0:0,distR:Z.margins?Z.margins.right||0:0,simplePos:"0",allowOverlap:Z.allowOverlap===!0?"1":"0",behindDoc:Z.behindDocument===!0?"1":"0",locked:Z.lockAnchor===!0?"1":"0",layoutInCell:Z.layoutInCell===!0?"1":"0",relativeHeight:Z.zIndex?Z.zIndex:$.emus.y})),this.root.push($J()),this.root.push(QJ(Z.horizontalPosition)),this.root.push(JJ(Z.verticalPosition)),this.root.push(xJ({x:$.emus.x,y:$.emus.y})),this.root.push(gJ({top:0,right:0,bottom:0,left:0})),Y.floating!==void 0&&Y.floating.wrap!==void 0)switch(Y.floating.wrap.type){case G2.SQUARE:this.root.push(_J(Y.floating.wrap,Y.floating.margins));break;case G2.TIGHT:this.root.push(yJ(Y.floating.margins));break;case G2.TOP_AND_BOTTOM:this.root.push(bJ(Y.floating.margins));break;case G2.NONE:default:this.root.push(C9())}else this.root.push(C9());this.root.push(new qU(Y.docProperties)),this.root.push(uJ()),this.root.push(new BU({mediaData:U,transform:$,outline:Y.outline,solidFill:Y.solidFill}))}}var mB=({mediaData:U,transform:$,docProperties:Y,outline:Z,solidFill:J})=>{var G,w,Q,q;return new X0({name:"wp:inline",attributes:{distanceTop:{key:"distT",value:0},distanceBottom:{key:"distB",value:0},distanceLeft:{key:"distL",value:0},distanceRight:{key:"distR",value:0}},children:[xJ({x:$.emus.x,y:$.emus.y}),gJ(Z?{top:((G=Z.width)!=null?G:9525)*2,right:((w=Z.width)!=null?w:9525)*2,bottom:((Q=Z.width)!=null?Q:9525)*2,left:((q=Z.width)!=null?q:9525)*2}:{top:0,right:0,bottom:0,left:0}),new qU(Y),uJ(),new BU({mediaData:U,transform:$,outline:Z,solidFill:J})]})};class D2 extends o{constructor(U,$={}){super("w:drawing");if(!$.floating)this.root.push(mB({mediaData:U,transform:U.transformation,docProperties:$.docProperties,outline:$.outline,solidFill:$.solidFill}));else this.root.push(new cJ({mediaData:U,transform:U.transformation,drawingOptions:$}))}}var lB=(U)=>{let Y=U.indexOf(";base64,"),Z=Y===-1?0:Y+8;return new Uint8Array(atob(U.substring(Z)).split("").map((J)=>J.charCodeAt(0)))},mJ=(U)=>typeof U==="string"?lB(U):U,L9=(U,$)=>({data:mJ(U.data),fileName:$,transformation:{pixels:{x:Math.round(U.transformation.width),y:Math.round(U.transformation.height)},emus:{x:Math.round(U.transformation.width*9525),y:Math.round(U.transformation.height*9525)},flip:U.transformation.flip,rotation:U.transformation.rotation?U.transformation.rotation*60000:void 0}});class lJ extends C0{constructor(U){super({});Y0(this,"imageData");let Y=`${A9(U.data)}.${U.type}`;this.imageData=U.type==="svg"?R0(W0({type:U.type},L9(U,Y)),{fallback:W0({type:U.fallback.type},L9(R0(W0({},U.fallback),{transformation:U.transformation}),`${A9(U.fallback.data)}.${U.fallback.type}`))}):W0({type:U.type},L9(U,Y));let Z=new D2(this.imageData,{floating:U.floating,docProperties:U.altText,outline:U.outline});this.root.push(Z)}prepForXml(U){if(U.file.Media.addImage(this.imageData.fileName,this.imageData),this.imageData.type==="svg")U.file.Media.addImage(this.imageData.fallback.fileName,this.imageData.fallback);return super.prepForXml(U)}}var XU=(U)=>{var $,Y,Z,J,G,w,Q,q;return{offset:{pixels:{x:Math.round((Y=($=U.offset)==null?void 0:$.left)!=null?Y:0),y:Math.round((J=(Z=U.offset)==null?void 0:Z.top)!=null?J:0)},emus:{x:Math.round(((w=(G=U.offset)==null?void 0:G.left)!=null?w:0)*9525),y:Math.round(((q=(Q=U.offset)==null?void 0:Q.top)!=null?q:0)*9525)}},pixels:{x:Math.round(U.width),y:Math.round(U.height)},emus:{x:Math.round(U.width*9525),y:Math.round(U.height*9525)},flip:U.flip,rotation:U.rotation?U.rotation*60000:void 0}};class aJ extends C0{constructor(U){super({});Y0(this,"wpsShapeData"),this.wpsShapeData={type:U.type,transformation:XU(U.transformation),data:W0({},U)};let $=new D2(this.wpsShapeData,{floating:U.floating,docProperties:U.altText,outline:U.outline,solidFill:U.solidFill});this.root.push($)}}class pJ extends C0{constructor(U){super({});Y0(this,"wpgGroupData"),Y0(this,"mediaDatas"),this.wpgGroupData={type:U.type,transformation:XU(U.transformation),children:U.children};let $=new D2(this.wpgGroupData,{floating:U.floating,docProperties:U.altText});this.mediaDatas=U.children.filter((Y)=>Y.type!=="wps").map((Y)=>Y),this.root.push($)}prepForXml(U){return this.mediaDatas.forEach(($)=>{if(U.file.Media.addImage($.fileName,$),$.type==="svg")U.file.Media.addImage($.fallback.fileName,$.fallback)}),super.prepForXml(U)}}class iJ extends o{constructor(U){super("w:instrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push(`SEQ ${U}`)}}class rJ extends C0{constructor(U){super({});this.root.push(U1(!0)),this.root.push(new iJ(U)),this.root.push(V1()),this.root.push($1())}}class sJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{instr:"w:instr"})}}class J6 extends o{constructor(U,$){super("w:fldSimple");if(this.root.push(new sJ({instr:U})),$!==void 0)this.root.push(new p1($))}}class nJ extends J6{constructor(U){super(` MERGEFIELD ${U} `,`«${U}»`)}}class oJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{xmlns:"xmlns"})}}var tJ={EXTERNAL:"External"},aB=(U,$,Y,Z)=>new X0({name:"Relationship",attributes:{id:{key:"Id",value:U},type:{key:"Type",value:$},target:{key:"Target",value:Y},targetMode:{key:"TargetMode",value:Z}}});class W1 extends o{constructor(){super("Relationships");this.root.push(new oJ({xmlns:"http://schemas.openxmlformats.org/package/2006/relationships"}))}addRelationship(U,$,Y,Z){this.root.push(aB(`rId${U}`,$,Y,Z))}get RelationshipCount(){return this.root.length-1}}class eJ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id",initials:"w:initials",author:"w:author",date:"w:date"})}}class G6 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id"})}}class UG extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{"xmlns:cx":"xmlns:cx","xmlns:cx1":"xmlns:cx1","xmlns:cx2":"xmlns:cx2","xmlns:cx3":"xmlns:cx3","xmlns:cx4":"xmlns:cx4","xmlns:cx5":"xmlns:cx5","xmlns:cx6":"xmlns:cx6","xmlns:cx7":"xmlns:cx7","xmlns:cx8":"xmlns:cx8","xmlns:mc":"xmlns:mc","xmlns:aink":"xmlns:aink","xmlns:am3d":"xmlns:am3d","xmlns:o":"xmlns:o","xmlns:r":"xmlns:r","xmlns:m":"xmlns:m","xmlns:v":"xmlns:v","xmlns:wp14":"xmlns:wp14","xmlns:wp":"xmlns:wp","xmlns:w10":"xmlns:w10","xmlns:w":"xmlns:w","xmlns:w14":"xmlns:w14","xmlns:w15":"xmlns:w15","xmlns:w16cex":"xmlns:w16cex","xmlns:w16cid":"xmlns:w16cid","xmlns:w16":"xmlns:w16","xmlns:w16sdtdh":"xmlns:w16sdtdh","xmlns:w16se":"xmlns:w16se","xmlns:wpg":"xmlns:wpg","xmlns:wpi":"xmlns:wpi","xmlns:wne":"xmlns:wne","xmlns:wps":"xmlns:wps"})}}class $G extends o{constructor(U){super("w:commentRangeStart");this.root.push(new G6({id:U}))}}class YG extends o{constructor(U){super("w:commentRangeEnd");this.root.push(new G6({id:U}))}}class ZG extends o{constructor(U){super("w:commentReference");this.root.push(new G6({id:U}))}}class IU extends o{constructor({id:U,initials:$,author:Y,date:Z=new Date,children:J}){super("w:comment");this.root.push(new eJ({id:U,initials:$,author:Y,date:Z.toISOString()}));for(let G of J)this.root.push(G)}}class LU extends o{constructor({children:U}){super("w:comments");Y0(this,"relationships"),this.root.push(new UG({"xmlns:cx":"http://schemas.microsoft.com/office/drawing/2014/chartex","xmlns:cx1":"http://schemas.microsoft.com/office/drawing/2015/9/8/chartex","xmlns:cx2":"http://schemas.microsoft.com/office/drawing/2015/10/21/chartex","xmlns:cx3":"http://schemas.microsoft.com/office/drawing/2016/5/9/chartex","xmlns:cx4":"http://schemas.microsoft.com/office/drawing/2016/5/10/chartex","xmlns:cx5":"http://schemas.microsoft.com/office/drawing/2016/5/11/chartex","xmlns:cx6":"http://schemas.microsoft.com/office/drawing/2016/5/12/chartex","xmlns:cx7":"http://schemas.microsoft.com/office/drawing/2016/5/13/chartex","xmlns:cx8":"http://schemas.microsoft.com/office/drawing/2016/5/14/chartex","xmlns:mc":"http://schemas.openxmlformats.org/markup-compatibility/2006","xmlns:aink":"http://schemas.microsoft.com/office/drawing/2016/ink","xmlns:am3d":"http://schemas.microsoft.com/office/drawing/2017/model3d","xmlns:o":"urn:schemas-microsoft-com:office:office","xmlns:r":"http://schemas.openxmlformats.org/officeDocument/2006/relationships","xmlns:m":"http://schemas.openxmlformats.org/officeDocument/2006/math","xmlns:v":"urn:schemas-microsoft-com:vml","xmlns:wp14":"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing","xmlns:wp":"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing","xmlns:w10":"urn:schemas-microsoft-com:office:word","xmlns:w":"http://schemas.openxmlformats.org/wordprocessingml/2006/main","xmlns:w14":"http://schemas.microsoft.com/office/word/2010/wordml","xmlns:w15":"http://schemas.microsoft.com/office/word/2012/wordml","xmlns:w16cex":"http://schemas.microsoft.com/office/word/2018/wordml/cex","xmlns:w16cid":"http://schemas.microsoft.com/office/word/2016/wordml/cid","xmlns:w16":"http://schemas.microsoft.com/office/word/2018/wordml","xmlns:w16sdtdh":"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash","xmlns:w16se":"http://schemas.microsoft.com/office/word/2015/wordml/symex","xmlns:wpg":"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup","xmlns:wpi":"http://schemas.microsoft.com/office/word/2010/wordprocessingInk","xmlns:wne":"http://schemas.microsoft.com/office/word/2006/wordml","xmlns:wps":"http://schemas.microsoft.com/office/word/2010/wordprocessingShape"}));for(let $ of U)this.root.push(new IU($));this.relationships=new W1}get Relationships(){return this.relationships}}class QG extends E0{constructor(){super("w:noBreakHyphen")}}class JG extends E0{constructor(){super("w:softHyphen")}}class GG extends E0{constructor(){super("w:dayShort")}}class KG extends E0{constructor(){super("w:monthShort")}}class wG extends E0{constructor(){super("w:yearShort")}}class BG extends E0{constructor(){super("w:dayLong")}}class qG extends E0{constructor(){super("w:monthLong")}}class XG extends E0{constructor(){super("w:yearLong")}}class IG extends E0{constructor(){super("w:annotationRef")}}class LG extends E0{constructor(){super("w:footnoteRef")}}class VU extends E0{constructor(){super("w:endnoteRef")}}class VG extends E0{constructor(){super("w:separator")}}class MG extends E0{constructor(){super("w:continuationSeparator")}}class WG extends E0{constructor(){super("w:pgNum")}}class HG extends E0{constructor(){super("w:cr")}}class MU extends E0{constructor(){super("w:tab")}}class jG extends E0{constructor(){super("w:lastRenderedPageBreak")}}var pB={LEFT:"left",CENTER:"center",RIGHT:"right"},iB={MARGIN:"margin",INDENT:"indent"},rB={NONE:"none",DOT:"dot",HYPHEN:"hyphen",UNDERSCORE:"underscore",MIDDLE_DOT:"middleDot"};class zG extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{alignment:"w:alignment",relativeTo:"w:relativeTo",leader:"w:leader"})}}class FG extends o{constructor(U){super("w:ptab");this.root.push(new zG({alignment:U.alignment,relativeTo:U.relativeTo,leader:U.leader}))}}var NG={COLUMN:"column",PAGE:"page"};class WU extends o{constructor(U){super("w:br");this.root.push(new O0({type:U}))}}class RG extends C0{constructor(){super({});this.root.push(new WU(NG.PAGE))}}class DG extends C0{constructor(){super({});this.root.push(new WU(NG.COLUMN))}}class HU extends o{constructor(){super("w:pageBreakBefore")}}var v1={AT_LEAST:"atLeast",EXACTLY:"exactly",EXACT:"exact",AUTO:"auto"},AG=({after:U,before:$,line:Y,lineRule:Z,beforeAutoSpacing:J,afterAutoSpacing:G})=>new X0({name:"w:spacing",attributes:{after:{key:"w:after",value:U},before:{key:"w:before",value:$},line:{key:"w:line",value:Y},lineRule:{key:"w:lineRule",value:Z},beforeAutoSpacing:{key:"w:beforeAutospacing",value:J},afterAutoSpacing:{key:"w:afterAutospacing",value:G}}}),sB={HEADING_1:"Heading1",HEADING_2:"Heading2",HEADING_3:"Heading3",HEADING_4:"Heading4",HEADING_5:"Heading5",HEADING_6:"Heading6",TITLE:"Title"},K2=(U)=>new X0({name:"w:pStyle",attributes:{val:{key:"w:val",value:U}}}),O9={LEFT:"left",RIGHT:"right",CENTER:"center",BAR:"bar",CLEAR:"clear",DECIMAL:"decimal",END:"end",NUM:"num",START:"start"},nB={DOT:"dot",HYPHEN:"hyphen",MIDDLE_DOT:"middleDot",NONE:"none",UNDERSCORE:"underscore"},oB={MAX:9026},PG=({type:U,position:$,leader:Y})=>new X0({name:"w:tab",attributes:{val:{key:"w:val",value:U},pos:{key:"w:pos",value:$},leader:{key:"w:leader",value:Y}}}),TG=(U)=>new X0({name:"w:tabs",children:U.map(($)=>PG($))});class q2 extends o{constructor(U,$){super("w:numPr");this.root.push(new CG($)),this.root.push(new OG(U))}}class CG extends o{constructor(U){super("w:ilvl");if(U>9)throw new Error("Level cannot be greater than 9. Read more here: https://answers.microsoft.com/en-us/msoffice/forum/all/does-word-support-more-than-9-list-levels/d130fdcd-1781-446d-8c84-c6c79124e4d7");this.root.push(new O0({val:U}))}}class OG extends o{constructor(U){super("w:numId");this.root.push(new O0({val:typeof U==="string"?`{${U}}`:U}))}}class r1 extends o{constructor(){super(...arguments);Y0(this,"fileChild",Symbol())}}class EG extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"r:id",history:"w:history",anchor:"w:anchor"})}}var tB={INTERNAL:"INTERNAL",EXTERNAL:"EXTERNAL"};class _1 extends o{constructor(U,$,Y){super("w:hyperlink");Y0(this,"linkId"),this.linkId=$;let Z={history:1,anchor:Y?Y:void 0,id:!Y?`rId${this.linkId}`:void 0},J=new EG(Z);this.root.push(J),U.forEach((G)=>{this.root.push(G)})}}class jU extends _1{constructor(U){super(U.children,R2(),U.anchor)}}class K6 extends o{constructor(U){super("w:externalHyperlink");this.options=U}}class kG extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id",name:"w:name"})}}class SG extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id"})}}class zU{constructor(U){Y0(this,"bookmarkUniqueNumericId",oQ()),Y0(this,"start"),Y0(this,"children"),Y0(this,"end");let $=this.bookmarkUniqueNumericId();this.start=new FU(U.id,$),this.children=U.children,this.end=new NU($)}}class FU extends o{constructor(U,$){super("w:bookmarkStart");let Y=new kG({name:U,id:$});this.root.push(Y)}}class NU extends o{constructor(U){super("w:bookmarkEnd");let $=new SG({id:U});this.root.push($)}}var vG=((U)=>{return U.NONE="none",U.RELATIVE="relative",U.NO_CONTEXT="no_context",U.FULL_CONTEXT="full_context",U})(vG||{}),eB={["relative"]:"\\r",["no_context"]:"\\n",["full_context"]:"\\w",["none"]:void 0};class _G extends J6{constructor(U,$,Y={}){let{hyperlink:Z=!0,referenceFormat:J="full_context"}=Y,G=`REF ${U}`,w=[...Z?["\\h"]:[],...[eB[J]].filter((q)=>!!q)],Q=`${G} ${w.join(" ")}`;super(Q,$)}}var yG=(U)=>new X0({name:"w:outlineLvl",attributes:{val:{key:"w:val",value:U}}});class bG extends o{constructor(U,$={}){super("w:instrText");this.root.push(new x0({space:g0.PRESERVE}));let Y=`PAGEREF ${U}`;if($.hyperlink)Y=`${Y} \\h`;if($.useRelativePosition)Y=`${Y} \\p`;this.root.push(Y)}}class gG extends C0{constructor(U,$={}){super({children:[U1(!0),new bG(U,$),$1()]})}}var Uq={ANSI:"00",DEFAULT:"01",SYMBOL:"02",MAC:"4D",JIS:"80",HANGUL:"81",JOHAB:"82",GB_2312:"86",CHINESEBIG5:"88",GREEK:"A1",TURKISH:"A2",VIETNAMESE:"A3",HEBREW:"B1",ARABIC:"B2",BALTIC:"BA",RUSSIAN:"CC",THAI:"DE",EASTEUROPE:"EE",OEM:"FF"},_2=({id:U,fontKey:$,subsetted:Y},Z)=>new X0({name:Z,attributes:W0({id:{key:"r:id",value:U}},$?{fontKey:{key:"w:fontKey",value:`{${$}}`}}:{}),children:[...Y?[new B0("w:subsetted",Y)]:[]]}),$q=({name:U,altName:$,panose1:Y,charset:Z,family:J,notTrueType:G,pitch:w,sig:Q,embedRegular:q,embedBold:z,embedItalic:R,embedBoldItalic:W})=>new X0({name:"w:font",attributes:{name:{key:"w:name",value:U}},children:[...$?[u1("w:altName",$)]:[],...Y?[u1("w:panose1",Y)]:[],...Z?[u1("w:charset",Z)]:[],u1("w:family",J),...G?[new B0("w:notTrueType",G)]:[],u1("w:pitch",w),...Q?[new X0({name:"w:sig",attributes:{usb0:{key:"w:usb0",value:Q.usb0},usb1:{key:"w:usb1",value:Q.usb1},usb2:{key:"w:usb2",value:Q.usb2},usb3:{key:"w:usb3",value:Q.usb3},csb0:{key:"w:csb0",value:Q.csb0},csb1:{key:"w:csb1",value:Q.csb1}}})]:[],...q?[_2(q,"w:embedRegular")]:[],...z?[_2(z,"w:embedBold")]:[],...R?[_2(R,"w:embedItalic")]:[],...W?[_2(W,"w:embedBoldItalic")]:[]]}),Yq=({name:U,index:$,fontKey:Y,characterSet:Z})=>$q({name:U,sig:{usb0:"E0002AFF",usb1:"C000247B",usb2:"00000009",usb3:"00000000",csb0:"000001FF",csb1:"00000000"},charset:Z,family:"auto",pitch:"variable",embedRegular:{fontKey:Y,id:`rId${$}`}}),Zq=(U)=>new X0({name:"w:fonts",attributes:{mc:{key:"xmlns:mc",value:"http://schemas.openxmlformats.org/markup-compatibility/2006"},r:{key:"xmlns:r",value:"http://schemas.openxmlformats.org/officeDocument/2006/relationships"},w:{key:"xmlns:w",value:"http://schemas.openxmlformats.org/wordprocessingml/2006/main"},w14:{key:"xmlns:w14",value:"http://schemas.microsoft.com/office/word/2010/wordml"},w15:{key:"xmlns:w15",value:"http://schemas.microsoft.com/office/word/2012/wordml"},w16cex:{key:"xmlns:w16cex",value:"http://schemas.microsoft.com/office/word/2018/wordml/cex"},w16cid:{key:"xmlns:w16cid",value:"http://schemas.microsoft.com/office/word/2016/wordml/cid"},w16:{key:"xmlns:w16",value:"http://schemas.microsoft.com/office/word/2018/wordml"},w16sdtdh:{key:"xmlns:w16sdtdh",value:"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash"},w16se:{key:"xmlns:w16se",value:"http://schemas.microsoft.com/office/word/2015/wordml/symex"},Ignorable:{key:"mc:Ignorable",value:"w14 w15 w16se w16cid w16 w16cex w16sdtdh"}},children:U.map(($,Y)=>Yq({name:$.name,index:Y+1,fontKey:$.fontKey,characterSet:$.characterSet}))});class RU{constructor(U){Y0(this,"fontTable"),Y0(this,"relationships"),Y0(this,"fontOptionsWithKey",[]),this.options=U,this.fontOptionsWithKey=U.map(($)=>R0(W0({},$),{fontKey:tQ()})),this.fontTable=Zq(this.fontOptionsWithKey),this.relationships=new W1;for(let $=0;$new X0({name:"w:wordWrap",attributes:{val:{key:"w:val",value:0}}}),Jq={NONE:"none",DROP:"drop",MARGIN:"margin"},Gq={MARGIN:"margin",PAGE:"page",TEXT:"text"},Kq={AROUND:"around",AUTO:"auto",NONE:"none",NOT_BESIDE:"notBeside",THROUGH:"through",TIGHT:"tight"},xG=(U)=>{var $,Y;return new X0({name:"w:framePr",attributes:{anchorLock:{key:"w:anchorLock",value:U.anchorLock},dropCap:{key:"w:dropCap",value:U.dropCap},width:{key:"w:w",value:U.width},height:{key:"w:h",value:U.height},x:{key:"w:x",value:U.position?U.position.x:void 0},y:{key:"w:y",value:U.position?U.position.y:void 0},anchorHorizontal:{key:"w:hAnchor",value:U.anchor.horizontal},anchorVertical:{key:"w:vAnchor",value:U.anchor.vertical},spaceHorizontal:{key:"w:hSpace",value:($=U.space)==null?void 0:$.horizontal},spaceVertical:{key:"w:vSpace",value:(Y=U.space)==null?void 0:Y.vertical},rule:{key:"w:hRule",value:U.rule},alignmentX:{key:"w:xAlign",value:U.alignment?U.alignment.x:void 0},alignmentY:{key:"w:yAlign",value:U.alignment?U.alignment.y:void 0},lines:{key:"w:lines",value:U.lines},wrap:{key:"w:wrap",value:U.wrap}}})};class Z1 extends Q1{constructor(U){var $,Y;super("w:pPr",U==null?void 0:U.includeIfEmpty);if(Y0(this,"numberingReferences",[]),!U)return this;if(U.heading)this.push(K2(U.heading));if(U.bullet)this.push(K2("ListParagraph"));if(U.numbering){if(!U.style&&!U.heading){if(!U.numbering.custom)this.push(K2("ListParagraph"))}}if(U.style)this.push(K2(U.style));if(U.keepNext!==void 0)this.push(new B0("w:keepNext",U.keepNext));if(U.keepLines!==void 0)this.push(new B0("w:keepLines",U.keepLines));if(U.pageBreakBefore)this.push(new HU);if(U.frame)this.push(xG(U.frame));if(U.widowControl!==void 0)this.push(new B0("w:widowControl",U.widowControl));if(U.bullet)this.push(new q2(1,U.bullet.level));if(U.numbering)this.numberingReferences.push({reference:U.numbering.reference,instance:($=U.numbering.instance)!=null?$:0}),this.push(new q2(`${U.numbering.reference}-${(Y=U.numbering.instance)!=null?Y:0}`,U.numbering.level));else if(U.numbering===!1)this.push(new q2(0,0));if(U.border)this.push(new o9(U.border));if(U.thematicBreak)this.push(new t9);if(U.shading)this.push(j2(U.shading));if(U.wordWrap)this.push(Qq());if(U.overflowPunctuation)this.push(new B0("w:overflowPunct",U.overflowPunctuation));let Z=[...U.rightTabStop!==void 0?[{type:O9.RIGHT,position:U.rightTabStop}]:[],...U.tabStops?U.tabStops:[],...U.leftTabStop!==void 0?[{type:O9.LEFT,position:U.leftTabStop}]:[]];if(Z.length>0)this.push(TG(Z));if(U.bidirectional!==void 0)this.push(new B0("w:bidi",U.bidirectional));if(U.spacing)this.push(AG(U.spacing));if(U.indent)this.push(kQ(U.indent));if(U.contextualSpacing!==void 0)this.push(new B0("w:contextualSpacing",U.contextualSpacing));if(U.alignment)this.push(n9(U.alignment));if(U.outlineLevel!==void 0)this.push(yG(U.outlineLevel));if(U.suppressLineNumbers!==void 0)this.push(new B0("w:suppressLineNumbers",U.suppressLineNumbers));if(U.autoSpaceEastAsianText!==void 0)this.push(new B0("w:autoSpaceDN",U.autoSpaceEastAsianText));if(U.run)this.push(new QU(U.run));if(U.revision)this.push(new DU(U.revision))}push(U){this.root.push(U)}prepForXml(U){if(!(U.viewWrapper instanceof RU))for(let $ of this.numberingReferences)U.file.Numbering.createConcreteNumberingInstance($.reference,$.instance);return super.prepForXml(U)}}class DU extends o{constructor(U){super("w:pPrChange");this.root.push(new _0({id:U.id,author:U.author,date:U.date})),this.root.push(new Z1(R0(W0({},U),{includeIfEmpty:!0})))}}class h0 extends r1{constructor(U){super("w:p");if(Y0(this,"properties"),typeof U==="string")return this.properties=new Z1({}),this.root.push(this.properties),this.root.push(new p1(U)),this;if(this.properties=new Z1(U),this.root.push(this.properties),U.text)this.root.push(new p1(U.text));if(U.children)for(let $ of U.children){if($ instanceof zU){this.root.push($.start);for(let Y of $.children)this.root.push(Y);this.root.push($.end);continue}this.root.push($)}}prepForXml(U){for(let $ of this.root)if($ instanceof K6){let Y=this.root.indexOf($),Z=new _1($.options.children,R2());U.viewWrapper.Relationships.addRelationship(Z.linkId,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",$.options.link,tJ.EXTERNAL),this.root[Y]=Z}return super.prepForXml(U)}addRunToFront(U){return this.root.splice(1,0,U),this}}var wq=class U extends o{constructor($){super("m:oMath");for(let Y of $.children)this.root.push(Y)}};class fG extends o{constructor(U){super("m:t");this.root.push(U)}}class hG extends o{constructor(U){super("m:r");this.root.push(new fG(U))}}class AU extends o{constructor(U){super("m:den");for(let $ of U)this.root.push($)}}class PU extends o{constructor(U){super("m:num");for(let $ of U)this.root.push($)}}class uG extends o{constructor(U){super("m:f");this.root.push(new PU(U.numerator)),this.root.push(new AU(U.denominator))}}var dG=({accent:U})=>new X0({name:"m:chr",attributes:{accent:{key:"m:val",value:U}}}),y0=({children:U})=>new X0({name:"m:e",children:U}),cG=({value:U})=>new X0({name:"m:limLoc",attributes:{value:{key:"m:val",value:U||"undOvr"}}}),Bq=()=>new X0({name:"m:subHide",attributes:{hide:{key:"m:val",value:1}}}),qq=()=>new X0({name:"m:supHide",attributes:{hide:{key:"m:val",value:1}}}),TU=({accent:U,hasSuperScript:$,hasSubScript:Y,limitLocationVal:Z})=>new X0({name:"m:naryPr",children:[...U?[dG({accent:U})]:[],cG({value:Z}),...!$?[qq()]:[],...!Y?[Bq()]:[]]}),s1=({children:U})=>new X0({name:"m:sub",children:U}),n1=({children:U})=>new X0({name:"m:sup",children:U});class mG extends o{constructor(U){super("m:nary");if(this.root.push(TU({accent:"∑",hasSuperScript:!!U.superScript,hasSubScript:!!U.subScript})),U.subScript)this.root.push(s1({children:U.subScript}));if(U.superScript)this.root.push(n1({children:U.superScript}));this.root.push(y0({children:U.children}))}}class lG extends o{constructor(U){super("m:nary");if(this.root.push(TU({accent:"",hasSuperScript:!!U.superScript,hasSubScript:!!U.subScript,limitLocationVal:"subSup"})),U.subScript)this.root.push(s1({children:U.subScript}));if(U.superScript)this.root.push(n1({children:U.superScript}));this.root.push(y0({children:U.children}))}}class w6 extends o{constructor(U){super("m:lim");for(let $ of U)this.root.push($)}}class aG extends o{constructor(U){super("m:limUpp");this.root.push(y0({children:U.children})),this.root.push(new w6(U.limit))}}class pG extends o{constructor(U){super("m:limLow");this.root.push(y0({children:U.children})),this.root.push(new w6(U.limit))}}var iG=()=>new X0({name:"m:sSupPr"});class rG extends o{constructor(U){super("m:sSup");this.root.push(iG()),this.root.push(y0({children:U.children})),this.root.push(n1({children:U.superScript}))}}var sG=()=>new X0({name:"m:sSubPr"});class nG extends o{constructor(U){super("m:sSub");this.root.push(sG()),this.root.push(y0({children:U.children})),this.root.push(s1({children:U.subScript}))}}var oG=()=>new X0({name:"m:sSubSupPr"});class tG extends o{constructor(U){super("m:sSubSup");this.root.push(oG()),this.root.push(y0({children:U.children})),this.root.push(s1({children:U.subScript})),this.root.push(n1({children:U.superScript}))}}var eG=()=>new X0({name:"m:sPrePr"});class UK extends X0{constructor({children:U,subScript:$,superScript:Y}){super({name:"m:sPre",children:[eG(),y0({children:U}),s1({children:$}),n1({children:Y})]})}}var Xq="";class CU extends o{constructor(U){super("m:deg");if(U)for(let $ of U)this.root.push($)}}class $K extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{hide:"m:val"})}}class YK extends o{constructor(){super("m:degHide");this.root.push(new $K({hide:1}))}}class OU extends o{constructor(U){super("m:radPr");if(!U)this.root.push(new YK)}}class ZK extends o{constructor(U){super("m:rad");this.root.push(new OU(!!U.degree)),this.root.push(new CU(U.degree)),this.root.push(y0({children:U.children}))}}class EU extends o{constructor(U){super("m:fName");for(let $ of U)this.root.push($)}}class kU extends o{constructor(){super("m:funcPr")}}class QK extends o{constructor(U){super("m:func");this.root.push(new kU),this.root.push(new EU(U.name)),this.root.push(y0({children:U.children}))}}var Iq=({character:U})=>new X0({name:"m:begChr",attributes:{character:{key:"m:val",value:U}}}),Lq=({character:U})=>new X0({name:"m:endChr",attributes:{character:{key:"m:val",value:U}}}),B6=({characters:U})=>new X0({name:"m:dPr",children:U?[Iq({character:U.beginningCharacter}),Lq({character:U.endingCharacter})]:[]});class JK extends o{constructor(U){super("m:d");this.root.push(B6({})),this.root.push(y0({children:U.children}))}}class GK extends o{constructor(U){super("m:d");this.root.push(B6({characters:{beginningCharacter:"[",endingCharacter:"]"}})),this.root.push(y0({children:U.children}))}}class KK extends o{constructor(U){super("m:d");this.root.push(B6({characters:{beginningCharacter:"{",endingCharacter:"}"}})),this.root.push(y0({children:U.children}))}}class wK extends o{constructor(U){super("m:d");this.root.push(B6({characters:{beginningCharacter:"〈",endingCharacter:"〉"}})),this.root.push(y0({children:U.children}))}}var Vq=(U)=>new X0({name:"w:gridCol",attributes:U!==void 0?{width:{key:"w:w",value:T0(U)}}:void 0});class SU extends o{constructor(U,$){super("w:tblGrid");for(let Y of U)this.root.push(Vq(Y));if($)this.root.push(new qK($))}}class BK extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id"})}}class qK extends o{constructor(U){super("w:tblGridChange");this.root.push(new BK({id:U.id})),this.root.push(new SU(U.columnWidths))}}class XK extends o{constructor(U){super("w:ins");this.root.push(new _0({id:U.id,author:U.author,date:U.date})),this.addChildElement(new p1(U))}}class IK extends o{constructor(){super("w:delInstrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("PAGE")}}class LK extends o{constructor(){super("w:delInstrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("NUMPAGES")}}class VK extends o{constructor(){super("w:delInstrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("SECTIONPAGES")}}class E9 extends o{constructor(U){super("w:delText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push(U)}}class MK extends o{constructor(U){super("w:del");Y0(this,"deletedTextRunWrapper"),this.root.push(new _0({id:U.id,author:U.author,date:U.date})),this.deletedTextRunWrapper=new WK(U),this.addChildElement(this.deletedTextRunWrapper)}}class WK extends o{constructor(U){super("w:r");if(this.root.push(new J1(U)),U.children)for(let $ of U.children){if(typeof $==="string"){switch($){case N1.CURRENT:this.root.push(U1()),this.root.push(new IK),this.root.push(V1()),this.root.push($1());break;case N1.TOTAL_PAGES:this.root.push(U1()),this.root.push(new LK),this.root.push(V1()),this.root.push($1());break;case N1.TOTAL_PAGES_IN_SECTION:this.root.push(U1()),this.root.push(new VK),this.root.push(V1()),this.root.push($1());break;default:this.root.push(new E9($));break}continue}this.root.push($)}else if(U.text)this.root.push(new E9(U.text));if(U.break)for(let $=0;$new X0({name:"w:vAlign",attributes:{verticalAlign:{key:"w:val",value:U}}}),zK=({marginUnitType:U=l2.DXA,top:$,left:Y,bottom:Z,right:J})=>[{name:"w:top",size:$},{name:"w:left",size:Y},{name:"w:bottom",size:Z},{name:"w:right",size:J}].filter((G)=>G.size!==void 0).map(({name:G,size:w})=>L2(G,{type:U,size:w})),Hq=(U)=>{let $=zK(U);if($.length===0)return;return new X0({name:"w:tblCellMar",children:$})},jq=(U)=>{let $=zK(U);if($.length===0)return;return new X0({name:"w:tcMar",children:$})},l2={AUTO:"auto",DXA:"dxa",NIL:"nil",PERCENTAGE:"pct"},L2=(U,{type:$=l2.AUTO,size:Y})=>{let Z=Y;if($===l2.PERCENTAGE&&typeof Y==="number")Z=`${Y}%`;return new X0({name:U,attributes:{type:{key:"w:type",value:$},size:{key:"w:w",value:s9(Z)}}})};class hU extends Q1{constructor(U){super("w:tcBorders");if(U.top)this.root.push(N0("w:top",U.top));if(U.start)this.root.push(N0("w:start",U.start));if(U.left)this.root.push(N0("w:left",U.left));if(U.bottom)this.root.push(N0("w:bottom",U.bottom));if(U.end)this.root.push(N0("w:end",U.end));if(U.right)this.root.push(N0("w:right",U.right))}}class FK extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val"})}}class uU extends o{constructor(U){super("w:gridSpan");this.root.push(new FK({val:S0(U)}))}}var dU={CONTINUE:"continue",RESTART:"restart"};class NK extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val"})}}class a2 extends o{constructor(U){super("w:vMerge");this.root.push(new NK({val:U}))}}var zq={BOTTOM_TO_TOP_LEFT_TO_RIGHT:"btLr",LEFT_TO_RIGHT_TOP_TO_BOTTOM:"lrTb",TOP_TO_BOTTOM_RIGHT_TO_LEFT:"tbRl"};class RK extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val"})}}class cU extends o{constructor(U){super("w:textDirection");this.root.push(new RK({val:U}))}}class mU extends Q1{constructor(U){super("w:tcPr",U.includeIfEmpty);if(U.width)this.root.push(L2("w:tcW",U.width));if(U.columnSpan)this.root.push(new uU(U.columnSpan));if(U.verticalMerge)this.root.push(new a2(U.verticalMerge));else if(U.rowSpan&&U.rowSpan>1)this.root.push(new a2(dU.RESTART));if(U.borders)this.root.push(new hU(U.borders));if(U.shading)this.root.push(j2(U.shading));if(U.margins){let $=jq(U.margins);if($)this.root.push($)}if(U.textDirection)this.root.push(new cU(U.textDirection));if(U.verticalAlign)this.root.push(fU(U.verticalAlign));if(U.insertion)this.root.push(new yU(U.insertion));if(U.deletion)this.root.push(new bU(U.deletion));if(U.revision)this.root.push(new DK(U.revision));if(U.cellMerge)this.root.push(new xU(U.cellMerge))}}class DK extends o{constructor(U){super("w:tcPrChange");this.root.push(new _0({id:U.id,author:U.author,date:U.date})),this.root.push(new mU(R0(W0({},U),{includeIfEmpty:!0})))}}class q6 extends o{constructor(U){super("w:tc");this.options=U,this.root.push(new mU(U));for(let $ of U.children)this.root.push($)}prepForXml(U){if(!(this.root[this.root.length-1]instanceof h0))this.root.push(new h0({}));return super.prepForXml(U)}}var x1={style:Q6.NONE,size:0,color:"auto"},f1={style:Q6.SINGLE,size:4,color:"auto"};class X6 extends o{constructor(U){var $,Y,Z,J,G,w;super("w:tblBorders");this.root.push(N0("w:top",($=U.top)!=null?$:f1)),this.root.push(N0("w:left",(Y=U.left)!=null?Y:f1)),this.root.push(N0("w:bottom",(Z=U.bottom)!=null?Z:f1)),this.root.push(N0("w:right",(J=U.right)!=null?J:f1)),this.root.push(N0("w:insideH",(G=U.insideHorizontal)!=null?G:f1)),this.root.push(N0("w:insideV",(w=U.insideVertical)!=null?w:f1))}}Y0(X6,"NONE",{top:x1,bottom:x1,left:x1,right:x1,insideHorizontal:x1,insideVertical:x1});var Fq={MARGIN:"margin",PAGE:"page",TEXT:"text"},Nq={CENTER:"center",INSIDE:"inside",LEFT:"left",OUTSIDE:"outside",RIGHT:"right"},Rq={CENTER:"center",INSIDE:"inside",BOTTOM:"bottom",OUTSIDE:"outside",INLINE:"inline",TOP:"top"},Dq={NEVER:"never",OVERLAP:"overlap"},Aq=(U)=>new X0({name:"w:tblOverlap",attributes:{val:{key:"w:val",value:U}}}),AK=({horizontalAnchor:U,verticalAnchor:$,absoluteHorizontalPosition:Y,relativeHorizontalPosition:Z,absoluteVerticalPosition:J,relativeVerticalPosition:G,bottomFromText:w,topFromText:Q,leftFromText:q,rightFromText:z,overlap:R})=>new X0({name:"w:tblpPr",attributes:{leftFromText:{key:"w:leftFromText",value:q===void 0?void 0:T0(q)},rightFromText:{key:"w:rightFromText",value:z===void 0?void 0:T0(z)},topFromText:{key:"w:topFromText",value:Q===void 0?void 0:T0(Q)},bottomFromText:{key:"w:bottomFromText",value:w===void 0?void 0:T0(w)},absoluteHorizontalPosition:{key:"w:tblpX",value:Y===void 0?void 0:e0(Y)},absoluteVerticalPosition:{key:"w:tblpY",value:J===void 0?void 0:e0(J)},horizontalAnchor:{key:"w:horzAnchor",value:U},relativeHorizontalPosition:{key:"w:tblpXSpec",value:Z},relativeVerticalPosition:{key:"w:tblpYSpec",value:G},verticalAnchor:{key:"w:vertAnchor",value:$}},children:R?[Aq(R)]:void 0}),Pq={AUTOFIT:"autofit",FIXED:"fixed"},PK=(U)=>new X0({name:"w:tblLayout",attributes:{type:{key:"w:type",value:U}}}),Tq={DXA:"dxa"},TK=({type:U=Tq.DXA,value:$})=>new X0({name:"w:tblCellSpacing",attributes:{type:{key:"w:type",value:U},value:{key:"w:w",value:s9($)}}}),CK=({firstRow:U,lastRow:$,firstColumn:Y,lastColumn:Z,noHBand:J,noVBand:G})=>new X0({name:"w:tblLook",attributes:{firstRow:{key:"w:firstRow",value:U},lastRow:{key:"w:lastRow",value:$},firstColumn:{key:"w:firstColumn",value:Y},lastColumn:{key:"w:lastColumn",value:Z},noHBand:{key:"w:noHBand",value:J},noVBand:{key:"w:noVBand",value:G}}});class I6 extends Q1{constructor(U){super("w:tblPr",U.includeIfEmpty);if(U.style)this.root.push(new Y1("w:tblStyle",U.style));if(U.float)this.root.push(AK(U.float));if(U.visuallyRightToLeft!==void 0)this.root.push(new B0("w:bidiVisual",U.visuallyRightToLeft));if(U.width)this.root.push(L2("w:tblW",U.width));if(U.alignment)this.root.push(n9(U.alignment));if(U.indent)this.root.push(L2("w:tblInd",U.indent));if(U.borders)this.root.push(new X6(U.borders));if(U.shading)this.root.push(j2(U.shading));if(U.layout)this.root.push(PK(U.layout));if(U.cellMargin){let $=Hq(U.cellMargin);if($)this.root.push($)}if(U.tableLook)this.root.push(CK(U.tableLook));if(U.cellSpacing)this.root.push(TK(U.cellSpacing));if(U.revision)this.root.push(new OK(U.revision))}}class OK extends o{constructor(U){super("w:tblPrChange");this.root.push(new _0({id:U.id,author:U.author,date:U.date})),this.root.push(new I6(R0(W0({},U),{includeIfEmpty:!0})))}}class EK extends r1{constructor({rows:U,width:$,columnWidths:Y=Array(Math.max(...U.map((H)=>H.CellCount))).fill(100),columnWidthsRevision:Z,margins:J,indent:G,float:w,layout:Q,style:q,borders:z,alignment:R,visuallyRightToLeft:W,tableLook:E,cellSpacing:D,revision:C}){super("w:tbl");this.root.push(new I6({borders:z!=null?z:{},width:$!=null?$:{size:100},indent:G,float:w,layout:Q,style:q,alignment:R,cellMargin:J,visuallyRightToLeft:W,tableLook:E,cellSpacing:D,revision:C})),this.root.push(new SU(Y,Z));for(let H of U)this.root.push(H);U.forEach((H,O)=>{if(O===U.length-1)return;let X=0;H.cells.forEach((j)=>{if(j.options.rowSpan&&j.options.rowSpan>1){let L=new q6({rowSpan:j.options.rowSpan-1,columnSpan:j.options.columnSpan,borders:j.options.borders,children:[],verticalMerge:dU.CONTINUE});U[O+1].addCellToColumnIndex(L,X)}X+=j.options.columnSpan||1})})}}var Cq={AUTO:"auto",ATLEAST:"atLeast",EXACT:"exact"},kK=(U,$)=>new X0({name:"w:trHeight",attributes:{value:{key:"w:val",value:T0(U)},rule:{key:"w:hRule",value:$}}});class L6 extends Q1{constructor(U){super("w:trPr",U.includeIfEmpty);if(U.cantSplit!==void 0)this.root.push(new B0("w:cantSplit",U.cantSplit));if(U.tableHeader!==void 0)this.root.push(new B0("w:tblHeader",U.tableHeader));if(U.height)this.root.push(kK(U.height.value,U.height.rule));if(U.cellSpacing)this.root.push(TK(U.cellSpacing));if(U.insertion)this.root.push(new vU(U.insertion));if(U.deletion)this.root.push(new _U(U.deletion));if(U.revision)this.root.push(new lU(U.revision))}}class lU extends o{constructor(U){super("w:trPrChange");this.root.push(new _0({id:U.id,author:U.author,date:U.date})),this.root.push(new L6(R0(W0({},U),{includeIfEmpty:!0})))}}class SK extends o{constructor(U){super("w:tr");this.options=U,this.root.push(new L6(U));for(let $ of U.children)this.root.push($)}get CellCount(){return this.options.children.length}get cells(){return this.root.filter((U)=>U instanceof q6)}addCellToIndex(U,$){this.root.splice($+1,0,U)}addCellToColumnIndex(U,$){let Y=this.columnIndexToRootIndex($,!0);this.addCellToIndex(U,Y-1)}rootIndexToColumnIndex(U){if(U<1||U>=this.root.length)throw new Error(`cell 'rootIndex' should between 1 to ${this.root.length-1}`);let $=0;for(let Y=1;Y=this.root.length)if($)return this.root.length;else throw new Error(`cell 'columnIndex' should not great than ${Y-1}`);let J=this.root[Z];Z+=1,Y+=J&&J.options.columnSpan||1}return Z-1}}class vK extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{xmlns:"xmlns",vt:"xmlns:vt"})}}class _K extends o{constructor(){super("Properties");this.root.push(new vK({xmlns:"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties",vt:"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"}))}}class yK extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{xmlns:"xmlns"})}}var X1=(U,$)=>new X0({name:"Default",attributes:{contentType:{key:"ContentType",value:U},extension:{key:"Extension",value:$}}}),f0=(U,$)=>new X0({name:"Override",attributes:{contentType:{key:"ContentType",value:U},partName:{key:"PartName",value:$}}});class bK extends o{constructor(){super("Types");this.root.push(new yK({xmlns:"http://schemas.openxmlformats.org/package/2006/content-types"})),this.root.push(X1("image/png","png")),this.root.push(X1("image/jpeg","jpeg")),this.root.push(X1("image/jpeg","jpg")),this.root.push(X1("image/bmp","bmp")),this.root.push(X1("image/gif","gif")),this.root.push(X1("image/svg+xml","svg")),this.root.push(X1("application/vnd.openxmlformats-package.relationships+xml","rels")),this.root.push(X1("application/xml","xml")),this.root.push(X1("application/vnd.openxmlformats-officedocument.obfuscatedFont","odttf")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml","/word/document.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml","/word/styles.xml")),this.root.push(f0("application/vnd.openxmlformats-package.core-properties+xml","/docProps/core.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.custom-properties+xml","/docProps/custom.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.extended-properties+xml","/docProps/app.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml","/word/numbering.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml","/word/footnotes.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml","/word/endnotes.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml","/word/settings.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml","/word/comments.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml","/word/fontTable.xml"))}addFooter(U){this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml",`/word/footer${U}.xml`))}addHeader(U){this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml",`/word/header${U}.xml`))}}var p2={wpc:"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",mc:"http://schemas.openxmlformats.org/markup-compatibility/2006",o:"urn:schemas-microsoft-com:office:office",r:"http://schemas.openxmlformats.org/officeDocument/2006/relationships",m:"http://schemas.openxmlformats.org/officeDocument/2006/math",v:"urn:schemas-microsoft-com:vml",wp14:"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",wp:"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",w10:"urn:schemas-microsoft-com:office:word",w:"http://schemas.openxmlformats.org/wordprocessingml/2006/main",w14:"http://schemas.microsoft.com/office/word/2010/wordml",w15:"http://schemas.microsoft.com/office/word/2012/wordml",wpg:"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",wpi:"http://schemas.microsoft.com/office/word/2010/wordprocessingInk",wne:"http://schemas.microsoft.com/office/word/2006/wordml",wps:"http://schemas.microsoft.com/office/word/2010/wordprocessingShape",cp:"http://schemas.openxmlformats.org/package/2006/metadata/core-properties",dc:"http://purl.org/dc/elements/1.1/",dcterms:"http://purl.org/dc/terms/",dcmitype:"http://purl.org/dc/dcmitype/",xsi:"http://www.w3.org/2001/XMLSchema-instance",cx:"http://schemas.microsoft.com/office/drawing/2014/chartex",cx1:"http://schemas.microsoft.com/office/drawing/2015/9/8/chartex",cx2:"http://schemas.microsoft.com/office/drawing/2015/10/21/chartex",cx3:"http://schemas.microsoft.com/office/drawing/2016/5/9/chartex",cx4:"http://schemas.microsoft.com/office/drawing/2016/5/10/chartex",cx5:"http://schemas.microsoft.com/office/drawing/2016/5/11/chartex",cx6:"http://schemas.microsoft.com/office/drawing/2016/5/12/chartex",cx7:"http://schemas.microsoft.com/office/drawing/2016/5/13/chartex",cx8:"http://schemas.microsoft.com/office/drawing/2016/5/14/chartex",aink:"http://schemas.microsoft.com/office/drawing/2016/ink",am3d:"http://schemas.microsoft.com/office/drawing/2017/model3d",w16cex:"http://schemas.microsoft.com/office/word/2018/wordml/cex",w16cid:"http://schemas.microsoft.com/office/word/2016/wordml/cid",w16:"http://schemas.microsoft.com/office/word/2018/wordml",w16sdtdh:"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash",w16se:"http://schemas.microsoft.com/office/word/2015/wordml/symex"};class o1 extends V0{constructor(U,$){super(W0({Ignorable:$},Object.fromEntries(U.map((Y)=>[Y,p2[Y]]))));Y0(this,"xmlKeys",W0({Ignorable:"mc:Ignorable"},Object.fromEntries(Object.keys(p2).map((Y)=>[Y,`xmlns:${Y}`]))))}}class gK extends o{constructor(U){super("cp:coreProperties");if(this.root.push(new o1(["cp","dc","dcterms","dcmitype","xsi"])),U.title)this.root.push(new I1("dc:title",U.title));if(U.subject)this.root.push(new I1("dc:subject",U.subject));if(U.creator)this.root.push(new I1("dc:creator",U.creator));if(U.keywords)this.root.push(new I1("cp:keywords",U.keywords));if(U.description)this.root.push(new I1("dc:description",U.description));if(U.lastModifiedBy)this.root.push(new I1("cp:lastModifiedBy",U.lastModifiedBy));if(U.revision)this.root.push(new I1("cp:revision",String(U.revision)));this.root.push(new k9("dcterms:created")),this.root.push(new k9("dcterms:modified"))}}class xK extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{type:"xsi:type"})}}class k9 extends o{constructor(U){super(U);this.root.push(new xK({type:"dcterms:W3CDTF"})),this.root.push(OQ(new Date))}}class fK extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{xmlns:"xmlns",vt:"xmlns:vt"})}}class hK extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{formatId:"fmtid",pid:"pid",name:"name"})}}class uK extends o{constructor(U,$){super("property");this.root.push(new hK({formatId:"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}",pid:U.toString(),name:$.name})),this.root.push(new dK($.value))}}class dK extends o{constructor(U){super("vt:lpwstr");this.root.push(U)}}class cK extends o{constructor(U){super("Properties");Y0(this,"nextId"),Y0(this,"properties",[]),this.root.push(new fK({xmlns:"http://schemas.openxmlformats.org/officeDocument/2006/custom-properties",vt:"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"})),this.nextId=2;for(let $ of U)this.addCustomProperty($)}prepForXml(U){return this.properties.forEach(($)=>this.root.push($)),super.prepForXml(U)}addCustomProperty(U){this.properties.push(new uK(this.nextId++,U))}}var mK=({space:U,count:$,separate:Y,equalWidth:Z,children:J})=>new X0({name:"w:cols",attributes:{space:{key:"w:space",value:U===void 0?void 0:T0(U)},count:{key:"w:num",value:$===void 0?void 0:S0($)},separate:{key:"w:sep",value:Y},equalWidth:{key:"w:equalWidth",value:Z}},children:!Z&&J?J:void 0}),Oq={DEFAULT:"default",LINES:"lines",LINES_AND_CHARS:"linesAndChars",SNAP_TO_CHARS:"snapToChars"},lK=({type:U,linePitch:$,charSpace:Y})=>new X0({name:"w:docGrid",attributes:{type:{key:"w:type",value:U},linePitch:{key:"w:linePitch",value:S0($)},charSpace:{key:"w:charSpace",value:Y?S0(Y):void 0}}}),k1={DEFAULT:"default",FIRST:"first",EVEN:"even"},S9={HEADER:"w:headerReference",FOOTER:"w:footerReference"},f2=(U,$)=>new X0({name:U,attributes:{type:{key:"w:type",value:$.type||k1.DEFAULT},id:{key:"r:id",value:`rId${$.id}`}}}),Eq={NEW_PAGE:"newPage",NEW_SECTION:"newSection",CONTINUOUS:"continuous"},aK=({countBy:U,start:$,restart:Y,distance:Z})=>new X0({name:"w:lnNumType",attributes:{countBy:{key:"w:countBy",value:U===void 0?void 0:S0(U)},start:{key:"w:start",value:$===void 0?void 0:S0($)},restart:{key:"w:restart",value:Y},distance:{key:"w:distance",value:Z===void 0?void 0:T0(Z)}}}),kq={ALL_PAGES:"allPages",FIRST_PAGE:"firstPage",NOT_FIRST_PAGE:"notFirstPage"},Sq={PAGE:"page",TEXT:"text"},vq={BACK:"back",FRONT:"front"};class v9 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{display:"w:display",offsetFrom:"w:offsetFrom",zOrder:"w:zOrder"})}}class aU extends Q1{constructor(U){super("w:pgBorders");if(!U)return this;if(U.pageBorders)this.root.push(new v9({display:U.pageBorders.display,offsetFrom:U.pageBorders.offsetFrom,zOrder:U.pageBorders.zOrder}));else this.root.push(new v9({}));if(U.pageBorderTop)this.root.push(N0("w:top",U.pageBorderTop));if(U.pageBorderLeft)this.root.push(N0("w:left",U.pageBorderLeft));if(U.pageBorderBottom)this.root.push(N0("w:bottom",U.pageBorderBottom));if(U.pageBorderRight)this.root.push(N0("w:right",U.pageBorderRight))}}var pK=(U,$,Y,Z,J,G,w)=>new X0({name:"w:pgMar",attributes:{top:{key:"w:top",value:e0(U)},right:{key:"w:right",value:T0($)},bottom:{key:"w:bottom",value:e0(Y)},left:{key:"w:left",value:T0(Z)},header:{key:"w:header",value:T0(J)},footer:{key:"w:footer",value:T0(G)},gutter:{key:"w:gutter",value:T0(w)}}}),_q={HYPHEN:"hyphen",PERIOD:"period",COLON:"colon",EM_DASH:"emDash",EN_DASH:"endash"},iK=({start:U,formatType:$,separator:Y})=>new X0({name:"w:pgNumType",attributes:{start:{key:"w:start",value:U===void 0?void 0:S0(U)},formatType:{key:"w:fmt",value:$},separator:{key:"w:chapSep",value:Y}}}),i2={PORTRAIT:"portrait",LANDSCAPE:"landscape"},rK=({width:U,height:$,orientation:Y,code:Z})=>{let J=T0(U),G=T0($);return new X0({name:"w:pgSz",attributes:{width:{key:"w:w",value:Y===i2.LANDSCAPE?G:J},height:{key:"w:h",value:Y===i2.LANDSCAPE?J:G},orientation:{key:"w:orient",value:Y},code:{key:"w:code",value:Z}}})},yq={LEFT_TO_RIGHT_TOP_TO_BOTTOM:"lrTb",TOP_TO_BOTTOM_RIGHT_TO_LEFT:"tbRl"};class sK extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val"})}}class pU extends o{constructor(U){super("w:textDirection");this.root.push(new sK({val:U}))}}var bq={NEXT_PAGE:"nextPage",NEXT_COLUMN:"nextColumn",CONTINUOUS:"continuous",EVEN_PAGE:"evenPage",ODD_PAGE:"oddPage"},nK=(U)=>new X0({name:"w:type",attributes:{val:{key:"w:val",value:U}}}),F1={TOP:1440,RIGHT:1440,BOTTOM:1440,LEFT:1440,HEADER:708,FOOTER:708,GUTTER:0},h2={WIDTH:11906,HEIGHT:16838,ORIENTATION:i2.PORTRAIT};class V6 extends o{constructor({page:{size:{width:U=h2.WIDTH,height:$=h2.HEIGHT,orientation:Y=h2.ORIENTATION}={},margin:{top:Z=F1.TOP,right:J=F1.RIGHT,bottom:G=F1.BOTTOM,left:w=F1.LEFT,header:Q=F1.HEADER,footer:q=F1.FOOTER,gutter:z=F1.GUTTER}={},pageNumbers:R={},borders:W,textDirection:E}={},grid:{linePitch:D=360,charSpace:C,type:H}={},headerWrapperGroup:O={},footerWrapperGroup:X={},lineNumbers:j,titlePage:L,verticalAlign:I,column:A,type:y,revision:g}={}){super("w:sectPr");if(this.addHeaderFooterGroup(S9.HEADER,O),this.addHeaderFooterGroup(S9.FOOTER,X),y)this.root.push(nK(y));if(this.root.push(rK({width:U,height:$,orientation:Y})),this.root.push(pK(Z,J,G,w,Q,q,z)),W)this.root.push(new aU(W));if(j)this.root.push(aK(j));if(this.root.push(iK(R)),A)this.root.push(mK(A));if(I)this.root.push(fU(I));if(L!==void 0)this.root.push(new B0("w:titlePg",L));if(E)this.root.push(new pU(E));if(g)this.root.push(new iU(g));this.root.push(lK({linePitch:D,charSpace:C,type:H}))}addHeaderFooterGroup(U,$){if($.default)this.root.push(f2(U,{type:k1.DEFAULT,id:$.default.View.ReferenceId}));if($.first)this.root.push(f2(U,{type:k1.FIRST,id:$.first.View.ReferenceId}));if($.even)this.root.push(f2(U,{type:k1.EVEN,id:$.even.View.ReferenceId}))}}class iU extends o{constructor(U){super("w:sectPrChange");this.root.push(new _0({id:U.id,author:U.author,date:U.date})),this.root.push(new V6(U))}}class oK extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{width:"w:w",space:"w:space"})}}class tK extends o{constructor(U){super("w:col");this.root.push(new oK({width:T0(U.width),space:U.space===void 0?void 0:T0(U.space)}))}}class rU extends o{constructor(){super("w:body");Y0(this,"sections",[])}addSection(U){let $=this.sections.pop();this.root.push(this.createSectionParagraph($)),this.sections.push(new V6(U))}prepForXml(U){if(this.sections.length===1)this.root.splice(0,1),this.root.push(this.sections.pop());return super.prepForXml(U)}push(U){this.root.push(U)}createSectionParagraph(U){let $=new h0({}),Y=new Z1({});return Y.push(U),$.addChildElement(Y),$}}class sU extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{color:"w:color",themeColor:"w:themeColor",themeShade:"w:themeShade",themeTint:"w:themeTint"})}}class nU extends o{constructor(U){super("w:background");this.root.push(new sU({color:U.color===void 0?void 0:S1(U.color),themeColor:U.themeColor,themeShade:U.themeShade===void 0?void 0:D9(U.themeShade),themeTint:U.themeTint===void 0?void 0:D9(U.themeTint)}))}}class eK extends o{constructor(U){super("w:document");if(Y0(this,"body"),this.root.push(new o1(["wpc","mc","o","r","m","v","wp14","wp","w10","w","w14","w15","wpg","wpi","wne","wps","cx","cx1","cx2","cx3","cx4","cx5","cx6","cx7","cx8","aink","am3d","w16cex","w16cid","w16","w16sdtdh","w16se"],"w14 w15 wp14")),this.body=new rU,U.background)this.root.push(new nU(U.background));this.root.push(this.body)}add(U){return this.body.push(U),this}get Body(){return this.body}}class U5{constructor(U){Y0(this,"document"),Y0(this,"relationships"),this.document=new eK(U),this.relationships=new W1}get View(){return this.document}get Relationships(){return this.relationships}}class $5 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{wpc:"xmlns:wpc",mc:"xmlns:mc",o:"xmlns:o",r:"xmlns:r",m:"xmlns:m",v:"xmlns:v",wp14:"xmlns:wp14",wp:"xmlns:wp",w10:"xmlns:w10",w:"xmlns:w",w14:"xmlns:w14",w15:"xmlns:w15",wpg:"xmlns:wpg",wpi:"xmlns:wpi",wne:"xmlns:wne",wps:"xmlns:wps",Ignorable:"mc:Ignorable"})}}class Y5 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{type:"w:type",id:"w:id"})}}class Z5 extends C0{constructor(){super({style:"EndnoteReference"});this.root.push(new VU)}}var fZ={SEPARATOR:"separator",CONTINUATION_SEPARATOR:"continuationSeparator"};class u2 extends o{constructor(U){super("w:endnote");this.root.push(new Y5({type:U.type,id:U.id}));for(let $=0;$9)throw new Error("Level cannot be greater than 9. Read more here: https://answers.microsoft.com/en-us/msoffice/forum/all/does-word-support-more-than-9-list-levels/d130fdcd-1781-446d-8c84-c6c79124e4d7");this.root.push(new V5({ilvl:S0(U),tentative:1}))}}class Z$ extends W6{}class F5 extends W6{}class N5 extends o{constructor(U){super("w:multiLevelType");this.root.push(new O0({val:U}))}}class R5 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{abstractNumId:"w:abstractNumId",restartNumberingAfterBreak:"w15:restartNumberingAfterBreak"})}}class r2 extends o{constructor(U,$){super("w:abstractNum");Y0(this,"id"),this.root.push(new R5({abstractNumId:S0(U),restartNumberingAfterBreak:0})),this.root.push(new N5("hybridMultilevel")),this.id=U;for(let Y of $)this.root.push(new Z$(Y))}}class D5 extends o{constructor(U){super("w:abstractNumId");this.root.push(new O0({val:U}))}}class A5 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{numId:"w:numId"})}}class s2 extends o{constructor(U){super("w:num");if(Y0(this,"numId"),Y0(this,"reference"),Y0(this,"instance"),this.numId=U.numId,this.reference=U.reference,this.instance=U.instance,this.root.push(new A5({numId:S0(U.numId)})),this.root.push(new D5(S0(U.abstractNumId))),U.overrideLevels&&U.overrideLevels.length)for(let $ of U.overrideLevels)this.root.push(new Q$($.num,$.start))}}class P5 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{ilvl:"w:ilvl"})}}class Q$ extends o{constructor(U,$){super("w:lvlOverride");if(this.root.push(new P5({ilvl:U})),$!==void 0)this.root.push(new C5($))}}class T5 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val"})}}class C5 extends o{constructor(U){super("w:startOverride");this.root.push(new T5({val:U}))}}class J$ extends o{constructor(U){super("w:numbering");Y0(this,"abstractNumberingMap",new Map),Y0(this,"concreteNumberingMap",new Map),Y0(this,"referenceConfigMap",new Map),Y0(this,"abstractNumUniqueNumericId",rQ()),Y0(this,"concreteNumUniqueNumericId",sQ()),this.root.push(new o1(["wpc","mc","o","r","m","v","wp14","wp","w10","w","w14","w15","wpg","wpi","wne","wps"],"w14 w15 wp14"));let $=new r2(this.abstractNumUniqueNumericId(),[{level:0,format:n0.BULLET,text:"●",alignment:m0.LEFT,style:{paragraph:{indent:{left:d0(0.5),hanging:d0(0.25)}}}},{level:1,format:n0.BULLET,text:"○",alignment:m0.LEFT,style:{paragraph:{indent:{left:d0(1),hanging:d0(0.25)}}}},{level:2,format:n0.BULLET,text:"■",alignment:m0.LEFT,style:{paragraph:{indent:{left:2160,hanging:d0(0.25)}}}},{level:3,format:n0.BULLET,text:"●",alignment:m0.LEFT,style:{paragraph:{indent:{left:2880,hanging:d0(0.25)}}}},{level:4,format:n0.BULLET,text:"○",alignment:m0.LEFT,style:{paragraph:{indent:{left:3600,hanging:d0(0.25)}}}},{level:5,format:n0.BULLET,text:"■",alignment:m0.LEFT,style:{paragraph:{indent:{left:4320,hanging:d0(0.25)}}}},{level:6,format:n0.BULLET,text:"●",alignment:m0.LEFT,style:{paragraph:{indent:{left:5040,hanging:d0(0.25)}}}},{level:7,format:n0.BULLET,text:"●",alignment:m0.LEFT,style:{paragraph:{indent:{left:5760,hanging:d0(0.25)}}}},{level:8,format:n0.BULLET,text:"●",alignment:m0.LEFT,style:{paragraph:{indent:{left:6480,hanging:d0(0.25)}}}}]);this.concreteNumberingMap.set("default-bullet-numbering",new s2({numId:1,abstractNumId:$.id,reference:"default-bullet-numbering",instance:0,overrideLevels:[{num:0,start:1}]})),this.abstractNumberingMap.set("default-bullet-numbering",$);for(let Y of U.config)this.abstractNumberingMap.set(Y.reference,new r2(this.abstractNumUniqueNumericId(),Y.levels)),this.referenceConfigMap.set(Y.reference,Y.levels)}prepForXml(U){for(let $ of this.abstractNumberingMap.values())this.root.push($);for(let $ of this.concreteNumberingMap.values())this.root.push($);return super.prepForXml(U)}createConcreteNumberingInstance(U,$){let Y=this.abstractNumberingMap.get(U);if(!Y)return;let Z=`${U}-${$}`;if(this.concreteNumberingMap.has(Z))return;let J=this.referenceConfigMap.get(U),G=J&&J[0].start,w={numId:this.concreteNumUniqueNumericId(),abstractNumId:Y.id,reference:U,instance:$,overrideLevels:[typeof G==="number"&&Number.isInteger(G)?{num:0,start:G}:{num:0,start:1}]};this.concreteNumberingMap.set(Z,new s2(w))}get ConcreteNumbering(){return Array.from(this.concreteNumberingMap.values())}get ReferenceConfig(){return Array.from(this.referenceConfigMap.values())}}var uq=(U)=>new X0({name:"w:compatSetting",attributes:{version:{key:"w:val",value:U},name:{key:"w:name",value:"compatibilityMode"},uri:{key:"w:uri",value:"http://schemas.microsoft.com/office/word"}}});class O5 extends o{constructor(U){super("w:compat");if(U.version)this.root.push(uq(U.version));if(U.useSingleBorderforContiguousCells)this.root.push(new B0("w:useSingleBorderforContiguousCells",U.useSingleBorderforContiguousCells));if(U.wordPerfectJustification)this.root.push(new B0("w:wpJustification",U.wordPerfectJustification));if(U.noTabStopForHangingIndent)this.root.push(new B0("w:noTabHangInd",U.noTabStopForHangingIndent));if(U.noLeading)this.root.push(new B0("w:noLeading",U.noLeading));if(U.spaceForUnderline)this.root.push(new B0("w:spaceForUL",U.spaceForUnderline));if(U.noColumnBalance)this.root.push(new B0("w:noColumnBalance",U.noColumnBalance));if(U.balanceSingleByteDoubleByteWidth)this.root.push(new B0("w:balanceSingleByteDoubleByteWidth",U.balanceSingleByteDoubleByteWidth));if(U.noExtraLineSpacing)this.root.push(new B0("w:noExtraLineSpacing",U.noExtraLineSpacing));if(U.doNotLeaveBackslashAlone)this.root.push(new B0("w:doNotLeaveBackslashAlone",U.doNotLeaveBackslashAlone));if(U.underlineTrailingSpaces)this.root.push(new B0("w:ulTrailSpace",U.underlineTrailingSpaces));if(U.doNotExpandShiftReturn)this.root.push(new B0("w:doNotExpandShiftReturn",U.doNotExpandShiftReturn));if(U.spacingInWholePoints)this.root.push(new B0("w:spacingInWholePoints",U.spacingInWholePoints));if(U.lineWrapLikeWord6)this.root.push(new B0("w:lineWrapLikeWord6",U.lineWrapLikeWord6));if(U.printBodyTextBeforeHeader)this.root.push(new B0("w:printBodyTextBeforeHeader",U.printBodyTextBeforeHeader));if(U.printColorsBlack)this.root.push(new B0("w:printColBlack",U.printColorsBlack));if(U.spaceWidth)this.root.push(new B0("w:wpSpaceWidth",U.spaceWidth));if(U.showBreaksInFrames)this.root.push(new B0("w:showBreaksInFrames",U.showBreaksInFrames));if(U.subFontBySize)this.root.push(new B0("w:subFontBySize",U.subFontBySize));if(U.suppressBottomSpacing)this.root.push(new B0("w:suppressBottomSpacing",U.suppressBottomSpacing));if(U.suppressTopSpacing)this.root.push(new B0("w:suppressTopSpacing",U.suppressTopSpacing));if(U.suppressSpacingAtTopOfPage)this.root.push(new B0("w:suppressSpacingAtTopOfPage",U.suppressSpacingAtTopOfPage));if(U.suppressTopSpacingWP)this.root.push(new B0("w:suppressTopSpacingWP",U.suppressTopSpacingWP));if(U.suppressSpBfAfterPgBrk)this.root.push(new B0("w:suppressSpBfAfterPgBrk",U.suppressSpBfAfterPgBrk));if(U.swapBordersFacingPages)this.root.push(new B0("w:swapBordersFacingPages",U.swapBordersFacingPages));if(U.convertMailMergeEsc)this.root.push(new B0("w:convMailMergeEsc",U.convertMailMergeEsc));if(U.truncateFontHeightsLikeWP6)this.root.push(new B0("w:truncateFontHeightsLikeWP6",U.truncateFontHeightsLikeWP6));if(U.macWordSmallCaps)this.root.push(new B0("w:mwSmallCaps",U.macWordSmallCaps));if(U.usePrinterMetrics)this.root.push(new B0("w:usePrinterMetrics",U.usePrinterMetrics));if(U.doNotSuppressParagraphBorders)this.root.push(new B0("w:doNotSuppressParagraphBorders",U.doNotSuppressParagraphBorders));if(U.wrapTrailSpaces)this.root.push(new B0("w:wrapTrailSpaces",U.wrapTrailSpaces));if(U.footnoteLayoutLikeWW8)this.root.push(new B0("w:footnoteLayoutLikeWW8",U.footnoteLayoutLikeWW8));if(U.shapeLayoutLikeWW8)this.root.push(new B0("w:shapeLayoutLikeWW8",U.shapeLayoutLikeWW8));if(U.alignTablesRowByRow)this.root.push(new B0("w:alignTablesRowByRow",U.alignTablesRowByRow));if(U.forgetLastTabAlignment)this.root.push(new B0("w:forgetLastTabAlignment",U.forgetLastTabAlignment));if(U.adjustLineHeightInTable)this.root.push(new B0("w:adjustLineHeightInTable",U.adjustLineHeightInTable));if(U.autoSpaceLikeWord95)this.root.push(new B0("w:autoSpaceLikeWord95",U.autoSpaceLikeWord95));if(U.noSpaceRaiseLower)this.root.push(new B0("w:noSpaceRaiseLower",U.noSpaceRaiseLower));if(U.doNotUseHTMLParagraphAutoSpacing)this.root.push(new B0("w:doNotUseHTMLParagraphAutoSpacing",U.doNotUseHTMLParagraphAutoSpacing));if(U.layoutRawTableWidth)this.root.push(new B0("w:layoutRawTableWidth",U.layoutRawTableWidth));if(U.layoutTableRowsApart)this.root.push(new B0("w:layoutTableRowsApart",U.layoutTableRowsApart));if(U.useWord97LineBreakRules)this.root.push(new B0("w:useWord97LineBreakRules",U.useWord97LineBreakRules));if(U.doNotBreakWrappedTables)this.root.push(new B0("w:doNotBreakWrappedTables",U.doNotBreakWrappedTables));if(U.doNotSnapToGridInCell)this.root.push(new B0("w:doNotSnapToGridInCell",U.doNotSnapToGridInCell));if(U.selectFieldWithFirstOrLastCharacter)this.root.push(new B0("w:selectFldWithFirstOrLastChar",U.selectFieldWithFirstOrLastCharacter));if(U.applyBreakingRules)this.root.push(new B0("w:applyBreakingRules",U.applyBreakingRules));if(U.doNotWrapTextWithPunctuation)this.root.push(new B0("w:doNotWrapTextWithPunct",U.doNotWrapTextWithPunctuation));if(U.doNotUseEastAsianBreakRules)this.root.push(new B0("w:doNotUseEastAsianBreakRules",U.doNotUseEastAsianBreakRules));if(U.useWord2002TableStyleRules)this.root.push(new B0("w:useWord2002TableStyleRules",U.useWord2002TableStyleRules));if(U.growAutofit)this.root.push(new B0("w:growAutofit",U.growAutofit));if(U.useFELayout)this.root.push(new B0("w:useFELayout",U.useFELayout));if(U.useNormalStyleForList)this.root.push(new B0("w:useNormalStyleForList",U.useNormalStyleForList));if(U.doNotUseIndentAsNumberingTabStop)this.root.push(new B0("w:doNotUseIndentAsNumberingTabStop",U.doNotUseIndentAsNumberingTabStop));if(U.useAlternateEastAsianLineBreakRules)this.root.push(new B0("w:useAltKinsokuLineBreakRules",U.useAlternateEastAsianLineBreakRules));if(U.allowSpaceOfSameStyleInTable)this.root.push(new B0("w:allowSpaceOfSameStyleInTable",U.allowSpaceOfSameStyleInTable));if(U.doNotSuppressIndentation)this.root.push(new B0("w:doNotSuppressIndentation",U.doNotSuppressIndentation));if(U.doNotAutofitConstrainedTables)this.root.push(new B0("w:doNotAutofitConstrainedTables",U.doNotAutofitConstrainedTables));if(U.autofitToFirstFixedWidthCell)this.root.push(new B0("w:autofitToFirstFixedWidthCell",U.autofitToFirstFixedWidthCell));if(U.underlineTabInNumberingList)this.root.push(new B0("w:underlineTabInNumList",U.underlineTabInNumberingList));if(U.displayHangulFixedWidth)this.root.push(new B0("w:displayHangulFixedWidth",U.displayHangulFixedWidth));if(U.splitPgBreakAndParaMark)this.root.push(new B0("w:splitPgBreakAndParaMark",U.splitPgBreakAndParaMark));if(U.doNotVerticallyAlignCellWithSp)this.root.push(new B0("w:doNotVertAlignCellWithSp",U.doNotVerticallyAlignCellWithSp));if(U.doNotBreakConstrainedForcedTable)this.root.push(new B0("w:doNotBreakConstrainedForcedTable",U.doNotBreakConstrainedForcedTable));if(U.ignoreVerticalAlignmentInTextboxes)this.root.push(new B0("w:doNotVertAlignInTxbx",U.ignoreVerticalAlignmentInTextboxes));if(U.useAnsiKerningPairs)this.root.push(new B0("w:useAnsiKerningPairs",U.useAnsiKerningPairs));if(U.cachedColumnBalance)this.root.push(new B0("w:cachedColBalance",U.cachedColumnBalance))}}class E5 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{wpc:"xmlns:wpc",mc:"xmlns:mc",o:"xmlns:o",r:"xmlns:r",m:"xmlns:m",v:"xmlns:v",wp14:"xmlns:wp14",wp:"xmlns:wp",w10:"xmlns:w10",w:"xmlns:w",w14:"xmlns:w14",w15:"xmlns:w15",wpg:"xmlns:wpg",wpi:"xmlns:wpi",wne:"xmlns:wne",wps:"xmlns:wps",Ignorable:"mc:Ignorable"})}}class k5 extends o{constructor(U){var $,Y,Z,J,G,w,Q,q;super("w:settings");if(this.root.push(new E5({wpc:"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",mc:"http://schemas.openxmlformats.org/markup-compatibility/2006",o:"urn:schemas-microsoft-com:office:office",r:"http://schemas.openxmlformats.org/officeDocument/2006/relationships",m:"http://schemas.openxmlformats.org/officeDocument/2006/math",v:"urn:schemas-microsoft-com:vml",wp14:"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",wp:"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",w10:"urn:schemas-microsoft-com:office:word",w:"http://schemas.openxmlformats.org/wordprocessingml/2006/main",w14:"http://schemas.microsoft.com/office/word/2010/wordml",w15:"http://schemas.microsoft.com/office/word/2012/wordml",wpg:"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",wpi:"http://schemas.microsoft.com/office/word/2010/wordprocessingInk",wne:"http://schemas.microsoft.com/office/word/2006/wordml",wps:"http://schemas.microsoft.com/office/word/2010/wordprocessingShape",Ignorable:"w14 w15 wp14"})),this.root.push(new B0("w:displayBackgroundShape",!0)),U.trackRevisions!==void 0)this.root.push(new B0("w:trackRevisions",U.trackRevisions));if(U.evenAndOddHeaders!==void 0)this.root.push(new B0("w:evenAndOddHeaders",U.evenAndOddHeaders));if(U.updateFields!==void 0)this.root.push(new B0("w:updateFields",U.updateFields));if(U.defaultTabStop!==void 0)this.root.push(new E1("w:defaultTabStop",U.defaultTabStop));if((($=U.hyphenation)==null?void 0:$.autoHyphenation)!==void 0)this.root.push(new B0("w:autoHyphenation",U.hyphenation.autoHyphenation));if(((Y=U.hyphenation)==null?void 0:Y.hyphenationZone)!==void 0)this.root.push(new E1("w:hyphenationZone",U.hyphenation.hyphenationZone));if(((Z=U.hyphenation)==null?void 0:Z.consecutiveHyphenLimit)!==void 0)this.root.push(new E1("w:consecutiveHyphenLimit",U.hyphenation.consecutiveHyphenLimit));if(((J=U.hyphenation)==null?void 0:J.doNotHyphenateCaps)!==void 0)this.root.push(new B0("w:doNotHyphenateCaps",U.hyphenation.doNotHyphenateCaps));this.root.push(new O5(R0(W0({},(G=U.compatibility)!=null?G:{}),{version:(q=(Q=(w=U.compatibility)==null?void 0:w.version)!=null?Q:U.compatibilityModeVersion)!=null?q:15})))}}class G$ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val"})}}class S5 extends o{constructor(U){super("w:name");this.root.push(new G$({val:U}))}}class v5 extends o{constructor(U){super("w:uiPriority");this.root.push(new G$({val:S0(U)}))}}class _5 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{type:"w:type",styleId:"w:styleId",default:"w:default",customStyle:"w:customStyle"})}}class K$ extends o{constructor(U,$){super("w:style");if(this.root.push(new _5(U)),$.name)this.root.push(new S5($.name));if($.basedOn)this.root.push(new Y1("w:basedOn",$.basedOn));if($.next)this.root.push(new Y1("w:next",$.next));if($.link)this.root.push(new Y1("w:link",$.link));if($.uiPriority!==void 0)this.root.push(new v5($.uiPriority));if($.semiHidden!==void 0)this.root.push(new B0("w:semiHidden",$.semiHidden));if($.unhideWhenUsed!==void 0)this.root.push(new B0("w:unhideWhenUsed",$.unhideWhenUsed));if($.quickFormat!==void 0)this.root.push(new B0("w:qFormat",$.quickFormat))}}class y1 extends K${constructor(U){super({type:"paragraph",styleId:U.id},U);Y0(this,"paragraphProperties"),Y0(this,"runProperties"),this.paragraphProperties=new Z1(U.paragraph),this.runProperties=new J1(U.run),this.root.push(this.paragraphProperties),this.root.push(this.runProperties)}}class D1 extends K${constructor(U){super({type:"character",styleId:U.id},W0({uiPriority:99,unhideWhenUsed:!0},U));Y0(this,"runProperties"),this.runProperties=new J1(U.run),this.root.push(this.runProperties)}}class H1 extends y1{constructor(U){super(W0({basedOn:"Normal",next:"Normal",quickFormat:!0},U))}}class y5 extends H1{constructor(U){super(W0({id:"Title",name:"Title"},U))}}class b5 extends H1{constructor(U){super(W0({id:"Heading1",name:"Heading 1"},U))}}class g5 extends H1{constructor(U){super(W0({id:"Heading2",name:"Heading 2"},U))}}class x5 extends H1{constructor(U){super(W0({id:"Heading3",name:"Heading 3"},U))}}class f5 extends H1{constructor(U){super(W0({id:"Heading4",name:"Heading 4"},U))}}class h5 extends H1{constructor(U){super(W0({id:"Heading5",name:"Heading 5"},U))}}class u5 extends H1{constructor(U){super(W0({id:"Heading6",name:"Heading 6"},U))}}class d5 extends H1{constructor(U){super(W0({id:"Strong",name:"Strong"},U))}}class c5 extends y1{constructor(U){super(W0({id:"ListParagraph",name:"List Paragraph",basedOn:"Normal",quickFormat:!0},U))}}class m5 extends y1{constructor(U){super(W0({id:"FootnoteText",name:"footnote text",link:"FootnoteTextChar",basedOn:"Normal",uiPriority:99,semiHidden:!0,unhideWhenUsed:!0,paragraph:{spacing:{after:0,line:240,lineRule:v1.AUTO}},run:{size:20}},U))}}class l5 extends D1{constructor(U){super(W0({id:"FootnoteReference",name:"footnote reference",basedOn:"DefaultParagraphFont",semiHidden:!0,run:{superScript:!0}},U))}}class a5 extends D1{constructor(U){super(W0({id:"FootnoteTextChar",name:"Footnote Text Char",basedOn:"DefaultParagraphFont",link:"FootnoteText",semiHidden:!0,run:{size:20}},U))}}class p5 extends y1{constructor(U){super(W0({id:"EndnoteText",name:"endnote text",link:"EndnoteTextChar",basedOn:"Normal",uiPriority:99,semiHidden:!0,unhideWhenUsed:!0,paragraph:{spacing:{after:0,line:240,lineRule:v1.AUTO}},run:{size:20}},U))}}class i5 extends D1{constructor(U){super(W0({id:"EndnoteReference",name:"endnote reference",basedOn:"DefaultParagraphFont",semiHidden:!0,run:{superScript:!0}},U))}}class r5 extends D1{constructor(U){super(W0({id:"EndnoteTextChar",name:"Endnote Text Char",basedOn:"DefaultParagraphFont",link:"EndnoteText",semiHidden:!0,run:{size:20}},U))}}class s5 extends D1{constructor(U){super(W0({id:"Hyperlink",name:"Hyperlink",basedOn:"DefaultParagraphFont",run:{color:"0563C1",underline:{type:ZU.SINGLE}}},U))}}class X2 extends o{constructor(U){super("w:styles");if(U.initialStyles)this.root.push(U.initialStyles);if(U.importedStyles)for(let $ of U.importedStyles)this.root.push($);if(U.paragraphStyles)for(let $ of U.paragraphStyles)this.root.push(new y1($));if(U.characterStyles)for(let $ of U.characterStyles)this.root.push(new D1($))}}class w$ extends o{constructor(U){super("w:pPrDefault");this.root.push(new Z1(U))}}class B$ extends o{constructor(U){super("w:rPrDefault");this.root.push(new J1(U))}}class q$ extends o{constructor(U){super("w:docDefaults");Y0(this,"runPropertiesDefaults"),Y0(this,"paragraphPropertiesDefaults"),this.runPropertiesDefaults=new B$(U.run),this.paragraphPropertiesDefaults=new w$(U.paragraph),this.root.push(this.runPropertiesDefaults),this.root.push(this.paragraphPropertiesDefaults)}}class n5{newInstance(U){let $=U6.xml2js(U,{compact:!1}),Y;for(let J of $.elements||[])if(J.name==="w:styles")Y=J;if(Y===void 0)throw new Error("can not find styles element");let Z=Y.elements||[];return{initialStyles:new i9(Y.attributes),importedStyles:Z.map((J)=>$6(J))}}}class c2{newInstance(U={}){var $;return{initialStyles:new o1(["mc","r","w","w14","w15"],"w14 w15"),importedStyles:[new q$(($=U.document)!=null?$:{}),new y5(W0({run:{size:56}},U.title)),new b5(W0({run:{color:"2E74B5",size:32}},U.heading1)),new g5(W0({run:{color:"2E74B5",size:26}},U.heading2)),new x5(W0({run:{color:"1F4D78",size:24}},U.heading3)),new f5(W0({run:{color:"2E74B5",italics:!0}},U.heading4)),new h5(W0({run:{color:"2E74B5"}},U.heading5)),new u5(W0({run:{color:"1F4D78"}},U.heading6)),new d5(W0({run:{bold:!0}},U.strong)),new c5(U.listParagraph||{}),new s5(U.hyperlink||{}),new l5(U.footnoteReference||{}),new m5(U.footnoteText||{}),new a5(U.footnoteTextChar||{}),new i5(U.endnoteReference||{}),new p5(U.endnoteText||{}),new r5(U.endnoteTextChar||{})]}}}class o5{constructor(U){Y0(this,"currentRelationshipId",1),Y0(this,"documentWrapper"),Y0(this,"headers",[]),Y0(this,"footers",[]),Y0(this,"coreProperties"),Y0(this,"numbering"),Y0(this,"media"),Y0(this,"fileRelationships"),Y0(this,"footnotesWrapper"),Y0(this,"endnotesWrapper"),Y0(this,"settings"),Y0(this,"contentTypes"),Y0(this,"customProperties"),Y0(this,"appProperties"),Y0(this,"styles"),Y0(this,"comments"),Y0(this,"fontWrapper");var $,Y,Z,J,G,w,Q,q,z,R,W,E,D;if(this.coreProperties=new gK(R0(W0({},U),{creator:($=U.creator)!=null?$:"Un-named",revision:(Y=U.revision)!=null?Y:1,lastModifiedBy:(Z=U.lastModifiedBy)!=null?Z:"Un-named"})),this.numbering=new J$(U.numbering?U.numbering:{config:[]}),this.comments=new LU((J=U.comments)!=null?J:{children:[]}),this.fileRelationships=new W1,this.customProperties=new cK((G=U.customProperties)!=null?G:[]),this.appProperties=new _K,this.footnotesWrapper=new I5,this.endnotesWrapper=new G5,this.contentTypes=new bK,this.documentWrapper=new U5({background:U.background}),this.settings=new k5({compatibilityModeVersion:U.compatabilityModeVersion,compatibility:U.compatibility,evenAndOddHeaders:U.evenAndOddHeaderAndFooters?!0:!1,trackRevisions:(w=U.features)==null?void 0:w.trackRevisions,updateFields:(Q=U.features)==null?void 0:Q.updateFields,defaultTabStop:U.defaultTabStop,hyphenation:{autoHyphenation:(q=U.hyphenation)==null?void 0:q.autoHyphenation,hyphenationZone:(z=U.hyphenation)==null?void 0:z.hyphenationZone,consecutiveHyphenLimit:(R=U.hyphenation)==null?void 0:R.consecutiveHyphenLimit,doNotHyphenateCaps:(W=U.hyphenation)==null?void 0:W.doNotHyphenateCaps}}),this.media=new M6,U.externalStyles!==void 0){let H=new c2().newInstance((E=U.styles)==null?void 0:E.default),X=new n5().newInstance(U.externalStyles);this.styles=new X2(R0(W0({},X),{importedStyles:[...H.importedStyles,...X.importedStyles]}))}else if(U.styles){let H=new c2().newInstance(U.styles.default);this.styles=new X2(W0(W0({},H),U.styles))}else{let C=new c2;this.styles=new X2(C.newInstance())}this.addDefaultRelationships();for(let C of U.sections)this.addSection(C);if(U.footnotes)for(let C in U.footnotes)this.footnotesWrapper.View.createFootNote(parseFloat(C),U.footnotes[C].children);if(U.endnotes)for(let C in U.endnotes)this.endnotesWrapper.View.createEndnote(parseFloat(C),U.endnotes[C].children);this.fontWrapper=new RU((D=U.fonts)!=null?D:[])}addSection({headers:U={},footers:$={},children:Y,properties:Z}){this.documentWrapper.View.Body.addSection(R0(W0({},Z),{headerWrapperGroup:{default:U.default?this.createHeader(U.default):void 0,first:U.first?this.createHeader(U.first):void 0,even:U.even?this.createHeader(U.even):void 0},footerWrapperGroup:{default:$.default?this.createFooter($.default):void 0,first:$.first?this.createFooter($.first):void 0,even:$.even?this.createFooter($.even):void 0}}));for(let J of Y)this.documentWrapper.View.add(J)}createHeader(U){let $=new Y$(this.media,this.currentRelationshipId++);for(let Y of U.options.children)$.add(Y);return this.addHeaderToDocument($),$}createFooter(U){let $=new U$(this.media,this.currentRelationshipId++);for(let Y of U.options.children)$.add(Y);return this.addFooterToDocument($),$}addHeaderToDocument(U,$=k1.DEFAULT){this.headers.push({header:U,type:$}),this.documentWrapper.Relationships.addRelationship(U.View.ReferenceId,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header",`header${this.headers.length}.xml`),this.contentTypes.addHeader(this.headers.length)}addFooterToDocument(U,$=k1.DEFAULT){this.footers.push({footer:U,type:$}),this.documentWrapper.Relationships.addRelationship(U.View.ReferenceId,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer",`footer${this.footers.length}.xml`),this.contentTypes.addFooter(this.footers.length)}addDefaultRelationships(){this.fileRelationships.addRelationship(1,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument","word/document.xml"),this.fileRelationships.addRelationship(2,"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties","docProps/core.xml"),this.fileRelationships.addRelationship(3,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties","docProps/app.xml"),this.fileRelationships.addRelationship(4,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties","docProps/custom.xml"),this.documentWrapper.Relationships.addRelationship(this.currentRelationshipId++,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles","styles.xml"),this.documentWrapper.Relationships.addRelationship(this.currentRelationshipId++,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering","numbering.xml"),this.documentWrapper.Relationships.addRelationship(this.currentRelationshipId++,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes","footnotes.xml"),this.documentWrapper.Relationships.addRelationship(this.currentRelationshipId++,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes","endnotes.xml"),this.documentWrapper.Relationships.addRelationship(this.currentRelationshipId++,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings","settings.xml"),this.documentWrapper.Relationships.addRelationship(this.currentRelationshipId++,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments","comments.xml")}get Document(){return this.documentWrapper}get Styles(){return this.styles}get CoreProperties(){return this.coreProperties}get Numbering(){return this.numbering}get Media(){return this.media}get FileRelationships(){return this.fileRelationships}get Headers(){return this.headers.map((U)=>U.header)}get Footers(){return this.footers.map((U)=>U.footer)}get ContentTypes(){return this.contentTypes}get CustomProperties(){return this.customProperties}get AppProperties(){return this.appProperties}get FootNotes(){return this.footnotesWrapper}get Endnotes(){return this.endnotesWrapper}get Settings(){return this.settings}get Comments(){return this.comments}get FontTable(){return this.fontWrapper}}class t5 extends o{constructor(U={}){super("w:instrText");Y0(this,"properties"),this.properties=U,this.root.push(new x0({space:g0.PRESERVE}));let $="TOC";if(this.properties.captionLabel)$=`${$} \\a "${this.properties.captionLabel}"`;if(this.properties.entriesFromBookmark)$=`${$} \\b "${this.properties.entriesFromBookmark}"`;if(this.properties.captionLabelIncludingNumbers)$=`${$} \\c "${this.properties.captionLabelIncludingNumbers}"`;if(this.properties.sequenceAndPageNumbersSeparator)$=`${$} \\d "${this.properties.sequenceAndPageNumbersSeparator}"`;if(this.properties.tcFieldIdentifier)$=`${$} \\f "${this.properties.tcFieldIdentifier}"`;if(this.properties.hyperlink)$=`${$} \\h`;if(this.properties.tcFieldLevelRange)$=`${$} \\l "${this.properties.tcFieldLevelRange}"`;if(this.properties.pageNumbersEntryLevelsRange)$=`${$} \\n "${this.properties.pageNumbersEntryLevelsRange}"`;if(this.properties.headingStyleRange)$=`${$} \\o "${this.properties.headingStyleRange}"`;if(this.properties.entryAndPageNumberSeparator)$=`${$} \\p "${this.properties.entryAndPageNumberSeparator}"`;if(this.properties.seqFieldIdentifierForPrefix)$=`${$} \\s "${this.properties.seqFieldIdentifierForPrefix}"`;if(this.properties.stylesWithLevels&&this.properties.stylesWithLevels.length){let Y=this.properties.stylesWithLevels.map((Z)=>`${Z.styleName},${Z.level}`).join(",");$=`${$} \\t "${Y}"`}if(this.properties.useAppliedParagraphOutlineLevel)$=`${$} \\u`;if(this.properties.preserveTabInEntries)$=`${$} \\w`;if(this.properties.preserveNewLineInEntries)$=`${$} \\x`;if(this.properties.hideTabAndPageNumbersInWebView)$=`${$} \\z`;this.root.push($)}}class X$ extends o{constructor(){super("w:sdtContent")}}class I$ extends o{constructor(U){super("w:sdtPr");if(U)this.root.push(new Y1("w:alias",U))}}class e5 extends r1{constructor(U="Table of Contents",$={}){var Y=$,{contentChildren:Z=[],cachedEntries:J=[],beginDirty:G=!0}=Y,w=oZ(Y,["contentChildren","cachedEntries","beginDirty"]);super("w:sdt");this.root.push(new I$(U));let Q=new X$,q=[new C0({children:[U1(G),new t5(w),V1()]})],z=[new C0({children:[$1()]})];if(J!==void 0&&J.length>0){let{stylesWithLevels:W}=w,E=J.map((C,H)=>{var O,X;let j=this.buildCachedContentParagraphChild(C,w),L=(X=(O=W==null?void 0:W.find((A)=>A.level===C.level))==null?void 0:O.styleName)!=null?X:`TOC${C.level}`,I=H===0?[...q,j]:H===J.length-1?[j,...z]:[j];return new h0({style:L,tabStops:this.getTabStopsForLevel(C.level),children:I})}),D=E;if(J.length<=1)D=[...E,new h0({children:z})];for(let C of D)Q.addChildElement(C)}else{let W=new h0({children:q});Q.addChildElement(W);for(let D of Z)Q.addChildElement(D);let E=new h0({children:z});Q.addChildElement(E)}this.root.push(Q)}getTabStopsForLevel(U,$=9025){return[{type:"clear",position:$+1-(U-1)*240},{type:"right",position:$,leader:"dot"}]}buildCachedContentRun(U,$){var Y,Z;return new C0({style:($==null?void 0:$.hyperlink)&&U.href!==void 0?"IndexLink":void 0,children:[new a1({text:U.title}),new MU,new a1({text:(Z=(Y=U.page)==null?void 0:Y.toString())!=null?Z:""})]})}buildCachedContentParagraphChild(U,$){let Y=this.buildCachedContentRun(U,$);if(($==null?void 0:$.hyperlink)&&U.href!==void 0)return new jU({anchor:U.href,children:[Y]});return Y}}class U7{constructor(U,$){Y0(this,"styleName"),Y0(this,"level"),this.styleName=U,this.level=$}}class $7{constructor(U={children:[]}){Y0(this,"options"),this.options=U}}class Y7{constructor(U={children:[]}){Y0(this,"options"),this.options=U}}class L$ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id"})}}class V$ extends o{constructor(U){super("w:footnoteReference");this.root.push(new L$({id:U}))}}class Z7 extends C0{constructor(U){super({style:"FootnoteReference"});this.root.push(new V$(U))}}class M$ extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id"})}}class W$ extends o{constructor(U){super("w:endnoteReference");this.root.push(new M$({id:U}))}}class Q7 extends C0{constructor(U){super({style:"EndnoteReference"});this.root.push(new W$(U))}}class _9 extends V0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w14:val",symbolfont:"w14:font"})}}class I2 extends o{constructor(U,$,Y){super(U);if(Y)this.root.push(new _9({val:DQ($),symbolfont:Y}));else this.root.push(new _9({val:$}))}}class H$ extends o{constructor(U){var $,Y,Z,J,G,w,Q,q;super("w14:checkbox");Y0(this,"DEFAULT_UNCHECKED_SYMBOL","2610"),Y0(this,"DEFAULT_CHECKED_SYMBOL","2612"),Y0(this,"DEFAULT_FONT","MS Gothic");let z=(U==null?void 0:U.checked)?"1":"0",R,W;this.root.push(new I2("w14:checked",z)),R=(($=U==null?void 0:U.checkedState)==null?void 0:$.value)?(Y=U==null?void 0:U.checkedState)==null?void 0:Y.value:this.DEFAULT_CHECKED_SYMBOL,W=((Z=U==null?void 0:U.checkedState)==null?void 0:Z.font)?(J=U==null?void 0:U.checkedState)==null?void 0:J.font:this.DEFAULT_FONT,this.root.push(new I2("w14:checkedState",R,W)),R=((G=U==null?void 0:U.uncheckedState)==null?void 0:G.value)?(w=U==null?void 0:U.uncheckedState)==null?void 0:w.value:this.DEFAULT_UNCHECKED_SYMBOL,W=((Q=U==null?void 0:U.uncheckedState)==null?void 0:Q.font)?(q=U==null?void 0:U.uncheckedState)==null?void 0:q.font:this.DEFAULT_FONT,this.root.push(new I2("w14:uncheckedState",R,W))}}class J7 extends o{constructor(U){var $,Y,Z,J;super("w:sdt");Y0(this,"DEFAULT_UNCHECKED_SYMBOL","2610"),Y0(this,"DEFAULT_CHECKED_SYMBOL","2612"),Y0(this,"DEFAULT_FONT","MS Gothic");let G=new I$(U==null?void 0:U.alias);G.addChildElement(new H$(U)),this.root.push(G);let w=new X$,Q=($=U==null?void 0:U.checkedState)==null?void 0:$.font,q=(Y=U==null?void 0:U.checkedState)==null?void 0:Y.value,z=(Z=U==null?void 0:U.uncheckedState)==null?void 0:Z.font,R=(J=U==null?void 0:U.uncheckedState)==null?void 0:J.value,W,E;if(U==null?void 0:U.checked)W=Q?Q:this.DEFAULT_FONT,E=q?q:this.DEFAULT_CHECKED_SYMBOL;else W=z?z:this.DEFAULT_FONT,E=R?R:this.DEFAULT_UNCHECKED_SYMBOL;let D=new GU({char:E,symbolfont:W});w.addChildElement(D),this.root.push(w)}}var dq=({shape:U})=>new X0({name:"w:pict",children:[U]}),cq=({children:U=[]})=>new X0({name:"w:txbxContent",children:U}),mq=({style:U,children:$,inset:Y})=>new X0({name:"v:textbox",attributes:{style:{key:"style",value:U},insetMode:{key:"insetmode",value:Y?"custom":"auto"},inset:{key:"inset",value:Y?`${Y.left}, ${Y.top}, ${Y.right}, ${Y.bottom}`:void 0}},children:[cq({children:$})]}),lq="#_x0000_t202",aq={flip:"flip",height:"height",left:"left",marginBottom:"margin-bottom",marginLeft:"margin-left",marginRight:"margin-right",marginTop:"margin-top",positionHorizontal:"mso-position-horizontal",positionHorizontalRelative:"mso-position-horizontal-relative",positionVertical:"mso-position-vertical",positionVerticalRelative:"mso-position-vertical-relative",wrapDistanceBottom:"mso-wrap-distance-bottom",wrapDistanceLeft:"mso-wrap-distance-left",wrapDistanceRight:"mso-wrap-distance-right",wrapDistanceTop:"mso-wrap-distance-top",wrapEdited:"mso-wrap-edited",wrapStyle:"mso-wrap-style",position:"position",rotation:"rotation",top:"top",visibility:"visibility",width:"width",zIndex:"z-index"},pq=(U)=>U?Object.entries(U).map(([$,Y])=>`${aq[$]}:${Y}`).join(";"):void 0,iq=({id:U,children:$,type:Y=lq,style:Z})=>new X0({name:"v:shape",attributes:{id:{key:"id",value:U},type:{key:"type",value:Y},style:{key:"style",value:pq(Z)}},children:[mq({style:"mso-fit-shape-to-text:t;",children:$})]});class G7 extends r1{constructor(U){var $=U,{style:Y,children:Z}=$,J=oZ($,["style","children"]);super("w:p");this.root.push(new Z1(J)),this.root.push(dq({shape:iq({children:Z,id:R2(),style:Y})}))}}var rq=m9();function y2(U){throw new Error('Could not dynamically require "'+U+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var V9={exports:{}},uZ;function sq(){if(uZ)return V9.exports;return uZ=1,function(U,$){(function(Y){U.exports=Y()})(function(){return function Y(Z,J,G){function w(z,R){if(!J[z]){if(!Z[z]){var W=typeof y2=="function"&&y2;if(!R&&W)return W(z,!0);if(Q)return Q(z,!0);var E=new Error("Cannot find module '"+z+"'");throw E.code="MODULE_NOT_FOUND",E}var D=J[z]={exports:{}};Z[z][0].call(D.exports,function(C){var H=Z[z][1][C];return w(H||C)},D,D.exports,Y,Z,J,G)}return J[z].exports}for(var Q=typeof y2=="function"&&y2,q=0;q>2,D=(3&z)<<4|R>>4,C=1>6:64,H=2>4,R=(15&E)<<4|(D=Q.indexOf(q.charAt(H++)))>>2,W=(3&D)<<6|(C=Q.indexOf(q.charAt(H++))),j[O++]=z,D!==64&&(j[O++]=R),C!==64&&(j[O++]=W);return j}},{"./support":30,"./utils":32}],2:[function(Y,Z,J){var G=Y("./external"),w=Y("./stream/DataWorker"),Q=Y("./stream/Crc32Probe"),q=Y("./stream/DataLengthProbe");function z(R,W,E,D,C){this.compressedSize=R,this.uncompressedSize=W,this.crc32=E,this.compression=D,this.compressedContent=C}z.prototype={getContentWorker:function(){var R=new w(G.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new q("data_length")),W=this;return R.on("end",function(){if(this.streamInfo.data_length!==W.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),R},getCompressedWorker:function(){return new w(G.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},z.createWorkerFrom=function(R,W,E){return R.pipe(new Q).pipe(new q("uncompressedSize")).pipe(W.compressWorker(E)).pipe(new q("compressedSize")).withStreamInfo("compression",W)},Z.exports=z},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(Y,Z,J){var G=Y("./stream/GenericWorker");J.STORE={magic:"\x00\x00",compressWorker:function(){return new G("STORE compression")},uncompressWorker:function(){return new G("STORE decompression")}},J.DEFLATE=Y("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(Y,Z,J){var G=Y("./utils"),w=function(){for(var Q,q=[],z=0;z<256;z++){Q=z;for(var R=0;R<8;R++)Q=1&Q?3988292384^Q>>>1:Q>>>1;q[z]=Q}return q}();Z.exports=function(Q,q){return Q!==void 0&&Q.length?G.getTypeOf(Q)!=="string"?function(z,R,W,E){var D=w,C=E+W;z^=-1;for(var H=E;H>>8^D[255&(z^R[H])];return-1^z}(0|q,Q,Q.length,0):function(z,R,W,E){var D=w,C=E+W;z^=-1;for(var H=E;H>>8^D[255&(z^R.charCodeAt(H))];return-1^z}(0|q,Q,Q.length,0):0}},{"./utils":32}],5:[function(Y,Z,J){J.base64=!1,J.binary=!1,J.dir=!1,J.createFolders=!0,J.date=null,J.compression=null,J.compressionOptions=null,J.comment=null,J.unixPermissions=null,J.dosPermissions=null},{}],6:[function(Y,Z,J){var G=null;G=typeof Promise!="undefined"?Promise:Y("lie"),Z.exports={Promise:G}},{lie:37}],7:[function(Y,Z,J){var G=typeof Uint8Array!="undefined"&&typeof Uint16Array!="undefined"&&typeof Uint32Array!="undefined",w=Y("pako"),Q=Y("./utils"),q=Y("./stream/GenericWorker"),z=G?"uint8array":"array";function R(W,E){q.call(this,"FlateWorker/"+W),this._pako=null,this._pakoAction=W,this._pakoOptions=E,this.meta={}}J.magic="\b\x00",Q.inherits(R,q),R.prototype.processChunk=function(W){this.meta=W.meta,this._pako===null&&this._createPako(),this._pako.push(Q.transformTo(z,W.data),!1)},R.prototype.flush=function(){q.prototype.flush.call(this),this._pako===null&&this._createPako(),this._pako.push([],!0)},R.prototype.cleanUp=function(){q.prototype.cleanUp.call(this),this._pako=null},R.prototype._createPako=function(){this._pako=new w[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var W=this;this._pako.onData=function(E){W.push({data:E,meta:W.meta})}},J.compressWorker=function(W){return new R("Deflate",W)},J.uncompressWorker=function(){return new R("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(Y,Z,J){function G(D,C){var H,O="";for(H=0;H>>=8;return O}function w(D,C,H,O,X,j){var L,I,A=D.file,y=D.compression,g=j!==z.utf8encode,d=Q.transformTo("string",j(A.name)),k=Q.transformTo("string",z.utf8encode(A.name)),s=A.comment,q0=Q.transformTo("string",j(s)),S=Q.transformTo("string",z.utf8encode(s)),h=k.length!==A.name.length,F=S.length!==s.length,a="",U0="",m="",J0=A.dir,$0=A.date,I0={crc32:0,compressedSize:0,uncompressedSize:0};C&&!H||(I0.crc32=D.crc32,I0.compressedSize=D.compressedSize,I0.uncompressedSize=D.uncompressedSize);var i=0;C&&(i|=8),g||!h&&!F||(i|=2048);var _=0,r=0;J0&&(_|=16),X==="UNIX"?(r=798,_|=function(Z0,p){var P=Z0;return Z0||(P=p?16893:33204),(65535&P)<<16}(A.unixPermissions,J0)):(r=20,_|=function(Z0){return 63&(Z0||0)}(A.dosPermissions)),L=$0.getUTCHours(),L<<=6,L|=$0.getUTCMinutes(),L<<=5,L|=$0.getUTCSeconds()/2,I=$0.getUTCFullYear()-1980,I<<=4,I|=$0.getUTCMonth()+1,I<<=5,I|=$0.getUTCDate(),h&&(U0=G(1,1)+G(R(d),4)+k,a+="up"+G(U0.length,2)+U0),F&&(m=G(1,1)+G(R(q0),4)+S,a+="uc"+G(m.length,2)+m);var n="";return n+=` -\x00`,n+=G(i,2),n+=y.magic,n+=G(L,2),n+=G(I,2),n+=G(I0.crc32,4),n+=G(I0.compressedSize,4),n+=G(I0.uncompressedSize,4),n+=G(d.length,2),n+=G(a.length,2),{fileRecord:W.LOCAL_FILE_HEADER+n+d+a,dirRecord:W.CENTRAL_FILE_HEADER+G(r,2)+n+G(q0.length,2)+"\x00\x00\x00\x00"+G(_,4)+G(O,4)+d+a+q0}}var Q=Y("../utils"),q=Y("../stream/GenericWorker"),z=Y("../utf8"),R=Y("../crc32"),W=Y("../signature");function E(D,C,H,O){q.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=C,this.zipPlatform=H,this.encodeFileName=O,this.streamFiles=D,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}Q.inherits(E,q),E.prototype.push=function(D){var C=D.meta.percent||0,H=this.entriesCount,O=this._sources.length;this.accumulate?this.contentBuffer.push(D):(this.bytesWritten+=D.data.length,q.prototype.push.call(this,{data:D.data,meta:{currentFile:this.currentFile,percent:H?(C+100*(H-O-1))/H:100}}))},E.prototype.openedSource=function(D){this.currentSourceOffset=this.bytesWritten,this.currentFile=D.file.name;var C=this.streamFiles&&!D.file.dir;if(C){var H=w(D,C,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:H.fileRecord,meta:{percent:0}})}else this.accumulate=!0},E.prototype.closedSource=function(D){this.accumulate=!1;var C=this.streamFiles&&!D.file.dir,H=w(D,C,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(H.dirRecord),C)this.push({data:function(O){return W.DATA_DESCRIPTOR+G(O.crc32,4)+G(O.compressedSize,4)+G(O.uncompressedSize,4)}(D),meta:{percent:100}});else for(this.push({data:H.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},E.prototype.flush=function(){for(var D=this.bytesWritten,C=0;C=this.index;q--)z=(z<<8)+this.byteAt(q);return this.index+=Q,z},readString:function(Q){return G.transformTo("string",this.readData(Q))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var Q=this.readInt(4);return new Date(Date.UTC(1980+(Q>>25&127),(Q>>21&15)-1,Q>>16&31,Q>>11&31,Q>>5&63,(31&Q)<<1))}},Z.exports=w},{"../utils":32}],19:[function(Y,Z,J){var G=Y("./Uint8ArrayReader");function w(Q){G.call(this,Q)}Y("../utils").inherits(w,G),w.prototype.readData=function(Q){this.checkOffset(Q);var q=this.data.slice(this.zero+this.index,this.zero+this.index+Q);return this.index+=Q,q},Z.exports=w},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(Y,Z,J){var G=Y("./DataReader");function w(Q){G.call(this,Q)}Y("../utils").inherits(w,G),w.prototype.byteAt=function(Q){return this.data.charCodeAt(this.zero+Q)},w.prototype.lastIndexOfSignature=function(Q){return this.data.lastIndexOf(Q)-this.zero},w.prototype.readAndCheckSignature=function(Q){return Q===this.readData(4)},w.prototype.readData=function(Q){this.checkOffset(Q);var q=this.data.slice(this.zero+this.index,this.zero+this.index+Q);return this.index+=Q,q},Z.exports=w},{"../utils":32,"./DataReader":18}],21:[function(Y,Z,J){var G=Y("./ArrayReader");function w(Q){G.call(this,Q)}Y("../utils").inherits(w,G),w.prototype.readData=function(Q){if(this.checkOffset(Q),Q===0)return new Uint8Array(0);var q=this.data.subarray(this.zero+this.index,this.zero+this.index+Q);return this.index+=Q,q},Z.exports=w},{"../utils":32,"./ArrayReader":17}],22:[function(Y,Z,J){var G=Y("../utils"),w=Y("../support"),Q=Y("./ArrayReader"),q=Y("./StringReader"),z=Y("./NodeBufferReader"),R=Y("./Uint8ArrayReader");Z.exports=function(W){var E=G.getTypeOf(W);return G.checkSupport(E),E!=="string"||w.uint8array?E==="nodebuffer"?new z(W):w.uint8array?new R(G.transformTo("uint8array",W)):new Q(G.transformTo("array",W)):new q(W)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(Y,Z,J){J.LOCAL_FILE_HEADER="PK\x03\x04",J.CENTRAL_FILE_HEADER="PK\x01\x02",J.CENTRAL_DIRECTORY_END="PK\x05\x06",J.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK\x06\x07",J.ZIP64_CENTRAL_DIRECTORY_END="PK\x06\x06",J.DATA_DESCRIPTOR="PK\x07\b"},{}],24:[function(Y,Z,J){var G=Y("./GenericWorker"),w=Y("../utils");function Q(q){G.call(this,"ConvertWorker to "+q),this.destType=q}w.inherits(Q,G),Q.prototype.processChunk=function(q){this.push({data:w.transformTo(this.destType,q.data),meta:q.meta})},Z.exports=Q},{"../utils":32,"./GenericWorker":28}],25:[function(Y,Z,J){var G=Y("./GenericWorker"),w=Y("../crc32");function Q(){G.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}Y("../utils").inherits(Q,G),Q.prototype.processChunk=function(q){this.streamInfo.crc32=w(q.data,this.streamInfo.crc32||0),this.push(q)},Z.exports=Q},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(Y,Z,J){var G=Y("../utils"),w=Y("./GenericWorker");function Q(q){w.call(this,"DataLengthProbe for "+q),this.propName=q,this.withStreamInfo(q,0)}G.inherits(Q,w),Q.prototype.processChunk=function(q){if(q){var z=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=z+q.data.length}w.prototype.processChunk.call(this,q)},Z.exports=Q},{"../utils":32,"./GenericWorker":28}],27:[function(Y,Z,J){var G=Y("../utils"),w=Y("./GenericWorker");function Q(q){w.call(this,"DataWorker");var z=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,q.then(function(R){z.dataIsReady=!0,z.data=R,z.max=R&&R.length||0,z.type=G.getTypeOf(R),z.isPaused||z._tickAndRepeat()},function(R){z.error(R)})}G.inherits(Q,w),Q.prototype.cleanUp=function(){w.prototype.cleanUp.call(this),this.data=null},Q.prototype.resume=function(){return!!w.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,G.delay(this._tickAndRepeat,[],this)),!0)},Q.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(G.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},Q.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var q=null,z=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":q=this.data.substring(this.index,z);break;case"uint8array":q=this.data.subarray(this.index,z);break;case"array":case"nodebuffer":q=this.data.slice(this.index,z)}return this.index=z,this.push({data:q,meta:{percent:this.max?this.index/this.max*100:0}})},Z.exports=Q},{"../utils":32,"./GenericWorker":28}],28:[function(Y,Z,J){function G(w){this.name=w||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}G.prototype={push:function(w){this.emit("data",w)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(w){this.emit("error",w)}return!0},error:function(w){return!this.isFinished&&(this.isPaused?this.generatedError=w:(this.isFinished=!0,this.emit("error",w),this.previous&&this.previous.error(w),this.cleanUp()),!0)},on:function(w,Q){return this._listeners[w].push(Q),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(w,Q){if(this._listeners[w])for(var q=0;q "+w:w}},Z.exports=G},{}],29:[function(Y,Z,J){var G=Y("../utils"),w=Y("./ConvertWorker"),Q=Y("./GenericWorker"),q=Y("../base64"),z=Y("../support"),R=Y("../external"),W=null;if(z.nodestream)try{W=Y("../nodejs/NodejsStreamOutputAdapter")}catch(C){}function E(C,H){return new R.Promise(function(O,X){var j=[],L=C._internalType,I=C._outputType,A=C._mimeType;C.on("data",function(y,g){j.push(y),H&&H(g)}).on("error",function(y){j=[],X(y)}).on("end",function(){try{var y=function(g,d,k){switch(g){case"blob":return G.newBlob(G.transformTo("arraybuffer",d),k);case"base64":return q.encode(d);default:return G.transformTo(g,d)}}(I,function(g,d){var k,s=0,q0=null,S=0;for(k=0;k>>6:(O<65536?H[L++]=224|O>>>12:(H[L++]=240|O>>>18,H[L++]=128|O>>>12&63),H[L++]=128|O>>>6&63),H[L++]=128|63&O);return H}(D)},J.utf8decode=function(D){return w.nodebuffer?G.transformTo("nodebuffer",D).toString("utf-8"):function(C){var H,O,X,j,L=C.length,I=new Array(2*L);for(H=O=0;H>10&1023,I[O++]=56320|1023&X)}return I.length!==O&&(I.subarray?I=I.subarray(0,O):I.length=O),G.applyFromCharCode(I)}(D=G.transformTo(w.uint8array?"uint8array":"array",D))},G.inherits(W,q),W.prototype.processChunk=function(D){var C=G.transformTo(w.uint8array?"uint8array":"array",D.data);if(this.leftOver&&this.leftOver.length){if(w.uint8array){var H=C;(C=new Uint8Array(H.length+this.leftOver.length)).set(this.leftOver,0),C.set(H,this.leftOver.length)}else C=this.leftOver.concat(C);this.leftOver=null}var O=function(j,L){var I;for((L=L||j.length)>j.length&&(L=j.length),I=L-1;0<=I&&(192&j[I])==128;)I--;return I<0?L:I===0?L:I+z[j[I]]>L?I:L}(C),X=C;O!==C.length&&(w.uint8array?(X=C.subarray(0,O),this.leftOver=C.subarray(O,C.length)):(X=C.slice(0,O),this.leftOver=C.slice(O,C.length))),this.push({data:J.utf8decode(X),meta:D.meta})},W.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:J.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},J.Utf8DecodeWorker=W,G.inherits(E,q),E.prototype.processChunk=function(D){this.push({data:J.utf8encode(D.data),meta:D.meta})},J.Utf8EncodeWorker=E},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(Y,Z,J){var G=Y("./support"),w=Y("./base64"),Q=Y("./nodejsUtils"),q=Y("./external");function z(H){return H}function R(H,O){for(var X=0;X>8;this.dir=!!(16&this.externalFileAttributes),D==0&&(this.dosPermissions=63&this.externalFileAttributes),D==3&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||this.fileNameStr.slice(-1)!=="/"||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var D=G(this.extraFields[1].value);this.uncompressedSize===w.MAX_VALUE_32BITS&&(this.uncompressedSize=D.readInt(8)),this.compressedSize===w.MAX_VALUE_32BITS&&(this.compressedSize=D.readInt(8)),this.localHeaderOffset===w.MAX_VALUE_32BITS&&(this.localHeaderOffset=D.readInt(8)),this.diskNumberStart===w.MAX_VALUE_32BITS&&(this.diskNumberStart=D.readInt(4))}},readExtraFields:function(D){var C,H,O,X=D.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});D.index+4>>6:(D<65536?E[O++]=224|D>>>12:(E[O++]=240|D>>>18,E[O++]=128|D>>>12&63),E[O++]=128|D>>>6&63),E[O++]=128|63&D);return E},J.buf2binstring=function(W){return R(W,W.length)},J.binstring2buf=function(W){for(var E=new G.Buf8(W.length),D=0,C=E.length;D>10&1023,j[C++]=56320|1023&H)}return R(j,C)},J.utf8border=function(W,E){var D;for((E=E||W.length)>W.length&&(E=W.length),D=E-1;0<=D&&(192&W[D])==128;)D--;return D<0?E:D===0?E:D+q[W[D]]>E?D:E}},{"./common":41}],43:[function(Y,Z,J){Z.exports=function(G,w,Q,q){for(var z=65535&G|0,R=G>>>16&65535|0,W=0;Q!==0;){for(Q-=W=2000>>1:w>>>1;Q[q]=w}return Q}();Z.exports=function(w,Q,q,z){var R=G,W=z+q;w^=-1;for(var E=z;E>>8^R[255&(w^Q[E])];return-1^w}},{}],46:[function(Y,Z,J){var G,w=Y("../utils/common"),Q=Y("./trees"),q=Y("./adler32"),z=Y("./crc32"),R=Y("./messages"),W=0,E=4,D=0,C=-2,H=-1,O=4,X=2,j=8,L=9,I=286,A=30,y=19,g=2*I+1,d=15,k=3,s=258,q0=s+k+1,S=42,h=113,F=1,a=2,U0=3,m=4;function J0(V,t){return V.msg=R[t],t}function $0(V){return(V<<1)-(4V.avail_out&&(T=V.avail_out),T!==0&&(w.arraySet(V.output,t.pending_buf,t.pending_out,T,V.next_out),V.next_out+=T,t.pending_out+=T,V.total_out+=T,V.avail_out-=T,t.pending-=T,t.pending===0&&(t.pending_out=0))}function _(V,t){Q._tr_flush_block(V,0<=V.block_start?V.block_start:-1,V.strstart-V.block_start,t),V.block_start=V.strstart,i(V.strm)}function r(V,t){V.pending_buf[V.pending++]=t}function n(V,t){V.pending_buf[V.pending++]=t>>>8&255,V.pending_buf[V.pending++]=255&t}function Z0(V,t){var T,K,B=V.max_chain_length,M=V.strstart,x=V.prev_length,l=V.nice_match,u=V.strstart>V.w_size-q0?V.strstart-(V.w_size-q0):0,Q0=V.window,w0=V.w_mask,K0=V.prev,L0=V.strstart+s,M0=Q0[M+x-1],H0=Q0[M+x];V.prev_length>=V.good_match&&(B>>=2),l>V.lookahead&&(l=V.lookahead);do if(Q0[(T=t)+x]===H0&&Q0[T+x-1]===M0&&Q0[T]===Q0[M]&&Q0[++T]===Q0[M+1]){M+=2,T++;do;while(Q0[++M]===Q0[++T]&&Q0[++M]===Q0[++T]&&Q0[++M]===Q0[++T]&&Q0[++M]===Q0[++T]&&Q0[++M]===Q0[++T]&&Q0[++M]===Q0[++T]&&Q0[++M]===Q0[++T]&&Q0[++M]===Q0[++T]&&Mu&&--B!=0);return x<=V.lookahead?x:V.lookahead}function p(V){var t,T,K,B,M,x,l,u,Q0,w0,K0=V.w_size;do{if(B=V.window_size-V.lookahead-V.strstart,V.strstart>=K0+(K0-q0)){for(w.arraySet(V.window,V.window,K0,K0,0),V.match_start-=K0,V.strstart-=K0,V.block_start-=K0,t=T=V.hash_size;K=V.head[--t],V.head[t]=K0<=K?K-K0:0,--T;);for(t=T=K0;K=V.prev[--t],V.prev[t]=K0<=K?K-K0:0,--T;);B+=K0}if(V.strm.avail_in===0)break;if(x=V.strm,l=V.window,u=V.strstart+V.lookahead,Q0=B,w0=void 0,w0=x.avail_in,Q0=k)for(M=V.strstart-V.insert,V.ins_h=V.window[M],V.ins_h=(V.ins_h<=k&&(V.ins_h=(V.ins_h<=k)if(K=Q._tr_tally(V,V.strstart-V.match_start,V.match_length-k),V.lookahead-=V.match_length,V.match_length<=V.max_lazy_match&&V.lookahead>=k){for(V.match_length--;V.strstart++,V.ins_h=(V.ins_h<=k&&(V.ins_h=(V.ins_h<=k&&V.match_length<=V.prev_length){for(B=V.strstart+V.lookahead-k,K=Q._tr_tally(V,V.strstart-1-V.prev_match,V.prev_length-k),V.lookahead-=V.prev_length-1,V.prev_length-=2;++V.strstart<=B&&(V.ins_h=(V.ins_h<V.pending_buf_size-5&&(T=V.pending_buf_size-5);;){if(V.lookahead<=1){if(p(V),V.lookahead===0&&t===W)return F;if(V.lookahead===0)break}V.strstart+=V.lookahead,V.lookahead=0;var K=V.block_start+T;if((V.strstart===0||V.strstart>=K)&&(V.lookahead=V.strstart-K,V.strstart=K,_(V,!1),V.strm.avail_out===0))return F;if(V.strstart-V.block_start>=V.w_size-q0&&(_(V,!1),V.strm.avail_out===0))return F}return V.insert=0,t===E?(_(V,!0),V.strm.avail_out===0?U0:m):(V.strstart>V.block_start&&(_(V,!1),V.strm.avail_out),F)}),new c(4,4,8,4,P),new c(4,5,16,8,P),new c(4,6,32,32,P),new c(4,4,16,16,N),new c(8,16,32,32,N),new c(8,16,128,128,N),new c(8,32,128,256,N),new c(32,128,258,1024,N),new c(32,258,258,4096,N)],J.deflateInit=function(V,t){return e(V,t,j,15,8,0)},J.deflateInit2=e,J.deflateReset=b,J.deflateResetKeep=v,J.deflateSetHeader=function(V,t){return V&&V.state?V.state.wrap!==2?C:(V.state.gzhead=t,D):C},J.deflate=function(V,t){var T,K,B,M;if(!V||!V.state||5>8&255),r(K,K.gzhead.time>>16&255),r(K,K.gzhead.time>>24&255),r(K,K.level===9?2:2<=K.strategy||K.level<2?4:0),r(K,255&K.gzhead.os),K.gzhead.extra&&K.gzhead.extra.length&&(r(K,255&K.gzhead.extra.length),r(K,K.gzhead.extra.length>>8&255)),K.gzhead.hcrc&&(V.adler=z(V.adler,K.pending_buf,K.pending,0)),K.gzindex=0,K.status=69):(r(K,0),r(K,0),r(K,0),r(K,0),r(K,0),r(K,K.level===9?2:2<=K.strategy||K.level<2?4:0),r(K,3),K.status=h);else{var x=j+(K.w_bits-8<<4)<<8;x|=(2<=K.strategy||K.level<2?0:K.level<6?1:K.level===6?2:3)<<6,K.strstart!==0&&(x|=32),x+=31-x%31,K.status=h,n(K,x),K.strstart!==0&&(n(K,V.adler>>>16),n(K,65535&V.adler)),V.adler=1}if(K.status===69)if(K.gzhead.extra){for(B=K.pending;K.gzindex<(65535&K.gzhead.extra.length)&&(K.pending!==K.pending_buf_size||(K.gzhead.hcrc&&K.pending>B&&(V.adler=z(V.adler,K.pending_buf,K.pending-B,B)),i(V),B=K.pending,K.pending!==K.pending_buf_size));)r(K,255&K.gzhead.extra[K.gzindex]),K.gzindex++;K.gzhead.hcrc&&K.pending>B&&(V.adler=z(V.adler,K.pending_buf,K.pending-B,B)),K.gzindex===K.gzhead.extra.length&&(K.gzindex=0,K.status=73)}else K.status=73;if(K.status===73)if(K.gzhead.name){B=K.pending;do{if(K.pending===K.pending_buf_size&&(K.gzhead.hcrc&&K.pending>B&&(V.adler=z(V.adler,K.pending_buf,K.pending-B,B)),i(V),B=K.pending,K.pending===K.pending_buf_size)){M=1;break}M=K.gzindexB&&(V.adler=z(V.adler,K.pending_buf,K.pending-B,B)),M===0&&(K.gzindex=0,K.status=91)}else K.status=91;if(K.status===91)if(K.gzhead.comment){B=K.pending;do{if(K.pending===K.pending_buf_size&&(K.gzhead.hcrc&&K.pending>B&&(V.adler=z(V.adler,K.pending_buf,K.pending-B,B)),i(V),B=K.pending,K.pending===K.pending_buf_size)){M=1;break}M=K.gzindexB&&(V.adler=z(V.adler,K.pending_buf,K.pending-B,B)),M===0&&(K.status=103)}else K.status=103;if(K.status===103&&(K.gzhead.hcrc?(K.pending+2>K.pending_buf_size&&i(V),K.pending+2<=K.pending_buf_size&&(r(K,255&V.adler),r(K,V.adler>>8&255),V.adler=0,K.status=h)):K.status=h),K.pending!==0){if(i(V),V.avail_out===0)return K.last_flush=-1,D}else if(V.avail_in===0&&$0(t)<=$0(T)&&t!==E)return J0(V,-5);if(K.status===666&&V.avail_in!==0)return J0(V,-5);if(V.avail_in!==0||K.lookahead!==0||t!==W&&K.status!==666){var l=K.strategy===2?function(u,Q0){for(var w0;;){if(u.lookahead===0&&(p(u),u.lookahead===0)){if(Q0===W)return F;break}if(u.match_length=0,w0=Q._tr_tally(u,0,u.window[u.strstart]),u.lookahead--,u.strstart++,w0&&(_(u,!1),u.strm.avail_out===0))return F}return u.insert=0,Q0===E?(_(u,!0),u.strm.avail_out===0?U0:m):u.last_lit&&(_(u,!1),u.strm.avail_out===0)?F:a}(K,t):K.strategy===3?function(u,Q0){for(var w0,K0,L0,M0,H0=u.window;;){if(u.lookahead<=s){if(p(u),u.lookahead<=s&&Q0===W)return F;if(u.lookahead===0)break}if(u.match_length=0,u.lookahead>=k&&0u.lookahead&&(u.match_length=u.lookahead)}if(u.match_length>=k?(w0=Q._tr_tally(u,1,u.match_length-k),u.lookahead-=u.match_length,u.strstart+=u.match_length,u.match_length=0):(w0=Q._tr_tally(u,0,u.window[u.strstart]),u.lookahead--,u.strstart++),w0&&(_(u,!1),u.strm.avail_out===0))return F}return u.insert=0,Q0===E?(_(u,!0),u.strm.avail_out===0?U0:m):u.last_lit&&(_(u,!1),u.strm.avail_out===0)?F:a}(K,t):G[K.level].func(K,t);if(l!==U0&&l!==m||(K.status=666),l===F||l===U0)return V.avail_out===0&&(K.last_flush=-1),D;if(l===a&&(t===1?Q._tr_align(K):t!==5&&(Q._tr_stored_block(K,0,0,!1),t===3&&(I0(K.head),K.lookahead===0&&(K.strstart=0,K.block_start=0,K.insert=0))),i(V),V.avail_out===0))return K.last_flush=-1,D}return t!==E?D:K.wrap<=0?1:(K.wrap===2?(r(K,255&V.adler),r(K,V.adler>>8&255),r(K,V.adler>>16&255),r(K,V.adler>>24&255),r(K,255&V.total_in),r(K,V.total_in>>8&255),r(K,V.total_in>>16&255),r(K,V.total_in>>24&255)):(n(K,V.adler>>>16),n(K,65535&V.adler)),i(V),0=T.w_size&&(M===0&&(I0(T.head),T.strstart=0,T.block_start=0,T.insert=0),Q0=new w.Buf8(T.w_size),w.arraySet(Q0,t,w0-T.w_size,T.w_size,0),t=Q0,w0=T.w_size),x=V.avail_in,l=V.next_in,u=V.input,V.avail_in=w0,V.next_in=0,V.input=t,p(T);T.lookahead>=k;){for(K=T.strstart,B=T.lookahead-(k-1);T.ins_h=(T.ins_h<>>=k=d>>>24,L-=k,(k=d>>>16&255)===0)a[R++]=65535&d;else{if(!(16&k)){if((64&k)==0){d=I[(65535&d)+(j&(1<>>=k,L-=k),L<15&&(j+=F[q++]<>>=k=d>>>24,L-=k,!(16&(k=d>>>16&255))){if((64&k)==0){d=A[(65535&d)+(j&(1<>>=k,L-=k,(k=R-W)>3,j&=(1<<(L-=s<<3))-1,G.next_in=q,G.next_out=R,G.avail_in=q>>24&255)+(S>>>8&65280)+((65280&S)<<8)+((255&S)<<24)}function j(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new G.Buf16(320),this.work=new G.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function L(S){var h;return S&&S.state?(h=S.state,S.total_in=S.total_out=h.total=0,S.msg="",h.wrap&&(S.adler=1&h.wrap),h.mode=C,h.last=0,h.havedict=0,h.dmax=32768,h.head=null,h.hold=0,h.bits=0,h.lencode=h.lendyn=new G.Buf32(H),h.distcode=h.distdyn=new G.Buf32(O),h.sane=1,h.back=-1,E):D}function I(S){var h;return S&&S.state?((h=S.state).wsize=0,h.whave=0,h.wnext=0,L(S)):D}function A(S,h){var F,a;return S&&S.state?(a=S.state,h<0?(F=0,h=-h):(F=1+(h>>4),h<48&&(h&=15)),h&&(h<8||15=m.wsize?(G.arraySet(m.window,h,F-m.wsize,m.wsize,0),m.wnext=0,m.whave=m.wsize):(a<(U0=m.wsize-m.wnext)&&(U0=a),G.arraySet(m.window,h,F-a,U0,m.wnext),(a-=U0)?(G.arraySet(m.window,h,F-a,a,0),m.wnext=a,m.whave=m.wsize):(m.wnext+=U0,m.wnext===m.wsize&&(m.wnext=0),m.whave>>8&255,F.check=Q(F.check,M,2,0),_=i=0,F.mode=2;break}if(F.flags=0,F.head&&(F.head.done=!1),!(1&F.wrap)||(((255&i)<<8)+(i>>8))%31){S.msg="incorrect header check",F.mode=30;break}if((15&i)!=8){S.msg="unknown compression method",F.mode=30;break}if(_-=4,V=8+(15&(i>>>=4)),F.wbits===0)F.wbits=V;else if(V>F.wbits){S.msg="invalid window size",F.mode=30;break}F.dmax=1<>8&1),512&F.flags&&(M[0]=255&i,M[1]=i>>>8&255,F.check=Q(F.check,M,2,0)),_=i=0,F.mode=3;case 3:for(;_<32;){if($0===0)break U;$0--,i+=a[m++]<<_,_+=8}F.head&&(F.head.time=i),512&F.flags&&(M[0]=255&i,M[1]=i>>>8&255,M[2]=i>>>16&255,M[3]=i>>>24&255,F.check=Q(F.check,M,4,0)),_=i=0,F.mode=4;case 4:for(;_<16;){if($0===0)break U;$0--,i+=a[m++]<<_,_+=8}F.head&&(F.head.xflags=255&i,F.head.os=i>>8),512&F.flags&&(M[0]=255&i,M[1]=i>>>8&255,F.check=Q(F.check,M,2,0)),_=i=0,F.mode=5;case 5:if(1024&F.flags){for(;_<16;){if($0===0)break U;$0--,i+=a[m++]<<_,_+=8}F.length=i,F.head&&(F.head.extra_len=i),512&F.flags&&(M[0]=255&i,M[1]=i>>>8&255,F.check=Q(F.check,M,2,0)),_=i=0}else F.head&&(F.head.extra=null);F.mode=6;case 6:if(1024&F.flags&&($0<(Z0=F.length)&&(Z0=$0),Z0&&(F.head&&(V=F.head.extra_len-F.length,F.head.extra||(F.head.extra=new Array(F.head.extra_len)),G.arraySet(F.head.extra,a,m,Z0,V)),512&F.flags&&(F.check=Q(F.check,a,Z0,m)),$0-=Z0,m+=Z0,F.length-=Z0),F.length))break U;F.length=0,F.mode=7;case 7:if(2048&F.flags){if($0===0)break U;for(Z0=0;V=a[m+Z0++],F.head&&V&&F.length<65536&&(F.head.name+=String.fromCharCode(V)),V&&Z0<$0;);if(512&F.flags&&(F.check=Q(F.check,a,Z0,m)),$0-=Z0,m+=Z0,V)break U}else F.head&&(F.head.name=null);F.length=0,F.mode=8;case 8:if(4096&F.flags){if($0===0)break U;for(Z0=0;V=a[m+Z0++],F.head&&V&&F.length<65536&&(F.head.comment+=String.fromCharCode(V)),V&&Z0<$0;);if(512&F.flags&&(F.check=Q(F.check,a,Z0,m)),$0-=Z0,m+=Z0,V)break U}else F.head&&(F.head.comment=null);F.mode=9;case 9:if(512&F.flags){for(;_<16;){if($0===0)break U;$0--,i+=a[m++]<<_,_+=8}if(i!==(65535&F.check)){S.msg="header crc mismatch",F.mode=30;break}_=i=0}F.head&&(F.head.hcrc=F.flags>>9&1,F.head.done=!0),S.adler=F.check=0,F.mode=12;break;case 10:for(;_<32;){if($0===0)break U;$0--,i+=a[m++]<<_,_+=8}S.adler=F.check=X(i),_=i=0,F.mode=11;case 11:if(F.havedict===0)return S.next_out=J0,S.avail_out=I0,S.next_in=m,S.avail_in=$0,F.hold=i,F.bits=_,2;S.adler=F.check=1,F.mode=12;case 12:if(h===5||h===6)break U;case 13:if(F.last){i>>>=7&_,_-=7&_,F.mode=27;break}for(;_<3;){if($0===0)break U;$0--,i+=a[m++]<<_,_+=8}switch(F.last=1&i,_-=1,3&(i>>>=1)){case 0:F.mode=14;break;case 1:if(s(F),F.mode=20,h!==6)break;i>>>=2,_-=2;break U;case 2:F.mode=17;break;case 3:S.msg="invalid block type",F.mode=30}i>>>=2,_-=2;break;case 14:for(i>>>=7&_,_-=7&_;_<32;){if($0===0)break U;$0--,i+=a[m++]<<_,_+=8}if((65535&i)!=(i>>>16^65535)){S.msg="invalid stored block lengths",F.mode=30;break}if(F.length=65535&i,_=i=0,F.mode=15,h===6)break U;case 15:F.mode=16;case 16:if(Z0=F.length){if($0>>=5,_-=5,F.ndist=1+(31&i),i>>>=5,_-=5,F.ncode=4+(15&i),i>>>=4,_-=4,286>>=3,_-=3}for(;F.have<19;)F.lens[x[F.have++]]=0;if(F.lencode=F.lendyn,F.lenbits=7,T={bits:F.lenbits},t=z(0,F.lens,0,19,F.lencode,0,F.work,T),F.lenbits=T.bits,t){S.msg="invalid code lengths set",F.mode=30;break}F.have=0,F.mode=19;case 19:for(;F.have>>16&255,f=65535&B,!((N=B>>>24)<=_);){if($0===0)break U;$0--,i+=a[m++]<<_,_+=8}if(f<16)i>>>=N,_-=N,F.lens[F.have++]=f;else{if(f===16){for(K=N+2;_>>=N,_-=N,F.have===0){S.msg="invalid bit length repeat",F.mode=30;break}V=F.lens[F.have-1],Z0=3+(3&i),i>>>=2,_-=2}else if(f===17){for(K=N+3;_>>=N)),i>>>=3,_-=3}else{for(K=N+7;_>>=N)),i>>>=7,_-=7}if(F.have+Z0>F.nlen+F.ndist){S.msg="invalid bit length repeat",F.mode=30;break}for(;Z0--;)F.lens[F.have++]=V}}if(F.mode===30)break;if(F.lens[256]===0){S.msg="invalid code -- missing end-of-block",F.mode=30;break}if(F.lenbits=9,T={bits:F.lenbits},t=z(R,F.lens,0,F.nlen,F.lencode,0,F.work,T),F.lenbits=T.bits,t){S.msg="invalid literal/lengths set",F.mode=30;break}if(F.distbits=6,F.distcode=F.distdyn,T={bits:F.distbits},t=z(W,F.lens,F.nlen,F.ndist,F.distcode,0,F.work,T),F.distbits=T.bits,t){S.msg="invalid distances set",F.mode=30;break}if(F.mode=20,h===6)break U;case 20:F.mode=21;case 21:if(6<=$0&&258<=I0){S.next_out=J0,S.avail_out=I0,S.next_in=m,S.avail_in=$0,F.hold=i,F.bits=_,q(S,n),J0=S.next_out,U0=S.output,I0=S.avail_out,m=S.next_in,a=S.input,$0=S.avail_in,i=F.hold,_=F.bits,F.mode===12&&(F.back=-1);break}for(F.back=0;c=(B=F.lencode[i&(1<>>16&255,f=65535&B,!((N=B>>>24)<=_);){if($0===0)break U;$0--,i+=a[m++]<<_,_+=8}if(c&&(240&c)==0){for(v=N,b=c,e=f;c=(B=F.lencode[e+((i&(1<>v)])>>>16&255,f=65535&B,!(v+(N=B>>>24)<=_);){if($0===0)break U;$0--,i+=a[m++]<<_,_+=8}i>>>=v,_-=v,F.back+=v}if(i>>>=N,_-=N,F.back+=N,F.length=f,c===0){F.mode=26;break}if(32&c){F.back=-1,F.mode=12;break}if(64&c){S.msg="invalid literal/length code",F.mode=30;break}F.extra=15&c,F.mode=22;case 22:if(F.extra){for(K=F.extra;_>>=F.extra,_-=F.extra,F.back+=F.extra}F.was=F.length,F.mode=23;case 23:for(;c=(B=F.distcode[i&(1<>>16&255,f=65535&B,!((N=B>>>24)<=_);){if($0===0)break U;$0--,i+=a[m++]<<_,_+=8}if((240&c)==0){for(v=N,b=c,e=f;c=(B=F.distcode[e+((i&(1<>v)])>>>16&255,f=65535&B,!(v+(N=B>>>24)<=_);){if($0===0)break U;$0--,i+=a[m++]<<_,_+=8}i>>>=v,_-=v,F.back+=v}if(i>>>=N,_-=N,F.back+=N,64&c){S.msg="invalid distance code",F.mode=30;break}F.offset=f,F.extra=15&c,F.mode=24;case 24:if(F.extra){for(K=F.extra;_>>=F.extra,_-=F.extra,F.back+=F.extra}if(F.offset>F.dmax){S.msg="invalid distance too far back",F.mode=30;break}F.mode=25;case 25:if(I0===0)break U;if(Z0=n-I0,F.offset>Z0){if((Z0=F.offset-Z0)>F.whave&&F.sane){S.msg="invalid distance too far back",F.mode=30;break}p=Z0>F.wnext?(Z0-=F.wnext,F.wsize-Z0):F.wnext-Z0,Z0>F.length&&(Z0=F.length),P=F.window}else P=U0,p=J0-F.offset,Z0=F.length;for(I0g?(k=p[P+O[h]],_[r+O[h]]):(k=96,0),j=1<>J0)+(L-=j)]=d<<24|k<<16|s|0,L!==0;);for(j=1<>=1;if(j!==0?(i&=j-1,i+=j):i=0,h++,--n[S]==0){if(S===a)break;S=W[E+O[h]]}if(U0>>7)]}function r(B,M){B.pending_buf[B.pending++]=255&M,B.pending_buf[B.pending++]=M>>>8&255}function n(B,M,x){B.bi_valid>X-x?(B.bi_buf|=M<>X-B.bi_valid,B.bi_valid+=x-X):(B.bi_buf|=M<>>=1,x<<=1,0<--M;);return x>>>1}function P(B,M,x){var l,u,Q0=new Array(O+1),w0=0;for(l=1;l<=O;l++)Q0[l]=w0=w0+x[l-1]<<1;for(u=0;u<=M;u++){var K0=B[2*u+1];K0!==0&&(B[2*u]=p(Q0[K0]++,K0))}}function N(B){var M;for(M=0;M>1;1<=x;x--)v(B,Q0,x);for(u=L0;x=B.heap[1],B.heap[1]=B.heap[B.heap_len--],v(B,Q0,1),l=B.heap[1],B.heap[--B.heap_max]=x,B.heap[--B.heap_max]=l,Q0[2*u]=Q0[2*x]+Q0[2*l],B.depth[u]=(B.depth[x]>=B.depth[l]?B.depth[x]:B.depth[l])+1,Q0[2*x+1]=Q0[2*l+1]=u,B.heap[1]=u++,v(B,Q0,1),2<=B.heap_len;);B.heap[--B.heap_max]=B.heap[1],function(H0,v0){var j1,l0,t1,D0,A2,z6,K1=v0.dyn_tree,N$=v0.max_code,H7=v0.stat_desc.static_tree,j7=v0.stat_desc.has_stree,z7=v0.stat_desc.extra_bits,R$=v0.stat_desc.extra_base,e1=v0.stat_desc.max_length,P2=0;for(D0=0;D0<=O;D0++)H0.bl_count[D0]=0;for(K1[2*H0.heap[H0.heap_max]+1]=0,j1=H0.heap_max+1;j1>=7;u>>=1)if(1&M0&&K0.dyn_ltree[2*L0]!==0)return w;if(K0.dyn_ltree[18]!==0||K0.dyn_ltree[20]!==0||K0.dyn_ltree[26]!==0)return Q;for(L0=32;L0>>3,(Q0=B.static_len+3+7>>>3)<=u&&(u=Q0)):u=Q0=x+5,x+4<=u&&M!==-1?K(B,M,x,l):B.strategy===4||Q0===u?(n(B,2+(l?1:0),3),b(B,q0,S)):(n(B,4+(l?1:0),3),function(K0,L0,M0,H0){var v0;for(n(K0,L0-257,5),n(K0,M0-1,5),n(K0,H0-4,4),v0=0;v0>>8&255,B.pending_buf[B.d_buf+2*B.last_lit+1]=255&M,B.pending_buf[B.l_buf+B.last_lit]=255&x,B.last_lit++,M===0?B.dyn_ltree[2*x]++:(B.matches++,M--,B.dyn_ltree[2*(F[x]+W+1)]++,B.dyn_dtree[2*_(M)]++),B.last_lit===B.lit_bufsize-1},J._tr_align=function(B){n(B,2,3),Z0(B,L,q0),function(M){M.bi_valid===16?(r(M,M.bi_buf),M.bi_buf=0,M.bi_valid=0):8<=M.bi_valid&&(M.pending_buf[M.pending++]=255&M.bi_buf,M.bi_buf>>=8,M.bi_valid-=8)}(B)}},{"../utils/common":41}],53:[function(Y,Z,J){Z.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(Y,Z,J){(function(G){(function(w,Q){if(!w.setImmediate){var q,z,R,W,E=1,D={},C=!1,H=w.document,O=Object.getPrototypeOf&&Object.getPrototypeOf(w);O=O&&O.setTimeout?O:w,q={}.toString.call(w.process)==="[object process]"?function(I){j0.nextTick(function(){j(I)})}:function(){if(w.postMessage&&!w.importScripts){var I=!0,A=w.onmessage;return w.onmessage=function(){I=!1},w.postMessage("","*"),w.onmessage=A,I}}()?(W="setImmediate$"+Math.random()+"$",w.addEventListener?w.addEventListener("message",L,!1):w.attachEvent("onmessage",L),function(I){w.postMessage(W+I,"*")}):w.MessageChannel?((R=new MessageChannel).port1.onmessage=function(I){j(I.data)},function(I){R.port2.postMessage(I)}):H&&("onreadystatechange"in H.createElement("script"))?(z=H.documentElement,function(I){var A=H.createElement("script");A.onreadystatechange=function(){j(I),A.onreadystatechange=null,z.removeChild(A),A=null},z.appendChild(A)}):function(I){setTimeout(j,0,I)},O.setImmediate=function(I){typeof I!="function"&&(I=new Function(""+I));for(var A=new Array(arguments.length-1),y=0;y":">"};function $(Y){return Y&&Y.replace?Y.replace(/([&"<>'])/g,function(Z,J){return U[J]}):Y}return M9=$,M9}var cZ;function tq(){if(cZ)return Z2.exports;cZ=1;var U=oq(),$=m9().Stream,Y=" ";function Z(z,R){if(typeof R!=="object")R={indent:R};var W=R.stream?new $:null,E="",D=!1,C=!R.indent?"":R.indent===!0?Y:R.indent,H=!0;function O(A){if(!H)A();else j0.nextTick(A)}function X(A,y){if(y!==void 0)E+=y;if(A&&!D)W=W||new $,D=!0;if(A&&D){var g=E;O(function(){W.emit("data",g)}),E=""}}function j(A,y){Q(X,w(A,C,C?1:0),y)}function L(){if(W){var A=E;O(function(){W.emit("data",A),W.emit("end"),W.readable=!1,W.emit("close")})}}function I(A){var y=A.encoding||"UTF-8",g={version:"1.0",encoding:y};if(A.standalone)g.standalone=A.standalone;j({"?xml":{_attr:g}}),E=E.replace("/>","?>")}if(O(function(){H=!1}),R.declaration)I(R.declaration);if(z&&z.forEach)z.forEach(function(A,y){var g;if(y+1===z.length)g=L;j(A,g)});else j(z,L);if(W)return W.readable=!0,W;return E}function J(){var z=Array.prototype.slice.call(arguments),R={_elem:w(z)};return R.push=function(W){if(!this.append)throw new Error("not assigned to a parent!");var E=this,D=this._elem.indent;Q(this.append,w(W,D,this._elem.icount+(D?1:0)),function(){E.append(!0)})},R.close=function(W){if(W!==void 0)this.push(W);if(this.end)this.end()},R}function G(z,R){return new Array(R||0).join(z||"")}function w(z,R,W){W=W||0;var E=G(R,W),D,C=z,H=!1;if(typeof z==="object"){var O=Object.keys(z);if(D=O[0],C=z[D],C&&C._elem)return C._elem.name=D,C._elem.icount=W,C._elem.indent=R,C._elem.indents=E,C._elem.interrupt=C,C._elem}var X=[],j=[],L;function I(A){var y=Object.keys(A);y.forEach(function(g){X.push(q(g,A[g]))})}switch(typeof C){case"object":if(C===null)break;if(C._attr)I(C._attr);if(C._cdata)j.push(("/g,"]]]]>")+"]]>");if(C.forEach){if(L=!1,j.push(""),C.forEach(function(A){if(typeof A=="object"){var y=Object.keys(A)[0];if(y=="_attr")I(A._attr);else j.push(w(A,R,W+1))}else j.pop(),L=!0,j.push(U(A))}),!L)j.push("")}break;default:j.push(U(C))}return{name:D,interrupt:H,attributes:X,content:j,icount:W,indents:E,indent:R}}function Q(z,R,W){if(typeof R!="object")return z(!1,R);var E=R.interrupt?1:R.content.length;function D(){while(R.content.length){var H=R.content.shift();if(H===void 0)continue;if(C(H))return;Q(z,H)}if(z(!1,(E>1?R.indents:"")+(R.name?"":"")+(R.indent&&!W?` -`:"")),W)W()}function C(H){if(H.interrupt)return H.interrupt.append=z,H.interrupt.end=D,H.interrupt=!1,z(!0),!0;return!1}if(z(!1,R.indents+(R.name?"<"+R.name:"")+(R.attributes.length?" "+R.attributes.join(" "):"")+(E?R.name?">":"":R.name?"/>":"")+(R.indent&&E>1?` -`:"")),!E)return z(!1,R.indent?` -`:"");if(!C(R))D()}function q(z,R){return z+'="'+U(R)+'"'}return Z2.exports=Z,Z2.exports.element=Z2.exports.Element=J,Z2.exports}var eq=tq(),F0=g9(eq),Q2=0,W9=32,UX=32,$X=(U,$)=>{let Y=$.replace(/-/g,"");if(Y.length!==UX)throw new Error(`Error: Cannot extract GUID from font filename: ${$}`);let J=Y.replace(/(..)/g,"$1 ").trim().split(" ").map((q)=>parseInt(q,16));J.reverse();let w=U.slice(Q2,W9).map((q,z)=>q^J[z%J.length]),Q=new Uint8Array(Q2+w.length+Math.max(0,U.length-W9));return Q.set(U.slice(0,Q2)),Q.set(w,Q2),Q.set(U.slice(W9),Q2+w.length),Q};class H6{format(U,$={stack:[]}){let Y=U.prepForXml($);if(Y)return Y;else throw Error("XMLComponent did not format correctly")}}class j${replace(U,$,Y){let Z=U;return $.forEach((J,G)=>{Z=Z.replace(new RegExp(`{${J.fileName}}`,"g"),(Y+G).toString())}),Z}getMediaData(U,$){return $.Array.filter((Y)=>U.search(`{${Y.fileName}}`)>0)}}class K7{replace(U,$){let Y=U;for(let Z of $)Y=Y.replace(new RegExp(`{${Z.reference}-${Z.instance}}`,"g"),Z.numId.toString());return Y}}class w7{constructor(){Y0(this,"formatter"),Y0(this,"imageReplacer"),Y0(this,"numberingReplacer"),this.formatter=new H6,this.imageReplacer=new j$,this.numberingReplacer=new K7}compile(U,$,Y=[]){let Z=new c1,J=this.xmlifyFile(U,$),G=new Map(Object.entries(J));for(let[,w]of G)if(Array.isArray(w))for(let Q of w)Z.file(Q.path,B2(Q.data));else Z.file(w.path,B2(w.data));for(let w of Y)Z.file(w.path,B2(w.data));for(let w of U.Media.Array)if(w.type!=="svg")Z.file(`word/media/${w.fileName}`,w.data);else Z.file(`word/media/${w.fileName}`,w.data),Z.file(`word/media/${w.fallback.fileName}`,w.fallback.data);for(let{data:w,name:Q,fontKey:q}of U.FontTable.fontOptionsWithKey){let[z]=Q.split(".");Z.file(`word/fonts/${z}.odttf`,$X(w,q))}return Z}xmlifyFile(U,$){let Y=U.Document.Relationships.RelationshipCount+1,Z=F0(this.formatter.format(U.Document.View,{viewWrapper:U.Document,file:U,stack:[]}),{indent:$,declaration:{standalone:"yes",encoding:"UTF-8"}}),J=U.Comments.Relationships.RelationshipCount+1,G=F0(this.formatter.format(U.Comments,{viewWrapper:{View:U.Comments,Relationships:U.Comments.Relationships},file:U,stack:[]}),{indent:$,declaration:{standalone:"yes",encoding:"UTF-8"}}),w=U.FootNotes.Relationships.RelationshipCount+1,Q=F0(this.formatter.format(U.FootNotes.View,{viewWrapper:U.FootNotes,file:U,stack:[]}),{indent:$,declaration:{standalone:"yes",encoding:"UTF-8"}}),q=this.imageReplacer.getMediaData(Z,U.Media),z=this.imageReplacer.getMediaData(G,U.Media),R=this.imageReplacer.getMediaData(Q,U.Media);return{Relationships:{data:(()=>{return q.forEach((W,E)=>{U.Document.Relationships.addRelationship(Y+E,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",`media/${W.fileName}`)}),U.Document.Relationships.addRelationship(U.Document.Relationships.RelationshipCount+1,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable","fontTable.xml"),F0(this.formatter.format(U.Document.Relationships,{viewWrapper:U.Document,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}})})(),path:"word/_rels/document.xml.rels"},Document:{data:(()=>{let W=this.imageReplacer.replace(Z,q,Y);return this.numberingReplacer.replace(W,U.Numbering.ConcreteNumbering)})(),path:"word/document.xml"},Styles:{data:(()=>{let W=F0(this.formatter.format(U.Styles,{viewWrapper:U.Document,file:U,stack:[]}),{indent:$,declaration:{standalone:"yes",encoding:"UTF-8"}});return this.numberingReplacer.replace(W,U.Numbering.ConcreteNumbering)})(),path:"word/styles.xml"},Properties:{data:F0(this.formatter.format(U.CoreProperties,{viewWrapper:U.Document,file:U,stack:[]}),{indent:$,declaration:{standalone:"yes",encoding:"UTF-8"}}),path:"docProps/core.xml"},Numbering:{data:F0(this.formatter.format(U.Numbering,{viewWrapper:U.Document,file:U,stack:[]}),{indent:$,declaration:{standalone:"yes",encoding:"UTF-8"}}),path:"word/numbering.xml"},FileRelationships:{data:F0(this.formatter.format(U.FileRelationships,{viewWrapper:U.Document,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}}),path:"_rels/.rels"},HeaderRelationships:U.Headers.map((W,E)=>{let D=F0(this.formatter.format(W.View,{viewWrapper:W,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}});return this.imageReplacer.getMediaData(D,U.Media).forEach((H,O)=>{W.Relationships.addRelationship(O,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",`media/${H.fileName}`)}),{data:F0(this.formatter.format(W.Relationships,{viewWrapper:W,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}}),path:`word/_rels/header${E+1}.xml.rels`}}),FooterRelationships:U.Footers.map((W,E)=>{let D=F0(this.formatter.format(W.View,{viewWrapper:W,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}});return this.imageReplacer.getMediaData(D,U.Media).forEach((H,O)=>{W.Relationships.addRelationship(O,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",`media/${H.fileName}`)}),{data:F0(this.formatter.format(W.Relationships,{viewWrapper:W,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}}),path:`word/_rels/footer${E+1}.xml.rels`}}),Headers:U.Headers.map((W,E)=>{let D=F0(this.formatter.format(W.View,{viewWrapper:W,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}}),C=this.imageReplacer.getMediaData(D,U.Media),H=this.imageReplacer.replace(D,C,0);return{data:this.numberingReplacer.replace(H,U.Numbering.ConcreteNumbering),path:`word/header${E+1}.xml`}}),Footers:U.Footers.map((W,E)=>{let D=F0(this.formatter.format(W.View,{viewWrapper:W,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}}),C=this.imageReplacer.getMediaData(D,U.Media),H=this.imageReplacer.replace(D,C,0);return{data:this.numberingReplacer.replace(H,U.Numbering.ConcreteNumbering),path:`word/footer${E+1}.xml`}}),ContentTypes:{data:F0(this.formatter.format(U.ContentTypes,{viewWrapper:U.Document,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}}),path:"[Content_Types].xml"},CustomProperties:{data:F0(this.formatter.format(U.CustomProperties,{viewWrapper:U.Document,file:U,stack:[]}),{indent:$,declaration:{standalone:"yes",encoding:"UTF-8"}}),path:"docProps/custom.xml"},AppProperties:{data:F0(this.formatter.format(U.AppProperties,{viewWrapper:U.Document,file:U,stack:[]}),{indent:$,declaration:{standalone:"yes",encoding:"UTF-8"}}),path:"docProps/app.xml"},FootNotes:{data:(()=>{let W=this.imageReplacer.replace(Q,R,w);return this.numberingReplacer.replace(W,U.Numbering.ConcreteNumbering)})(),path:"word/footnotes.xml"},FootNotesRelationships:{data:(()=>{return R.forEach((W,E)=>{U.FootNotes.Relationships.addRelationship(w+E,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",`media/${W.fileName}`)}),F0(this.formatter.format(U.FootNotes.Relationships,{viewWrapper:U.FootNotes,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}})})(),path:"word/_rels/footnotes.xml.rels"},Endnotes:{data:F0(this.formatter.format(U.Endnotes.View,{viewWrapper:U.Endnotes,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}}),path:"word/endnotes.xml"},EndnotesRelationships:{data:F0(this.formatter.format(U.Endnotes.Relationships,{viewWrapper:U.Endnotes,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}}),path:"word/_rels/endnotes.xml.rels"},Settings:{data:F0(this.formatter.format(U.Settings,{viewWrapper:U.Document,file:U,stack:[]}),{indent:$,declaration:{standalone:"yes",encoding:"UTF-8"}}),path:"word/settings.xml"},Comments:{data:(()=>{let W=this.imageReplacer.replace(G,z,J);return this.numberingReplacer.replace(W,U.Numbering.ConcreteNumbering)})(),path:"word/comments.xml"},CommentsRelationships:{data:(()=>{return z.forEach((W,E)=>{U.Comments.Relationships.addRelationship(J+E,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",`media/${W.fileName}`)}),F0(this.formatter.format(U.Comments.Relationships,{viewWrapper:{View:U.Comments,Relationships:U.Comments.Relationships},file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}})})(),path:"word/_rels/comments.xml.rels"},FontTable:{data:F0(this.formatter.format(U.FontTable.View,{viewWrapper:U.Document,file:U,stack:[]}),{indent:$,declaration:{standalone:"yes",encoding:"UTF-8"}}),path:"word/fontTable.xml"},FontTableRelationships:{data:(()=>F0(this.formatter.format(U.FontTable.Relationships,{viewWrapper:U.Document,file:U,stack:[]}),{indent:$,declaration:{encoding:"UTF-8"}}))(),path:"word/_rels/fontTable.xml.rels"}}}}var B7={NONE:"",WITH_2_BLANKS:" ",WITH_4_BLANKS:" ",WITH_TAB:"\t"},mZ=(U)=>U===!0?B7.WITH_2_BLANKS:U===!1?void 0:U,q7=class U{static pack($,Y,Z){return b9(this,arguments,function*(J,G,w,Q=[]){return this.compiler.compile(J,mZ(w),Q).generateAsync({type:G,mimeType:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",compression:"DEFLATE"})})}static toString($,Y,Z=[]){return U.pack($,"string",Y,Z)}static toBuffer($,Y,Z=[]){return U.pack($,"nodebuffer",Y,Z)}static toBase64String($,Y,Z=[]){return U.pack($,"base64",Y,Z)}static toBlob($,Y,Z=[]){return U.pack($,"blob",Y,Z)}static toArrayBuffer($,Y,Z=[]){return U.pack($,"arraybuffer",Y,Z)}static toStream($,Y,Z=[]){let J=new rq.Stream;return this.compiler.compile($,mZ(Y),Z).generateAsync({type:"nodebuffer",mimeType:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",compression:"DEFLATE"}).then((w)=>{J.emit("data",w),J.emit("end")}),J}};Y0(q7,"compiler",new w7);var YX=q7,ZX=new H6,j6=(U)=>{return U6.xml2js(U,{compact:!1,captureSpacesBetweenElements:!0})},X7=(U)=>{var $;return($=j6(F0(ZX.format(new a1({text:U})))).elements[0].elements)!=null?$:[]},I7=(U)=>R0(W0({},U),{attributes:{"xml:space":"preserve"}}),z$=(U,$)=>{var Y,Z;return(Z=(Y=U.elements)==null?void 0:Y.filter((J)=>J.name===$)[0].elements)!=null?Z:[]},h1=(U,$,Y)=>{let Z=z$(U,"Types");if(Z.some((G)=>{var w,Q;return G.type==="element"&&G.name==="Default"&&((w=G==null?void 0:G.attributes)==null?void 0:w.ContentType)===$&&((Q=G==null?void 0:G.attributes)==null?void 0:Q.Extension)===Y}))return;Z.push({attributes:{ContentType:$,Extension:Y},name:"Default",type:"element"})},QX=(U)=>{let $=parseInt(U.substring(3),10);return isNaN($)?0:$},JX=(U)=>{return z$(U,"Relationships").map((Y)=>{var Z,J,G;return QX((G=(J=(Z=Y.attributes)==null?void 0:Z.Id)==null?void 0:J.toString())!=null?G:"")}).reduce((Y,Z)=>Math.max(Y,Z),0)+1},lZ=(U,$,Y,Z,J)=>{let G=z$(U,"Relationships");return G.push({attributes:{Id:`rId${$}`,Type:Y,Target:Z,TargetMode:J},name:"Relationship",type:"element"}),G};class L7 extends Error{constructor(U){super(`Token ${U} not found`);this.name="TokenNotFoundError"}}var GX=(U,$)=>{var Y,Z,J,G;for(let w=0;w<((Y=U.elements)!=null?Y:[]).length;w++){let Q=U.elements[w];if(Q.type==="element"&&Q.name==="w:r"){let q=((Z=Q.elements)!=null?Z:[]).filter((z)=>z.type==="element"&&z.name==="w:t");for(let z of q){if(!((J=z.elements)==null?void 0:J[0]))continue;if((G=z.elements[0].text)==null?void 0:G.includes($))return w}}}throw new L7($)},KX=(U,$)=>{var Y,Z;let J=-1,G=(Z=(Y=U.elements)==null?void 0:Y.map((q,z)=>{var R,W,E;if(J!==-1)return q;if(q.type==="element"&&q.name==="w:t"){let C=((E=(W=(R=q.elements)==null?void 0:R[0])==null?void 0:W.text)!=null?E:"").split($),H=C.map((O)=>R0(W0(W0({},q),I7(q)),{elements:X7(O)}));if(C.length>1)J=z;return H}else return q}).flat())!=null?Z:[],w=R0(W0({},JSON.parse(JSON.stringify(U))),{elements:G.slice(0,J+1)}),Q=R0(W0({},JSON.parse(JSON.stringify(U))),{elements:G.slice(J+1)});return{left:w,right:Q}},J2={START:0,MIDDLE:1,END:2},wX=({paragraphElement:U,renderedParagraph:$,originalText:Y,replacementText:Z})=>{let J=$.text.indexOf(Y),G=J+Y.length-1,w=J2.START;for(let Q of $.runs)for(let{text:q,index:z,start:R,end:W}of Q.parts)switch(w){case J2.START:if(J>=R&&J<=W){let E=J-R,D=Math.min(G,W)-R,C=Q.text.substring(E,D+1);if(C==="")continue;let H=q.replace(C,Z);H9(U.elements[Q.index].elements[z],H),w=J2.MIDDLE;continue}break;case J2.MIDDLE:if(G<=W){let E=q.substring(G-R+1);H9(U.elements[Q.index].elements[z],E);let D=U.elements[Q.index].elements[z];U.elements[Q.index].elements[z]=I7(D),w=J2.END}else H9(U.elements[Q.index].elements[z],"");break}return U},H9=(U,$)=>{return U.elements=X7($),U},BX=(U)=>{if(U.element.name!=="w:p")throw new Error(`Invalid node type: ${U.element.name}`);if(!U.element.elements)return{text:"",runs:[],index:-1,pathToParagraph:[]};let $=0,Y=U.element.elements.map((J,G)=>({element:J,i:G})).filter(({element:J})=>J.name==="w:r").map(({element:J,i:G})=>{let w=qX(J,G,$);return $+=w.text.length,w}).filter((J)=>!!J);return{text:Y.reduce((J,G)=>J+G.text,""),runs:Y,index:U.index,pathToParagraph:V7(U)}},qX=(U,$,Y)=>{if(!U.elements)return{text:"",parts:[],index:-1,start:Y,end:Y};let Z=Y,J=U.elements.map((w,Q)=>{var q,z;return w.name==="w:t"&&w.elements&&w.elements.length>0?{text:(z=(q=w.elements[0].text)==null?void 0:q.toString())!=null?z:"",index:Q,start:Z,end:(()=>{var R,W;return Z+=((W=(R=w.elements[0].text)==null?void 0:R.toString())!=null?W:"").length-1,Z})()}:void 0}).filter((w)=>!!w).map((w)=>w);return{text:J.reduce((w,Q)=>w+Q.text,""),parts:J,index:$,start:Y,end:Z}},V7=(U)=>U.parent?[...V7(U.parent),U.index]:[U.index],aZ=(U)=>{var $,Y;return(Y=($=U.element.elements)==null?void 0:$.map((Z,J)=>({element:Z,index:J,parent:U})))!=null?Y:[]},M7=(U)=>{let $=[],Y=[...aZ({element:U,index:0,parent:void 0})],Z;while(Y.length>0){if(Z=Y.shift(),Z.element.name==="w:p")$=[...$,BX(Z)];Y.push(...aZ(Z))}return $},XX=(U,$)=>M7(U).filter((Y)=>Y.text.includes($)),IX=new H6,j9="ɵ",LX=({json:U,patch:$,patchText:Y,context:Z,keepOriginalStyles:J=!0})=>{let G=XX(U,Y);if(G.length===0)return{element:U,didFindOccurrence:!1};for(let w of G){let Q=$.children.map((q)=>j6(F0(IX.format(q,Z)))).map((q)=>q.elements[0]);switch($.type){case y9.DOCUMENT:{let q=VX(U,w.pathToParagraph),z=MX(w.pathToParagraph);q.elements.splice(z,1,...Q);break}case y9.PARAGRAPH:default:{let q=W7(U,w.pathToParagraph);wX({paragraphElement:q,renderedParagraph:w,originalText:Y,replacementText:j9});let z=GX(q,j9),R=q.elements[z],{left:W,right:E}=KX(R,j9),D=Q,C=E;if(J){let H=R.elements.filter((O)=>O.type==="element"&&O.name==="w:rPr");D=Q.map((O)=>{var X;return R0(W0({},O),{elements:[...H,...(X=O.elements)!=null?X:[]]})}),C=R0(W0({},E),{elements:[...H,...E.elements]})}q.elements.splice(z,1,W,...D,C);break}}}return{element:U,didFindOccurrence:!0}},W7=(U,$)=>{let Y=U;for(let Z=1;Z<$.length;Z++){let J=$[Z];Y=Y.elements[J]}return Y},VX=(U,$)=>W7(U,$.slice(0,$.length-1)),MX=(U)=>U[U.length-1],y9={DOCUMENT:"file",PARAGRAPH:"paragraph"},pZ=new j$,WX=new Uint8Array([255,254]),HX=new Uint8Array([254,255]),iZ=(U,$)=>{if(U.length!==$.length)return!1;for(let Y=0;Yb9(null,[U],function*({outputType:$,data:Y,patches:Z,keepOriginalStyles:J,placeholderDelimiters:G={start:"{{",end:"}}"},recursive:w=!0}){var Q,q,z;let R=Y instanceof c1?Y:yield c1.loadAsync(Y),W=new Map,E={Media:new M6},D=new Map,C=[],H=[],O=!1,X=new Map;for(let[L,I]of Object.entries(R.files)){let A=yield I.async("uint8array"),y=A.slice(0,2);if(iZ(y,WX)||iZ(y,HX)){X.set(L,A);continue}if(!L.endsWith(".xml")&&!L.endsWith(".rels")){X.set(L,A);continue}let g=j6(yield I.async("text"));if(L==="word/document.xml"){let d=(Q=g.elements)==null?void 0:Q.find((k)=>k.name==="w:document");if(d&&d.attributes){for(let k of["mc","wp","r","w15","m"])d.attributes[`xmlns:${k}`]=p2[k];d.attributes["mc:Ignorable"]=`${d.attributes["mc:Ignorable"]||""} w15`.trim()}}if(L.startsWith("word/")&&!L.endsWith(".xml.rels")){let d={file:E,viewWrapper:{Relationships:{addRelationship:(S,h,F,a)=>{H.push({key:L,hyperlink:{id:S,link:F}})}}},stack:[]};if(W.set(L,d),!(G==null?void 0:G.start.trim())||!(G==null?void 0:G.end.trim()))throw new Error("Both start and end delimiters must be non-empty strings.");let{start:k,end:s}=G;for(let[S,h]of Object.entries(Z)){let F=`${k}${S}${s}`;while(!0){let{didFindOccurrence:a}=LX({json:g,patch:R0(W0({},h),{children:h.children.map((U0)=>{if(U0 instanceof K6){let m=new _1(U0.options.children,R2());return H.push({key:L,hyperlink:{id:m.linkId,link:U0.options.link}}),m}else return U0})}),patchText:F,context:d,keepOriginalStyles:J});if(!w||!a)break}}let q0=pZ.getMediaData(JSON.stringify(g),d.file.Media);if(q0.length>0)O=!0,C.push({key:L,mediaDatas:q0})}D.set(L,g)}for(let{key:L,mediaDatas:I}of C){let A=`word/_rels/${L.split("/").pop()}.rels`,y=(q=D.get(A))!=null?q:rZ();D.set(A,y);let g=JX(y),d=pZ.replace(JSON.stringify(D.get(L)),I,g);D.set(L,JSON.parse(d));for(let k=0;k{return U6.js2xml(U,{attributeValueFn:(Y)=>String(Y).replace(/&(?!amp;|lt;|gt;|quot;|apos;)/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")})},rZ=()=>({declaration:{attributes:{version:"1.0",encoding:"UTF-8",standalone:"yes"}},elements:[{type:"element",name:"Relationships",attributes:{xmlns:"http://schemas.openxmlformats.org/package/2006/relationships"},elements:[]}]}),FX=(U)=>b9(null,[U],function*({data:$}){let Y=$ instanceof c1?$:yield c1.loadAsync($),Z=new Set;for(let[J,G]of Object.entries(Y.files)){if(!J.endsWith(".xml")&&!J.endsWith(".rels"))continue;if(J.startsWith("word/")&&!J.endsWith(".xml.rels")){let w=j6(yield G.async("text"));M7(w).forEach((Q)=>NX(Q.text).forEach((q)=>Z.add(q)))}}return Array.from(Z)}),NX=(U)=>{var $;let Y=new RegExp("(?<=\\{\\{).+?(?=\\}\\})","gs");return($=U.match(Y))!=null?$:[]};if(typeof globalThis.Buffer==="undefined")globalThis.Buffer=G0;if(typeof globalThis.process==="undefined")globalThis.process=RX;globalThis.__bundles=globalThis.__bundles||{};globalThis.__bundles.docx=F$;})(); +Actual: `+P.attribValue);else{var v=P.tag,b=P.tags[P.tags.length-1]||P;if(v.ns===b.ns)v.ns=Object.create(b.ns);v.ns[f]=P.attribValue}P.attribList.push([P.attribName,P.attribValue])}else P.tag.attributes[P.attribName]=P.attribValue,S(P,"onattribute",{name:P.attribName,value:P.attribValue});P.attribName=P.attribValue=""}function i(P,R){if(P.opt.xmlns){var c=P.tag,f=U0(P.tagName);if(c.prefix=f.prefix,c.local=f.local,c.uri=c.ns[f.prefix]||"",c.prefix&&!c.uri)m(P,"Unbound namespace prefix: "+JSON.stringify(P.tagName)),c.uri=f.prefix;var v=P.tags[P.tags.length-1]||P;if(c.ns&&v.ns!==c.ns)Object.keys(c.ns).forEach(function(u){S(P,"onopennamespace",{prefix:u,uri:c.ns[u]})});for(var b=0,e=P.attribList.length;b",P.tagName="",P.state=E.SCRIPT;return}S(P,"onscript",P.script),P.script=""}var R=P.tags.length,c=P.tagName;if(!P.strict)c=c[P.looseCase]();var f=c;while(R--){var v=P.tags[R];if(v.name!==f)m(P,"Unexpected close tag");else break}if(R<0){m(P,"Unmatched closing tag: "+P.tagName),P.textNode+="",P.state=E.TEXT;return}P.tagName=c;var b=P.tags.length;while(b-- >R){var e=P.tag=P.tags.pop();P.tagName=P.tag.name,S(P,"onclosetag",P.tagName);var I={};for(var t in e.ns)I[t]=e.ns[t];var T=P.tags[P.tags.length-1]||P;if(P.opt.xmlns&&e.ns!==T.ns)Object.keys(e.ns).forEach(function(K){var q=e.ns[K];S(P,"onclosenamespace",{prefix:K,uri:q})})}if(R===0)P.closedRoot=!0;P.tagName=P.attribValue=P.attribName="",P.attribList.length=0,P.state=E.TEXT}function r(P){var R=P.entity,c=R.toLowerCase(),f,v="";if(P.ENTITIES[R])return P.ENTITIES[R];if(P.ENTITIES[c])return P.ENTITIES[c];if(R=c,R.charAt(0)==="#")if(R.charAt(1)==="x")R=R.slice(2),f=parseInt(R,16),v=f.toString(16);else R=R.slice(1),f=parseInt(R,10),v=f.toString(10);if(R=R.replace(/^0+/,""),isNaN(f)||v.toLowerCase()!==R)return m(P,"Invalid character entity"),"&"+P.entity+";";return String.fromCodePoint(f)}function n(P,R){if(R==="<")P.state=E.OPEN_WAKA,P.startTagPosition=P.position;else if(!L(R))m(P,"Non-whitespace before first tag."),P.textNode=R,P.state=E.TEXT}function Z0(P,R){var c="";if(R")S(R,"onsgmldeclaration",R.sgmlDecl),R.sgmlDecl="",R.state=E.TEXT;else if(A(f))R.state=E.SGML_DECL_QUOTED,R.sgmlDecl+=f;else R.sgmlDecl+=f;continue;case E.SGML_DECL_QUOTED:if(f===R.q)R.state=E.SGML_DECL,R.q="";R.sgmlDecl+=f;continue;case E.DOCTYPE:if(f===">")R.state=E.TEXT,S(R,"ondoctype",R.doctype),R.doctype=!0;else if(R.doctype+=f,f==="[")R.state=E.DOCTYPE_DTD;else if(A(f))R.state=E.DOCTYPE_QUOTED,R.q=f;continue;case E.DOCTYPE_QUOTED:if(R.doctype+=f,f===R.q)R.q="",R.state=E.DOCTYPE;continue;case E.DOCTYPE_DTD:if(R.doctype+=f,f==="]")R.state=E.DOCTYPE;else if(A(f))R.state=E.DOCTYPE_DTD_QUOTED,R.q=f;continue;case E.DOCTYPE_DTD_QUOTED:if(R.doctype+=f,f===R.q)R.state=E.DOCTYPE_DTD,R.q="";continue;case E.COMMENT:if(f==="-")R.state=E.COMMENT_ENDING;else R.comment+=f;continue;case E.COMMENT_ENDING:if(f==="-"){if(R.state=E.COMMENT_ENDED,R.comment=N(R.opt,R.comment),R.comment)S(R,"oncomment",R.comment);R.comment=""}else R.comment+="-"+f,R.state=E.COMMENT;continue;case E.COMMENT_ENDED:if(f!==">")m(R,"Malformed comment"),R.comment+="--"+f,R.state=E.COMMENT;else R.state=E.TEXT;continue;case E.CDATA:if(f==="]")R.state=E.CDATA_ENDING;else R.cdata+=f;continue;case E.CDATA_ENDING:if(f==="]")R.state=E.CDATA_ENDING_2;else R.cdata+="]"+f,R.state=E.CDATA;continue;case E.CDATA_ENDING_2:if(f===">"){if(R.cdata)S(R,"oncdata",R.cdata);S(R,"onclosecdata"),R.cdata="",R.state=E.TEXT}else if(f==="]")R.cdata+="]";else R.cdata+="]]"+f,R.state=E.CDATA;continue;case E.PROC_INST:if(f==="?")R.state=E.PROC_INST_ENDING;else if(L(f))R.state=E.PROC_INST_BODY;else R.procInstName+=f;continue;case E.PROC_INST_BODY:if(!R.procInstBody&&L(f))continue;else if(f==="?")R.state=E.PROC_INST_ENDING;else R.procInstBody+=f;continue;case E.PROC_INST_ENDING:if(f===">")S(R,"onprocessinginstruction",{name:R.procInstName,body:R.procInstBody}),R.procInstName=R.procInstBody="",R.state=E.TEXT;else R.procInstBody+="?"+f,R.state=E.PROC_INST_BODY;continue;case E.OPEN_TAG:if(g(V,f))R.tagName+=f;else if(J0(R),f===">")i(R);else if(f==="/")R.state=E.OPEN_TAG_SLASH;else{if(!L(f))m(R,"Invalid character in tag name");R.state=E.ATTRIB}continue;case E.OPEN_TAG_SLASH:if(f===">")i(R,!0),_(R);else m(R,"Forward-slash in opening tag not followed by >"),R.state=E.ATTRIB;continue;case E.ATTRIB:if(L(f))continue;else if(f===">")i(R);else if(f==="/")R.state=E.OPEN_TAG_SLASH;else if(g(O,f))R.attribName=f,R.attribValue="",R.state=E.ATTRIB_NAME;else m(R,"Invalid attribute name");continue;case E.ATTRIB_NAME:if(f==="=")R.state=E.ATTRIB_VALUE;else if(f===">")m(R,"Attribute without value"),R.attribValue=R.attribName,L0(R),i(R);else if(L(f))R.state=E.ATTRIB_NAME_SAW_WHITE;else if(g(V,f))R.attribName+=f;else m(R,"Invalid attribute name");continue;case E.ATTRIB_NAME_SAW_WHITE:if(f==="=")R.state=E.ATTRIB_VALUE;else if(L(f))continue;else if(m(R,"Attribute without value"),R.tag.attributes[R.attribName]="",R.attribValue="",S(R,"onattribute",{name:R.attribName,value:""}),R.attribName="",f===">")i(R);else if(g(O,f))R.attribName=f,R.state=E.ATTRIB_NAME;else m(R,"Invalid attribute name"),R.state=E.ATTRIB;continue;case E.ATTRIB_VALUE:if(L(f))continue;else if(A(f))R.q=f,R.state=E.ATTRIB_VALUE_QUOTED;else m(R,"Unquoted attribute value"),R.state=E.ATTRIB_VALUE_UNQUOTED,R.attribValue=f;continue;case E.ATTRIB_VALUE_QUOTED:if(f!==R.q){if(f==="&")R.state=E.ATTRIB_VALUE_ENTITY_Q;else R.attribValue+=f;continue}L0(R),R.q="",R.state=E.ATTRIB_VALUE_CLOSED;continue;case E.ATTRIB_VALUE_CLOSED:if(L(f))R.state=E.ATTRIB;else if(f===">")i(R);else if(f==="/")R.state=E.OPEN_TAG_SLASH;else if(g(O,f))m(R,"No whitespace between attributes"),R.attribName=f,R.attribValue="",R.state=E.ATTRIB_NAME;else m(R,"Invalid attribute name");continue;case E.ATTRIB_VALUE_UNQUOTED:if(!y(f)){if(f==="&")R.state=E.ATTRIB_VALUE_ENTITY_U;else R.attribValue+=f;continue}if(L0(R),f===">")i(R);else R.state=E.ATTRIB;continue;case E.CLOSE_TAG:if(!R.tagName)if(L(f))continue;else if(d(O,f))if(R.script)R.script+="")_(R);else if(g(V,f))R.tagName+=f;else if(R.script)R.script+="")_(R);else m(R,"Invalid characters in closing tag");continue;case E.TEXT_ENTITY:case E.ATTRIB_VALUE_ENTITY_Q:case E.ATTRIB_VALUE_ENTITY_U:var e,I;switch(R.state){case E.TEXT_ENTITY:e=E.TEXT,I="textNode";break;case E.ATTRIB_VALUE_ENTITY_Q:e=E.ATTRIB_VALUE_QUOTED,I="attribValue";break;case E.ATTRIB_VALUE_ENTITY_U:e=E.ATTRIB_VALUE_UNQUOTED,I="attribValue";break}if(f===";")R[I]+=r(R),R.entity="",R.state=e;else if(g(R.entity.length?M:j,f))R.entity+=f;else m(R,"Invalid character in entity name"),R[I]+="&"+R.entity+f,R.entity="",R.state=e;continue;default:throw Error(R,"Unknown state: "+R.state)}}if(R.position>=R.bufferCheckPosition)J(R);return R}if(!String.fromCodePoint)(function(){var P=String.fromCharCode,R=Math.floor,c=function(){var f=16384,v=[],b,e,I=-1,t=arguments.length;if(!t)return"";var T="";while(++I1114111||R(K)!==K)throw RangeError("Invalid code point: "+K);if(K<=65535)v.push(K);else K-=65536,b=(K>>10)+55296,e=K%1024+56320,v.push(b,e);if(I+1===t||v.length>f)T+=P.apply(null,v),v.length=0}return T};if(Object.defineProperty)Object.defineProperty(String,"fromCodePoint",{value:c,configurable:!0,writable:!0});else String.fromCodePoint=c})()})($)}(_8),_8}var n6,WZ;function l9(){if(WZ)return n6;return WZ=1,n6={isArray:function($){if(Array.isArray)return Array.isArray($);return Object.prototype.toString.call($)==="[object Array]"}},n6}var o6,HZ;function a9(){if(HZ)return o6;HZ=1;var $=l9().isArray;return o6={copyOptions:function(U){var Y,Z={};for(Y in U)if(U.hasOwnProperty(Y))Z[Y]=U[Y];return Z},ensureFlagExists:function(U,Y){if(!(U in Y)||typeof Y[U]!=="boolean")Y[U]=!1},ensureSpacesExists:function(U){if(!("spaces"in U)||typeof U.spaces!=="number"&&typeof U.spaces!=="string")U.spaces=0},ensureAlwaysArrayExists:function(U){if(!("alwaysArray"in U)||typeof U.alwaysArray!=="boolean"&&!$(U.alwaysArray))U.alwaysArray=!1},ensureKeyExists:function(U,Y){if(!(U+"Key"in Y)||typeof Y[U+"Key"]!=="string")Y[U+"Key"]=Y.compact?"_"+U:U},checkFnExists:function(U,Y){return U+"Fn"in Y}},o6}var t6,jZ;function FQ(){if(jZ)return t6;jZ=1;var $=GX(),U=a9(),Y=l9().isArray,Z,J;function G(V){return Z=U.copyOptions(V),U.ensureFlagExists("ignoreDeclaration",Z),U.ensureFlagExists("ignoreInstruction",Z),U.ensureFlagExists("ignoreAttributes",Z),U.ensureFlagExists("ignoreText",Z),U.ensureFlagExists("ignoreComment",Z),U.ensureFlagExists("ignoreCdata",Z),U.ensureFlagExists("ignoreDoctype",Z),U.ensureFlagExists("compact",Z),U.ensureFlagExists("alwaysChildren",Z),U.ensureFlagExists("addParent",Z),U.ensureFlagExists("trim",Z),U.ensureFlagExists("nativeType",Z),U.ensureFlagExists("nativeTypeAttributes",Z),U.ensureFlagExists("sanitize",Z),U.ensureFlagExists("instructionHasAttributes",Z),U.ensureFlagExists("captureSpacesBetweenElements",Z),U.ensureAlwaysArrayExists(Z),U.ensureKeyExists("declaration",Z),U.ensureKeyExists("instruction",Z),U.ensureKeyExists("attributes",Z),U.ensureKeyExists("text",Z),U.ensureKeyExists("comment",Z),U.ensureKeyExists("cdata",Z),U.ensureKeyExists("doctype",Z),U.ensureKeyExists("type",Z),U.ensureKeyExists("name",Z),U.ensureKeyExists("elements",Z),U.ensureKeyExists("parent",Z),U.checkFnExists("doctype",Z),U.checkFnExists("instruction",Z),U.checkFnExists("cdata",Z),U.checkFnExists("comment",Z),U.checkFnExists("text",Z),U.checkFnExists("instructionName",Z),U.checkFnExists("elementName",Z),U.checkFnExists("attributeName",Z),U.checkFnExists("attributeValue",Z),U.checkFnExists("attributes",Z),Z}function X(V){var j=Number(V);if(!isNaN(j))return j;var M=V.toLowerCase();if(M==="true")return!0;else if(M==="false")return!1;return V}function Q(V,j){var M;if(Z.compact){if(!J[Z[V+"Key"]]&&(Y(Z.alwaysArray)?Z.alwaysArray.indexOf(Z[V+"Key"])!==-1:Z.alwaysArray))J[Z[V+"Key"]]=[];if(J[Z[V+"Key"]]&&!Y(J[Z[V+"Key"]]))J[Z[V+"Key"]]=[J[Z[V+"Key"]]];if(V+"Fn"in Z&&typeof j==="string")j=Z[V+"Fn"](j,J);if(V==="instruction"&&(("instructionFn"in Z)||("instructionNameFn"in Z))){for(M in j)if(j.hasOwnProperty(M))if("instructionFn"in Z)j[M]=Z.instructionFn(j[M],M,J);else{var L=j[M];delete j[M],j[Z.instructionNameFn(M,L,J)]=L}}if(Y(J[Z[V+"Key"]]))J[Z[V+"Key"]].push(j);else J[Z[V+"Key"]]=j}else{if(!J[Z.elementsKey])J[Z.elementsKey]=[];var A={};if(A[Z.typeKey]=V,V==="instruction"){for(M in j)if(j.hasOwnProperty(M))break;if(A[Z.nameKey]="instructionNameFn"in Z?Z.instructionNameFn(M,j,J):M,Z.instructionHasAttributes){if(A[Z.attributesKey]=j[M][Z.attributesKey],"instructionFn"in Z)A[Z.attributesKey]=Z.instructionFn(A[Z.attributesKey],M,J)}else{if("instructionFn"in Z)j[M]=Z.instructionFn(j[M],M,J);A[Z.instructionKey]=j[M]}}else{if(V+"Fn"in Z)j=Z[V+"Fn"](j,J);A[Z[V+"Key"]]=j}if(Z.addParent)A[Z.parentKey]=J;J[Z.elementsKey].push(A)}}function B(V){if("attributesFn"in Z&&V)V=Z.attributesFn(V,J);if((Z.trim||("attributeValueFn"in Z)||("attributeNameFn"in Z)||Z.nativeTypeAttributes)&&V){var j;for(j in V)if(V.hasOwnProperty(j)){if(Z.trim)V[j]=V[j].trim();if(Z.nativeTypeAttributes)V[j]=X(V[j]);if("attributeValueFn"in Z)V[j]=Z.attributeValueFn(V[j],j,J);if("attributeNameFn"in Z){var M=V[j];delete V[j],V[Z.attributeNameFn(j,V[j],J)]=M}}}return V}function F(V){var j={};if(V.body&&(V.name.toLowerCase()==="xml"||Z.instructionHasAttributes)){var M=/([\w:-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|(\w+))\s*/g,L;while((L=M.exec(V.body))!==null)j[L[1]]=L[2]||L[3]||L[4];j=B(j)}if(V.name.toLowerCase()==="xml"){if(Z.ignoreDeclaration)return;if(J[Z.declarationKey]={},Object.keys(j).length)J[Z.declarationKey][Z.attributesKey]=j;if(Z.addParent)J[Z.declarationKey][Z.parentKey]=J}else{if(Z.ignoreInstruction)return;if(Z.trim)V.body=V.body.trim();var A={};if(Z.instructionHasAttributes&&Object.keys(j).length)A[V.name]={},A[V.name][Z.attributesKey]=j;else A[V.name]=V.body;Q("instruction",A)}}function z(V,j){var M;if(typeof V==="object")j=V.attributes,V=V.name;if(j=B(j),"elementNameFn"in Z)V=Z.elementNameFn(V,J);if(Z.compact){if(M={},!Z.ignoreAttributes&&j&&Object.keys(j).length){M[Z.attributesKey]={};var L;for(L in j)if(j.hasOwnProperty(L))M[Z.attributesKey][L]=j[L]}if(!(V in J)&&(Y(Z.alwaysArray)?Z.alwaysArray.indexOf(V)!==-1:Z.alwaysArray))J[V]=[];if(J[V]&&!Y(J[V]))J[V]=[J[V]];if(Y(J[V]))J[V].push(M);else J[V]=M}else{if(!J[Z.elementsKey])J[Z.elementsKey]=[];if(M={},M[Z.typeKey]="element",M[Z.nameKey]=V,!Z.ignoreAttributes&&j&&Object.keys(j).length)M[Z.attributesKey]=j;if(Z.alwaysChildren)M[Z.elementsKey]=[];J[Z.elementsKey].push(M)}M[Z.parentKey]=J,J=M}function W(V){if(Z.ignoreText)return;if(!V.trim()&&!Z.captureSpacesBetweenElements)return;if(Z.trim)V=V.trim();if(Z.nativeType)V=X(V);if(Z.sanitize)V=V.replace(/&/g,"&").replace(//g,">");Q("text",V)}function k(V){if(Z.ignoreComment)return;if(Z.trim)V=V.trim();Q("comment",V)}function D(V){var j=J[Z.parentKey];if(!Z.addParent)delete J[Z.parentKey];J=j}function C(V){if(Z.ignoreCdata)return;if(Z.trim)V=V.trim();Q("cdata",V)}function H(V){if(Z.ignoreDoctype)return;if(V=V.replace(/^ /,""),Z.trim)V=V.trim();Q("doctype",V)}function O(V){V.note=V}return t6=function(V,j){var M=$.parser(!0,{}),L={};if(J=L,Z=G(j),M.opt={strictEntities:!0},M.onopentag=z,M.ontext=W,M.oncomment=k,M.onclosetag=D,M.onerror=O,M.oncdata=C,M.ondoctype=H,M.onprocessinginstruction=F,M.write(V).close(),L[Z.elementsKey]){var A=L[Z.elementsKey];delete L[Z.elementsKey],L[Z.elementsKey]=A,delete L.text}return L},t6}var e6,zZ;function KX(){if(zZ)return e6;zZ=1;var $=a9(),U=FQ();function Y(Z){var J=$.copyOptions(Z);return $.ensureSpacesExists(J),J}return e6=function(Z,J){var G,X,Q,B;if(G=Y(J),X=U(Z,G),B="compact"in G&&G.compact?"_parent":"parent","addParent"in G&&G.addParent)Q=JSON.stringify(X,function(F,z){return F===B?"_":z},G.spaces);else Q=JSON.stringify(X,null,G.spaces);return Q.replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")},e6}var $9,FZ;function NQ(){if(FZ)return $9;FZ=1;var $=a9(),U=l9().isArray,Y,Z;function J(M){var L=$.copyOptions(M);if($.ensureFlagExists("ignoreDeclaration",L),$.ensureFlagExists("ignoreInstruction",L),$.ensureFlagExists("ignoreAttributes",L),$.ensureFlagExists("ignoreText",L),$.ensureFlagExists("ignoreComment",L),$.ensureFlagExists("ignoreCdata",L),$.ensureFlagExists("ignoreDoctype",L),$.ensureFlagExists("compact",L),$.ensureFlagExists("indentText",L),$.ensureFlagExists("indentCdata",L),$.ensureFlagExists("indentAttributes",L),$.ensureFlagExists("indentInstruction",L),$.ensureFlagExists("fullTagEmptyElement",L),$.ensureFlagExists("noQuotesForNativeAttributes",L),$.ensureSpacesExists(L),typeof L.spaces==="number")L.spaces=Array(L.spaces+1).join(" ");return $.ensureKeyExists("declaration",L),$.ensureKeyExists("instruction",L),$.ensureKeyExists("attributes",L),$.ensureKeyExists("text",L),$.ensureKeyExists("comment",L),$.ensureKeyExists("cdata",L),$.ensureKeyExists("doctype",L),$.ensureKeyExists("type",L),$.ensureKeyExists("name",L),$.ensureKeyExists("elements",L),$.checkFnExists("doctype",L),$.checkFnExists("instruction",L),$.checkFnExists("cdata",L),$.checkFnExists("comment",L),$.checkFnExists("text",L),$.checkFnExists("instructionName",L),$.checkFnExists("elementName",L),$.checkFnExists("attributeName",L),$.checkFnExists("attributeValue",L),$.checkFnExists("attributes",L),$.checkFnExists("fullTagEmptyElement",L),L}function G(M,L,A){return(!A&&M.spaces?` +`:"")+Array(L+1).join(M.spaces)}function X(M,L,A){if(L.ignoreAttributes)return"";if("attributesFn"in L)M=L.attributesFn(M,Z,Y);var y,g,d,E,s=[];for(y in M)if(M.hasOwnProperty(y)&&M[y]!==null&&M[y]!==void 0)E=L.noQuotesForNativeAttributes&&typeof M[y]!=="string"?"":'"',g=""+M[y],g=g.replace(/"/g,"""),d="attributeNameFn"in L?L.attributeNameFn(y,g,Z,Y):y,s.push(L.spaces&&L.indentAttributes?G(L,A+1,!1):" "),s.push(d+"="+E+("attributeValueFn"in L?L.attributeValueFn(g,y,Z,Y):g)+E);if(M&&Object.keys(M).length&&L.spaces&&L.indentAttributes)s.push(G(L,A,!1));return s.join("")}function Q(M,L,A){return Y=M,Z="xml",L.ignoreDeclaration?"":""}function B(M,L,A){if(L.ignoreInstruction)return"";var y;for(y in M)if(M.hasOwnProperty(y))break;var g="instructionNameFn"in L?L.instructionNameFn(y,M[y],Z,Y):y;if(typeof M[y]==="object")return Y=M,Z=g,"";else{var d=M[y]?M[y]:"";if("instructionFn"in L)d=L.instructionFn(d,y,Z,Y);return""}}function F(M,L){return L.ignoreComment?"":""}function z(M,L){return L.ignoreCdata?"":"","]]]]>"))+"]]>"}function W(M,L){return L.ignoreDoctype?"":""}function k(M,L){if(L.ignoreText)return"";return M=""+M,M=M.replace(/&/g,"&"),M=M.replace(/&/g,"&").replace(//g,">"),"textFn"in L?L.textFn(M,Z,Y):M}function D(M,L){var A;if(M.elements&&M.elements.length)for(A=0;A"),M[L.elementsKey]&&M[L.elementsKey].length)y.push(H(M[L.elementsKey],L,A+1)),Y=M,Z=M.name;y.push(L.spaces&&D(M,L)?` +`+Array(A+1).join(L.spaces):""),y.push("")}else y.push("/>");return y.join("")}function H(M,L,A,y){return M.reduce(function(g,d){var E=G(L,A,y&&!g);switch(d.type){case"element":return g+E+C(d,L,A);case"comment":return g+E+F(d[L.commentKey],L);case"doctype":return g+E+W(d[L.doctypeKey],L);case"cdata":return g+(L.indentCdata?E:"")+z(d[L.cdataKey],L);case"text":return g+(L.indentText?E:"")+k(d[L.textKey],L);case"instruction":var s={};return s[d[L.nameKey]]=d[L.attributesKey]?d:d[L.instructionKey],g+(L.indentInstruction?E:"")+B(s,L,A)}},"")}function O(M,L,A){var y;for(y in M)if(M.hasOwnProperty(y))switch(y){case L.parentKey:case L.attributesKey:break;case L.textKey:if(L.indentText||A)return!0;break;case L.cdataKey:if(L.indentCdata||A)return!0;break;case L.instructionKey:if(L.indentInstruction||A)return!0;break;case L.doctypeKey:case L.commentKey:return!0;default:return!0}return!1}function V(M,L,A,y,g){Y=M,Z=L;var d="elementNameFn"in A?A.elementNameFn(L,M):L;if(typeof M>"u"||M===null||M==="")return"fullTagEmptyElementFn"in A&&A.fullTagEmptyElementFn(L,M)||A.fullTagEmptyElement?"<"+d+">":"<"+d+"/>";var E=[];if(L){if(E.push("<"+d),typeof M!=="object")return E.push(">"+k(M,A)+""),E.join("");if(M[A.attributesKey])E.push(X(M[A.attributesKey],A,y));var s=O(M,A,!0)||M[A.attributesKey]&&M[A.attributesKey]["xml:space"]==="preserve";if(!s)if("fullTagEmptyElementFn"in A)s=A.fullTagEmptyElementFn(L,M);else s=A.fullTagEmptyElement;if(s)E.push(">");else return E.push("/>"),E.join("")}if(E.push(j(M,A,y+1,!1)),Y=M,Z=L,L)E.push((g?G(A,y,!1):"")+"");return E.join("")}function j(M,L,A,y){var g,d,E,s=[];for(d in M)if(M.hasOwnProperty(d)){E=U(M[d])?M[d]:[M[d]];for(g=0;g{switch($.type){case void 0:case"element":let U=new p9($.name,$.attributes),Y=$.elements||[];for(let Z of Y){let J=U8(Z);if(J!==void 0)U.push(J)}return U;case"text":return $.text;default:return}};class RQ extends I0{}class p9 extends o{static fromXmlString($){let U=$8.xml2js($,{compact:!1});return U8(U)}constructor($,U){super($);if(U)this.root.push(new RQ(U))}push($){this.root.push($)}}class i9 extends o{constructor($){super("");this._attr=$}prepForXml($){return{_attr:this._attr}}}var VX="";class Y8 extends o{constructor($,U){super($);if(U)this.root=U.root}}var S0=($)=>{if(isNaN($))throw Error(`Invalid value '${$}' specified. Must be an integer.`);return Math.floor($)},W1=($)=>{let U=S0($);if(U<0)throw Error(`Invalid value '${$}' specified. Must be a positive integer.`);return U},Z8=($,U)=>{let Y=U*2;if($.length!==Y||isNaN(Number(`0x${$}`)))throw Error(`Invalid hex value '${$}'. Expected ${Y} digit hex value`);return $},BX=($)=>Z8($,4),DQ=($)=>Z8($,2),D9=($)=>Z8($,1),H1=($)=>{let U=$.slice(-2),Y=$.substring(0,$.length-2);return`${Number(Y)}${U}`},r9=($)=>{let U=H1($);if(parseFloat(U)<0)throw Error(`Invalid value '${U}' specified. Expected a positive number.`);return U},S2=($)=>{if($==="auto")return $;let U=$.charAt(0)==="#"?$.substring(1):$;return Z8(U,3)},e0=($)=>typeof $==="string"?H1($):S0($),AQ=($)=>typeof $==="string"?r9($):W1($),LX=($)=>typeof $==="string"?H1($):S0($),T0=($)=>typeof $==="string"?r9($):W1($),PQ=($)=>{let U=$.substring(0,$.length-1);return`${Number(U)}%`},s9=($)=>{if(typeof $==="number")return S0($);if($.slice(-1)==="%")return PQ($);return H1($)},TQ=W1,CQ=W1,OQ=($)=>$.toISOString();class X0 extends o{constructor($,U=!0){super($);if(U!==!0)this.root.push(new O0({val:U}))}}class q1 extends o{constructor($,U){super($);this.root.push(new O0({val:AQ(U)}))}}class k0 extends o{}class Y2 extends o{constructor($,U){super($);this.root.push(new O0({val:U}))}}var u2=($,U)=>new B0({name:$,attributes:{value:{key:"w:val",value:U}}});class k2 extends o{constructor($,U){super($);this.root.push(new O0({val:U}))}}class kQ extends o{constructor($,U){super($);this.root.push(new O0({val:U}))}}class L2 extends o{constructor($,U){super($);this.root.push(U)}}class B0 extends o{constructor({name:$,attributes:U,children:Y}){super($);if(U)this.root.push(new n1(U));if(Y)this.root.push(...Y)}}var m0={START:"start",CENTER:"center",END:"end",BOTH:"both",MEDIUM_KASHIDA:"mediumKashida",DISTRIBUTE:"distribute",NUM_TAB:"numTab",HIGH_KASHIDA:"highKashida",LOW_KASHIDA:"lowKashida",THAI_DISTRIBUTE:"thaiDistribute",LEFT:"left",RIGHT:"right",JUSTIFIED:"both"},n9=($)=>new B0({name:"w:jc",attributes:{val:{key:"w:val",value:$}}}),N0=($,{color:U,size:Y,space:Z,style:J})=>new B0({name:$,attributes:{style:{key:"w:val",value:J},color:{key:"w:color",value:U===void 0?void 0:S2(U)},size:{key:"w:sz",value:Y===void 0?void 0:TQ(Y)},space:{key:"w:space",value:Z===void 0?void 0:CQ(Z)}}}),Q8={SINGLE:"single",DASH_DOT_STROKED:"dashDotStroked",DASHED:"dashed",DASH_SMALL_GAP:"dashSmallGap",DOT_DASH:"dotDash",DOT_DOT_DASH:"dotDotDash",DOTTED:"dotted",DOUBLE:"double",DOUBLE_WAVE:"doubleWave",INSET:"inset",NIL:"nil",NONE:"none",OUTSET:"outset",THICK:"thick",THICK_THIN_LARGE_GAP:"thickThinLargeGap",THICK_THIN_MEDIUM_GAP:"thickThinMediumGap",THICK_THIN_SMALL_GAP:"thickThinSmallGap",THIN_THICK_LARGE_GAP:"thinThickLargeGap",THIN_THICK_MEDIUM_GAP:"thinThickMediumGap",THIN_THICK_SMALL_GAP:"thinThickSmallGap",THIN_THICK_THIN_LARGE_GAP:"thinThickThinLargeGap",THIN_THICK_THIN_MEDIUM_GAP:"thinThickThinMediumGap",THIN_THICK_THIN_SMALL_GAP:"thinThickThinSmallGap",THREE_D_EMBOSS:"threeDEmboss",THREE_D_ENGRAVE:"threeDEngrave",TRIPLE:"triple",WAVE:"wave"};class o9 extends Q2{constructor($){super("w:pBdr");if($.top)this.root.push(N0("w:top",$.top));if($.bottom)this.root.push(N0("w:bottom",$.bottom));if($.left)this.root.push(N0("w:left",$.left));if($.right)this.root.push(N0("w:right",$.right));if($.between)this.root.push(N0("w:between",$.between))}}class t9 extends o{constructor(){super("w:pBdr");let $=N0("w:bottom",{color:"auto",space:1,style:Q8.SINGLE,size:6});this.root.push($)}}var EQ=({start:$,end:U,left:Y,right:Z,hanging:J,firstLine:G})=>new B0({name:"w:ind",attributes:{start:{key:"w:start",value:$===void 0?void 0:e0($)},end:{key:"w:end",value:U===void 0?void 0:e0(U)},left:{key:"w:left",value:Y===void 0?void 0:e0(Y)},right:{key:"w:right",value:Z===void 0?void 0:e0(Z)},hanging:{key:"w:hanging",value:J===void 0?void 0:T0(J)},firstLine:{key:"w:firstLine",value:G===void 0?void 0:T0(G)}}}),SQ=()=>new B0({name:"w:br"}),e9={BEGIN:"begin",END:"end",SEPARATE:"separate"},$$=($,U)=>new B0({name:"w:fldChar",attributes:{type:{key:"w:fldCharType",value:$},dirty:{key:"w:dirty",value:U}}}),$2=($)=>$$(e9.BEGIN,$),I2=($)=>$$(e9.SEPARATE,$),U2=($)=>$$(e9.END,$),MX={CENTER:"center",INSIDE:"inside",LEFT:"left",OUTSIDE:"outside",RIGHT:"right"},IX={BOTTOM:"bottom",CENTER:"center",INSIDE:"inside",OUTSIDE:"outside",TOP:"top"},wX={DECIMAL:"decimal",UPPER_ROMAN:"upperRoman",LOWER_ROMAN:"lowerRoman",UPPER_LETTER:"upperLetter",LOWER_LETTER:"lowerLetter",ORDINAL:"ordinal",CARDINAL_TEXT:"cardinalText",ORDINAL_TEXT:"ordinalText",HEX:"hex",CHICAGO:"chicago",IDEOGRAPH_DIGITAL:"ideographDigital",JAPANESE_COUNTING:"japaneseCounting",AIUEO:"aiueo",IROHA:"iroha",DECIMAL_FULL_WIDTH:"decimalFullWidth",DECIMAL_HALF_WIDTH:"decimalHalfWidth",JAPANESE_LEGAL:"japaneseLegal",JAPANESE_DIGITAL_TEN_THOUSAND:"japaneseDigitalTenThousand",DECIMAL_ENCLOSED_CIRCLE:"decimalEnclosedCircle",DECIMAL_FULL_WIDTH_2:"decimalFullWidth2",AIUEO_FULL_WIDTH:"aiueoFullWidth",IROHA_FULL_WIDTH:"irohaFullWidth",DECIMAL_ZERO:"decimalZero",BULLET:"bullet",GANADA:"ganada",CHOSUNG:"chosung",DECIMAL_ENCLOSED_FULL_STOP:"decimalEnclosedFullstop",DECIMAL_ENCLOSED_PAREN:"decimalEnclosedParen",DECIMAL_ENCLOSED_CIRCLE_CHINESE:"decimalEnclosedCircleChinese",IDEOGRAPH_ENCLOSED_CIRCLE:"ideographEnclosedCircle",IDEOGRAPH_TRADITIONAL:"ideographTraditional",IDEOGRAPH_ZODIAC:"ideographZodiac",IDEOGRAPH_ZODIAC_TRADITIONAL:"ideographZodiacTraditional",TAIWANESE_COUNTING:"taiwaneseCounting",IDEOGRAPH_LEGAL_TRADITIONAL:"ideographLegalTraditional",TAIWANESE_COUNTING_THOUSAND:"taiwaneseCountingThousand",TAIWANESE_DIGITAL:"taiwaneseDigital",CHINESE_COUNTING:"chineseCounting",CHINESE_LEGAL_SIMPLIFIED:"chineseLegalSimplified",CHINESE_COUNTING_TEN_THOUSAND:"chineseCountingThousand",KOREAN_DIGITAL:"koreanDigital",KOREAN_COUNTING:"koreanCounting",KOREAN_LEGAL:"koreanLegal",KOREAN_DIGITAL_2:"koreanDigital2",VIETNAMESE_COUNTING:"vietnameseCounting",RUSSIAN_LOWER:"russianLower",RUSSIAN_UPPER:"russianUpper",NONE:"none",NUMBER_IN_DASH:"numberInDash",HEBREW_1:"hebrew1",HEBREW_2:"hebrew2",ARABIC_ALPHA:"arabicAlpha",ARABIC_ABJAD:"arabicAbjad",HINDI_VOWELS:"hindiVowels",HINDI_CONSONANTS:"hindiConsonants",HINDI_NUMBERS:"hindiNumbers",HINDI_COUNTING:"hindiCounting",THAI_LETTERS:"thaiLetters",THAI_NUMBERS:"thaiNumbers",THAI_COUNTING:"thaiCounting",BAHT_TEXT:"bahtText",DOLLAR_TEXT:"dollarText"},g0={DEFAULT:"default",PRESERVE:"preserve"};class x0 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{space:"xml:space"})}}class vQ extends o{constructor(){super("w:instrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("PAGE")}}class _Q extends o{constructor(){super("w:instrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("NUMPAGES")}}class yQ extends o{constructor(){super("w:instrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("SECTIONPAGES")}}class bQ extends o{constructor(){super("w:instrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("SECTION")}}var j1=({fill:$,color:U,type:Y})=>new B0({name:"w:shd",attributes:{fill:{key:"w:fill",value:$===void 0?void 0:S2($)},color:{key:"w:color",value:U===void 0?void 0:S2(U)},type:{key:"w:val",value:Y}}}),WX={CLEAR:"clear",DIAGONAL_CROSS:"diagCross",DIAGONAL_STRIPE:"diagStripe",HORIZONTAL_CROSS:"horzCross",HORIZONTAL_STRIPE:"horzStripe",NIL:"nil",PERCENT_5:"pct5",PERCENT_10:"pct10",PERCENT_12:"pct12",PERCENT_15:"pct15",PERCENT_20:"pct20",PERCENT_25:"pct25",PERCENT_30:"pct30",PERCENT_35:"pct35",PERCENT_37:"pct37",PERCENT_40:"pct40",PERCENT_45:"pct45",PERCENT_50:"pct50",PERCENT_55:"pct55",PERCENT_60:"pct60",PERCENT_62:"pct62",PERCENT_65:"pct65",PERCENT_70:"pct70",PERCENT_75:"pct75",PERCENT_80:"pct80",PERCENT_85:"pct85",PERCENT_87:"pct87",PERCENT_90:"pct90",PERCENT_95:"pct95",REVERSE_DIAGONAL_STRIPE:"reverseDiagStripe",SOLID:"solid",THIN_DIAGONAL_CROSS:"thinDiagCross",THIN_DIAGONAL_STRIPE:"thinDiagStripe",THIN_HORIZONTAL_CROSS:"thinHorzCross",THIN_REVERSE_DIAGONAL_STRIPE:"thinReverseDiagStripe",THIN_VERTICAL_STRIPE:"thinVertStripe",VERTICAL_STRIPE:"vertStripe"};class _0 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id",author:"w:author",date:"w:date"})}}class gQ extends o{constructor($){super("w:del");this.root.push(new _0({id:$.id,author:$.author,date:$.date}))}}class xQ extends o{constructor($){super("w:ins");this.root.push(new _0({id:$.id,author:$.author,date:$.date}))}}var U$={DOT:"dot"},Y$=($=U$.DOT)=>new B0({name:"w:em",attributes:{val:{key:"w:val",value:$}}}),HX=()=>Y$(U$.DOT);class fQ extends o{constructor($){super("w:spacing");this.root.push(new O0({val:e0($)}))}}class hQ extends o{constructor($){super("w:color");this.root.push(new O0({val:S2($)}))}}class uQ extends o{constructor($){super("w:highlight");this.root.push(new O0({val:$}))}}class dQ extends o{constructor($){super("w:highlightCs");this.root.push(new O0({val:$}))}}var jX=($)=>new B0({name:"w:lang",attributes:{value:{key:"w:val",value:$.value},eastAsia:{key:"w:eastAsia",value:$.eastAsia},bidirectional:{key:"w:bidi",value:$.bidirectional}}}),g1=($,U)=>{if(typeof $==="string"){let Z=$;return new B0({name:"w:rFonts",attributes:{ascii:{key:"w:ascii",value:Z},cs:{key:"w:cs",value:Z},eastAsia:{key:"w:eastAsia",value:Z},hAnsi:{key:"w:hAnsi",value:Z},hint:{key:"w:hint",value:U}}})}let Y=$;return new B0({name:"w:rFonts",attributes:{ascii:{key:"w:ascii",value:Y.ascii},cs:{key:"w:cs",value:Y.cs},eastAsia:{key:"w:eastAsia",value:Y.eastAsia},hAnsi:{key:"w:hAnsi",value:Y.hAnsi},hint:{key:"w:hint",value:Y.hint}}})},cQ=($)=>new B0({name:"w:vertAlign",attributes:{val:{key:"w:val",value:$}}}),zX=()=>cQ("superscript"),FX=()=>cQ("subscript"),Z$={SINGLE:"single",WORDS:"words",DOUBLE:"double",THICK:"thick",DOTTED:"dotted",DOTTEDHEAVY:"dottedHeavy",DASH:"dash",DASHEDHEAVY:"dashedHeavy",DASHLONG:"dashLong",DASHLONGHEAVY:"dashLongHeavy",DOTDASH:"dotDash",DASHDOTHEAVY:"dashDotHeavy",DOTDOTDASH:"dotDotDash",DASHDOTDOTHEAVY:"dashDotDotHeavy",WAVE:"wave",WAVYHEAVY:"wavyHeavy",WAVYDOUBLE:"wavyDouble",NONE:"none"},mQ=($=Z$.SINGLE,U)=>new B0({name:"w:u",attributes:{val:{key:"w:val",value:$},color:{key:"w:color",value:U===void 0?void 0:S2(U)}}}),NX={BLINK_BACKGROUND:"blinkBackground",LIGHTS:"lights",ANTS_BLACK:"antsBlack",ANTS_RED:"antsRed",SHIMMER:"shimmer",SPARKLE:"sparkle",NONE:"none"},RX={BLACK:"black",BLUE:"blue",CYAN:"cyan",DARK_BLUE:"darkBlue",DARK_CYAN:"darkCyan",DARK_GRAY:"darkGray",DARK_GREEN:"darkGreen",DARK_MAGENTA:"darkMagenta",DARK_RED:"darkRed",DARK_YELLOW:"darkYellow",GREEN:"green",LIGHT_GRAY:"lightGray",MAGENTA:"magenta",NONE:"none",RED:"red",WHITE:"white",YELLOW:"yellow"};class J2 extends Q2{constructor($){var U,Y;super("w:rPr");if(!$)return;if($.style)this.push(new Y2("w:rStyle",$.style));if($.font)if(typeof $.font==="string")this.push(g1($.font));else if("name"in $.font)this.push(g1($.font.name,$.font.hint));else this.push(g1($.font));if($.bold!==void 0)this.push(new X0("w:b",$.bold));if($.boldComplexScript===void 0&&$.bold!==void 0||$.boldComplexScript)this.push(new X0("w:bCs",(U=$.boldComplexScript)!=null?U:$.bold));if($.italics!==void 0)this.push(new X0("w:i",$.italics));if($.italicsComplexScript===void 0&&$.italics!==void 0||$.italicsComplexScript)this.push(new X0("w:iCs",(Y=$.italicsComplexScript)!=null?Y:$.italics));if($.smallCaps!==void 0)this.push(new X0("w:smallCaps",$.smallCaps));else if($.allCaps!==void 0)this.push(new X0("w:caps",$.allCaps));if($.strike!==void 0)this.push(new X0("w:strike",$.strike));if($.doubleStrike!==void 0)this.push(new X0("w:dstrike",$.doubleStrike));if($.emboss!==void 0)this.push(new X0("w:emboss",$.emboss));if($.imprint!==void 0)this.push(new X0("w:imprint",$.imprint));if($.noProof!==void 0)this.push(new X0("w:noProof",$.noProof));if($.snapToGrid!==void 0)this.push(new X0("w:snapToGrid",$.snapToGrid));if($.vanish)this.push(new X0("w:vanish",$.vanish));if($.color)this.push(new hQ($.color));if($.characterSpacing)this.push(new fQ($.characterSpacing));if($.scale!==void 0)this.push(new k2("w:w",$.scale));if($.kern)this.push(new q1("w:kern",$.kern));if($.position)this.push(new Y2("w:position",$.position));if($.size!==void 0)this.push(new q1("w:sz",$.size));let Z=$.sizeComplexScript===void 0||$.sizeComplexScript===!0?$.size:$.sizeComplexScript;if(Z)this.push(new q1("w:szCs",Z));if($.highlight)this.push(new uQ($.highlight));let J=$.highlightComplexScript===void 0||$.highlightComplexScript===!0?$.highlight:$.highlightComplexScript;if(J)this.push(new dQ(J));if($.underline)this.push(mQ($.underline.type,$.underline.color));if($.effect)this.push(new Y2("w:effect",$.effect));if($.border)this.push(N0("w:bdr",$.border));if($.shading)this.push(j1($.shading));if($.subScript)this.push(FX());if($.superScript)this.push(zX());if($.rightToLeft!==void 0)this.push(new X0("w:rtl",$.rightToLeft));if($.emphasisMark)this.push(Y$($.emphasisMark.type));if($.language)this.push(jX($.language));if($.specVanish)this.push(new X0("w:specVanish",$.vanish));if($.math)this.push(new X0("w:oMath",$.math));if($.revision)this.push(new J$($.revision))}push($){this.root.push($)}}class Q$ extends J2{constructor($){super($);if($==null?void 0:$.insertion)this.push(new xQ($.insertion));if($==null?void 0:$.deletion)this.push(new gQ($.deletion))}}class J$ extends o{constructor($){super("w:rPrChange");this.root.push(new _0({id:$.id,author:$.author,date:$.date})),this.addChildElement(new J2($))}}class a2 extends o{constructor($){var U;super("w:t");if(typeof $==="string")this.root.push(new x0({space:g0.PRESERVE})),this.root.push($);else this.root.push(new x0({space:(U=$.space)!=null?U:g0.DEFAULT})),this.root.push($.text)}}var N2={CURRENT:"CURRENT",TOTAL_PAGES:"TOTAL_PAGES",TOTAL_PAGES_IN_SECTION:"TOTAL_PAGES_IN_SECTION",CURRENT_SECTION:"SECTION"};class C0 extends o{constructor($){super("w:r");if(Y0(this,"properties"),this.properties=new J2($),this.root.push(this.properties),$.break)for(let U=0;U<$.break;U++)this.root.push(SQ());if($.children)for(let U of $.children){if(typeof U==="string"){switch(U){case N2.CURRENT:this.root.push($2()),this.root.push(new vQ),this.root.push(I2()),this.root.push(U2());break;case N2.TOTAL_PAGES:this.root.push($2()),this.root.push(new _Q),this.root.push(I2()),this.root.push(U2());break;case N2.TOTAL_PAGES_IN_SECTION:this.root.push($2()),this.root.push(new yQ),this.root.push(I2()),this.root.push(U2());break;case N2.CURRENT_SECTION:this.root.push($2()),this.root.push(new bQ),this.root.push(I2()),this.root.push(U2());break;default:this.root.push(new a2(U));break}continue}this.root.push(U)}else if($.text!==void 0)this.root.push(new a2($.text))}}class p2 extends C0{constructor($){super(typeof $==="string"?{text:$}:$)}}class lQ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{char:"w:char",symbolfont:"w:font"})}}var DZ=class extends o{constructor(U="",Y="Wingdings"){super("w:sym");this.root.push(new lQ({char:U,symbolfont:Y}))}};class G$ extends C0{constructor($){if(typeof $==="string"){super({});return this.root.push(new DZ($)),this}super($);this.root.push(new DZ($.char,$.symbolfont))}}var Z9={},z0={},Q9,AZ;function z1(){if(AZ)return Q9;AZ=1,Q9=$;function $(U,Y){if(!U)throw Error(Y||"Assertion failed")}return $.equal=function(Y,Z,J){if(Y!=Z)throw Error(J||"Assertion failed: "+Y+" != "+Z)},Q9}var PZ;function G2(){if(PZ)return z0;PZ=1;var $=z1(),U=R2();z0.inherits=U;function Y(S,h){if((S.charCodeAt(h)&64512)!==55296)return!1;if(h<0||h+1>=S.length)return!1;return(S.charCodeAt(h+1)&64512)===56320}function Z(S,h){if(Array.isArray(S))return S.slice();if(!S)return[];var N=[];if(typeof S==="string"){if(!h){var a=0;for(var $0=0;$0>6|192,N[a++]=m&63|128;else if(Y(S,$0))m=65536+((m&1023)<<10)+(S.charCodeAt(++$0)&1023),N[a++]=m>>18|240,N[a++]=m>>12&63|128,N[a++]=m>>6&63|128,N[a++]=m&63|128;else N[a++]=m>>12|224,N[a++]=m>>6&63|128,N[a++]=m&63|128}}else if(h==="hex"){if(S=S.replace(/[^a-z0-9]+/ig,""),S.length%2!==0)S="0"+S;for($0=0;$0>>24|S>>>8&65280|S<<8&16711680|(S&255)<<24;return h>>>0}z0.htonl=G;function X(S,h){var N="";for(var a=0;a>>0}return m}z0.join32=F;function z(S,h){var N=Array(S.length*4);for(var a=0,$0=0;a>>24,N[$0+1]=m>>>16&255,N[$0+2]=m>>>8&255,N[$0+3]=m&255;else N[$0+3]=m>>>24,N[$0+2]=m>>>16&255,N[$0+1]=m>>>8&255,N[$0]=m&255}return N}z0.split32=z;function W(S,h){return S>>>h|S<<32-h}z0.rotr32=W;function k(S,h){return S<>>32-h}z0.rotl32=k;function D(S,h){return S+h>>>0}z0.sum32=D;function C(S,h,N){return S+h+N>>>0}z0.sum32_3=C;function H(S,h,N,a){return S+h+N+a>>>0}z0.sum32_4=H;function O(S,h,N,a,$0){return S+h+N+a+$0>>>0}z0.sum32_5=O;function V(S,h,N,a){var $0=S[h],m=S[h+1],J0=a+m>>>0,U0=(J0>>0,S[h+1]=J0}z0.sum64=V;function j(S,h,N,a){var $0=h+a>>>0,m=($0>>0}z0.sum64_hi=j;function M(S,h,N,a){var $0=h+a;return $0>>>0}z0.sum64_lo=M;function L(S,h,N,a,$0,m,J0,U0){var L0=0,i=h;i=i+a>>>0,L0+=i>>0,L0+=i>>0,L0+=i>>0}z0.sum64_4_hi=L;function A(S,h,N,a,$0,m,J0,U0){var L0=h+a+m+U0;return L0>>>0}z0.sum64_4_lo=A;function y(S,h,N,a,$0,m,J0,U0,L0,i){var _=0,r=h;r=r+a>>>0,_+=r>>0,_+=r>>0,_+=r>>0,_+=r>>0}z0.sum64_5_hi=y;function g(S,h,N,a,$0,m,J0,U0,L0,i){var _=h+a+m+U0+i;return _>>>0}z0.sum64_5_lo=g;function d(S,h,N){var a=h<<32-N|S>>>N;return a>>>0}z0.rotr64_hi=d;function E(S,h,N){var a=S<<32-N|h>>>N;return a>>>0}z0.rotr64_lo=E;function s(S,h,N){return S>>>N}z0.shr64_hi=s;function V0(S,h,N){var a=S<<32-N|h>>>N;return a>>>0}return z0.shr64_lo=V0,z0}var J9={},TZ;function F1(){if(TZ)return J9;TZ=1;var $=G2(),U=z1();function Y(){this.pending=null,this.pendingTotal=0,this.blockSize=this.constructor.blockSize,this.outSize=this.constructor.outSize,this.hmacStrength=this.constructor.hmacStrength,this.padLength=this.constructor.padLength/8,this.endian="big",this._delta8=this.blockSize/8,this._delta32=this.blockSize/32}return J9.BlockHash=Y,Y.prototype.update=function(J,G){if(J=$.toArray(J,G),!this.pending)this.pending=J;else this.pending=this.pending.concat(J);if(this.pendingTotal+=J.length,this.pending.length>=this._delta8){J=this.pending;var X=J.length%this._delta8;if(this.pending=J.slice(J.length-X,J.length),this.pending.length===0)this.pending=null;J=$.join32(J,0,J.length-X,this.endian);for(var Q=0;Q>>24&255,Q[B++]=J>>>16&255,Q[B++]=J>>>8&255,Q[B++]=J&255}else{Q[B++]=J&255,Q[B++]=J>>>8&255,Q[B++]=J>>>16&255,Q[B++]=J>>>24&255,Q[B++]=0,Q[B++]=0,Q[B++]=0,Q[B++]=0;for(F=8;F>>3}s0.g0_256=B;function F(z){return U(z,17)^U(z,19)^z>>>10}return s0.g1_256=F,s0}var G9,OZ;function DX(){if(OZ)return G9;OZ=1;var $=G2(),U=F1(),Y=aQ(),Z=$.rotl32,J=$.sum32,G=$.sum32_5,X=Y.ft_1,Q=U.BlockHash,B=[1518500249,1859775393,2400959708,3395469782];function F(){if(!(this instanceof F))return new F;Q.call(this),this.h=[1732584193,4023233417,2562383102,271733878,3285377520],this.W=Array(80)}return $.inherits(F,Q),G9=F,F.blockSize=512,F.outSize=160,F.hmacStrength=80,F.padLength=64,F.prototype._update=function(W,k){var D=this.W;for(var C=0;C<16;C++)D[C]=W[k+C];for(;Cthis.blockSize)J=new this.Hash().update(J).digest();U(J.length<=this.blockSize);for(var G=J.length;G{return(Y=U)=>{let Z="",J=Y|0;while(J--)Z+=$[Math.random()*$.length|0];return Z}},yX=($=21)=>{let U="",Y=$|0;while(Y--)U+=vX[Math.random()*64|0];return U},bX=($)=>Math.floor($/25.4*72*20),d0=($)=>Math.floor($*72*20),N1=($=0)=>{let U=$;return()=>++U},rQ=()=>N1(),sQ=()=>N1(1),nQ=()=>N1(),oQ=()=>N1(),R1=()=>yX().toLowerCase(),A9=($)=>SX.sha1().update($ instanceof ArrayBuffer?new Uint8Array($):$).digest("hex"),Y1=($)=>_X("1234567890abcdef",$)(),tQ=()=>`${Y1(8)}-${Y1(4)}-${Y1(4)}-${Y1(4)}-${Y1(12)}`,X1=($)=>new Uint8Array(new TextEncoder().encode($)),eQ={CHARACTER:"character",COLUMN:"column",INSIDE_MARGIN:"insideMargin",LEFT_MARGIN:"leftMargin",MARGIN:"margin",OUTSIDE_MARGIN:"outsideMargin",PAGE:"page",RIGHT_MARGIN:"rightMargin"},$J={BOTTOM_MARGIN:"bottomMargin",INSIDE_MARGIN:"insideMargin",LINE:"line",MARGIN:"margin",OUTSIDE_MARGIN:"outsideMargin",PAGE:"page",PARAGRAPH:"paragraph",TOP_MARGIN:"topMargin"},UJ=()=>new B0({name:"wp:simplePos",attributes:{x:{key:"x",value:0},y:{key:"y",value:0}}}),YJ=($)=>new B0({name:"wp:align",children:[$]}),ZJ=($)=>new B0({name:"wp:posOffset",children:[$.toString()]}),QJ=({relative:$,align:U,offset:Y})=>new B0({name:"wp:positionH",attributes:{relativeFrom:{key:"relativeFrom",value:$!=null?$:eQ.PAGE}},children:[(()=>{if(U)return YJ(U);else if(Y!==void 0)return ZJ(Y);else throw Error("There is no configuration provided for floating position (Align or offset)")})()]}),JJ=({relative:$,align:U,offset:Y})=>new B0({name:"wp:positionV",attributes:{relativeFrom:{key:"relativeFrom",value:$!=null?$:$J.PAGE}},children:[(()=>{if(U)return YJ(U);else if(Y!==void 0)return ZJ(Y);else throw Error("There is no configuration provided for floating position (Align or offset)")})()]}),GJ=(($)=>{return $.CENTER="ctr",$.TOP="t",$.BOTTOM="b",$})(GJ||{}),KJ=($={})=>{var U,Y,Z,J;return new B0({name:"wps:bodyPr",attributes:{lIns:{key:"lIns",value:(U=$.margins)==null?void 0:U.left},rIns:{key:"rIns",value:(Y=$.margins)==null?void 0:Y.right},tIns:{key:"tIns",value:(Z=$.margins)==null?void 0:Z.top},bIns:{key:"bIns",value:(J=$.margins)==null?void 0:J.bottom},anchor:{key:"anchor",value:$.verticalAnchor}},children:[...$.noAutoFit?[new X0("a:noAutofit",$.noAutoFit)]:[]]})},gX=($={txBox:"1"})=>new B0({name:"wps:cNvSpPr",attributes:{txBox:{key:"txBox",value:$.txBox}}}),xX=($)=>new B0({name:"w:txbxContent",children:[...$]}),fX=($)=>new B0({name:"wps:txbx",children:[xX($)]});class qJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{cx:"cx",cy:"cy"})}}class XJ extends o{constructor($,U){super("a:ext");Y0(this,"attributes"),this.attributes=new qJ({cx:$,cy:U}),this.root.push(this.attributes)}}class VJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{x:"x",y:"y"})}}class BJ extends o{constructor($,U){super("a:off");this.root.push(new VJ({x:$!=null?$:0,y:U!=null?U:0}))}}class LJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{flipVertical:"flipV",flipHorizontal:"flipH",rotation:"rot"})}}class K$ extends o{constructor($){var U,Y,Z,J,G,X;super("a:xfrm");Y0(this,"extents"),Y0(this,"offset"),this.root.push(new LJ({flipVertical:(U=$.flip)==null?void 0:U.vertical,flipHorizontal:(Y=$.flip)==null?void 0:Y.horizontal,rotation:$.rotation})),this.offset=new BJ((J=(Z=$.offset)==null?void 0:Z.emus)==null?void 0:J.x,(X=(G=$.offset)==null?void 0:G.emus)==null?void 0:X.y),this.extents=new XJ($.emus.x,$.emus.y),this.root.push(this.offset),this.root.push(this.extents)}}var MJ=()=>new B0({name:"a:noFill"}),hX=($)=>new B0({name:"a:srgbClr",attributes:{value:{key:"val",value:$.value}}}),uX=($)=>new B0({name:"a:schemeClr",attributes:{value:{key:"val",value:$.value}}}),P9=($)=>new B0({name:"a:solidFill",children:[$.type==="rgb"?hX($):uX($)]}),dX=($)=>new B0({name:"a:ln",attributes:{width:{key:"w",value:$.width},cap:{key:"cap",value:$.cap},compoundLine:{key:"cmpd",value:$.compoundLine},align:{key:"algn",value:$.align}},children:[$.type==="noFill"?MJ():$.solidFillType==="rgb"?P9({type:"rgb",value:$.value}):P9({type:"scheme",value:$.value})]});class IJ extends o{constructor(){super("a:avLst")}}class wJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{prst:"prst"})}}class WJ extends o{constructor(){super("a:prstGeom");this.root.push(new wJ({prst:"rect"})),this.root.push(new IJ)}}class HJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{bwMode:"bwMode"})}}class q$ extends o{constructor({element:$,outline:U,solidFill:Y,transform:Z}){super(`${$}:spPr`);if(Y0(this,"form"),this.root.push(new HJ({bwMode:"auto"})),this.form=new K$(Z),this.root.push(this.form),this.root.push(new WJ),U)this.root.push(MJ()),this.root.push(dX(U));if(Y)this.root.push(P9(Y))}}var xZ=($)=>new B0({name:"wps:wsp",children:[gX($.nonVisualProperties),new q$({element:"wps",transform:$.transformation,outline:$.outline,solidFill:$.solidFill}),fX($.children),KJ($.bodyProperties)]});class x1 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{uri:"uri"})}}var cX=($)=>new B0({name:"asvg:svgBlip",attributes:{asvg:{key:"xmlns:asvg",value:"http://schemas.microsoft.com/office/drawing/2016/SVG/main"},embed:{key:"r:embed",value:`rId{${$.fileName}}`}}}),mX=($)=>new B0({name:"a:ext",attributes:{uri:{key:"uri",value:"{96DAC541-7B7A-43D3-8B79-37D633B846F1}"}},children:[cX($)]}),lX=($)=>new B0({name:"a:extLst",children:[mX($)]}),aX=($)=>new B0({name:"a:blip",attributes:{embed:{key:"r:embed",value:`rId{${$.type==="svg"?$.fallback.fileName:$.fileName}}`},cstate:{key:"cstate",value:"none"}},children:$.type==="svg"?[lX($)]:[]});class jJ extends o{constructor(){super("a:srcRect")}}class zJ extends o{constructor(){super("a:fillRect")}}class FJ extends o{constructor(){super("a:stretch");this.root.push(new zJ)}}class NJ extends o{constructor($){super("pic:blipFill");this.root.push(aX($)),this.root.push(new jJ),this.root.push(new FJ)}}class RJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{noChangeAspect:"noChangeAspect",noChangeArrowheads:"noChangeArrowheads"})}}class DJ extends o{constructor(){super("a:picLocks");this.root.push(new RJ({noChangeAspect:1,noChangeArrowheads:1}))}}class AJ extends o{constructor(){super("pic:cNvPicPr");this.root.push(new DJ)}}var PJ=($,U)=>new B0({name:"a:hlinkClick",attributes:R0(W0({},U?{xmlns:{key:"xmlns:a",value:"http://schemas.openxmlformats.org/drawingml/2006/main"}}:{}),{id:{key:"r:id",value:`rId${$}`}})});class TJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"id",name:"name",descr:"descr"})}}class CJ extends o{constructor(){super("pic:cNvPr");this.root.push(new TJ({id:0,name:"",descr:""}))}prepForXml($){for(let U=$.stack.length-1;U>=0;U--){let Y=$.stack[U];if(!(Y instanceof _2))continue;this.root.push(PJ(Y.linkId,!1));break}return super.prepForXml($)}}class OJ extends o{constructor(){super("pic:nvPicPr");this.root.push(new CJ),this.root.push(new AJ)}}class kJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{xmlns:"xmlns:pic"})}}class T9 extends o{constructor({mediaData:$,transform:U,outline:Y}){super("pic:pic");this.root.push(new kJ({xmlns:"http://schemas.openxmlformats.org/drawingml/2006/picture"})),this.root.push(new OJ),this.root.push(new NJ($)),this.root.push(new q$({element:"pic",transform:U,outline:Y}))}}var pX=($)=>new B0({name:"wpg:grpSpPr",children:[new K$($)]}),iX=()=>new B0({name:"wpg:cNvGrpSpPr"}),rX=($)=>new B0({name:"wpg:wgp",children:[iX(),pX($.transformation),...$.children]});class EJ extends o{constructor({mediaData:$,transform:U,outline:Y,solidFill:Z}){super("a:graphicData");if($.type==="wps"){this.root.push(new x1({uri:"http://schemas.microsoft.com/office/word/2010/wordprocessingShape"}));let J=xZ(R0(W0({},$.data),{transformation:U,outline:Y,solidFill:Z}));this.root.push(J)}else if($.type==="wpg"){this.root.push(new x1({uri:"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"}));let G=$.children.map((Q)=>{if(Q.type==="wps")return xZ(R0(W0({},Q.data),{transformation:Q.transformation,outline:Q.outline,solidFill:Q.solidFill}));else return new T9({mediaData:Q,transform:Q.transformation,outline:Q.outline})}),X=rX({children:G,transformation:U});this.root.push(X)}else{this.root.push(new x1({uri:"http://schemas.openxmlformats.org/drawingml/2006/picture"}));let G=new T9({mediaData:$,transform:U,outline:Y});this.root.push(G)}}}class SJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{a:"xmlns:a"})}}class X$ extends o{constructor({mediaData:$,transform:U,outline:Y,solidFill:Z}){super("a:graphic");Y0(this,"data"),this.root.push(new SJ({a:"http://schemas.openxmlformats.org/drawingml/2006/main"})),this.data=new EJ({mediaData:$,transform:U,outline:Y,solidFill:Z}),this.root.push(this.data)}}var G1={NONE:0,SQUARE:1,TIGHT:2,TOP_AND_BOTTOM:3},vJ={BOTH_SIDES:"bothSides",LEFT:"left",RIGHT:"right",LARGEST:"largest"},C9=()=>new B0({name:"wp:wrapNone"}),_J=($,U={top:0,bottom:0,left:0,right:0})=>new B0({name:"wp:wrapSquare",attributes:{wrapText:{key:"wrapText",value:$.side||vJ.BOTH_SIDES},distT:{key:"distT",value:U.top},distB:{key:"distB",value:U.bottom},distL:{key:"distL",value:U.left},distR:{key:"distR",value:U.right}}}),yJ=($={top:0,bottom:0})=>new B0({name:"wp:wrapTight",attributes:{distT:{key:"distT",value:$.top},distB:{key:"distB",value:$.bottom}}}),bJ=($={top:0,bottom:0})=>new B0({name:"wp:wrapTopAndBottom",attributes:{distT:{key:"distT",value:$.top},distB:{key:"distB",value:$.bottom}}});class V$ extends o{constructor({name:$,description:U,title:Y,id:Z}={name:"",description:"",title:""}){super("wp:docPr");Y0(this,"docPropertiesUniqueNumericId",nQ());let J={id:{key:"id",value:Z!=null?Z:this.docPropertiesUniqueNumericId()},name:{key:"name",value:$}};if(U!==null&&U!==void 0)J.description={key:"descr",value:U};if(Y!==null&&Y!==void 0)J.title={key:"title",value:Y};this.root.push(new n1(J))}prepForXml($){for(let U=$.stack.length-1;U>=0;U--){let Y=$.stack[U];if(!(Y instanceof _2))continue;this.root.push(PJ(Y.linkId,!0));break}return super.prepForXml($)}}var gJ=({top:$,right:U,bottom:Y,left:Z})=>new B0({name:"wp:effectExtent",attributes:{top:{key:"t",value:$},right:{key:"r",value:U},bottom:{key:"b",value:Y},left:{key:"l",value:Z}}}),xJ=({x:$,y:U})=>new B0({name:"wp:extent",attributes:{x:{key:"cx",value:$},y:{key:"cy",value:U}}});class fJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{xmlns:"xmlns:a",noChangeAspect:"noChangeAspect"})}}class hJ extends o{constructor(){super("a:graphicFrameLocks");this.root.push(new fJ({xmlns:"http://schemas.openxmlformats.org/drawingml/2006/main",noChangeAspect:1}))}}var uJ=()=>new B0({name:"wp:cNvGraphicFramePr",children:[new hJ]});class dJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{distT:"distT",distB:"distB",distL:"distL",distR:"distR",allowOverlap:"allowOverlap",behindDoc:"behindDoc",layoutInCell:"layoutInCell",locked:"locked",relativeHeight:"relativeHeight",simplePos:"simplePos"})}}class cJ extends o{constructor({mediaData:$,transform:U,drawingOptions:Y}){super("wp:anchor");let Z=W0({allowOverlap:!0,behindDocument:!1,lockAnchor:!1,layoutInCell:!0,verticalPosition:{},horizontalPosition:{}},Y.floating);if(this.root.push(new dJ({distT:Z.margins?Z.margins.top||0:0,distB:Z.margins?Z.margins.bottom||0:0,distL:Z.margins?Z.margins.left||0:0,distR:Z.margins?Z.margins.right||0:0,simplePos:"0",allowOverlap:Z.allowOverlap===!0?"1":"0",behindDoc:Z.behindDocument===!0?"1":"0",locked:Z.lockAnchor===!0?"1":"0",layoutInCell:Z.layoutInCell===!0?"1":"0",relativeHeight:Z.zIndex?Z.zIndex:U.emus.y})),this.root.push(UJ()),this.root.push(QJ(Z.horizontalPosition)),this.root.push(JJ(Z.verticalPosition)),this.root.push(xJ({x:U.emus.x,y:U.emus.y})),this.root.push(gJ({top:0,right:0,bottom:0,left:0})),Y.floating!==void 0&&Y.floating.wrap!==void 0)switch(Y.floating.wrap.type){case G1.SQUARE:this.root.push(_J(Y.floating.wrap,Y.floating.margins));break;case G1.TIGHT:this.root.push(yJ(Y.floating.margins));break;case G1.TOP_AND_BOTTOM:this.root.push(bJ(Y.floating.margins));break;case G1.NONE:default:this.root.push(C9())}else this.root.push(C9());this.root.push(new V$(Y.docProperties)),this.root.push(uJ()),this.root.push(new X$({mediaData:$,transform:U,outline:Y.outline,solidFill:Y.solidFill}))}}var sX=({mediaData:$,transform:U,docProperties:Y,outline:Z,solidFill:J})=>{var G,X,Q,B;return new B0({name:"wp:inline",attributes:{distanceTop:{key:"distT",value:0},distanceBottom:{key:"distB",value:0},distanceLeft:{key:"distL",value:0},distanceRight:{key:"distR",value:0}},children:[xJ({x:U.emus.x,y:U.emus.y}),gJ(Z?{top:((G=Z.width)!=null?G:9525)*2,right:((X=Z.width)!=null?X:9525)*2,bottom:((Q=Z.width)!=null?Q:9525)*2,left:((B=Z.width)!=null?B:9525)*2}:{top:0,right:0,bottom:0,left:0}),new V$(Y),uJ(),new X$({mediaData:$,transform:U,outline:Z,solidFill:J})]})};class D1 extends o{constructor($,U={}){super("w:drawing");if(!U.floating)this.root.push(sX({mediaData:$,transform:$.transformation,docProperties:U.docProperties,outline:U.outline,solidFill:U.solidFill}));else this.root.push(new cJ({mediaData:$,transform:$.transformation,drawingOptions:U}))}}var nX=($)=>{let Y=$.indexOf(";base64,"),Z=Y===-1?0:Y+8;return new Uint8Array(atob($.substring(Z)).split("").map((J)=>J.charCodeAt(0)))},mJ=($)=>typeof $==="string"?nX($):$,M9=($,U)=>({data:mJ($.data),fileName:U,transformation:{pixels:{x:Math.round($.transformation.width),y:Math.round($.transformation.height)},emus:{x:Math.round($.transformation.width*9525),y:Math.round($.transformation.height*9525)},flip:$.transformation.flip,rotation:$.transformation.rotation?$.transformation.rotation*60000:void 0}});class lJ extends C0{constructor($){super({});Y0(this,"imageData");let Y=`${A9($.data)}.${$.type}`;this.imageData=$.type==="svg"?R0(W0({type:$.type},M9($,Y)),{fallback:W0({type:$.fallback.type},M9(R0(W0({},$.fallback),{transformation:$.transformation}),`${A9($.fallback.data)}.${$.fallback.type}`))}):W0({type:$.type},M9($,Y));let Z=new D1(this.imageData,{floating:$.floating,docProperties:$.altText,outline:$.outline});this.root.push(Z)}prepForXml($){if($.file.Media.addImage(this.imageData.fileName,this.imageData),this.imageData.type==="svg")$.file.Media.addImage(this.imageData.fallback.fileName,this.imageData.fallback);return super.prepForXml($)}}var B$=($)=>{var U,Y,Z,J,G,X,Q,B;return{offset:{pixels:{x:Math.round((Y=(U=$.offset)==null?void 0:U.left)!=null?Y:0),y:Math.round((J=(Z=$.offset)==null?void 0:Z.top)!=null?J:0)},emus:{x:Math.round(((X=(G=$.offset)==null?void 0:G.left)!=null?X:0)*9525),y:Math.round(((B=(Q=$.offset)==null?void 0:Q.top)!=null?B:0)*9525)}},pixels:{x:Math.round($.width),y:Math.round($.height)},emus:{x:Math.round($.width*9525),y:Math.round($.height*9525)},flip:$.flip,rotation:$.rotation?$.rotation*60000:void 0}};class aJ extends C0{constructor($){super({});Y0(this,"wpsShapeData"),this.wpsShapeData={type:$.type,transformation:B$($.transformation),data:W0({},$)};let U=new D1(this.wpsShapeData,{floating:$.floating,docProperties:$.altText,outline:$.outline,solidFill:$.solidFill});this.root.push(U)}}class pJ extends C0{constructor($){super({});Y0(this,"wpgGroupData"),Y0(this,"mediaDatas"),this.wpgGroupData={type:$.type,transformation:B$($.transformation),children:$.children};let U=new D1(this.wpgGroupData,{floating:$.floating,docProperties:$.altText});this.mediaDatas=$.children.filter((Y)=>Y.type!=="wps").map((Y)=>Y),this.root.push(U)}prepForXml($){return this.mediaDatas.forEach((U)=>{if($.file.Media.addImage(U.fileName,U),U.type==="svg")$.file.Media.addImage(U.fallback.fileName,U.fallback)}),super.prepForXml($)}}class iJ extends o{constructor($){super("w:instrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push(`SEQ ${$}`)}}class rJ extends C0{constructor($){super({});this.root.push($2(!0)),this.root.push(new iJ($)),this.root.push(I2()),this.root.push(U2())}}class sJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{instr:"w:instr"})}}class J8 extends o{constructor($,U){super("w:fldSimple");if(this.root.push(new sJ({instr:$})),U!==void 0)this.root.push(new p2(U))}}class nJ extends J8{constructor($){super(` MERGEFIELD ${$} `,`«${$}»`)}}class oJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{xmlns:"xmlns"})}}var tJ={EXTERNAL:"External"},oX=($,U,Y,Z)=>new B0({name:"Relationship",attributes:{id:{key:"Id",value:$},type:{key:"Type",value:U},target:{key:"Target",value:Y},targetMode:{key:"TargetMode",value:Z}}});class W2 extends o{constructor(){super("Relationships");this.root.push(new oJ({xmlns:"http://schemas.openxmlformats.org/package/2006/relationships"}))}addRelationship($,U,Y,Z){this.root.push(oX(`rId${$}`,U,Y,Z))}get RelationshipCount(){return this.root.length-1}}class eJ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id",initials:"w:initials",author:"w:author",date:"w:date"})}}class G8 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id"})}}class $G extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{"xmlns:cx":"xmlns:cx","xmlns:cx1":"xmlns:cx1","xmlns:cx2":"xmlns:cx2","xmlns:cx3":"xmlns:cx3","xmlns:cx4":"xmlns:cx4","xmlns:cx5":"xmlns:cx5","xmlns:cx6":"xmlns:cx6","xmlns:cx7":"xmlns:cx7","xmlns:cx8":"xmlns:cx8","xmlns:mc":"xmlns:mc","xmlns:aink":"xmlns:aink","xmlns:am3d":"xmlns:am3d","xmlns:o":"xmlns:o","xmlns:r":"xmlns:r","xmlns:m":"xmlns:m","xmlns:v":"xmlns:v","xmlns:wp14":"xmlns:wp14","xmlns:wp":"xmlns:wp","xmlns:w10":"xmlns:w10","xmlns:w":"xmlns:w","xmlns:w14":"xmlns:w14","xmlns:w15":"xmlns:w15","xmlns:w16cex":"xmlns:w16cex","xmlns:w16cid":"xmlns:w16cid","xmlns:w16":"xmlns:w16","xmlns:w16sdtdh":"xmlns:w16sdtdh","xmlns:w16se":"xmlns:w16se","xmlns:wpg":"xmlns:wpg","xmlns:wpi":"xmlns:wpi","xmlns:wne":"xmlns:wne","xmlns:wps":"xmlns:wps"})}}class UG extends o{constructor($){super("w:commentRangeStart");this.root.push(new G8({id:$}))}}class YG extends o{constructor($){super("w:commentRangeEnd");this.root.push(new G8({id:$}))}}class ZG extends o{constructor($){super("w:commentReference");this.root.push(new G8({id:$}))}}class L$ extends o{constructor({id:$,initials:U,author:Y,date:Z=new Date,children:J}){super("w:comment");this.root.push(new eJ({id:$,initials:U,author:Y,date:Z.toISOString()}));for(let G of J)this.root.push(G)}}class M$ extends o{constructor({children:$}){super("w:comments");Y0(this,"relationships"),this.root.push(new $G({"xmlns:cx":"http://schemas.microsoft.com/office/drawing/2014/chartex","xmlns:cx1":"http://schemas.microsoft.com/office/drawing/2015/9/8/chartex","xmlns:cx2":"http://schemas.microsoft.com/office/drawing/2015/10/21/chartex","xmlns:cx3":"http://schemas.microsoft.com/office/drawing/2016/5/9/chartex","xmlns:cx4":"http://schemas.microsoft.com/office/drawing/2016/5/10/chartex","xmlns:cx5":"http://schemas.microsoft.com/office/drawing/2016/5/11/chartex","xmlns:cx6":"http://schemas.microsoft.com/office/drawing/2016/5/12/chartex","xmlns:cx7":"http://schemas.microsoft.com/office/drawing/2016/5/13/chartex","xmlns:cx8":"http://schemas.microsoft.com/office/drawing/2016/5/14/chartex","xmlns:mc":"http://schemas.openxmlformats.org/markup-compatibility/2006","xmlns:aink":"http://schemas.microsoft.com/office/drawing/2016/ink","xmlns:am3d":"http://schemas.microsoft.com/office/drawing/2017/model3d","xmlns:o":"urn:schemas-microsoft-com:office:office","xmlns:r":"http://schemas.openxmlformats.org/officeDocument/2006/relationships","xmlns:m":"http://schemas.openxmlformats.org/officeDocument/2006/math","xmlns:v":"urn:schemas-microsoft-com:vml","xmlns:wp14":"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing","xmlns:wp":"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing","xmlns:w10":"urn:schemas-microsoft-com:office:word","xmlns:w":"http://schemas.openxmlformats.org/wordprocessingml/2006/main","xmlns:w14":"http://schemas.microsoft.com/office/word/2010/wordml","xmlns:w15":"http://schemas.microsoft.com/office/word/2012/wordml","xmlns:w16cex":"http://schemas.microsoft.com/office/word/2018/wordml/cex","xmlns:w16cid":"http://schemas.microsoft.com/office/word/2016/wordml/cid","xmlns:w16":"http://schemas.microsoft.com/office/word/2018/wordml","xmlns:w16sdtdh":"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash","xmlns:w16se":"http://schemas.microsoft.com/office/word/2015/wordml/symex","xmlns:wpg":"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup","xmlns:wpi":"http://schemas.microsoft.com/office/word/2010/wordprocessingInk","xmlns:wne":"http://schemas.microsoft.com/office/word/2006/wordml","xmlns:wps":"http://schemas.microsoft.com/office/word/2010/wordprocessingShape"}));for(let U of $)this.root.push(new L$(U));this.relationships=new W2}get Relationships(){return this.relationships}}class QG extends k0{constructor(){super("w:noBreakHyphen")}}class JG extends k0{constructor(){super("w:softHyphen")}}class GG extends k0{constructor(){super("w:dayShort")}}class KG extends k0{constructor(){super("w:monthShort")}}class qG extends k0{constructor(){super("w:yearShort")}}class XG extends k0{constructor(){super("w:dayLong")}}class VG extends k0{constructor(){super("w:monthLong")}}class BG extends k0{constructor(){super("w:yearLong")}}class LG extends k0{constructor(){super("w:annotationRef")}}class MG extends k0{constructor(){super("w:footnoteRef")}}class I$ extends k0{constructor(){super("w:endnoteRef")}}class IG extends k0{constructor(){super("w:separator")}}class wG extends k0{constructor(){super("w:continuationSeparator")}}class WG extends k0{constructor(){super("w:pgNum")}}class HG extends k0{constructor(){super("w:cr")}}class w$ extends k0{constructor(){super("w:tab")}}class jG extends k0{constructor(){super("w:lastRenderedPageBreak")}}var tX={LEFT:"left",CENTER:"center",RIGHT:"right"},eX={MARGIN:"margin",INDENT:"indent"},$V={NONE:"none",DOT:"dot",HYPHEN:"hyphen",UNDERSCORE:"underscore",MIDDLE_DOT:"middleDot"};class zG extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{alignment:"w:alignment",relativeTo:"w:relativeTo",leader:"w:leader"})}}class FG extends o{constructor($){super("w:ptab");this.root.push(new zG({alignment:$.alignment,relativeTo:$.relativeTo,leader:$.leader}))}}var NG={COLUMN:"column",PAGE:"page"};class W$ extends o{constructor($){super("w:br");this.root.push(new O0({type:$}))}}class RG extends C0{constructor(){super({});this.root.push(new W$(NG.PAGE))}}class DG extends C0{constructor(){super({});this.root.push(new W$(NG.COLUMN))}}class H$ extends o{constructor(){super("w:pageBreakBefore")}}var v2={AT_LEAST:"atLeast",EXACTLY:"exactly",EXACT:"exact",AUTO:"auto"},AG=({after:$,before:U,line:Y,lineRule:Z,beforeAutoSpacing:J,afterAutoSpacing:G})=>new B0({name:"w:spacing",attributes:{after:{key:"w:after",value:$},before:{key:"w:before",value:U},line:{key:"w:line",value:Y},lineRule:{key:"w:lineRule",value:Z},beforeAutoSpacing:{key:"w:beforeAutospacing",value:J},afterAutoSpacing:{key:"w:afterAutospacing",value:G}}}),UV={HEADING_1:"Heading1",HEADING_2:"Heading2",HEADING_3:"Heading3",HEADING_4:"Heading4",HEADING_5:"Heading5",HEADING_6:"Heading6",TITLE:"Title"},K1=($)=>new B0({name:"w:pStyle",attributes:{val:{key:"w:val",value:$}}}),O9={LEFT:"left",RIGHT:"right",CENTER:"center",BAR:"bar",CLEAR:"clear",DECIMAL:"decimal",END:"end",NUM:"num",START:"start"},YV={DOT:"dot",HYPHEN:"hyphen",MIDDLE_DOT:"middleDot",NONE:"none",UNDERSCORE:"underscore"},ZV={MAX:9026},PG=({type:$,position:U,leader:Y})=>new B0({name:"w:tab",attributes:{val:{key:"w:val",value:$},pos:{key:"w:pos",value:U},leader:{key:"w:leader",value:Y}}}),TG=($)=>new B0({name:"w:tabs",children:$.map((U)=>PG(U))});class V1 extends o{constructor($,U){super("w:numPr");this.root.push(new CG(U)),this.root.push(new OG($))}}class CG extends o{constructor($){super("w:ilvl");if($>9)throw Error("Level cannot be greater than 9. Read more here: https://answers.microsoft.com/en-us/msoffice/forum/all/does-word-support-more-than-9-list-levels/d130fdcd-1781-446d-8c84-c6c79124e4d7");this.root.push(new O0({val:$}))}}class OG extends o{constructor($){super("w:numId");this.root.push(new O0({val:typeof $==="string"?`{${$}}`:$}))}}class r2 extends o{constructor(){super(...arguments);Y0(this,"fileChild",Symbol())}}class kG extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"r:id",history:"w:history",anchor:"w:anchor"})}}var QV={INTERNAL:"INTERNAL",EXTERNAL:"EXTERNAL"};class _2 extends o{constructor($,U,Y){super("w:hyperlink");Y0(this,"linkId"),this.linkId=U;let Z={history:1,anchor:Y?Y:void 0,id:!Y?`rId${this.linkId}`:void 0},J=new kG(Z);this.root.push(J),$.forEach((G)=>{this.root.push(G)})}}class j$ extends _2{constructor($){super($.children,R1(),$.anchor)}}class K8 extends o{constructor($){super("w:externalHyperlink");this.options=$}}class EG extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id",name:"w:name"})}}class SG extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id"})}}class z${constructor($){Y0(this,"bookmarkUniqueNumericId",oQ()),Y0(this,"start"),Y0(this,"children"),Y0(this,"end");let U=this.bookmarkUniqueNumericId();this.start=new F$($.id,U),this.children=$.children,this.end=new N$(U)}}class F$ extends o{constructor($,U){super("w:bookmarkStart");let Y=new EG({name:$,id:U});this.root.push(Y)}}class N$ extends o{constructor($){super("w:bookmarkEnd");let U=new SG({id:$});this.root.push(U)}}var vG=(($)=>{return $.NONE="none",$.RELATIVE="relative",$.NO_CONTEXT="no_context",$.FULL_CONTEXT="full_context",$})(vG||{}),JV={["relative"]:"\\r",["no_context"]:"\\n",["full_context"]:"\\w",["none"]:void 0};class _G extends J8{constructor($,U,Y={}){let{hyperlink:Z=!0,referenceFormat:J="full_context"}=Y,G=`REF ${$}`,X=[...Z?["\\h"]:[],...[JV[J]].filter((B)=>!!B)],Q=`${G} ${X.join(" ")}`;super(Q,U)}}var yG=($)=>new B0({name:"w:outlineLvl",attributes:{val:{key:"w:val",value:$}}});class bG extends o{constructor($,U={}){super("w:instrText");this.root.push(new x0({space:g0.PRESERVE}));let Y=`PAGEREF ${$}`;if(U.hyperlink)Y=`${Y} \\h`;if(U.useRelativePosition)Y=`${Y} \\p`;this.root.push(Y)}}class gG extends C0{constructor($,U={}){super({children:[$2(!0),new bG($,U),U2()]})}}var GV={ANSI:"00",DEFAULT:"01",SYMBOL:"02",MAC:"4D",JIS:"80",HANGUL:"81",JOHAB:"82",GB_2312:"86",CHINESEBIG5:"88",GREEK:"A1",TURKISH:"A2",VIETNAMESE:"A3",HEBREW:"B1",ARABIC:"B2",BALTIC:"BA",RUSSIAN:"CC",THAI:"DE",EASTEUROPE:"EE",OEM:"FF"},_1=({id:$,fontKey:U,subsetted:Y},Z)=>new B0({name:Z,attributes:W0({id:{key:"r:id",value:$}},U?{fontKey:{key:"w:fontKey",value:`{${U}}`}}:{}),children:[...Y?[new X0("w:subsetted",Y)]:[]]}),KV=({name:$,altName:U,panose1:Y,charset:Z,family:J,notTrueType:G,pitch:X,sig:Q,embedRegular:B,embedBold:F,embedItalic:z,embedBoldItalic:W})=>new B0({name:"w:font",attributes:{name:{key:"w:name",value:$}},children:[...U?[u2("w:altName",U)]:[],...Y?[u2("w:panose1",Y)]:[],...Z?[u2("w:charset",Z)]:[],u2("w:family",J),...G?[new X0("w:notTrueType",G)]:[],u2("w:pitch",X),...Q?[new B0({name:"w:sig",attributes:{usb0:{key:"w:usb0",value:Q.usb0},usb1:{key:"w:usb1",value:Q.usb1},usb2:{key:"w:usb2",value:Q.usb2},usb3:{key:"w:usb3",value:Q.usb3},csb0:{key:"w:csb0",value:Q.csb0},csb1:{key:"w:csb1",value:Q.csb1}}})]:[],...B?[_1(B,"w:embedRegular")]:[],...F?[_1(F,"w:embedBold")]:[],...z?[_1(z,"w:embedItalic")]:[],...W?[_1(W,"w:embedBoldItalic")]:[]]}),qV=({name:$,index:U,fontKey:Y,characterSet:Z})=>KV({name:$,sig:{usb0:"E0002AFF",usb1:"C000247B",usb2:"00000009",usb3:"00000000",csb0:"000001FF",csb1:"00000000"},charset:Z,family:"auto",pitch:"variable",embedRegular:{fontKey:Y,id:`rId${U}`}}),XV=($)=>new B0({name:"w:fonts",attributes:{mc:{key:"xmlns:mc",value:"http://schemas.openxmlformats.org/markup-compatibility/2006"},r:{key:"xmlns:r",value:"http://schemas.openxmlformats.org/officeDocument/2006/relationships"},w:{key:"xmlns:w",value:"http://schemas.openxmlformats.org/wordprocessingml/2006/main"},w14:{key:"xmlns:w14",value:"http://schemas.microsoft.com/office/word/2010/wordml"},w15:{key:"xmlns:w15",value:"http://schemas.microsoft.com/office/word/2012/wordml"},w16cex:{key:"xmlns:w16cex",value:"http://schemas.microsoft.com/office/word/2018/wordml/cex"},w16cid:{key:"xmlns:w16cid",value:"http://schemas.microsoft.com/office/word/2016/wordml/cid"},w16:{key:"xmlns:w16",value:"http://schemas.microsoft.com/office/word/2018/wordml"},w16sdtdh:{key:"xmlns:w16sdtdh",value:"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash"},w16se:{key:"xmlns:w16se",value:"http://schemas.microsoft.com/office/word/2015/wordml/symex"},Ignorable:{key:"mc:Ignorable",value:"w14 w15 w16se w16cid w16 w16cex w16sdtdh"}},children:$.map((U,Y)=>qV({name:U.name,index:Y+1,fontKey:U.fontKey,characterSet:U.characterSet}))});class R${constructor($){Y0(this,"fontTable"),Y0(this,"relationships"),Y0(this,"fontOptionsWithKey",[]),this.options=$,this.fontOptionsWithKey=$.map((U)=>R0(W0({},U),{fontKey:tQ()})),this.fontTable=XV(this.fontOptionsWithKey),this.relationships=new W2;for(let U=0;U<$.length;U++)this.relationships.addRelationship(U+1,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/font",`fonts/${$[U].name}.odttf`)}get View(){return this.fontTable}get Relationships(){return this.relationships}}var VV=()=>new B0({name:"w:wordWrap",attributes:{val:{key:"w:val",value:0}}}),BV={NONE:"none",DROP:"drop",MARGIN:"margin"},LV={MARGIN:"margin",PAGE:"page",TEXT:"text"},MV={AROUND:"around",AUTO:"auto",NONE:"none",NOT_BESIDE:"notBeside",THROUGH:"through",TIGHT:"tight"},xG=($)=>{var U,Y;return new B0({name:"w:framePr",attributes:{anchorLock:{key:"w:anchorLock",value:$.anchorLock},dropCap:{key:"w:dropCap",value:$.dropCap},width:{key:"w:w",value:$.width},height:{key:"w:h",value:$.height},x:{key:"w:x",value:$.position?$.position.x:void 0},y:{key:"w:y",value:$.position?$.position.y:void 0},anchorHorizontal:{key:"w:hAnchor",value:$.anchor.horizontal},anchorVertical:{key:"w:vAnchor",value:$.anchor.vertical},spaceHorizontal:{key:"w:hSpace",value:(U=$.space)==null?void 0:U.horizontal},spaceVertical:{key:"w:vSpace",value:(Y=$.space)==null?void 0:Y.vertical},rule:{key:"w:hRule",value:$.rule},alignmentX:{key:"w:xAlign",value:$.alignment?$.alignment.x:void 0},alignmentY:{key:"w:yAlign",value:$.alignment?$.alignment.y:void 0},lines:{key:"w:lines",value:$.lines},wrap:{key:"w:wrap",value:$.wrap}}})};class Z2 extends Q2{constructor($){var U,Y;super("w:pPr",$==null?void 0:$.includeIfEmpty);if(Y0(this,"numberingReferences",[]),!$)return this;if($.heading)this.push(K1($.heading));if($.bullet)this.push(K1("ListParagraph"));if($.numbering){if(!$.style&&!$.heading){if(!$.numbering.custom)this.push(K1("ListParagraph"))}}if($.style)this.push(K1($.style));if($.keepNext!==void 0)this.push(new X0("w:keepNext",$.keepNext));if($.keepLines!==void 0)this.push(new X0("w:keepLines",$.keepLines));if($.pageBreakBefore)this.push(new H$);if($.frame)this.push(xG($.frame));if($.widowControl!==void 0)this.push(new X0("w:widowControl",$.widowControl));if($.bullet)this.push(new V1(1,$.bullet.level));if($.numbering)this.numberingReferences.push({reference:$.numbering.reference,instance:(U=$.numbering.instance)!=null?U:0}),this.push(new V1(`${$.numbering.reference}-${(Y=$.numbering.instance)!=null?Y:0}`,$.numbering.level));else if($.numbering===!1)this.push(new V1(0,0));if($.border)this.push(new o9($.border));if($.thematicBreak)this.push(new t9);if($.shading)this.push(j1($.shading));if($.wordWrap)this.push(VV());if($.overflowPunctuation)this.push(new X0("w:overflowPunct",$.overflowPunctuation));let Z=[...$.rightTabStop!==void 0?[{type:O9.RIGHT,position:$.rightTabStop}]:[],...$.tabStops?$.tabStops:[],...$.leftTabStop!==void 0?[{type:O9.LEFT,position:$.leftTabStop}]:[]];if(Z.length>0)this.push(TG(Z));if($.bidirectional!==void 0)this.push(new X0("w:bidi",$.bidirectional));if($.spacing)this.push(AG($.spacing));if($.indent)this.push(EQ($.indent));if($.contextualSpacing!==void 0)this.push(new X0("w:contextualSpacing",$.contextualSpacing));if($.alignment)this.push(n9($.alignment));if($.outlineLevel!==void 0)this.push(yG($.outlineLevel));if($.suppressLineNumbers!==void 0)this.push(new X0("w:suppressLineNumbers",$.suppressLineNumbers));if($.autoSpaceEastAsianText!==void 0)this.push(new X0("w:autoSpaceDN",$.autoSpaceEastAsianText));if($.run)this.push(new Q$($.run));if($.revision)this.push(new D$($.revision))}push($){this.root.push($)}prepForXml($){if(!($.viewWrapper instanceof R$))for(let U of this.numberingReferences)$.file.Numbering.createConcreteNumberingInstance(U.reference,U.instance);return super.prepForXml($)}}class D$ extends o{constructor($){super("w:pPrChange");this.root.push(new _0({id:$.id,author:$.author,date:$.date})),this.root.push(new Z2(R0(W0({},$),{includeIfEmpty:!0})))}}class h0 extends r2{constructor($){super("w:p");if(Y0(this,"properties"),typeof $==="string")return this.properties=new Z2({}),this.root.push(this.properties),this.root.push(new p2($)),this;if(this.properties=new Z2($),this.root.push(this.properties),$.text)this.root.push(new p2($.text));if($.children)for(let U of $.children){if(U instanceof z$){this.root.push(U.start);for(let Y of U.children)this.root.push(Y);this.root.push(U.end);continue}this.root.push(U)}}prepForXml($){for(let U of this.root)if(U instanceof K8){let Y=this.root.indexOf(U),Z=new _2(U.options.children,R1());$.viewWrapper.Relationships.addRelationship(Z.linkId,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",U.options.link,tJ.EXTERNAL),this.root[Y]=Z}return super.prepForXml($)}addRunToFront($){return this.root.splice(1,0,$),this}}var IV=class extends o{constructor(U){super("m:oMath");for(let Y of U.children)this.root.push(Y)}};class fG extends o{constructor($){super("m:t");this.root.push($)}}class hG extends o{constructor($){super("m:r");this.root.push(new fG($))}}class A$ extends o{constructor($){super("m:den");for(let U of $)this.root.push(U)}}class P$ extends o{constructor($){super("m:num");for(let U of $)this.root.push(U)}}class uG extends o{constructor($){super("m:f");this.root.push(new P$($.numerator)),this.root.push(new A$($.denominator))}}var dG=({accent:$})=>new B0({name:"m:chr",attributes:{accent:{key:"m:val",value:$}}}),y0=({children:$})=>new B0({name:"m:e",children:$}),cG=({value:$})=>new B0({name:"m:limLoc",attributes:{value:{key:"m:val",value:$||"undOvr"}}}),wV=()=>new B0({name:"m:subHide",attributes:{hide:{key:"m:val",value:1}}}),WV=()=>new B0({name:"m:supHide",attributes:{hide:{key:"m:val",value:1}}}),T$=({accent:$,hasSuperScript:U,hasSubScript:Y,limitLocationVal:Z})=>new B0({name:"m:naryPr",children:[...$?[dG({accent:$})]:[],cG({value:Z}),...!U?[WV()]:[],...!Y?[wV()]:[]]}),s2=({children:$})=>new B0({name:"m:sub",children:$}),n2=({children:$})=>new B0({name:"m:sup",children:$});class mG extends o{constructor($){super("m:nary");if(this.root.push(T$({accent:"∑",hasSuperScript:!!$.superScript,hasSubScript:!!$.subScript})),$.subScript)this.root.push(s2({children:$.subScript}));if($.superScript)this.root.push(n2({children:$.superScript}));this.root.push(y0({children:$.children}))}}class lG extends o{constructor($){super("m:nary");if(this.root.push(T$({accent:"",hasSuperScript:!!$.superScript,hasSubScript:!!$.subScript,limitLocationVal:"subSup"})),$.subScript)this.root.push(s2({children:$.subScript}));if($.superScript)this.root.push(n2({children:$.superScript}));this.root.push(y0({children:$.children}))}}class q8 extends o{constructor($){super("m:lim");for(let U of $)this.root.push(U)}}class aG extends o{constructor($){super("m:limUpp");this.root.push(y0({children:$.children})),this.root.push(new q8($.limit))}}class pG extends o{constructor($){super("m:limLow");this.root.push(y0({children:$.children})),this.root.push(new q8($.limit))}}var iG=()=>new B0({name:"m:sSupPr"});class rG extends o{constructor($){super("m:sSup");this.root.push(iG()),this.root.push(y0({children:$.children})),this.root.push(n2({children:$.superScript}))}}var sG=()=>new B0({name:"m:sSubPr"});class nG extends o{constructor($){super("m:sSub");this.root.push(sG()),this.root.push(y0({children:$.children})),this.root.push(s2({children:$.subScript}))}}var oG=()=>new B0({name:"m:sSubSupPr"});class tG extends o{constructor($){super("m:sSubSup");this.root.push(oG()),this.root.push(y0({children:$.children})),this.root.push(s2({children:$.subScript})),this.root.push(n2({children:$.superScript}))}}var eG=()=>new B0({name:"m:sPrePr"});class $K extends B0{constructor({children:$,subScript:U,superScript:Y}){super({name:"m:sPre",children:[eG(),y0({children:$}),s2({children:U}),n2({children:Y})]})}}var HV="";class C$ extends o{constructor($){super("m:deg");if($)for(let U of $)this.root.push(U)}}class UK extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{hide:"m:val"})}}class YK extends o{constructor(){super("m:degHide");this.root.push(new UK({hide:1}))}}class O$ extends o{constructor($){super("m:radPr");if(!$)this.root.push(new YK)}}class ZK extends o{constructor($){super("m:rad");this.root.push(new O$(!!$.degree)),this.root.push(new C$($.degree)),this.root.push(y0({children:$.children}))}}class k$ extends o{constructor($){super("m:fName");for(let U of $)this.root.push(U)}}class E$ extends o{constructor(){super("m:funcPr")}}class QK extends o{constructor($){super("m:func");this.root.push(new E$),this.root.push(new k$($.name)),this.root.push(y0({children:$.children}))}}var jV=({character:$})=>new B0({name:"m:begChr",attributes:{character:{key:"m:val",value:$}}}),zV=({character:$})=>new B0({name:"m:endChr",attributes:{character:{key:"m:val",value:$}}}),X8=({characters:$})=>new B0({name:"m:dPr",children:$?[jV({character:$.beginningCharacter}),zV({character:$.endingCharacter})]:[]});class JK extends o{constructor($){super("m:d");this.root.push(X8({})),this.root.push(y0({children:$.children}))}}class GK extends o{constructor($){super("m:d");this.root.push(X8({characters:{beginningCharacter:"[",endingCharacter:"]"}})),this.root.push(y0({children:$.children}))}}class KK extends o{constructor($){super("m:d");this.root.push(X8({characters:{beginningCharacter:"{",endingCharacter:"}"}})),this.root.push(y0({children:$.children}))}}class qK extends o{constructor($){super("m:d");this.root.push(X8({characters:{beginningCharacter:"〈",endingCharacter:"〉"}})),this.root.push(y0({children:$.children}))}}var FV=($)=>new B0({name:"w:gridCol",attributes:$!==void 0?{width:{key:"w:w",value:T0($)}}:void 0});class S$ extends o{constructor($,U){super("w:tblGrid");for(let Y of $)this.root.push(FV(Y));if(U)this.root.push(new VK(U))}}class XK extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id"})}}class VK extends o{constructor($){super("w:tblGridChange");this.root.push(new XK({id:$.id})),this.root.push(new S$($.columnWidths))}}class BK extends o{constructor($){super("w:ins");this.root.push(new _0({id:$.id,author:$.author,date:$.date})),this.addChildElement(new p2($))}}class LK extends o{constructor(){super("w:delInstrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("PAGE")}}class MK extends o{constructor(){super("w:delInstrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("NUMPAGES")}}class IK extends o{constructor(){super("w:delInstrText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push("SECTIONPAGES")}}class k9 extends o{constructor($){super("w:delText");this.root.push(new x0({space:g0.PRESERVE})),this.root.push($)}}class wK extends o{constructor($){super("w:del");Y0(this,"deletedTextRunWrapper"),this.root.push(new _0({id:$.id,author:$.author,date:$.date})),this.deletedTextRunWrapper=new WK($),this.addChildElement(this.deletedTextRunWrapper)}}class WK extends o{constructor($){super("w:r");if(this.root.push(new J2($)),$.children)for(let U of $.children){if(typeof U==="string"){switch(U){case N2.CURRENT:this.root.push($2()),this.root.push(new LK),this.root.push(I2()),this.root.push(U2());break;case N2.TOTAL_PAGES:this.root.push($2()),this.root.push(new MK),this.root.push(I2()),this.root.push(U2());break;case N2.TOTAL_PAGES_IN_SECTION:this.root.push($2()),this.root.push(new IK),this.root.push(I2()),this.root.push(U2());break;default:this.root.push(new k9(U));break}continue}this.root.push(U)}else if($.text)this.root.push(new k9($.text));if($.break)for(let U=0;U<$.break;U++)this.root.splice(1,0,SQ())}}class v$ extends o{constructor($){super("w:ins");this.root.push(new _0({id:$.id,author:$.author,date:$.date}))}}class _$ extends o{constructor($){super("w:del");this.root.push(new _0({id:$.id,author:$.author,date:$.date}))}}class y$ extends o{constructor($){super("w:cellIns");this.root.push(new _0({id:$.id,author:$.author,date:$.date}))}}class b$ extends o{constructor($){super("w:cellDel");this.root.push(new _0({id:$.id,author:$.author,date:$.date}))}}var NV={CONTINUE:"cont",RESTART:"rest"};class g$ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id",author:"w:author",date:"w:date",verticalMerge:"w:vMerge",verticalMergeOriginal:"w:vMergeOrig"})}}class x$ extends o{constructor($){super("w:cellMerge");this.root.push(new g$($))}}var HK={TOP:"top",CENTER:"center",BOTTOM:"bottom"},jK=R0(W0({},HK),{BOTH:"both"}),RV=jK,f$=($)=>new B0({name:"w:vAlign",attributes:{verticalAlign:{key:"w:val",value:$}}}),zK=({marginUnitType:$=l1.DXA,top:U,left:Y,bottom:Z,right:J})=>[{name:"w:top",size:U},{name:"w:left",size:Y},{name:"w:bottom",size:Z},{name:"w:right",size:J}].filter((G)=>G.size!==void 0).map(({name:G,size:X})=>M1(G,{type:$,size:X})),DV=($)=>{let U=zK($);if(U.length===0)return;return new B0({name:"w:tblCellMar",children:U})},AV=($)=>{let U=zK($);if(U.length===0)return;return new B0({name:"w:tcMar",children:U})},l1={AUTO:"auto",DXA:"dxa",NIL:"nil",PERCENTAGE:"pct"},M1=($,{type:U=l1.AUTO,size:Y})=>{let Z=Y;if(U===l1.PERCENTAGE&&typeof Y==="number")Z=`${Y}%`;return new B0({name:$,attributes:{type:{key:"w:type",value:U},size:{key:"w:w",value:s9(Z)}}})};class h$ extends Q2{constructor($){super("w:tcBorders");if($.top)this.root.push(N0("w:top",$.top));if($.start)this.root.push(N0("w:start",$.start));if($.left)this.root.push(N0("w:left",$.left));if($.bottom)this.root.push(N0("w:bottom",$.bottom));if($.end)this.root.push(N0("w:end",$.end));if($.right)this.root.push(N0("w:right",$.right))}}class FK extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val"})}}class u$ extends o{constructor($){super("w:gridSpan");this.root.push(new FK({val:S0($)}))}}var d$={CONTINUE:"continue",RESTART:"restart"};class NK extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val"})}}class a1 extends o{constructor($){super("w:vMerge");this.root.push(new NK({val:$}))}}var PV={BOTTOM_TO_TOP_LEFT_TO_RIGHT:"btLr",LEFT_TO_RIGHT_TOP_TO_BOTTOM:"lrTb",TOP_TO_BOTTOM_RIGHT_TO_LEFT:"tbRl"};class RK extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val"})}}class c$ extends o{constructor($){super("w:textDirection");this.root.push(new RK({val:$}))}}class m$ extends Q2{constructor($){super("w:tcPr",$.includeIfEmpty);if($.width)this.root.push(M1("w:tcW",$.width));if($.columnSpan)this.root.push(new u$($.columnSpan));if($.verticalMerge)this.root.push(new a1($.verticalMerge));else if($.rowSpan&&$.rowSpan>1)this.root.push(new a1(d$.RESTART));if($.borders)this.root.push(new h$($.borders));if($.shading)this.root.push(j1($.shading));if($.margins){let U=AV($.margins);if(U)this.root.push(U)}if($.textDirection)this.root.push(new c$($.textDirection));if($.verticalAlign)this.root.push(f$($.verticalAlign));if($.insertion)this.root.push(new y$($.insertion));if($.deletion)this.root.push(new b$($.deletion));if($.revision)this.root.push(new DK($.revision));if($.cellMerge)this.root.push(new x$($.cellMerge))}}class DK extends o{constructor($){super("w:tcPrChange");this.root.push(new _0({id:$.id,author:$.author,date:$.date})),this.root.push(new m$(R0(W0({},$),{includeIfEmpty:!0})))}}class V8 extends o{constructor($){super("w:tc");this.options=$,this.root.push(new m$($));for(let U of $.children)this.root.push(U)}prepForXml($){if(!(this.root[this.root.length-1]instanceof h0))this.root.push(new h0({}));return super.prepForXml($)}}var x2={style:Q8.NONE,size:0,color:"auto"},f2={style:Q8.SINGLE,size:4,color:"auto"};class B8 extends o{constructor($){var U,Y,Z,J,G,X;super("w:tblBorders");this.root.push(N0("w:top",(U=$.top)!=null?U:f2)),this.root.push(N0("w:left",(Y=$.left)!=null?Y:f2)),this.root.push(N0("w:bottom",(Z=$.bottom)!=null?Z:f2)),this.root.push(N0("w:right",(J=$.right)!=null?J:f2)),this.root.push(N0("w:insideH",(G=$.insideHorizontal)!=null?G:f2)),this.root.push(N0("w:insideV",(X=$.insideVertical)!=null?X:f2))}}Y0(B8,"NONE",{top:x2,bottom:x2,left:x2,right:x2,insideHorizontal:x2,insideVertical:x2});var TV={MARGIN:"margin",PAGE:"page",TEXT:"text"},CV={CENTER:"center",INSIDE:"inside",LEFT:"left",OUTSIDE:"outside",RIGHT:"right"},OV={CENTER:"center",INSIDE:"inside",BOTTOM:"bottom",OUTSIDE:"outside",INLINE:"inline",TOP:"top"},kV={NEVER:"never",OVERLAP:"overlap"},EV=($)=>new B0({name:"w:tblOverlap",attributes:{val:{key:"w:val",value:$}}}),AK=({horizontalAnchor:$,verticalAnchor:U,absoluteHorizontalPosition:Y,relativeHorizontalPosition:Z,absoluteVerticalPosition:J,relativeVerticalPosition:G,bottomFromText:X,topFromText:Q,leftFromText:B,rightFromText:F,overlap:z})=>new B0({name:"w:tblpPr",attributes:{leftFromText:{key:"w:leftFromText",value:B===void 0?void 0:T0(B)},rightFromText:{key:"w:rightFromText",value:F===void 0?void 0:T0(F)},topFromText:{key:"w:topFromText",value:Q===void 0?void 0:T0(Q)},bottomFromText:{key:"w:bottomFromText",value:X===void 0?void 0:T0(X)},absoluteHorizontalPosition:{key:"w:tblpX",value:Y===void 0?void 0:e0(Y)},absoluteVerticalPosition:{key:"w:tblpY",value:J===void 0?void 0:e0(J)},horizontalAnchor:{key:"w:horzAnchor",value:$},relativeHorizontalPosition:{key:"w:tblpXSpec",value:Z},relativeVerticalPosition:{key:"w:tblpYSpec",value:G},verticalAnchor:{key:"w:vertAnchor",value:U}},children:z?[EV(z)]:void 0}),SV={AUTOFIT:"autofit",FIXED:"fixed"},PK=($)=>new B0({name:"w:tblLayout",attributes:{type:{key:"w:type",value:$}}}),vV={DXA:"dxa"},TK=({type:$=vV.DXA,value:U})=>new B0({name:"w:tblCellSpacing",attributes:{type:{key:"w:type",value:$},value:{key:"w:w",value:s9(U)}}}),CK=({firstRow:$,lastRow:U,firstColumn:Y,lastColumn:Z,noHBand:J,noVBand:G})=>new B0({name:"w:tblLook",attributes:{firstRow:{key:"w:firstRow",value:$},lastRow:{key:"w:lastRow",value:U},firstColumn:{key:"w:firstColumn",value:Y},lastColumn:{key:"w:lastColumn",value:Z},noHBand:{key:"w:noHBand",value:J},noVBand:{key:"w:noVBand",value:G}}});class L8 extends Q2{constructor($){super("w:tblPr",$.includeIfEmpty);if($.style)this.root.push(new Y2("w:tblStyle",$.style));if($.float)this.root.push(AK($.float));if($.visuallyRightToLeft!==void 0)this.root.push(new X0("w:bidiVisual",$.visuallyRightToLeft));if($.width)this.root.push(M1("w:tblW",$.width));if($.alignment)this.root.push(n9($.alignment));if($.indent)this.root.push(M1("w:tblInd",$.indent));if($.borders)this.root.push(new B8($.borders));if($.shading)this.root.push(j1($.shading));if($.layout)this.root.push(PK($.layout));if($.cellMargin){let U=DV($.cellMargin);if(U)this.root.push(U)}if($.tableLook)this.root.push(CK($.tableLook));if($.cellSpacing)this.root.push(TK($.cellSpacing));if($.revision)this.root.push(new OK($.revision))}}class OK extends o{constructor($){super("w:tblPrChange");this.root.push(new _0({id:$.id,author:$.author,date:$.date})),this.root.push(new L8(R0(W0({},$),{includeIfEmpty:!0})))}}class kK extends r2{constructor({rows:$,width:U,columnWidths:Y=Array(Math.max(...$.map((H)=>H.CellCount))).fill(100),columnWidthsRevision:Z,margins:J,indent:G,float:X,layout:Q,style:B,borders:F,alignment:z,visuallyRightToLeft:W,tableLook:k,cellSpacing:D,revision:C}){super("w:tbl");this.root.push(new L8({borders:F!=null?F:{},width:U!=null?U:{size:100},indent:G,float:X,layout:Q,style:B,alignment:z,cellMargin:J,visuallyRightToLeft:W,tableLook:k,cellSpacing:D,revision:C})),this.root.push(new S$(Y,Z));for(let H of $)this.root.push(H);$.forEach((H,O)=>{if(O===$.length-1)return;let V=0;H.cells.forEach((j)=>{if(j.options.rowSpan&&j.options.rowSpan>1){let M=new V8({rowSpan:j.options.rowSpan-1,columnSpan:j.options.columnSpan,borders:j.options.borders,children:[],verticalMerge:d$.CONTINUE});$[O+1].addCellToColumnIndex(M,V)}V+=j.options.columnSpan||1})})}}var _V={AUTO:"auto",ATLEAST:"atLeast",EXACT:"exact"},EK=($,U)=>new B0({name:"w:trHeight",attributes:{value:{key:"w:val",value:T0($)},rule:{key:"w:hRule",value:U}}});class M8 extends Q2{constructor($){super("w:trPr",$.includeIfEmpty);if($.cantSplit!==void 0)this.root.push(new X0("w:cantSplit",$.cantSplit));if($.tableHeader!==void 0)this.root.push(new X0("w:tblHeader",$.tableHeader));if($.height)this.root.push(EK($.height.value,$.height.rule));if($.cellSpacing)this.root.push(TK($.cellSpacing));if($.insertion)this.root.push(new v$($.insertion));if($.deletion)this.root.push(new _$($.deletion));if($.revision)this.root.push(new l$($.revision))}}class l$ extends o{constructor($){super("w:trPrChange");this.root.push(new _0({id:$.id,author:$.author,date:$.date})),this.root.push(new M8(R0(W0({},$),{includeIfEmpty:!0})))}}class SK extends o{constructor($){super("w:tr");this.options=$,this.root.push(new M8($));for(let U of $.children)this.root.push(U)}get CellCount(){return this.options.children.length}get cells(){return this.root.filter(($)=>$ instanceof V8)}addCellToIndex($,U){this.root.splice(U+1,0,$)}addCellToColumnIndex($,U){let Y=this.columnIndexToRootIndex(U,!0);this.addCellToIndex($,Y-1)}rootIndexToColumnIndex($){if($<1||$>=this.root.length)throw Error(`cell 'rootIndex' should between 1 to ${this.root.length-1}`);let U=0;for(let Y=1;Y<$;Y++){let Z=this.root[Y];U+=Z.options.columnSpan||1}return U}columnIndexToRootIndex($,U=!1){if($<0)throw Error("cell 'columnIndex' should not less than zero");let Y=0,Z=1;while(Y<=$){if(Z>=this.root.length)if(U)return this.root.length;else throw Error(`cell 'columnIndex' should not great than ${Y-1}`);let J=this.root[Z];Z+=1,Y+=J&&J.options.columnSpan||1}return Z-1}}class vK extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{xmlns:"xmlns",vt:"xmlns:vt"})}}class _K extends o{constructor(){super("Properties");this.root.push(new vK({xmlns:"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties",vt:"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"}))}}class yK extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{xmlns:"xmlns"})}}var B2=($,U)=>new B0({name:"Default",attributes:{contentType:{key:"ContentType",value:$},extension:{key:"Extension",value:U}}}),f0=($,U)=>new B0({name:"Override",attributes:{contentType:{key:"ContentType",value:$},partName:{key:"PartName",value:U}}});class bK extends o{constructor(){super("Types");this.root.push(new yK({xmlns:"http://schemas.openxmlformats.org/package/2006/content-types"})),this.root.push(B2("image/png","png")),this.root.push(B2("image/jpeg","jpeg")),this.root.push(B2("image/jpeg","jpg")),this.root.push(B2("image/bmp","bmp")),this.root.push(B2("image/gif","gif")),this.root.push(B2("image/svg+xml","svg")),this.root.push(B2("application/vnd.openxmlformats-package.relationships+xml","rels")),this.root.push(B2("application/xml","xml")),this.root.push(B2("application/vnd.openxmlformats-officedocument.obfuscatedFont","odttf")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml","/word/document.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml","/word/styles.xml")),this.root.push(f0("application/vnd.openxmlformats-package.core-properties+xml","/docProps/core.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.custom-properties+xml","/docProps/custom.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.extended-properties+xml","/docProps/app.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml","/word/numbering.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml","/word/footnotes.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml","/word/endnotes.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml","/word/settings.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml","/word/comments.xml")),this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml","/word/fontTable.xml"))}addFooter($){this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml",`/word/footer${$}.xml`))}addHeader($){this.root.push(f0("application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml",`/word/header${$}.xml`))}}var p1={wpc:"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",mc:"http://schemas.openxmlformats.org/markup-compatibility/2006",o:"urn:schemas-microsoft-com:office:office",r:"http://schemas.openxmlformats.org/officeDocument/2006/relationships",m:"http://schemas.openxmlformats.org/officeDocument/2006/math",v:"urn:schemas-microsoft-com:vml",wp14:"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",wp:"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",w10:"urn:schemas-microsoft-com:office:word",w:"http://schemas.openxmlformats.org/wordprocessingml/2006/main",w14:"http://schemas.microsoft.com/office/word/2010/wordml",w15:"http://schemas.microsoft.com/office/word/2012/wordml",wpg:"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",wpi:"http://schemas.microsoft.com/office/word/2010/wordprocessingInk",wne:"http://schemas.microsoft.com/office/word/2006/wordml",wps:"http://schemas.microsoft.com/office/word/2010/wordprocessingShape",cp:"http://schemas.openxmlformats.org/package/2006/metadata/core-properties",dc:"http://purl.org/dc/elements/1.1/",dcterms:"http://purl.org/dc/terms/",dcmitype:"http://purl.org/dc/dcmitype/",xsi:"http://www.w3.org/2001/XMLSchema-instance",cx:"http://schemas.microsoft.com/office/drawing/2014/chartex",cx1:"http://schemas.microsoft.com/office/drawing/2015/9/8/chartex",cx2:"http://schemas.microsoft.com/office/drawing/2015/10/21/chartex",cx3:"http://schemas.microsoft.com/office/drawing/2016/5/9/chartex",cx4:"http://schemas.microsoft.com/office/drawing/2016/5/10/chartex",cx5:"http://schemas.microsoft.com/office/drawing/2016/5/11/chartex",cx6:"http://schemas.microsoft.com/office/drawing/2016/5/12/chartex",cx7:"http://schemas.microsoft.com/office/drawing/2016/5/13/chartex",cx8:"http://schemas.microsoft.com/office/drawing/2016/5/14/chartex",aink:"http://schemas.microsoft.com/office/drawing/2016/ink",am3d:"http://schemas.microsoft.com/office/drawing/2017/model3d",w16cex:"http://schemas.microsoft.com/office/word/2018/wordml/cex",w16cid:"http://schemas.microsoft.com/office/word/2016/wordml/cid",w16:"http://schemas.microsoft.com/office/word/2018/wordml",w16sdtdh:"http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash",w16se:"http://schemas.microsoft.com/office/word/2015/wordml/symex"};class o2 extends I0{constructor($,U){super(W0({Ignorable:U},Object.fromEntries($.map((Y)=>[Y,p1[Y]]))));Y0(this,"xmlKeys",W0({Ignorable:"mc:Ignorable"},Object.fromEntries(Object.keys(p1).map((Y)=>[Y,`xmlns:${Y}`]))))}}class gK extends o{constructor($){super("cp:coreProperties");if(this.root.push(new o2(["cp","dc","dcterms","dcmitype","xsi"])),$.title)this.root.push(new L2("dc:title",$.title));if($.subject)this.root.push(new L2("dc:subject",$.subject));if($.creator)this.root.push(new L2("dc:creator",$.creator));if($.keywords)this.root.push(new L2("cp:keywords",$.keywords));if($.description)this.root.push(new L2("dc:description",$.description));if($.lastModifiedBy)this.root.push(new L2("cp:lastModifiedBy",$.lastModifiedBy));if($.revision)this.root.push(new L2("cp:revision",String($.revision)));this.root.push(new E9("dcterms:created")),this.root.push(new E9("dcterms:modified"))}}class xK extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{type:"xsi:type"})}}class E9 extends o{constructor($){super($);this.root.push(new xK({type:"dcterms:W3CDTF"})),this.root.push(OQ(new Date))}}class fK extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{xmlns:"xmlns",vt:"xmlns:vt"})}}class hK extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{formatId:"fmtid",pid:"pid",name:"name"})}}class uK extends o{constructor($,U){super("property");this.root.push(new hK({formatId:"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}",pid:$.toString(),name:U.name})),this.root.push(new dK(U.value))}}class dK extends o{constructor($){super("vt:lpwstr");this.root.push($)}}class cK extends o{constructor($){super("Properties");Y0(this,"nextId"),Y0(this,"properties",[]),this.root.push(new fK({xmlns:"http://schemas.openxmlformats.org/officeDocument/2006/custom-properties",vt:"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"})),this.nextId=2;for(let U of $)this.addCustomProperty(U)}prepForXml($){return this.properties.forEach((U)=>this.root.push(U)),super.prepForXml($)}addCustomProperty($){this.properties.push(new uK(this.nextId++,$))}}var mK=({space:$,count:U,separate:Y,equalWidth:Z,children:J})=>new B0({name:"w:cols",attributes:{space:{key:"w:space",value:$===void 0?void 0:T0($)},count:{key:"w:num",value:U===void 0?void 0:S0(U)},separate:{key:"w:sep",value:Y},equalWidth:{key:"w:equalWidth",value:Z}},children:!Z&&J?J:void 0}),yV={DEFAULT:"default",LINES:"lines",LINES_AND_CHARS:"linesAndChars",SNAP_TO_CHARS:"snapToChars"},lK=({type:$,linePitch:U,charSpace:Y})=>new B0({name:"w:docGrid",attributes:{type:{key:"w:type",value:$},linePitch:{key:"w:linePitch",value:S0(U)},charSpace:{key:"w:charSpace",value:Y?S0(Y):void 0}}}),E2={DEFAULT:"default",FIRST:"first",EVEN:"even"},S9={HEADER:"w:headerReference",FOOTER:"w:footerReference"},f1=($,U)=>new B0({name:$,attributes:{type:{key:"w:type",value:U.type||E2.DEFAULT},id:{key:"r:id",value:`rId${U.id}`}}}),bV={NEW_PAGE:"newPage",NEW_SECTION:"newSection",CONTINUOUS:"continuous"},aK=({countBy:$,start:U,restart:Y,distance:Z})=>new B0({name:"w:lnNumType",attributes:{countBy:{key:"w:countBy",value:$===void 0?void 0:S0($)},start:{key:"w:start",value:U===void 0?void 0:S0(U)},restart:{key:"w:restart",value:Y},distance:{key:"w:distance",value:Z===void 0?void 0:T0(Z)}}}),gV={ALL_PAGES:"allPages",FIRST_PAGE:"firstPage",NOT_FIRST_PAGE:"notFirstPage"},xV={PAGE:"page",TEXT:"text"},fV={BACK:"back",FRONT:"front"};class v9 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{display:"w:display",offsetFrom:"w:offsetFrom",zOrder:"w:zOrder"})}}class a$ extends Q2{constructor($){super("w:pgBorders");if(!$)return this;if($.pageBorders)this.root.push(new v9({display:$.pageBorders.display,offsetFrom:$.pageBorders.offsetFrom,zOrder:$.pageBorders.zOrder}));else this.root.push(new v9({}));if($.pageBorderTop)this.root.push(N0("w:top",$.pageBorderTop));if($.pageBorderLeft)this.root.push(N0("w:left",$.pageBorderLeft));if($.pageBorderBottom)this.root.push(N0("w:bottom",$.pageBorderBottom));if($.pageBorderRight)this.root.push(N0("w:right",$.pageBorderRight))}}var pK=($,U,Y,Z,J,G,X)=>new B0({name:"w:pgMar",attributes:{top:{key:"w:top",value:e0($)},right:{key:"w:right",value:T0(U)},bottom:{key:"w:bottom",value:e0(Y)},left:{key:"w:left",value:T0(Z)},header:{key:"w:header",value:T0(J)},footer:{key:"w:footer",value:T0(G)},gutter:{key:"w:gutter",value:T0(X)}}}),hV={HYPHEN:"hyphen",PERIOD:"period",COLON:"colon",EM_DASH:"emDash",EN_DASH:"endash"},iK=({start:$,formatType:U,separator:Y})=>new B0({name:"w:pgNumType",attributes:{start:{key:"w:start",value:$===void 0?void 0:S0($)},formatType:{key:"w:fmt",value:U},separator:{key:"w:chapSep",value:Y}}}),i1={PORTRAIT:"portrait",LANDSCAPE:"landscape"},rK=({width:$,height:U,orientation:Y,code:Z})=>{let J=T0($),G=T0(U);return new B0({name:"w:pgSz",attributes:{width:{key:"w:w",value:Y===i1.LANDSCAPE?G:J},height:{key:"w:h",value:Y===i1.LANDSCAPE?J:G},orientation:{key:"w:orient",value:Y},code:{key:"w:code",value:Z}}})},uV={LEFT_TO_RIGHT_TOP_TO_BOTTOM:"lrTb",TOP_TO_BOTTOM_RIGHT_TO_LEFT:"tbRl"};class sK extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val"})}}class p$ extends o{constructor($){super("w:textDirection");this.root.push(new sK({val:$}))}}var dV={NEXT_PAGE:"nextPage",NEXT_COLUMN:"nextColumn",CONTINUOUS:"continuous",EVEN_PAGE:"evenPage",ODD_PAGE:"oddPage"},nK=($)=>new B0({name:"w:type",attributes:{val:{key:"w:val",value:$}}}),F2={TOP:1440,RIGHT:1440,BOTTOM:1440,LEFT:1440,HEADER:708,FOOTER:708,GUTTER:0},h1={WIDTH:11906,HEIGHT:16838,ORIENTATION:i1.PORTRAIT};class I8 extends o{constructor({page:{size:{width:$=h1.WIDTH,height:U=h1.HEIGHT,orientation:Y=h1.ORIENTATION}={},margin:{top:Z=F2.TOP,right:J=F2.RIGHT,bottom:G=F2.BOTTOM,left:X=F2.LEFT,header:Q=F2.HEADER,footer:B=F2.FOOTER,gutter:F=F2.GUTTER}={},pageNumbers:z={},borders:W,textDirection:k}={},grid:{linePitch:D=360,charSpace:C,type:H}={},headerWrapperGroup:O={},footerWrapperGroup:V={},lineNumbers:j,titlePage:M,verticalAlign:L,column:A,type:y,revision:g}={}){super("w:sectPr");if(this.addHeaderFooterGroup(S9.HEADER,O),this.addHeaderFooterGroup(S9.FOOTER,V),y)this.root.push(nK(y));if(this.root.push(rK({width:$,height:U,orientation:Y})),this.root.push(pK(Z,J,G,X,Q,B,F)),W)this.root.push(new a$(W));if(j)this.root.push(aK(j));if(this.root.push(iK(z)),A)this.root.push(mK(A));if(L)this.root.push(f$(L));if(M!==void 0)this.root.push(new X0("w:titlePg",M));if(k)this.root.push(new p$(k));if(g)this.root.push(new i$(g));this.root.push(lK({linePitch:D,charSpace:C,type:H}))}addHeaderFooterGroup($,U){if(U.default)this.root.push(f1($,{type:E2.DEFAULT,id:U.default.View.ReferenceId}));if(U.first)this.root.push(f1($,{type:E2.FIRST,id:U.first.View.ReferenceId}));if(U.even)this.root.push(f1($,{type:E2.EVEN,id:U.even.View.ReferenceId}))}}class i$ extends o{constructor($){super("w:sectPrChange");this.root.push(new _0({id:$.id,author:$.author,date:$.date})),this.root.push(new I8($))}}class oK extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{width:"w:w",space:"w:space"})}}class tK extends o{constructor($){super("w:col");this.root.push(new oK({width:T0($.width),space:$.space===void 0?void 0:T0($.space)}))}}class r$ extends o{constructor(){super("w:body");Y0(this,"sections",[])}addSection($){let U=this.sections.pop();this.root.push(this.createSectionParagraph(U)),this.sections.push(new I8($))}prepForXml($){if(this.sections.length===1)this.root.splice(0,1),this.root.push(this.sections.pop());return super.prepForXml($)}push($){this.root.push($)}createSectionParagraph($){let U=new h0({}),Y=new Z2({});return Y.push($),U.addChildElement(Y),U}}class s$ extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{color:"w:color",themeColor:"w:themeColor",themeShade:"w:themeShade",themeTint:"w:themeTint"})}}class n$ extends o{constructor($){super("w:background");this.root.push(new s$({color:$.color===void 0?void 0:S2($.color),themeColor:$.themeColor,themeShade:$.themeShade===void 0?void 0:D9($.themeShade),themeTint:$.themeTint===void 0?void 0:D9($.themeTint)}))}}class eK extends o{constructor($){super("w:document");if(Y0(this,"body"),this.root.push(new o2(["wpc","mc","o","r","m","v","wp14","wp","w10","w","w14","w15","wpg","wpi","wne","wps","cx","cx1","cx2","cx3","cx4","cx5","cx6","cx7","cx8","aink","am3d","w16cex","w16cid","w16","w16sdtdh","w16se"],"w14 w15 wp14")),this.body=new r$,$.background)this.root.push(new n$($.background));this.root.push(this.body)}add($){return this.body.push($),this}get Body(){return this.body}}class $5{constructor($){Y0(this,"document"),Y0(this,"relationships"),this.document=new eK($),this.relationships=new W2}get View(){return this.document}get Relationships(){return this.relationships}}class U5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{wpc:"xmlns:wpc",mc:"xmlns:mc",o:"xmlns:o",r:"xmlns:r",m:"xmlns:m",v:"xmlns:v",wp14:"xmlns:wp14",wp:"xmlns:wp",w10:"xmlns:w10",w:"xmlns:w",w14:"xmlns:w14",w15:"xmlns:w15",wpg:"xmlns:wpg",wpi:"xmlns:wpi",wne:"xmlns:wne",wps:"xmlns:wps",Ignorable:"mc:Ignorable"})}}class Y5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{type:"w:type",id:"w:id"})}}class Z5 extends C0{constructor(){super({style:"EndnoteReference"});this.root.push(new I$)}}var fZ={SEPARATOR:"separator",CONTINUATION_SEPARATOR:"continuationSeparator"};class u1 extends o{constructor($){super("w:endnote");this.root.push(new Y5({type:$.type,id:$.id}));for(let U=0;U<$.children.length;U++){let Y=$.children[U];if(U===0)Y.addRunToFront(new Z5);this.root.push(Y)}}}class Q5 extends o{constructor(){super("w:continuationSeparator")}}class o$ extends C0{constructor(){super({});this.root.push(new Q5)}}class J5 extends o{constructor(){super("w:separator")}}class t$ extends C0{constructor(){super({});this.root.push(new J5)}}class e$ extends o{constructor(){super("w:endnotes");this.root.push(new U5({wpc:"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",mc:"http://schemas.openxmlformats.org/markup-compatibility/2006",o:"urn:schemas-microsoft-com:office:office",r:"http://schemas.openxmlformats.org/officeDocument/2006/relationships",m:"http://schemas.openxmlformats.org/officeDocument/2006/math",v:"urn:schemas-microsoft-com:vml",wp14:"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",wp:"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",w10:"urn:schemas-microsoft-com:office:word",w:"http://schemas.openxmlformats.org/wordprocessingml/2006/main",w14:"http://schemas.microsoft.com/office/word/2010/wordml",w15:"http://schemas.microsoft.com/office/word/2012/wordml",wpg:"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",wpi:"http://schemas.microsoft.com/office/word/2010/wordprocessingInk",wne:"http://schemas.microsoft.com/office/word/2006/wordml",wps:"http://schemas.microsoft.com/office/word/2010/wordprocessingShape",Ignorable:"w14 w15 wp14"}));let $=new u1({id:-1,type:fZ.SEPARATOR,children:[new h0({spacing:{after:0,line:240,lineRule:v2.AUTO},children:[new t$]})]});this.root.push($);let U=new u1({id:0,type:fZ.CONTINUATION_SEPARATOR,children:[new h0({spacing:{after:0,line:240,lineRule:v2.AUTO},children:[new o$]})]});this.root.push(U)}createEndnote($,U){let Y=new u1({id:$,children:U});this.root.push(Y)}}class G5{constructor(){Y0(this,"endnotes"),Y0(this,"relationships"),this.endnotes=new e$,this.relationships=new W2}get View(){return this.endnotes}get Relationships(){return this.relationships}}class K5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{wpc:"xmlns:wpc",mc:"xmlns:mc",o:"xmlns:o",r:"xmlns:r",m:"xmlns:m",v:"xmlns:v",wp14:"xmlns:wp14",wp:"xmlns:wp",w10:"xmlns:w10",w:"xmlns:w",w14:"xmlns:w14",w15:"xmlns:w15",wpg:"xmlns:wpg",wpi:"xmlns:wpi",wne:"xmlns:wne",wps:"xmlns:wps",cp:"xmlns:cp",dc:"xmlns:dc",dcterms:"xmlns:dcterms",dcmitype:"xmlns:dcmitype",xsi:"xmlns:xsi",type:"xsi:type"})}}var cV=class extends Y8{constructor(U,Y){super("w:ftr",Y);if(Y0(this,"refId"),this.refId=U,!Y)this.root.push(new K5({wpc:"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",mc:"http://schemas.openxmlformats.org/markup-compatibility/2006",o:"urn:schemas-microsoft-com:office:office",r:"http://schemas.openxmlformats.org/officeDocument/2006/relationships",m:"http://schemas.openxmlformats.org/officeDocument/2006/math",v:"urn:schemas-microsoft-com:vml",wp14:"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",wp:"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",w10:"urn:schemas-microsoft-com:office:word",w:"http://schemas.openxmlformats.org/wordprocessingml/2006/main",w14:"http://schemas.microsoft.com/office/word/2010/wordml",w15:"http://schemas.microsoft.com/office/word/2012/wordml",wpg:"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",wpi:"http://schemas.microsoft.com/office/word/2010/wordprocessingInk",wne:"http://schemas.microsoft.com/office/word/2006/wordml",wps:"http://schemas.microsoft.com/office/word/2010/wordprocessingShape"}))}get ReferenceId(){return this.refId}add(U){this.root.push(U)}};class $U{constructor($,U,Y){Y0(this,"footer"),Y0(this,"relationships"),this.media=$,this.footer=new cV(U,Y),this.relationships=new W2}add($){this.footer.add($)}addChildElement($){this.footer.addChildElement($)}get View(){return this.footer}get Relationships(){return this.relationships}get Media(){return this.media}}class q5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{type:"w:type",id:"w:id"})}}class X5 extends o{constructor(){super("w:footnoteRef")}}class V5 extends C0{constructor(){super({style:"FootnoteReference"});this.root.push(new X5)}}var hZ={SEPERATOR:"separator",CONTINUATION_SEPERATOR:"continuationSeparator"};class d1 extends o{constructor($){super("w:footnote");this.root.push(new q5({type:$.type,id:$.id}));for(let U=0;U<$.children.length;U++){let Y=$.children[U];if(U===0)Y.addRunToFront(new V5);this.root.push(Y)}}}class B5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{wpc:"xmlns:wpc",mc:"xmlns:mc",o:"xmlns:o",r:"xmlns:r",m:"xmlns:m",v:"xmlns:v",wp14:"xmlns:wp14",wp:"xmlns:wp",w10:"xmlns:w10",w:"xmlns:w",w14:"xmlns:w14",w15:"xmlns:w15",wpg:"xmlns:wpg",wpi:"xmlns:wpi",wne:"xmlns:wne",wps:"xmlns:wps",Ignorable:"mc:Ignorable"})}}class UU extends o{constructor(){super("w:footnotes");this.root.push(new B5({wpc:"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",mc:"http://schemas.openxmlformats.org/markup-compatibility/2006",o:"urn:schemas-microsoft-com:office:office",r:"http://schemas.openxmlformats.org/officeDocument/2006/relationships",m:"http://schemas.openxmlformats.org/officeDocument/2006/math",v:"urn:schemas-microsoft-com:vml",wp14:"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",wp:"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",w10:"urn:schemas-microsoft-com:office:word",w:"http://schemas.openxmlformats.org/wordprocessingml/2006/main",w14:"http://schemas.microsoft.com/office/word/2010/wordml",w15:"http://schemas.microsoft.com/office/word/2012/wordml",wpg:"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",wpi:"http://schemas.microsoft.com/office/word/2010/wordprocessingInk",wne:"http://schemas.microsoft.com/office/word/2006/wordml",wps:"http://schemas.microsoft.com/office/word/2010/wordprocessingShape",Ignorable:"w14 w15 wp14"}));let $=new d1({id:-1,type:hZ.SEPERATOR,children:[new h0({spacing:{after:0,line:240,lineRule:v2.AUTO},children:[new t$]})]});this.root.push($);let U=new d1({id:0,type:hZ.CONTINUATION_SEPERATOR,children:[new h0({spacing:{after:0,line:240,lineRule:v2.AUTO},children:[new o$]})]});this.root.push(U)}createFootNote($,U){let Y=new d1({id:$,children:U});this.root.push(Y)}}class L5{constructor(){Y0(this,"footnotess"),Y0(this,"relationships"),this.footnotess=new UU,this.relationships=new W2}get View(){return this.footnotess}get Relationships(){return this.relationships}}class M5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{wpc:"xmlns:wpc",mc:"xmlns:mc",o:"xmlns:o",r:"xmlns:r",m:"xmlns:m",v:"xmlns:v",wp14:"xmlns:wp14",wp:"xmlns:wp",w10:"xmlns:w10",w:"xmlns:w",w14:"xmlns:w14",w15:"xmlns:w15",wpg:"xmlns:wpg",wpi:"xmlns:wpi",wne:"xmlns:wne",wps:"xmlns:wps",cp:"xmlns:cp",dc:"xmlns:dc",dcterms:"xmlns:dcterms",dcmitype:"xmlns:dcmitype",xsi:"xmlns:xsi",type:"xsi:type",cx:"xmlns:cx",cx1:"xmlns:cx1",cx2:"xmlns:cx2",cx3:"xmlns:cx3",cx4:"xmlns:cx4",cx5:"xmlns:cx5",cx6:"xmlns:cx6",cx7:"xmlns:cx7",cx8:"xmlns:cx8",w16cid:"xmlns:w16cid",w16se:"xmlns:w16se"})}}var mV=class extends Y8{constructor(U,Y){super("w:hdr",Y);if(Y0(this,"refId"),this.refId=U,!Y)this.root.push(new M5({wpc:"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",mc:"http://schemas.openxmlformats.org/markup-compatibility/2006",o:"urn:schemas-microsoft-com:office:office",r:"http://schemas.openxmlformats.org/officeDocument/2006/relationships",m:"http://schemas.openxmlformats.org/officeDocument/2006/math",v:"urn:schemas-microsoft-com:vml",wp14:"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",wp:"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",w10:"urn:schemas-microsoft-com:office:word",w:"http://schemas.openxmlformats.org/wordprocessingml/2006/main",w14:"http://schemas.microsoft.com/office/word/2010/wordml",w15:"http://schemas.microsoft.com/office/word/2012/wordml",wpg:"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",wpi:"http://schemas.microsoft.com/office/word/2010/wordprocessingInk",wne:"http://schemas.microsoft.com/office/word/2006/wordml",wps:"http://schemas.microsoft.com/office/word/2010/wordprocessingShape",cx:"http://schemas.microsoft.com/office/drawing/2014/chartex",cx1:"http://schemas.microsoft.com/office/drawing/2015/9/8/chartex",cx2:"http://schemas.microsoft.com/office/drawing/2015/10/21/chartex",cx3:"http://schemas.microsoft.com/office/drawing/2016/5/9/chartex",cx4:"http://schemas.microsoft.com/office/drawing/2016/5/10/chartex",cx5:"http://schemas.microsoft.com/office/drawing/2016/5/11/chartex",cx6:"http://schemas.microsoft.com/office/drawing/2016/5/12/chartex",cx7:"http://schemas.microsoft.com/office/drawing/2016/5/13/chartex",cx8:"http://schemas.microsoft.com/office/drawing/2016/5/14/chartex",w16cid:"http://schemas.microsoft.com/office/word/2016/wordml/cid",w16se:"http://schemas.microsoft.com/office/word/2015/wordml/symex"}))}get ReferenceId(){return this.refId}add(U){this.root.push(U)}};class YU{constructor($,U,Y){Y0(this,"header"),Y0(this,"relationships"),this.media=$,this.header=new mV(U,Y),this.relationships=new W2}add($){return this.header.add($),this}addChildElement($){this.header.addChildElement($)}get View(){return this.header}get Relationships(){return this.relationships}get Media(){return this.media}}class w8{constructor(){Y0(this,"map"),this.map=new Map}addImage($,U){this.map.set($,U)}get Array(){return Array.from(this.map.values())}}var lV="",n0={DECIMAL:"decimal",UPPER_ROMAN:"upperRoman",LOWER_ROMAN:"lowerRoman",UPPER_LETTER:"upperLetter",LOWER_LETTER:"lowerLetter",ORDINAL:"ordinal",CARDINAL_TEXT:"cardinalText",ORDINAL_TEXT:"ordinalText",HEX:"hex",CHICAGO:"chicago",IDEOGRAPH__DIGITAL:"ideographDigital",JAPANESE_COUNTING:"japaneseCounting",AIUEO:"aiueo",IROHA:"iroha",DECIMAL_FULL_WIDTH:"decimalFullWidth",DECIMAL_HALF_WIDTH:"decimalHalfWidth",JAPANESE_LEGAL:"japaneseLegal",JAPANESE_DIGITAL_TEN_THOUSAND:"japaneseDigitalTenThousand",DECIMAL_ENCLOSED_CIRCLE:"decimalEnclosedCircle",DECIMAL_FULL_WIDTH2:"decimalFullWidth2",AIUEO_FULL_WIDTH:"aiueoFullWidth",IROHA_FULL_WIDTH:"irohaFullWidth",DECIMAL_ZERO:"decimalZero",BULLET:"bullet",GANADA:"ganada",CHOSUNG:"chosung",DECIMAL_ENCLOSED_FULLSTOP:"decimalEnclosedFullstop",DECIMAL_ENCLOSED_PARENTHESES:"decimalEnclosedParen",DECIMAL_ENCLOSED_CIRCLE_CHINESE:"decimalEnclosedCircleChinese",IDEOGRAPH_ENCLOSED_CIRCLE:"ideographEnclosedCircle",IDEOGRAPH_TRADITIONAL:"ideographTraditional",IDEOGRAPH_ZODIAC:"ideographZodiac",IDEOGRAPH_ZODIAC_TRADITIONAL:"ideographZodiacTraditional",TAIWANESE_COUNTING:"taiwaneseCounting",IDEOGRAPH_LEGAL_TRADITIONAL:"ideographLegalTraditional",TAIWANESE_COUNTING_THOUSAND:"taiwaneseCountingThousand",TAIWANESE_DIGITAL:"taiwaneseDigital",CHINESE_COUNTING:"chineseCounting",CHINESE_LEGAL_SIMPLIFIED:"chineseLegalSimplified",CHINESE_COUNTING_THOUSAND:"chineseCountingThousand",KOREAN_DIGITAL:"koreanDigital",KOREAN_COUNTING:"koreanCounting",KOREAN_LEGAL:"koreanLegal",KOREAN_DIGITAL2:"koreanDigital2",VIETNAMESE_COUNTING:"vietnameseCounting",RUSSIAN_LOWER:"russianLower",RUSSIAN_UPPER:"russianUpper",NONE:"none",NUMBER_IN_DASH:"numberInDash",HEBREW1:"hebrew1",HEBREW2:"hebrew2",ARABIC_ALPHA:"arabicAlpha",ARABIC_ABJAD:"arabicAbjad",HINDI_VOWELS:"hindiVowels",HINDI_CONSONANTS:"hindiConsonants",HINDI_NUMBERS:"hindiNumbers",HINDI_COUNTING:"hindiCounting",THAI_LETTERS:"thaiLetters",THAI_NUMBERS:"thaiNumbers",THAI_COUNTING:"thaiCounting",BAHT_TEXT:"bahtText",DOLLAR_TEXT:"dollarText",CUSTOM:"custom"};class I5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{ilvl:"w:ilvl",tentative:"w15:tentative"})}}class w5 extends o{constructor($){super("w:numFmt");this.root.push(new O0({val:$}))}}class W5 extends o{constructor($){super("w:lvlText");this.root.push(new O0({val:$}))}}class H5 extends o{constructor($){super("w:lvlJc");this.root.push(new O0({val:$}))}}var aV={NOTHING:"nothing",SPACE:"space",TAB:"tab"};class j5 extends o{constructor($){super("w:suff");this.root.push(new O0({val:$}))}}class z5 extends o{constructor(){super("w:isLgl")}}class W8 extends o{constructor({level:$,format:U,text:Y,alignment:Z=m0.START,start:J=1,style:G,suffix:X,isLegalNumberingStyle:Q}){super("w:lvl");if(Y0(this,"paragraphProperties"),Y0(this,"runProperties"),this.root.push(new k2("w:start",S0(J))),U)this.root.push(new w5(U));if(X)this.root.push(new j5(X));if(Q)this.root.push(new z5);if(Y)this.root.push(new W5(Y));if(this.root.push(new H5(Z)),this.paragraphProperties=new Z2(G&&G.paragraph),this.runProperties=new J2(G&&G.run),this.root.push(this.paragraphProperties),this.root.push(this.runProperties),$>9)throw Error("Level cannot be greater than 9. Read more here: https://answers.microsoft.com/en-us/msoffice/forum/all/does-word-support-more-than-9-list-levels/d130fdcd-1781-446d-8c84-c6c79124e4d7");this.root.push(new I5({ilvl:S0($),tentative:1}))}}class ZU extends W8{}class F5 extends W8{}class N5 extends o{constructor($){super("w:multiLevelType");this.root.push(new O0({val:$}))}}class R5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{abstractNumId:"w:abstractNumId",restartNumberingAfterBreak:"w15:restartNumberingAfterBreak"})}}class r1 extends o{constructor($,U){super("w:abstractNum");Y0(this,"id"),this.root.push(new R5({abstractNumId:S0($),restartNumberingAfterBreak:0})),this.root.push(new N5("hybridMultilevel")),this.id=$;for(let Y of U)this.root.push(new ZU(Y))}}class D5 extends o{constructor($){super("w:abstractNumId");this.root.push(new O0({val:$}))}}class A5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{numId:"w:numId"})}}class s1 extends o{constructor($){super("w:num");if(Y0(this,"numId"),Y0(this,"reference"),Y0(this,"instance"),this.numId=$.numId,this.reference=$.reference,this.instance=$.instance,this.root.push(new A5({numId:S0($.numId)})),this.root.push(new D5(S0($.abstractNumId))),$.overrideLevels&&$.overrideLevels.length)for(let U of $.overrideLevels)this.root.push(new QU(U.num,U.start))}}class P5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{ilvl:"w:ilvl"})}}class QU extends o{constructor($,U){super("w:lvlOverride");if(this.root.push(new P5({ilvl:$})),U!==void 0)this.root.push(new C5(U))}}class T5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val"})}}class C5 extends o{constructor($){super("w:startOverride");this.root.push(new T5({val:$}))}}class JU extends o{constructor($){super("w:numbering");Y0(this,"abstractNumberingMap",new Map),Y0(this,"concreteNumberingMap",new Map),Y0(this,"referenceConfigMap",new Map),Y0(this,"abstractNumUniqueNumericId",rQ()),Y0(this,"concreteNumUniqueNumericId",sQ()),this.root.push(new o2(["wpc","mc","o","r","m","v","wp14","wp","w10","w","w14","w15","wpg","wpi","wne","wps"],"w14 w15 wp14"));let U=new r1(this.abstractNumUniqueNumericId(),[{level:0,format:n0.BULLET,text:"●",alignment:m0.LEFT,style:{paragraph:{indent:{left:d0(0.5),hanging:d0(0.25)}}}},{level:1,format:n0.BULLET,text:"○",alignment:m0.LEFT,style:{paragraph:{indent:{left:d0(1),hanging:d0(0.25)}}}},{level:2,format:n0.BULLET,text:"■",alignment:m0.LEFT,style:{paragraph:{indent:{left:2160,hanging:d0(0.25)}}}},{level:3,format:n0.BULLET,text:"●",alignment:m0.LEFT,style:{paragraph:{indent:{left:2880,hanging:d0(0.25)}}}},{level:4,format:n0.BULLET,text:"○",alignment:m0.LEFT,style:{paragraph:{indent:{left:3600,hanging:d0(0.25)}}}},{level:5,format:n0.BULLET,text:"■",alignment:m0.LEFT,style:{paragraph:{indent:{left:4320,hanging:d0(0.25)}}}},{level:6,format:n0.BULLET,text:"●",alignment:m0.LEFT,style:{paragraph:{indent:{left:5040,hanging:d0(0.25)}}}},{level:7,format:n0.BULLET,text:"●",alignment:m0.LEFT,style:{paragraph:{indent:{left:5760,hanging:d0(0.25)}}}},{level:8,format:n0.BULLET,text:"●",alignment:m0.LEFT,style:{paragraph:{indent:{left:6480,hanging:d0(0.25)}}}}]);this.concreteNumberingMap.set("default-bullet-numbering",new s1({numId:1,abstractNumId:U.id,reference:"default-bullet-numbering",instance:0,overrideLevels:[{num:0,start:1}]})),this.abstractNumberingMap.set("default-bullet-numbering",U);for(let Y of $.config)this.abstractNumberingMap.set(Y.reference,new r1(this.abstractNumUniqueNumericId(),Y.levels)),this.referenceConfigMap.set(Y.reference,Y.levels)}prepForXml($){for(let U of this.abstractNumberingMap.values())this.root.push(U);for(let U of this.concreteNumberingMap.values())this.root.push(U);return super.prepForXml($)}createConcreteNumberingInstance($,U){let Y=this.abstractNumberingMap.get($);if(!Y)return;let Z=`${$}-${U}`;if(this.concreteNumberingMap.has(Z))return;let J=this.referenceConfigMap.get($),G=J&&J[0].start,X={numId:this.concreteNumUniqueNumericId(),abstractNumId:Y.id,reference:$,instance:U,overrideLevels:[typeof G==="number"&&Number.isInteger(G)?{num:0,start:G}:{num:0,start:1}]};this.concreteNumberingMap.set(Z,new s1(X))}get ConcreteNumbering(){return Array.from(this.concreteNumberingMap.values())}get ReferenceConfig(){return Array.from(this.referenceConfigMap.values())}}var pV=($)=>new B0({name:"w:compatSetting",attributes:{version:{key:"w:val",value:$},name:{key:"w:name",value:"compatibilityMode"},uri:{key:"w:uri",value:"http://schemas.microsoft.com/office/word"}}});class O5 extends o{constructor($){super("w:compat");if($.version)this.root.push(pV($.version));if($.useSingleBorderforContiguousCells)this.root.push(new X0("w:useSingleBorderforContiguousCells",$.useSingleBorderforContiguousCells));if($.wordPerfectJustification)this.root.push(new X0("w:wpJustification",$.wordPerfectJustification));if($.noTabStopForHangingIndent)this.root.push(new X0("w:noTabHangInd",$.noTabStopForHangingIndent));if($.noLeading)this.root.push(new X0("w:noLeading",$.noLeading));if($.spaceForUnderline)this.root.push(new X0("w:spaceForUL",$.spaceForUnderline));if($.noColumnBalance)this.root.push(new X0("w:noColumnBalance",$.noColumnBalance));if($.balanceSingleByteDoubleByteWidth)this.root.push(new X0("w:balanceSingleByteDoubleByteWidth",$.balanceSingleByteDoubleByteWidth));if($.noExtraLineSpacing)this.root.push(new X0("w:noExtraLineSpacing",$.noExtraLineSpacing));if($.doNotLeaveBackslashAlone)this.root.push(new X0("w:doNotLeaveBackslashAlone",$.doNotLeaveBackslashAlone));if($.underlineTrailingSpaces)this.root.push(new X0("w:ulTrailSpace",$.underlineTrailingSpaces));if($.doNotExpandShiftReturn)this.root.push(new X0("w:doNotExpandShiftReturn",$.doNotExpandShiftReturn));if($.spacingInWholePoints)this.root.push(new X0("w:spacingInWholePoints",$.spacingInWholePoints));if($.lineWrapLikeWord6)this.root.push(new X0("w:lineWrapLikeWord6",$.lineWrapLikeWord6));if($.printBodyTextBeforeHeader)this.root.push(new X0("w:printBodyTextBeforeHeader",$.printBodyTextBeforeHeader));if($.printColorsBlack)this.root.push(new X0("w:printColBlack",$.printColorsBlack));if($.spaceWidth)this.root.push(new X0("w:wpSpaceWidth",$.spaceWidth));if($.showBreaksInFrames)this.root.push(new X0("w:showBreaksInFrames",$.showBreaksInFrames));if($.subFontBySize)this.root.push(new X0("w:subFontBySize",$.subFontBySize));if($.suppressBottomSpacing)this.root.push(new X0("w:suppressBottomSpacing",$.suppressBottomSpacing));if($.suppressTopSpacing)this.root.push(new X0("w:suppressTopSpacing",$.suppressTopSpacing));if($.suppressSpacingAtTopOfPage)this.root.push(new X0("w:suppressSpacingAtTopOfPage",$.suppressSpacingAtTopOfPage));if($.suppressTopSpacingWP)this.root.push(new X0("w:suppressTopSpacingWP",$.suppressTopSpacingWP));if($.suppressSpBfAfterPgBrk)this.root.push(new X0("w:suppressSpBfAfterPgBrk",$.suppressSpBfAfterPgBrk));if($.swapBordersFacingPages)this.root.push(new X0("w:swapBordersFacingPages",$.swapBordersFacingPages));if($.convertMailMergeEsc)this.root.push(new X0("w:convMailMergeEsc",$.convertMailMergeEsc));if($.truncateFontHeightsLikeWP6)this.root.push(new X0("w:truncateFontHeightsLikeWP6",$.truncateFontHeightsLikeWP6));if($.macWordSmallCaps)this.root.push(new X0("w:mwSmallCaps",$.macWordSmallCaps));if($.usePrinterMetrics)this.root.push(new X0("w:usePrinterMetrics",$.usePrinterMetrics));if($.doNotSuppressParagraphBorders)this.root.push(new X0("w:doNotSuppressParagraphBorders",$.doNotSuppressParagraphBorders));if($.wrapTrailSpaces)this.root.push(new X0("w:wrapTrailSpaces",$.wrapTrailSpaces));if($.footnoteLayoutLikeWW8)this.root.push(new X0("w:footnoteLayoutLikeWW8",$.footnoteLayoutLikeWW8));if($.shapeLayoutLikeWW8)this.root.push(new X0("w:shapeLayoutLikeWW8",$.shapeLayoutLikeWW8));if($.alignTablesRowByRow)this.root.push(new X0("w:alignTablesRowByRow",$.alignTablesRowByRow));if($.forgetLastTabAlignment)this.root.push(new X0("w:forgetLastTabAlignment",$.forgetLastTabAlignment));if($.adjustLineHeightInTable)this.root.push(new X0("w:adjustLineHeightInTable",$.adjustLineHeightInTable));if($.autoSpaceLikeWord95)this.root.push(new X0("w:autoSpaceLikeWord95",$.autoSpaceLikeWord95));if($.noSpaceRaiseLower)this.root.push(new X0("w:noSpaceRaiseLower",$.noSpaceRaiseLower));if($.doNotUseHTMLParagraphAutoSpacing)this.root.push(new X0("w:doNotUseHTMLParagraphAutoSpacing",$.doNotUseHTMLParagraphAutoSpacing));if($.layoutRawTableWidth)this.root.push(new X0("w:layoutRawTableWidth",$.layoutRawTableWidth));if($.layoutTableRowsApart)this.root.push(new X0("w:layoutTableRowsApart",$.layoutTableRowsApart));if($.useWord97LineBreakRules)this.root.push(new X0("w:useWord97LineBreakRules",$.useWord97LineBreakRules));if($.doNotBreakWrappedTables)this.root.push(new X0("w:doNotBreakWrappedTables",$.doNotBreakWrappedTables));if($.doNotSnapToGridInCell)this.root.push(new X0("w:doNotSnapToGridInCell",$.doNotSnapToGridInCell));if($.selectFieldWithFirstOrLastCharacter)this.root.push(new X0("w:selectFldWithFirstOrLastChar",$.selectFieldWithFirstOrLastCharacter));if($.applyBreakingRules)this.root.push(new X0("w:applyBreakingRules",$.applyBreakingRules));if($.doNotWrapTextWithPunctuation)this.root.push(new X0("w:doNotWrapTextWithPunct",$.doNotWrapTextWithPunctuation));if($.doNotUseEastAsianBreakRules)this.root.push(new X0("w:doNotUseEastAsianBreakRules",$.doNotUseEastAsianBreakRules));if($.useWord2002TableStyleRules)this.root.push(new X0("w:useWord2002TableStyleRules",$.useWord2002TableStyleRules));if($.growAutofit)this.root.push(new X0("w:growAutofit",$.growAutofit));if($.useFELayout)this.root.push(new X0("w:useFELayout",$.useFELayout));if($.useNormalStyleForList)this.root.push(new X0("w:useNormalStyleForList",$.useNormalStyleForList));if($.doNotUseIndentAsNumberingTabStop)this.root.push(new X0("w:doNotUseIndentAsNumberingTabStop",$.doNotUseIndentAsNumberingTabStop));if($.useAlternateEastAsianLineBreakRules)this.root.push(new X0("w:useAltKinsokuLineBreakRules",$.useAlternateEastAsianLineBreakRules));if($.allowSpaceOfSameStyleInTable)this.root.push(new X0("w:allowSpaceOfSameStyleInTable",$.allowSpaceOfSameStyleInTable));if($.doNotSuppressIndentation)this.root.push(new X0("w:doNotSuppressIndentation",$.doNotSuppressIndentation));if($.doNotAutofitConstrainedTables)this.root.push(new X0("w:doNotAutofitConstrainedTables",$.doNotAutofitConstrainedTables));if($.autofitToFirstFixedWidthCell)this.root.push(new X0("w:autofitToFirstFixedWidthCell",$.autofitToFirstFixedWidthCell));if($.underlineTabInNumberingList)this.root.push(new X0("w:underlineTabInNumList",$.underlineTabInNumberingList));if($.displayHangulFixedWidth)this.root.push(new X0("w:displayHangulFixedWidth",$.displayHangulFixedWidth));if($.splitPgBreakAndParaMark)this.root.push(new X0("w:splitPgBreakAndParaMark",$.splitPgBreakAndParaMark));if($.doNotVerticallyAlignCellWithSp)this.root.push(new X0("w:doNotVertAlignCellWithSp",$.doNotVerticallyAlignCellWithSp));if($.doNotBreakConstrainedForcedTable)this.root.push(new X0("w:doNotBreakConstrainedForcedTable",$.doNotBreakConstrainedForcedTable));if($.ignoreVerticalAlignmentInTextboxes)this.root.push(new X0("w:doNotVertAlignInTxbx",$.ignoreVerticalAlignmentInTextboxes));if($.useAnsiKerningPairs)this.root.push(new X0("w:useAnsiKerningPairs",$.useAnsiKerningPairs));if($.cachedColumnBalance)this.root.push(new X0("w:cachedColBalance",$.cachedColumnBalance))}}class k5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{wpc:"xmlns:wpc",mc:"xmlns:mc",o:"xmlns:o",r:"xmlns:r",m:"xmlns:m",v:"xmlns:v",wp14:"xmlns:wp14",wp:"xmlns:wp",w10:"xmlns:w10",w:"xmlns:w",w14:"xmlns:w14",w15:"xmlns:w15",wpg:"xmlns:wpg",wpi:"xmlns:wpi",wne:"xmlns:wne",wps:"xmlns:wps",Ignorable:"mc:Ignorable"})}}class E5 extends o{constructor($){var U,Y,Z,J,G,X,Q,B;super("w:settings");if(this.root.push(new k5({wpc:"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas",mc:"http://schemas.openxmlformats.org/markup-compatibility/2006",o:"urn:schemas-microsoft-com:office:office",r:"http://schemas.openxmlformats.org/officeDocument/2006/relationships",m:"http://schemas.openxmlformats.org/officeDocument/2006/math",v:"urn:schemas-microsoft-com:vml",wp14:"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing",wp:"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",w10:"urn:schemas-microsoft-com:office:word",w:"http://schemas.openxmlformats.org/wordprocessingml/2006/main",w14:"http://schemas.microsoft.com/office/word/2010/wordml",w15:"http://schemas.microsoft.com/office/word/2012/wordml",wpg:"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup",wpi:"http://schemas.microsoft.com/office/word/2010/wordprocessingInk",wne:"http://schemas.microsoft.com/office/word/2006/wordml",wps:"http://schemas.microsoft.com/office/word/2010/wordprocessingShape",Ignorable:"w14 w15 wp14"})),this.root.push(new X0("w:displayBackgroundShape",!0)),$.trackRevisions!==void 0)this.root.push(new X0("w:trackRevisions",$.trackRevisions));if($.evenAndOddHeaders!==void 0)this.root.push(new X0("w:evenAndOddHeaders",$.evenAndOddHeaders));if($.updateFields!==void 0)this.root.push(new X0("w:updateFields",$.updateFields));if($.defaultTabStop!==void 0)this.root.push(new k2("w:defaultTabStop",$.defaultTabStop));if(((U=$.hyphenation)==null?void 0:U.autoHyphenation)!==void 0)this.root.push(new X0("w:autoHyphenation",$.hyphenation.autoHyphenation));if(((Y=$.hyphenation)==null?void 0:Y.hyphenationZone)!==void 0)this.root.push(new k2("w:hyphenationZone",$.hyphenation.hyphenationZone));if(((Z=$.hyphenation)==null?void 0:Z.consecutiveHyphenLimit)!==void 0)this.root.push(new k2("w:consecutiveHyphenLimit",$.hyphenation.consecutiveHyphenLimit));if(((J=$.hyphenation)==null?void 0:J.doNotHyphenateCaps)!==void 0)this.root.push(new X0("w:doNotHyphenateCaps",$.hyphenation.doNotHyphenateCaps));this.root.push(new O5(R0(W0({},(G=$.compatibility)!=null?G:{}),{version:(B=(Q=(X=$.compatibility)==null?void 0:X.version)!=null?Q:$.compatibilityModeVersion)!=null?B:15})))}}class GU extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w:val"})}}class S5 extends o{constructor($){super("w:name");this.root.push(new GU({val:$}))}}class v5 extends o{constructor($){super("w:uiPriority");this.root.push(new GU({val:S0($)}))}}class _5 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{type:"w:type",styleId:"w:styleId",default:"w:default",customStyle:"w:customStyle"})}}class KU extends o{constructor($,U){super("w:style");if(this.root.push(new _5($)),U.name)this.root.push(new S5(U.name));if(U.basedOn)this.root.push(new Y2("w:basedOn",U.basedOn));if(U.next)this.root.push(new Y2("w:next",U.next));if(U.link)this.root.push(new Y2("w:link",U.link));if(U.uiPriority!==void 0)this.root.push(new v5(U.uiPriority));if(U.semiHidden!==void 0)this.root.push(new X0("w:semiHidden",U.semiHidden));if(U.unhideWhenUsed!==void 0)this.root.push(new X0("w:unhideWhenUsed",U.unhideWhenUsed));if(U.quickFormat!==void 0)this.root.push(new X0("w:qFormat",U.quickFormat))}}class y2 extends KU{constructor($){super({type:"paragraph",styleId:$.id},$);Y0(this,"paragraphProperties"),Y0(this,"runProperties"),this.paragraphProperties=new Z2($.paragraph),this.runProperties=new J2($.run),this.root.push(this.paragraphProperties),this.root.push(this.runProperties)}}class D2 extends KU{constructor($){super({type:"character",styleId:$.id},W0({uiPriority:99,unhideWhenUsed:!0},$));Y0(this,"runProperties"),this.runProperties=new J2($.run),this.root.push(this.runProperties)}}class H2 extends y2{constructor($){super(W0({basedOn:"Normal",next:"Normal",quickFormat:!0},$))}}class y5 extends H2{constructor($){super(W0({id:"Title",name:"Title"},$))}}class b5 extends H2{constructor($){super(W0({id:"Heading1",name:"Heading 1"},$))}}class g5 extends H2{constructor($){super(W0({id:"Heading2",name:"Heading 2"},$))}}class x5 extends H2{constructor($){super(W0({id:"Heading3",name:"Heading 3"},$))}}class f5 extends H2{constructor($){super(W0({id:"Heading4",name:"Heading 4"},$))}}class h5 extends H2{constructor($){super(W0({id:"Heading5",name:"Heading 5"},$))}}class u5 extends H2{constructor($){super(W0({id:"Heading6",name:"Heading 6"},$))}}class d5 extends H2{constructor($){super(W0({id:"Strong",name:"Strong"},$))}}class c5 extends y2{constructor($){super(W0({id:"ListParagraph",name:"List Paragraph",basedOn:"Normal",quickFormat:!0},$))}}class m5 extends y2{constructor($){super(W0({id:"FootnoteText",name:"footnote text",link:"FootnoteTextChar",basedOn:"Normal",uiPriority:99,semiHidden:!0,unhideWhenUsed:!0,paragraph:{spacing:{after:0,line:240,lineRule:v2.AUTO}},run:{size:20}},$))}}class l5 extends D2{constructor($){super(W0({id:"FootnoteReference",name:"footnote reference",basedOn:"DefaultParagraphFont",semiHidden:!0,run:{superScript:!0}},$))}}class a5 extends D2{constructor($){super(W0({id:"FootnoteTextChar",name:"Footnote Text Char",basedOn:"DefaultParagraphFont",link:"FootnoteText",semiHidden:!0,run:{size:20}},$))}}class p5 extends y2{constructor($){super(W0({id:"EndnoteText",name:"endnote text",link:"EndnoteTextChar",basedOn:"Normal",uiPriority:99,semiHidden:!0,unhideWhenUsed:!0,paragraph:{spacing:{after:0,line:240,lineRule:v2.AUTO}},run:{size:20}},$))}}class i5 extends D2{constructor($){super(W0({id:"EndnoteReference",name:"endnote reference",basedOn:"DefaultParagraphFont",semiHidden:!0,run:{superScript:!0}},$))}}class r5 extends D2{constructor($){super(W0({id:"EndnoteTextChar",name:"Endnote Text Char",basedOn:"DefaultParagraphFont",link:"EndnoteText",semiHidden:!0,run:{size:20}},$))}}class s5 extends D2{constructor($){super(W0({id:"Hyperlink",name:"Hyperlink",basedOn:"DefaultParagraphFont",run:{color:"0563C1",underline:{type:Z$.SINGLE}}},$))}}class B1 extends o{constructor($){super("w:styles");if($.initialStyles)this.root.push($.initialStyles);if($.importedStyles)for(let U of $.importedStyles)this.root.push(U);if($.paragraphStyles)for(let U of $.paragraphStyles)this.root.push(new y2(U));if($.characterStyles)for(let U of $.characterStyles)this.root.push(new D2(U))}}class qU extends o{constructor($){super("w:pPrDefault");this.root.push(new Z2($))}}class XU extends o{constructor($){super("w:rPrDefault");this.root.push(new J2($))}}class VU extends o{constructor($){super("w:docDefaults");Y0(this,"runPropertiesDefaults"),Y0(this,"paragraphPropertiesDefaults"),this.runPropertiesDefaults=new XU($.run),this.paragraphPropertiesDefaults=new qU($.paragraph),this.root.push(this.runPropertiesDefaults),this.root.push(this.paragraphPropertiesDefaults)}}class n5{newInstance($){let U=$8.xml2js($,{compact:!1}),Y;for(let J of U.elements||[])if(J.name==="w:styles")Y=J;if(Y===void 0)throw Error("can not find styles element");let Z=Y.elements||[];return{initialStyles:new i9(Y.attributes),importedStyles:Z.map((J)=>U8(J))}}}class c1{newInstance($={}){var U;return{initialStyles:new o2(["mc","r","w","w14","w15"],"w14 w15"),importedStyles:[new VU((U=$.document)!=null?U:{}),new y5(W0({run:{size:56}},$.title)),new b5(W0({run:{color:"2E74B5",size:32}},$.heading1)),new g5(W0({run:{color:"2E74B5",size:26}},$.heading2)),new x5(W0({run:{color:"1F4D78",size:24}},$.heading3)),new f5(W0({run:{color:"2E74B5",italics:!0}},$.heading4)),new h5(W0({run:{color:"2E74B5"}},$.heading5)),new u5(W0({run:{color:"1F4D78"}},$.heading6)),new d5(W0({run:{bold:!0}},$.strong)),new c5($.listParagraph||{}),new s5($.hyperlink||{}),new l5($.footnoteReference||{}),new m5($.footnoteText||{}),new a5($.footnoteTextChar||{}),new i5($.endnoteReference||{}),new p5($.endnoteText||{}),new r5($.endnoteTextChar||{})]}}}class o5{constructor($){Y0(this,"currentRelationshipId",1),Y0(this,"documentWrapper"),Y0(this,"headers",[]),Y0(this,"footers",[]),Y0(this,"coreProperties"),Y0(this,"numbering"),Y0(this,"media"),Y0(this,"fileRelationships"),Y0(this,"footnotesWrapper"),Y0(this,"endnotesWrapper"),Y0(this,"settings"),Y0(this,"contentTypes"),Y0(this,"customProperties"),Y0(this,"appProperties"),Y0(this,"styles"),Y0(this,"comments"),Y0(this,"fontWrapper");var U,Y,Z,J,G,X,Q,B,F,z,W,k,D;if(this.coreProperties=new gK(R0(W0({},$),{creator:(U=$.creator)!=null?U:"Un-named",revision:(Y=$.revision)!=null?Y:1,lastModifiedBy:(Z=$.lastModifiedBy)!=null?Z:"Un-named"})),this.numbering=new JU($.numbering?$.numbering:{config:[]}),this.comments=new M$((J=$.comments)!=null?J:{children:[]}),this.fileRelationships=new W2,this.customProperties=new cK((G=$.customProperties)!=null?G:[]),this.appProperties=new _K,this.footnotesWrapper=new L5,this.endnotesWrapper=new G5,this.contentTypes=new bK,this.documentWrapper=new $5({background:$.background}),this.settings=new E5({compatibilityModeVersion:$.compatabilityModeVersion,compatibility:$.compatibility,evenAndOddHeaders:$.evenAndOddHeaderAndFooters?!0:!1,trackRevisions:(X=$.features)==null?void 0:X.trackRevisions,updateFields:(Q=$.features)==null?void 0:Q.updateFields,defaultTabStop:$.defaultTabStop,hyphenation:{autoHyphenation:(B=$.hyphenation)==null?void 0:B.autoHyphenation,hyphenationZone:(F=$.hyphenation)==null?void 0:F.hyphenationZone,consecutiveHyphenLimit:(z=$.hyphenation)==null?void 0:z.consecutiveHyphenLimit,doNotHyphenateCaps:(W=$.hyphenation)==null?void 0:W.doNotHyphenateCaps}}),this.media=new w8,$.externalStyles!==void 0){let H=new c1().newInstance((k=$.styles)==null?void 0:k.default),V=new n5().newInstance($.externalStyles);this.styles=new B1(R0(W0({},V),{importedStyles:[...H.importedStyles,...V.importedStyles]}))}else if($.styles){let H=new c1().newInstance($.styles.default);this.styles=new B1(W0(W0({},H),$.styles))}else{let C=new c1;this.styles=new B1(C.newInstance())}this.addDefaultRelationships();for(let C of $.sections)this.addSection(C);if($.footnotes)for(let C in $.footnotes)this.footnotesWrapper.View.createFootNote(parseFloat(C),$.footnotes[C].children);if($.endnotes)for(let C in $.endnotes)this.endnotesWrapper.View.createEndnote(parseFloat(C),$.endnotes[C].children);this.fontWrapper=new R$((D=$.fonts)!=null?D:[])}addSection({headers:$={},footers:U={},children:Y,properties:Z}){this.documentWrapper.View.Body.addSection(R0(W0({},Z),{headerWrapperGroup:{default:$.default?this.createHeader($.default):void 0,first:$.first?this.createHeader($.first):void 0,even:$.even?this.createHeader($.even):void 0},footerWrapperGroup:{default:U.default?this.createFooter(U.default):void 0,first:U.first?this.createFooter(U.first):void 0,even:U.even?this.createFooter(U.even):void 0}}));for(let J of Y)this.documentWrapper.View.add(J)}createHeader($){let U=new YU(this.media,this.currentRelationshipId++);for(let Y of $.options.children)U.add(Y);return this.addHeaderToDocument(U),U}createFooter($){let U=new $U(this.media,this.currentRelationshipId++);for(let Y of $.options.children)U.add(Y);return this.addFooterToDocument(U),U}addHeaderToDocument($,U=E2.DEFAULT){this.headers.push({header:$,type:U}),this.documentWrapper.Relationships.addRelationship($.View.ReferenceId,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header",`header${this.headers.length}.xml`),this.contentTypes.addHeader(this.headers.length)}addFooterToDocument($,U=E2.DEFAULT){this.footers.push({footer:$,type:U}),this.documentWrapper.Relationships.addRelationship($.View.ReferenceId,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer",`footer${this.footers.length}.xml`),this.contentTypes.addFooter(this.footers.length)}addDefaultRelationships(){this.fileRelationships.addRelationship(1,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument","word/document.xml"),this.fileRelationships.addRelationship(2,"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties","docProps/core.xml"),this.fileRelationships.addRelationship(3,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties","docProps/app.xml"),this.fileRelationships.addRelationship(4,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties","docProps/custom.xml"),this.documentWrapper.Relationships.addRelationship(this.currentRelationshipId++,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles","styles.xml"),this.documentWrapper.Relationships.addRelationship(this.currentRelationshipId++,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering","numbering.xml"),this.documentWrapper.Relationships.addRelationship(this.currentRelationshipId++,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes","footnotes.xml"),this.documentWrapper.Relationships.addRelationship(this.currentRelationshipId++,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes","endnotes.xml"),this.documentWrapper.Relationships.addRelationship(this.currentRelationshipId++,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings","settings.xml"),this.documentWrapper.Relationships.addRelationship(this.currentRelationshipId++,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments","comments.xml")}get Document(){return this.documentWrapper}get Styles(){return this.styles}get CoreProperties(){return this.coreProperties}get Numbering(){return this.numbering}get Media(){return this.media}get FileRelationships(){return this.fileRelationships}get Headers(){return this.headers.map(($)=>$.header)}get Footers(){return this.footers.map(($)=>$.footer)}get ContentTypes(){return this.contentTypes}get CustomProperties(){return this.customProperties}get AppProperties(){return this.appProperties}get FootNotes(){return this.footnotesWrapper}get Endnotes(){return this.endnotesWrapper}get Settings(){return this.settings}get Comments(){return this.comments}get FontTable(){return this.fontWrapper}}class t5 extends o{constructor($={}){super("w:instrText");Y0(this,"properties"),this.properties=$,this.root.push(new x0({space:g0.PRESERVE}));let U="TOC";if(this.properties.captionLabel)U=`${U} \\a "${this.properties.captionLabel}"`;if(this.properties.entriesFromBookmark)U=`${U} \\b "${this.properties.entriesFromBookmark}"`;if(this.properties.captionLabelIncludingNumbers)U=`${U} \\c "${this.properties.captionLabelIncludingNumbers}"`;if(this.properties.sequenceAndPageNumbersSeparator)U=`${U} \\d "${this.properties.sequenceAndPageNumbersSeparator}"`;if(this.properties.tcFieldIdentifier)U=`${U} \\f "${this.properties.tcFieldIdentifier}"`;if(this.properties.hyperlink)U=`${U} \\h`;if(this.properties.tcFieldLevelRange)U=`${U} \\l "${this.properties.tcFieldLevelRange}"`;if(this.properties.pageNumbersEntryLevelsRange)U=`${U} \\n "${this.properties.pageNumbersEntryLevelsRange}"`;if(this.properties.headingStyleRange)U=`${U} \\o "${this.properties.headingStyleRange}"`;if(this.properties.entryAndPageNumberSeparator)U=`${U} \\p "${this.properties.entryAndPageNumberSeparator}"`;if(this.properties.seqFieldIdentifierForPrefix)U=`${U} \\s "${this.properties.seqFieldIdentifierForPrefix}"`;if(this.properties.stylesWithLevels&&this.properties.stylesWithLevels.length){let Y=this.properties.stylesWithLevels.map((Z)=>`${Z.styleName},${Z.level}`).join(",");U=`${U} \\t "${Y}"`}if(this.properties.useAppliedParagraphOutlineLevel)U=`${U} \\u`;if(this.properties.preserveTabInEntries)U=`${U} \\w`;if(this.properties.preserveNewLineInEntries)U=`${U} \\x`;if(this.properties.hideTabAndPageNumbersInWebView)U=`${U} \\z`;this.root.push(U)}}class BU extends o{constructor(){super("w:sdtContent")}}class LU extends o{constructor($){super("w:sdtPr");if($)this.root.push(new Y2("w:alias",$))}}class e5 extends r2{constructor($="Table of Contents",U={}){var Y=U,{contentChildren:Z=[],cachedEntries:J=[],beginDirty:G=!0}=Y,X=oZ(Y,["contentChildren","cachedEntries","beginDirty"]);super("w:sdt");this.root.push(new LU($));let Q=new BU,B=[new C0({children:[$2(G),new t5(X),I2()]})],F=[new C0({children:[U2()]})];if(J!==void 0&&J.length>0){let{stylesWithLevels:W}=X,k=J.map((C,H)=>{var O,V;let j=this.buildCachedContentParagraphChild(C,X),M=(V=(O=W==null?void 0:W.find((A)=>A.level===C.level))==null?void 0:O.styleName)!=null?V:`TOC${C.level}`,L=H===0?[...B,j]:H===J.length-1?[j,...F]:[j];return new h0({style:M,tabStops:this.getTabStopsForLevel(C.level),children:L})}),D=k;if(J.length<=1)D=[...k,new h0({children:F})];for(let C of D)Q.addChildElement(C)}else{let W=new h0({children:B});Q.addChildElement(W);for(let D of Z)Q.addChildElement(D);let k=new h0({children:F});Q.addChildElement(k)}this.root.push(Q)}getTabStopsForLevel($,U=9025){return[{type:"clear",position:U+1-($-1)*240},{type:"right",position:U,leader:"dot"}]}buildCachedContentRun($,U){var Y,Z;return new C0({style:(U==null?void 0:U.hyperlink)&&$.href!==void 0?"IndexLink":void 0,children:[new a2({text:$.title}),new w$,new a2({text:(Z=(Y=$.page)==null?void 0:Y.toString())!=null?Z:""})]})}buildCachedContentParagraphChild($,U){let Y=this.buildCachedContentRun($,U);if((U==null?void 0:U.hyperlink)&&$.href!==void 0)return new j$({anchor:$.href,children:[Y]});return Y}}class $7{constructor($,U){Y0(this,"styleName"),Y0(this,"level"),this.styleName=$,this.level=U}}class U7{constructor($={children:[]}){Y0(this,"options"),this.options=$}}class Y7{constructor($={children:[]}){Y0(this,"options"),this.options=$}}class MU extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id"})}}class IU extends o{constructor($){super("w:footnoteReference");this.root.push(new MU({id:$}))}}class Z7 extends C0{constructor($){super({style:"FootnoteReference"});this.root.push(new IU($))}}class wU extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{id:"w:id"})}}class WU extends o{constructor($){super("w:endnoteReference");this.root.push(new wU({id:$}))}}class Q7 extends C0{constructor($){super({style:"EndnoteReference"});this.root.push(new WU($))}}class _9 extends I0{constructor(){super(...arguments);Y0(this,"xmlKeys",{val:"w14:val",symbolfont:"w14:font"})}}class L1 extends o{constructor($,U,Y){super($);if(Y)this.root.push(new _9({val:DQ(U),symbolfont:Y}));else this.root.push(new _9({val:U}))}}class HU extends o{constructor($){var U,Y,Z,J,G,X,Q,B;super("w14:checkbox");Y0(this,"DEFAULT_UNCHECKED_SYMBOL","2610"),Y0(this,"DEFAULT_CHECKED_SYMBOL","2612"),Y0(this,"DEFAULT_FONT","MS Gothic");let F=($==null?void 0:$.checked)?"1":"0",z,W;this.root.push(new L1("w14:checked",F)),z=((U=$==null?void 0:$.checkedState)==null?void 0:U.value)?(Y=$==null?void 0:$.checkedState)==null?void 0:Y.value:this.DEFAULT_CHECKED_SYMBOL,W=((Z=$==null?void 0:$.checkedState)==null?void 0:Z.font)?(J=$==null?void 0:$.checkedState)==null?void 0:J.font:this.DEFAULT_FONT,this.root.push(new L1("w14:checkedState",z,W)),z=((G=$==null?void 0:$.uncheckedState)==null?void 0:G.value)?(X=$==null?void 0:$.uncheckedState)==null?void 0:X.value:this.DEFAULT_UNCHECKED_SYMBOL,W=((Q=$==null?void 0:$.uncheckedState)==null?void 0:Q.font)?(B=$==null?void 0:$.uncheckedState)==null?void 0:B.font:this.DEFAULT_FONT,this.root.push(new L1("w14:uncheckedState",z,W))}}class J7 extends o{constructor($){var U,Y,Z,J;super("w:sdt");Y0(this,"DEFAULT_UNCHECKED_SYMBOL","2610"),Y0(this,"DEFAULT_CHECKED_SYMBOL","2612"),Y0(this,"DEFAULT_FONT","MS Gothic");let G=new LU($==null?void 0:$.alias);G.addChildElement(new HU($)),this.root.push(G);let X=new BU,Q=(U=$==null?void 0:$.checkedState)==null?void 0:U.font,B=(Y=$==null?void 0:$.checkedState)==null?void 0:Y.value,F=(Z=$==null?void 0:$.uncheckedState)==null?void 0:Z.font,z=(J=$==null?void 0:$.uncheckedState)==null?void 0:J.value,W,k;if($==null?void 0:$.checked)W=Q?Q:this.DEFAULT_FONT,k=B?B:this.DEFAULT_CHECKED_SYMBOL;else W=F?F:this.DEFAULT_FONT,k=z?z:this.DEFAULT_UNCHECKED_SYMBOL;let D=new G$({char:k,symbolfont:W});X.addChildElement(D),this.root.push(X)}}var iV=({shape:$})=>new B0({name:"w:pict",children:[$]}),rV=({children:$=[]})=>new B0({name:"w:txbxContent",children:$}),sV=({style:$,children:U,inset:Y})=>new B0({name:"v:textbox",attributes:{style:{key:"style",value:$},insetMode:{key:"insetmode",value:Y?"custom":"auto"},inset:{key:"inset",value:Y?`${Y.left}, ${Y.top}, ${Y.right}, ${Y.bottom}`:void 0}},children:[rV({children:U})]}),nV="#_x0000_t202",oV={flip:"flip",height:"height",left:"left",marginBottom:"margin-bottom",marginLeft:"margin-left",marginRight:"margin-right",marginTop:"margin-top",positionHorizontal:"mso-position-horizontal",positionHorizontalRelative:"mso-position-horizontal-relative",positionVertical:"mso-position-vertical",positionVerticalRelative:"mso-position-vertical-relative",wrapDistanceBottom:"mso-wrap-distance-bottom",wrapDistanceLeft:"mso-wrap-distance-left",wrapDistanceRight:"mso-wrap-distance-right",wrapDistanceTop:"mso-wrap-distance-top",wrapEdited:"mso-wrap-edited",wrapStyle:"mso-wrap-style",position:"position",rotation:"rotation",top:"top",visibility:"visibility",width:"width",zIndex:"z-index"},tV=($)=>$?Object.entries($).map(([U,Y])=>`${oV[U]}:${Y}`).join(";"):void 0,eV=({id:$,children:U,type:Y=nV,style:Z})=>new B0({name:"v:shape",attributes:{id:{key:"id",value:$},type:{key:"type",value:Y},style:{key:"style",value:tV(Z)}},children:[sV({style:"mso-fit-shape-to-text:t;",children:U})]});class G7 extends r2{constructor($){var U=$,{style:Y,children:Z}=U,J=oZ(U,["style","children"]);super("w:p");this.root.push(new Z2(J)),this.root.push(iV({shape:eV({children:Z,id:R1(),style:Y})}))}}var $B=m9();function y1($){throw Error('Could not dynamically require "'+$+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var I9={exports:{}},uZ;function UB(){if(uZ)return I9.exports;return uZ=1,function($,U){(function(Y){$.exports=Y()})(function(){return function Y(Z,J,G){function X(F,z){if(!J[F]){if(!Z[F]){var W=typeof y1=="function"&&y1;if(!z&&W)return W(F,!0);if(Q)return Q(F,!0);var k=Error("Cannot find module '"+F+"'");throw k.code="MODULE_NOT_FOUND",k}var D=J[F]={exports:{}};Z[F][0].call(D.exports,function(C){var H=Z[F][1][C];return X(H||C)},D,D.exports,Y,Z,J,G)}return J[F].exports}for(var Q=typeof y1=="function"&&y1,B=0;B>2,D=(3&F)<<4|z>>4,C=1>6:64,H=2>4,z=(15&k)<<4|(D=Q.indexOf(B.charAt(H++)))>>2,W=(3&D)<<6|(C=Q.indexOf(B.charAt(H++))),j[O++]=F,D!==64&&(j[O++]=z),C!==64&&(j[O++]=W);return j}},{"./support":30,"./utils":32}],2:[function(Y,Z,J){var G=Y("./external"),X=Y("./stream/DataWorker"),Q=Y("./stream/Crc32Probe"),B=Y("./stream/DataLengthProbe");function F(z,W,k,D,C){this.compressedSize=z,this.uncompressedSize=W,this.crc32=k,this.compression=D,this.compressedContent=C}F.prototype={getContentWorker:function(){var z=new X(G.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new B("data_length")),W=this;return z.on("end",function(){if(this.streamInfo.data_length!==W.uncompressedSize)throw Error("Bug : uncompressed data size mismatch")}),z},getCompressedWorker:function(){return new X(G.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},F.createWorkerFrom=function(z,W,k){return z.pipe(new Q).pipe(new B("uncompressedSize")).pipe(W.compressWorker(k)).pipe(new B("compressedSize")).withStreamInfo("compression",W)},Z.exports=F},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(Y,Z,J){var G=Y("./stream/GenericWorker");J.STORE={magic:"\x00\x00",compressWorker:function(){return new G("STORE compression")},uncompressWorker:function(){return new G("STORE decompression")}},J.DEFLATE=Y("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(Y,Z,J){var G=Y("./utils"),X=function(){for(var Q,B=[],F=0;F<256;F++){Q=F;for(var z=0;z<8;z++)Q=1&Q?3988292384^Q>>>1:Q>>>1;B[F]=Q}return B}();Z.exports=function(Q,B){return Q!==void 0&&Q.length?G.getTypeOf(Q)!=="string"?function(F,z,W,k){var D=X,C=k+W;F^=-1;for(var H=k;H>>8^D[255&(F^z[H])];return-1^F}(0|B,Q,Q.length,0):function(F,z,W,k){var D=X,C=k+W;F^=-1;for(var H=k;H>>8^D[255&(F^z.charCodeAt(H))];return-1^F}(0|B,Q,Q.length,0):0}},{"./utils":32}],5:[function(Y,Z,J){J.base64=!1,J.binary=!1,J.dir=!1,J.createFolders=!0,J.date=null,J.compression=null,J.compressionOptions=null,J.comment=null,J.unixPermissions=null,J.dosPermissions=null},{}],6:[function(Y,Z,J){var G=null;G=typeof Promise<"u"?Promise:Y("lie"),Z.exports={Promise:G}},{lie:37}],7:[function(Y,Z,J){var G=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Uint32Array<"u",X=Y("pako"),Q=Y("./utils"),B=Y("./stream/GenericWorker"),F=G?"uint8array":"array";function z(W,k){B.call(this,"FlateWorker/"+W),this._pako=null,this._pakoAction=W,this._pakoOptions=k,this.meta={}}J.magic="\b\x00",Q.inherits(z,B),z.prototype.processChunk=function(W){this.meta=W.meta,this._pako===null&&this._createPako(),this._pako.push(Q.transformTo(F,W.data),!1)},z.prototype.flush=function(){B.prototype.flush.call(this),this._pako===null&&this._createPako(),this._pako.push([],!0)},z.prototype.cleanUp=function(){B.prototype.cleanUp.call(this),this._pako=null},z.prototype._createPako=function(){this._pako=new X[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var W=this;this._pako.onData=function(k){W.push({data:k,meta:W.meta})}},J.compressWorker=function(W){return new z("Deflate",W)},J.uncompressWorker=function(){return new z("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(Y,Z,J){function G(D,C){var H,O="";for(H=0;H>>=8;return O}function X(D,C,H,O,V,j){var M,L,A=D.file,y=D.compression,g=j!==F.utf8encode,d=Q.transformTo("string",j(A.name)),E=Q.transformTo("string",F.utf8encode(A.name)),s=A.comment,V0=Q.transformTo("string",j(s)),S=Q.transformTo("string",F.utf8encode(s)),h=E.length!==A.name.length,N=S.length!==s.length,a="",$0="",m="",J0=A.dir,U0=A.date,L0={crc32:0,compressedSize:0,uncompressedSize:0};C&&!H||(L0.crc32=D.crc32,L0.compressedSize=D.compressedSize,L0.uncompressedSize=D.uncompressedSize);var i=0;C&&(i|=8),g||!h&&!N||(i|=2048);var _=0,r=0;J0&&(_|=16),V==="UNIX"?(r=798,_|=function(Z0,p){var P=Z0;return Z0||(P=p?16893:33204),(65535&P)<<16}(A.unixPermissions,J0)):(r=20,_|=function(Z0){return 63&(Z0||0)}(A.dosPermissions)),M=U0.getUTCHours(),M<<=6,M|=U0.getUTCMinutes(),M<<=5,M|=U0.getUTCSeconds()/2,L=U0.getUTCFullYear()-1980,L<<=4,L|=U0.getUTCMonth()+1,L<<=5,L|=U0.getUTCDate(),h&&($0=G(1,1)+G(z(d),4)+E,a+="up"+G($0.length,2)+$0),N&&(m=G(1,1)+G(z(V0),4)+S,a+="uc"+G(m.length,2)+m);var n="";return n+=` +\x00`,n+=G(i,2),n+=y.magic,n+=G(M,2),n+=G(L,2),n+=G(L0.crc32,4),n+=G(L0.compressedSize,4),n+=G(L0.uncompressedSize,4),n+=G(d.length,2),n+=G(a.length,2),{fileRecord:W.LOCAL_FILE_HEADER+n+d+a,dirRecord:W.CENTRAL_FILE_HEADER+G(r,2)+n+G(V0.length,2)+"\x00\x00\x00\x00"+G(_,4)+G(O,4)+d+a+V0}}var Q=Y("../utils"),B=Y("../stream/GenericWorker"),F=Y("../utf8"),z=Y("../crc32"),W=Y("../signature");function k(D,C,H,O){B.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=C,this.zipPlatform=H,this.encodeFileName=O,this.streamFiles=D,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}Q.inherits(k,B),k.prototype.push=function(D){var C=D.meta.percent||0,H=this.entriesCount,O=this._sources.length;this.accumulate?this.contentBuffer.push(D):(this.bytesWritten+=D.data.length,B.prototype.push.call(this,{data:D.data,meta:{currentFile:this.currentFile,percent:H?(C+100*(H-O-1))/H:100}}))},k.prototype.openedSource=function(D){this.currentSourceOffset=this.bytesWritten,this.currentFile=D.file.name;var C=this.streamFiles&&!D.file.dir;if(C){var H=X(D,C,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:H.fileRecord,meta:{percent:0}})}else this.accumulate=!0},k.prototype.closedSource=function(D){this.accumulate=!1;var C=this.streamFiles&&!D.file.dir,H=X(D,C,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(H.dirRecord),C)this.push({data:function(O){return W.DATA_DESCRIPTOR+G(O.crc32,4)+G(O.compressedSize,4)+G(O.uncompressedSize,4)}(D),meta:{percent:100}});else for(this.push({data:H.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},k.prototype.flush=function(){for(var D=this.bytesWritten,C=0;C=this.index;B--)F=(F<<8)+this.byteAt(B);return this.index+=Q,F},readString:function(Q){return G.transformTo("string",this.readData(Q))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var Q=this.readInt(4);return new Date(Date.UTC(1980+(Q>>25&127),(Q>>21&15)-1,Q>>16&31,Q>>11&31,Q>>5&63,(31&Q)<<1))}},Z.exports=X},{"../utils":32}],19:[function(Y,Z,J){var G=Y("./Uint8ArrayReader");function X(Q){G.call(this,Q)}Y("../utils").inherits(X,G),X.prototype.readData=function(Q){this.checkOffset(Q);var B=this.data.slice(this.zero+this.index,this.zero+this.index+Q);return this.index+=Q,B},Z.exports=X},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(Y,Z,J){var G=Y("./DataReader");function X(Q){G.call(this,Q)}Y("../utils").inherits(X,G),X.prototype.byteAt=function(Q){return this.data.charCodeAt(this.zero+Q)},X.prototype.lastIndexOfSignature=function(Q){return this.data.lastIndexOf(Q)-this.zero},X.prototype.readAndCheckSignature=function(Q){return Q===this.readData(4)},X.prototype.readData=function(Q){this.checkOffset(Q);var B=this.data.slice(this.zero+this.index,this.zero+this.index+Q);return this.index+=Q,B},Z.exports=X},{"../utils":32,"./DataReader":18}],21:[function(Y,Z,J){var G=Y("./ArrayReader");function X(Q){G.call(this,Q)}Y("../utils").inherits(X,G),X.prototype.readData=function(Q){if(this.checkOffset(Q),Q===0)return new Uint8Array(0);var B=this.data.subarray(this.zero+this.index,this.zero+this.index+Q);return this.index+=Q,B},Z.exports=X},{"../utils":32,"./ArrayReader":17}],22:[function(Y,Z,J){var G=Y("../utils"),X=Y("../support"),Q=Y("./ArrayReader"),B=Y("./StringReader"),F=Y("./NodeBufferReader"),z=Y("./Uint8ArrayReader");Z.exports=function(W){var k=G.getTypeOf(W);return G.checkSupport(k),k!=="string"||X.uint8array?k==="nodebuffer"?new F(W):X.uint8array?new z(G.transformTo("uint8array",W)):new Q(G.transformTo("array",W)):new B(W)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(Y,Z,J){J.LOCAL_FILE_HEADER="PK\x03\x04",J.CENTRAL_FILE_HEADER="PK\x01\x02",J.CENTRAL_DIRECTORY_END="PK\x05\x06",J.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK\x06\x07",J.ZIP64_CENTRAL_DIRECTORY_END="PK\x06\x06",J.DATA_DESCRIPTOR="PK\x07\b"},{}],24:[function(Y,Z,J){var G=Y("./GenericWorker"),X=Y("../utils");function Q(B){G.call(this,"ConvertWorker to "+B),this.destType=B}X.inherits(Q,G),Q.prototype.processChunk=function(B){this.push({data:X.transformTo(this.destType,B.data),meta:B.meta})},Z.exports=Q},{"../utils":32,"./GenericWorker":28}],25:[function(Y,Z,J){var G=Y("./GenericWorker"),X=Y("../crc32");function Q(){G.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}Y("../utils").inherits(Q,G),Q.prototype.processChunk=function(B){this.streamInfo.crc32=X(B.data,this.streamInfo.crc32||0),this.push(B)},Z.exports=Q},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(Y,Z,J){var G=Y("../utils"),X=Y("./GenericWorker");function Q(B){X.call(this,"DataLengthProbe for "+B),this.propName=B,this.withStreamInfo(B,0)}G.inherits(Q,X),Q.prototype.processChunk=function(B){if(B){var F=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=F+B.data.length}X.prototype.processChunk.call(this,B)},Z.exports=Q},{"../utils":32,"./GenericWorker":28}],27:[function(Y,Z,J){var G=Y("../utils"),X=Y("./GenericWorker");function Q(B){X.call(this,"DataWorker");var F=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,B.then(function(z){F.dataIsReady=!0,F.data=z,F.max=z&&z.length||0,F.type=G.getTypeOf(z),F.isPaused||F._tickAndRepeat()},function(z){F.error(z)})}G.inherits(Q,X),Q.prototype.cleanUp=function(){X.prototype.cleanUp.call(this),this.data=null},Q.prototype.resume=function(){return!!X.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,G.delay(this._tickAndRepeat,[],this)),!0)},Q.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(G.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},Q.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var B=null,F=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":B=this.data.substring(this.index,F);break;case"uint8array":B=this.data.subarray(this.index,F);break;case"array":case"nodebuffer":B=this.data.slice(this.index,F)}return this.index=F,this.push({data:B,meta:{percent:this.max?this.index/this.max*100:0}})},Z.exports=Q},{"../utils":32,"./GenericWorker":28}],28:[function(Y,Z,J){function G(X){this.name=X||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}G.prototype={push:function(X){this.emit("data",X)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(X){this.emit("error",X)}return!0},error:function(X){return!this.isFinished&&(this.isPaused?this.generatedError=X:(this.isFinished=!0,this.emit("error",X),this.previous&&this.previous.error(X),this.cleanUp()),!0)},on:function(X,Q){return this._listeners[X].push(Q),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(X,Q){if(this._listeners[X])for(var B=0;B "+X:X}},Z.exports=G},{}],29:[function(Y,Z,J){var G=Y("../utils"),X=Y("./ConvertWorker"),Q=Y("./GenericWorker"),B=Y("../base64"),F=Y("../support"),z=Y("../external"),W=null;if(F.nodestream)try{W=Y("../nodejs/NodejsStreamOutputAdapter")}catch(C){}function k(C,H){return new z.Promise(function(O,V){var j=[],M=C._internalType,L=C._outputType,A=C._mimeType;C.on("data",function(y,g){j.push(y),H&&H(g)}).on("error",function(y){j=[],V(y)}).on("end",function(){try{var y=function(g,d,E){switch(g){case"blob":return G.newBlob(G.transformTo("arraybuffer",d),E);case"base64":return B.encode(d);default:return G.transformTo(g,d)}}(L,function(g,d){var E,s=0,V0=null,S=0;for(E=0;E"u")J.blob=!1;else{var G=new ArrayBuffer(0);try{J.blob=new Blob([G],{type:"application/zip"}).size===0}catch(Q){try{var X=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);X.append(G),J.blob=X.getBlob("application/zip").size===0}catch(B){J.blob=!1}}}try{J.nodestream=!!Y("readable-stream").Readable}catch(Q){J.nodestream=!1}},{"readable-stream":16}],31:[function(Y,Z,J){for(var G=Y("./utils"),X=Y("./support"),Q=Y("./nodejsUtils"),B=Y("./stream/GenericWorker"),F=Array(256),z=0;z<256;z++)F[z]=252<=z?6:248<=z?5:240<=z?4:224<=z?3:192<=z?2:1;F[254]=F[254]=1;function W(){B.call(this,"utf-8 decode"),this.leftOver=null}function k(){B.call(this,"utf-8 encode")}J.utf8encode=function(D){return X.nodebuffer?Q.newBufferFrom(D,"utf-8"):function(C){var H,O,V,j,M,L=C.length,A=0;for(j=0;j>>6:(O<65536?H[M++]=224|O>>>12:(H[M++]=240|O>>>18,H[M++]=128|O>>>12&63),H[M++]=128|O>>>6&63),H[M++]=128|63&O);return H}(D)},J.utf8decode=function(D){return X.nodebuffer?G.transformTo("nodebuffer",D).toString("utf-8"):function(C){var H,O,V,j,M=C.length,L=Array(2*M);for(H=O=0;H>10&1023,L[O++]=56320|1023&V)}return L.length!==O&&(L.subarray?L=L.subarray(0,O):L.length=O),G.applyFromCharCode(L)}(D=G.transformTo(X.uint8array?"uint8array":"array",D))},G.inherits(W,B),W.prototype.processChunk=function(D){var C=G.transformTo(X.uint8array?"uint8array":"array",D.data);if(this.leftOver&&this.leftOver.length){if(X.uint8array){var H=C;(C=new Uint8Array(H.length+this.leftOver.length)).set(this.leftOver,0),C.set(H,this.leftOver.length)}else C=this.leftOver.concat(C);this.leftOver=null}var O=function(j,M){var L;for((M=M||j.length)>j.length&&(M=j.length),L=M-1;0<=L&&(192&j[L])==128;)L--;return L<0?M:L===0?M:L+F[j[L]]>M?L:M}(C),V=C;O!==C.length&&(X.uint8array?(V=C.subarray(0,O),this.leftOver=C.subarray(O,C.length)):(V=C.slice(0,O),this.leftOver=C.slice(O,C.length))),this.push({data:J.utf8decode(V),meta:D.meta})},W.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:J.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},J.Utf8DecodeWorker=W,G.inherits(k,B),k.prototype.processChunk=function(D){this.push({data:J.utf8encode(D.data),meta:D.meta})},J.Utf8EncodeWorker=k},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(Y,Z,J){var G=Y("./support"),X=Y("./base64"),Q=Y("./nodejsUtils"),B=Y("./external");function F(H){return H}function z(H,O){for(var V=0;V>8;this.dir=!!(16&this.externalFileAttributes),D==0&&(this.dosPermissions=63&this.externalFileAttributes),D==3&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||this.fileNameStr.slice(-1)!=="/"||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var D=G(this.extraFields[1].value);this.uncompressedSize===X.MAX_VALUE_32BITS&&(this.uncompressedSize=D.readInt(8)),this.compressedSize===X.MAX_VALUE_32BITS&&(this.compressedSize=D.readInt(8)),this.localHeaderOffset===X.MAX_VALUE_32BITS&&(this.localHeaderOffset=D.readInt(8)),this.diskNumberStart===X.MAX_VALUE_32BITS&&(this.diskNumberStart=D.readInt(4))}},readExtraFields:function(D){var C,H,O,V=D.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});D.index+4>>6:(D<65536?k[O++]=224|D>>>12:(k[O++]=240|D>>>18,k[O++]=128|D>>>12&63),k[O++]=128|D>>>6&63),k[O++]=128|63&D);return k},J.buf2binstring=function(W){return z(W,W.length)},J.binstring2buf=function(W){for(var k=new G.Buf8(W.length),D=0,C=k.length;D>10&1023,j[C++]=56320|1023&H)}return z(j,C)},J.utf8border=function(W,k){var D;for((k=k||W.length)>W.length&&(k=W.length),D=k-1;0<=D&&(192&W[D])==128;)D--;return D<0?k:D===0?k:D+B[W[D]]>k?D:k}},{"./common":41}],43:[function(Y,Z,J){Z.exports=function(G,X,Q,B){for(var F=65535&G|0,z=G>>>16&65535|0,W=0;Q!==0;){for(Q-=W=2000>>1:X>>>1;Q[B]=X}return Q}();Z.exports=function(X,Q,B,F){var z=G,W=F+B;X^=-1;for(var k=F;k>>8^z[255&(X^Q[k])];return-1^X}},{}],46:[function(Y,Z,J){var G,X=Y("../utils/common"),Q=Y("./trees"),B=Y("./adler32"),F=Y("./crc32"),z=Y("./messages"),W=0,k=4,D=0,C=-2,H=-1,O=4,V=2,j=8,M=9,L=286,A=30,y=19,g=2*L+1,d=15,E=3,s=258,V0=s+E+1,S=42,h=113,N=1,a=2,$0=3,m=4;function J0(I,t){return I.msg=z[t],t}function U0(I){return(I<<1)-(4I.avail_out&&(T=I.avail_out),T!==0&&(X.arraySet(I.output,t.pending_buf,t.pending_out,T,I.next_out),I.next_out+=T,t.pending_out+=T,I.total_out+=T,I.avail_out-=T,t.pending-=T,t.pending===0&&(t.pending_out=0))}function _(I,t){Q._tr_flush_block(I,0<=I.block_start?I.block_start:-1,I.strstart-I.block_start,t),I.block_start=I.strstart,i(I.strm)}function r(I,t){I.pending_buf[I.pending++]=t}function n(I,t){I.pending_buf[I.pending++]=t>>>8&255,I.pending_buf[I.pending++]=255&t}function Z0(I,t){var T,K,q=I.max_chain_length,w=I.strstart,x=I.prev_length,l=I.nice_match,u=I.strstart>I.w_size-V0?I.strstart-(I.w_size-V0):0,Q0=I.window,q0=I.w_mask,K0=I.prev,M0=I.strstart+s,w0=Q0[w+x-1],H0=Q0[w+x];I.prev_length>=I.good_match&&(q>>=2),l>I.lookahead&&(l=I.lookahead);do if(Q0[(T=t)+x]===H0&&Q0[T+x-1]===w0&&Q0[T]===Q0[w]&&Q0[++T]===Q0[w+1]){w+=2,T++;do;while(Q0[++w]===Q0[++T]&&Q0[++w]===Q0[++T]&&Q0[++w]===Q0[++T]&&Q0[++w]===Q0[++T]&&Q0[++w]===Q0[++T]&&Q0[++w]===Q0[++T]&&Q0[++w]===Q0[++T]&&Q0[++w]===Q0[++T]&&wu&&--q!=0);return x<=I.lookahead?x:I.lookahead}function p(I){var t,T,K,q,w,x,l,u,Q0,q0,K0=I.w_size;do{if(q=I.window_size-I.lookahead-I.strstart,I.strstart>=K0+(K0-V0)){for(X.arraySet(I.window,I.window,K0,K0,0),I.match_start-=K0,I.strstart-=K0,I.block_start-=K0,t=T=I.hash_size;K=I.head[--t],I.head[t]=K0<=K?K-K0:0,--T;);for(t=T=K0;K=I.prev[--t],I.prev[t]=K0<=K?K-K0:0,--T;);q+=K0}if(I.strm.avail_in===0)break;if(x=I.strm,l=I.window,u=I.strstart+I.lookahead,Q0=q,q0=void 0,q0=x.avail_in,Q0=E)for(w=I.strstart-I.insert,I.ins_h=I.window[w],I.ins_h=(I.ins_h<=E&&(I.ins_h=(I.ins_h<=E)if(K=Q._tr_tally(I,I.strstart-I.match_start,I.match_length-E),I.lookahead-=I.match_length,I.match_length<=I.max_lazy_match&&I.lookahead>=E){for(I.match_length--;I.strstart++,I.ins_h=(I.ins_h<=E&&(I.ins_h=(I.ins_h<=E&&I.match_length<=I.prev_length){for(q=I.strstart+I.lookahead-E,K=Q._tr_tally(I,I.strstart-1-I.prev_match,I.prev_length-E),I.lookahead-=I.prev_length-1,I.prev_length-=2;++I.strstart<=q&&(I.ins_h=(I.ins_h<I.pending_buf_size-5&&(T=I.pending_buf_size-5);;){if(I.lookahead<=1){if(p(I),I.lookahead===0&&t===W)return N;if(I.lookahead===0)break}I.strstart+=I.lookahead,I.lookahead=0;var K=I.block_start+T;if((I.strstart===0||I.strstart>=K)&&(I.lookahead=I.strstart-K,I.strstart=K,_(I,!1),I.strm.avail_out===0))return N;if(I.strstart-I.block_start>=I.w_size-V0&&(_(I,!1),I.strm.avail_out===0))return N}return I.insert=0,t===k?(_(I,!0),I.strm.avail_out===0?$0:m):(I.strstart>I.block_start&&(_(I,!1),I.strm.avail_out),N)}),new c(4,4,8,4,P),new c(4,5,16,8,P),new c(4,6,32,32,P),new c(4,4,16,16,R),new c(8,16,32,32,R),new c(8,16,128,128,R),new c(8,32,128,256,R),new c(32,128,258,1024,R),new c(32,258,258,4096,R)],J.deflateInit=function(I,t){return e(I,t,j,15,8,0)},J.deflateInit2=e,J.deflateReset=b,J.deflateResetKeep=v,J.deflateSetHeader=function(I,t){return I&&I.state?I.state.wrap!==2?C:(I.state.gzhead=t,D):C},J.deflate=function(I,t){var T,K,q,w;if(!I||!I.state||5>8&255),r(K,K.gzhead.time>>16&255),r(K,K.gzhead.time>>24&255),r(K,K.level===9?2:2<=K.strategy||K.level<2?4:0),r(K,255&K.gzhead.os),K.gzhead.extra&&K.gzhead.extra.length&&(r(K,255&K.gzhead.extra.length),r(K,K.gzhead.extra.length>>8&255)),K.gzhead.hcrc&&(I.adler=F(I.adler,K.pending_buf,K.pending,0)),K.gzindex=0,K.status=69):(r(K,0),r(K,0),r(K,0),r(K,0),r(K,0),r(K,K.level===9?2:2<=K.strategy||K.level<2?4:0),r(K,3),K.status=h);else{var x=j+(K.w_bits-8<<4)<<8;x|=(2<=K.strategy||K.level<2?0:K.level<6?1:K.level===6?2:3)<<6,K.strstart!==0&&(x|=32),x+=31-x%31,K.status=h,n(K,x),K.strstart!==0&&(n(K,I.adler>>>16),n(K,65535&I.adler)),I.adler=1}if(K.status===69)if(K.gzhead.extra){for(q=K.pending;K.gzindex<(65535&K.gzhead.extra.length)&&(K.pending!==K.pending_buf_size||(K.gzhead.hcrc&&K.pending>q&&(I.adler=F(I.adler,K.pending_buf,K.pending-q,q)),i(I),q=K.pending,K.pending!==K.pending_buf_size));)r(K,255&K.gzhead.extra[K.gzindex]),K.gzindex++;K.gzhead.hcrc&&K.pending>q&&(I.adler=F(I.adler,K.pending_buf,K.pending-q,q)),K.gzindex===K.gzhead.extra.length&&(K.gzindex=0,K.status=73)}else K.status=73;if(K.status===73)if(K.gzhead.name){q=K.pending;do{if(K.pending===K.pending_buf_size&&(K.gzhead.hcrc&&K.pending>q&&(I.adler=F(I.adler,K.pending_buf,K.pending-q,q)),i(I),q=K.pending,K.pending===K.pending_buf_size)){w=1;break}w=K.gzindexq&&(I.adler=F(I.adler,K.pending_buf,K.pending-q,q)),w===0&&(K.gzindex=0,K.status=91)}else K.status=91;if(K.status===91)if(K.gzhead.comment){q=K.pending;do{if(K.pending===K.pending_buf_size&&(K.gzhead.hcrc&&K.pending>q&&(I.adler=F(I.adler,K.pending_buf,K.pending-q,q)),i(I),q=K.pending,K.pending===K.pending_buf_size)){w=1;break}w=K.gzindexq&&(I.adler=F(I.adler,K.pending_buf,K.pending-q,q)),w===0&&(K.status=103)}else K.status=103;if(K.status===103&&(K.gzhead.hcrc?(K.pending+2>K.pending_buf_size&&i(I),K.pending+2<=K.pending_buf_size&&(r(K,255&I.adler),r(K,I.adler>>8&255),I.adler=0,K.status=h)):K.status=h),K.pending!==0){if(i(I),I.avail_out===0)return K.last_flush=-1,D}else if(I.avail_in===0&&U0(t)<=U0(T)&&t!==k)return J0(I,-5);if(K.status===666&&I.avail_in!==0)return J0(I,-5);if(I.avail_in!==0||K.lookahead!==0||t!==W&&K.status!==666){var l=K.strategy===2?function(u,Q0){for(var q0;;){if(u.lookahead===0&&(p(u),u.lookahead===0)){if(Q0===W)return N;break}if(u.match_length=0,q0=Q._tr_tally(u,0,u.window[u.strstart]),u.lookahead--,u.strstart++,q0&&(_(u,!1),u.strm.avail_out===0))return N}return u.insert=0,Q0===k?(_(u,!0),u.strm.avail_out===0?$0:m):u.last_lit&&(_(u,!1),u.strm.avail_out===0)?N:a}(K,t):K.strategy===3?function(u,Q0){for(var q0,K0,M0,w0,H0=u.window;;){if(u.lookahead<=s){if(p(u),u.lookahead<=s&&Q0===W)return N;if(u.lookahead===0)break}if(u.match_length=0,u.lookahead>=E&&0u.lookahead&&(u.match_length=u.lookahead)}if(u.match_length>=E?(q0=Q._tr_tally(u,1,u.match_length-E),u.lookahead-=u.match_length,u.strstart+=u.match_length,u.match_length=0):(q0=Q._tr_tally(u,0,u.window[u.strstart]),u.lookahead--,u.strstart++),q0&&(_(u,!1),u.strm.avail_out===0))return N}return u.insert=0,Q0===k?(_(u,!0),u.strm.avail_out===0?$0:m):u.last_lit&&(_(u,!1),u.strm.avail_out===0)?N:a}(K,t):G[K.level].func(K,t);if(l!==$0&&l!==m||(K.status=666),l===N||l===$0)return I.avail_out===0&&(K.last_flush=-1),D;if(l===a&&(t===1?Q._tr_align(K):t!==5&&(Q._tr_stored_block(K,0,0,!1),t===3&&(L0(K.head),K.lookahead===0&&(K.strstart=0,K.block_start=0,K.insert=0))),i(I),I.avail_out===0))return K.last_flush=-1,D}return t!==k?D:K.wrap<=0?1:(K.wrap===2?(r(K,255&I.adler),r(K,I.adler>>8&255),r(K,I.adler>>16&255),r(K,I.adler>>24&255),r(K,255&I.total_in),r(K,I.total_in>>8&255),r(K,I.total_in>>16&255),r(K,I.total_in>>24&255)):(n(K,I.adler>>>16),n(K,65535&I.adler)),i(I),0=T.w_size&&(w===0&&(L0(T.head),T.strstart=0,T.block_start=0,T.insert=0),Q0=new X.Buf8(T.w_size),X.arraySet(Q0,t,q0-T.w_size,T.w_size,0),t=Q0,q0=T.w_size),x=I.avail_in,l=I.next_in,u=I.input,I.avail_in=q0,I.next_in=0,I.input=t,p(T);T.lookahead>=E;){for(K=T.strstart,q=T.lookahead-(E-1);T.ins_h=(T.ins_h<>>=E=d>>>24,M-=E,(E=d>>>16&255)===0)a[z++]=65535&d;else{if(!(16&E)){if((64&E)==0){d=L[(65535&d)+(j&(1<>>=E,M-=E),M<15&&(j+=N[B++]<>>=E=d>>>24,M-=E,!(16&(E=d>>>16&255))){if((64&E)==0){d=A[(65535&d)+(j&(1<>>=E,M-=E,(E=z-W)>3,j&=(1<<(M-=s<<3))-1,G.next_in=B,G.next_out=z,G.avail_in=B>>24&255)+(S>>>8&65280)+((65280&S)<<8)+((255&S)<<24)}function j(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new G.Buf16(320),this.work=new G.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function M(S){var h;return S&&S.state?(h=S.state,S.total_in=S.total_out=h.total=0,S.msg="",h.wrap&&(S.adler=1&h.wrap),h.mode=C,h.last=0,h.havedict=0,h.dmax=32768,h.head=null,h.hold=0,h.bits=0,h.lencode=h.lendyn=new G.Buf32(H),h.distcode=h.distdyn=new G.Buf32(O),h.sane=1,h.back=-1,k):D}function L(S){var h;return S&&S.state?((h=S.state).wsize=0,h.whave=0,h.wnext=0,M(S)):D}function A(S,h){var N,a;return S&&S.state?(a=S.state,h<0?(N=0,h=-h):(N=1+(h>>4),h<48&&(h&=15)),h&&(h<8||15=m.wsize?(G.arraySet(m.window,h,N-m.wsize,m.wsize,0),m.wnext=0,m.whave=m.wsize):(a<($0=m.wsize-m.wnext)&&($0=a),G.arraySet(m.window,h,N-a,$0,m.wnext),(a-=$0)?(G.arraySet(m.window,h,N-a,a,0),m.wnext=a,m.whave=m.wsize):(m.wnext+=$0,m.wnext===m.wsize&&(m.wnext=0),m.whave>>8&255,N.check=Q(N.check,w,2,0),_=i=0,N.mode=2;break}if(N.flags=0,N.head&&(N.head.done=!1),!(1&N.wrap)||(((255&i)<<8)+(i>>8))%31){S.msg="incorrect header check",N.mode=30;break}if((15&i)!=8){S.msg="unknown compression method",N.mode=30;break}if(_-=4,I=8+(15&(i>>>=4)),N.wbits===0)N.wbits=I;else if(I>N.wbits){S.msg="invalid window size",N.mode=30;break}N.dmax=1<>8&1),512&N.flags&&(w[0]=255&i,w[1]=i>>>8&255,N.check=Q(N.check,w,2,0)),_=i=0,N.mode=3;case 3:for(;_<32;){if(U0===0)break $;U0--,i+=a[m++]<<_,_+=8}N.head&&(N.head.time=i),512&N.flags&&(w[0]=255&i,w[1]=i>>>8&255,w[2]=i>>>16&255,w[3]=i>>>24&255,N.check=Q(N.check,w,4,0)),_=i=0,N.mode=4;case 4:for(;_<16;){if(U0===0)break $;U0--,i+=a[m++]<<_,_+=8}N.head&&(N.head.xflags=255&i,N.head.os=i>>8),512&N.flags&&(w[0]=255&i,w[1]=i>>>8&255,N.check=Q(N.check,w,2,0)),_=i=0,N.mode=5;case 5:if(1024&N.flags){for(;_<16;){if(U0===0)break $;U0--,i+=a[m++]<<_,_+=8}N.length=i,N.head&&(N.head.extra_len=i),512&N.flags&&(w[0]=255&i,w[1]=i>>>8&255,N.check=Q(N.check,w,2,0)),_=i=0}else N.head&&(N.head.extra=null);N.mode=6;case 6:if(1024&N.flags&&(U0<(Z0=N.length)&&(Z0=U0),Z0&&(N.head&&(I=N.head.extra_len-N.length,N.head.extra||(N.head.extra=Array(N.head.extra_len)),G.arraySet(N.head.extra,a,m,Z0,I)),512&N.flags&&(N.check=Q(N.check,a,Z0,m)),U0-=Z0,m+=Z0,N.length-=Z0),N.length))break $;N.length=0,N.mode=7;case 7:if(2048&N.flags){if(U0===0)break $;for(Z0=0;I=a[m+Z0++],N.head&&I&&N.length<65536&&(N.head.name+=String.fromCharCode(I)),I&&Z0>9&1,N.head.done=!0),S.adler=N.check=0,N.mode=12;break;case 10:for(;_<32;){if(U0===0)break $;U0--,i+=a[m++]<<_,_+=8}S.adler=N.check=V(i),_=i=0,N.mode=11;case 11:if(N.havedict===0)return S.next_out=J0,S.avail_out=L0,S.next_in=m,S.avail_in=U0,N.hold=i,N.bits=_,2;S.adler=N.check=1,N.mode=12;case 12:if(h===5||h===6)break $;case 13:if(N.last){i>>>=7&_,_-=7&_,N.mode=27;break}for(;_<3;){if(U0===0)break $;U0--,i+=a[m++]<<_,_+=8}switch(N.last=1&i,_-=1,3&(i>>>=1)){case 0:N.mode=14;break;case 1:if(s(N),N.mode=20,h!==6)break;i>>>=2,_-=2;break $;case 2:N.mode=17;break;case 3:S.msg="invalid block type",N.mode=30}i>>>=2,_-=2;break;case 14:for(i>>>=7&_,_-=7&_;_<32;){if(U0===0)break $;U0--,i+=a[m++]<<_,_+=8}if((65535&i)!=(i>>>16^65535)){S.msg="invalid stored block lengths",N.mode=30;break}if(N.length=65535&i,_=i=0,N.mode=15,h===6)break $;case 15:N.mode=16;case 16:if(Z0=N.length){if(U0>>=5,_-=5,N.ndist=1+(31&i),i>>>=5,_-=5,N.ncode=4+(15&i),i>>>=4,_-=4,286>>=3,_-=3}for(;N.have<19;)N.lens[x[N.have++]]=0;if(N.lencode=N.lendyn,N.lenbits=7,T={bits:N.lenbits},t=F(0,N.lens,0,19,N.lencode,0,N.work,T),N.lenbits=T.bits,t){S.msg="invalid code lengths set",N.mode=30;break}N.have=0,N.mode=19;case 19:for(;N.have>>16&255,f=65535&q,!((R=q>>>24)<=_);){if(U0===0)break $;U0--,i+=a[m++]<<_,_+=8}if(f<16)i>>>=R,_-=R,N.lens[N.have++]=f;else{if(f===16){for(K=R+2;_>>=R,_-=R,N.have===0){S.msg="invalid bit length repeat",N.mode=30;break}I=N.lens[N.have-1],Z0=3+(3&i),i>>>=2,_-=2}else if(f===17){for(K=R+3;_>>=R)),i>>>=3,_-=3}else{for(K=R+7;_>>=R)),i>>>=7,_-=7}if(N.have+Z0>N.nlen+N.ndist){S.msg="invalid bit length repeat",N.mode=30;break}for(;Z0--;)N.lens[N.have++]=I}}if(N.mode===30)break;if(N.lens[256]===0){S.msg="invalid code -- missing end-of-block",N.mode=30;break}if(N.lenbits=9,T={bits:N.lenbits},t=F(z,N.lens,0,N.nlen,N.lencode,0,N.work,T),N.lenbits=T.bits,t){S.msg="invalid literal/lengths set",N.mode=30;break}if(N.distbits=6,N.distcode=N.distdyn,T={bits:N.distbits},t=F(W,N.lens,N.nlen,N.ndist,N.distcode,0,N.work,T),N.distbits=T.bits,t){S.msg="invalid distances set",N.mode=30;break}if(N.mode=20,h===6)break $;case 20:N.mode=21;case 21:if(6<=U0&&258<=L0){S.next_out=J0,S.avail_out=L0,S.next_in=m,S.avail_in=U0,N.hold=i,N.bits=_,B(S,n),J0=S.next_out,$0=S.output,L0=S.avail_out,m=S.next_in,a=S.input,U0=S.avail_in,i=N.hold,_=N.bits,N.mode===12&&(N.back=-1);break}for(N.back=0;c=(q=N.lencode[i&(1<>>16&255,f=65535&q,!((R=q>>>24)<=_);){if(U0===0)break $;U0--,i+=a[m++]<<_,_+=8}if(c&&(240&c)==0){for(v=R,b=c,e=f;c=(q=N.lencode[e+((i&(1<>v)])>>>16&255,f=65535&q,!(v+(R=q>>>24)<=_);){if(U0===0)break $;U0--,i+=a[m++]<<_,_+=8}i>>>=v,_-=v,N.back+=v}if(i>>>=R,_-=R,N.back+=R,N.length=f,c===0){N.mode=26;break}if(32&c){N.back=-1,N.mode=12;break}if(64&c){S.msg="invalid literal/length code",N.mode=30;break}N.extra=15&c,N.mode=22;case 22:if(N.extra){for(K=N.extra;_>>=N.extra,_-=N.extra,N.back+=N.extra}N.was=N.length,N.mode=23;case 23:for(;c=(q=N.distcode[i&(1<>>16&255,f=65535&q,!((R=q>>>24)<=_);){if(U0===0)break $;U0--,i+=a[m++]<<_,_+=8}if((240&c)==0){for(v=R,b=c,e=f;c=(q=N.distcode[e+((i&(1<>v)])>>>16&255,f=65535&q,!(v+(R=q>>>24)<=_);){if(U0===0)break $;U0--,i+=a[m++]<<_,_+=8}i>>>=v,_-=v,N.back+=v}if(i>>>=R,_-=R,N.back+=R,64&c){S.msg="invalid distance code",N.mode=30;break}N.offset=f,N.extra=15&c,N.mode=24;case 24:if(N.extra){for(K=N.extra;_>>=N.extra,_-=N.extra,N.back+=N.extra}if(N.offset>N.dmax){S.msg="invalid distance too far back",N.mode=30;break}N.mode=25;case 25:if(L0===0)break $;if(Z0=n-L0,N.offset>Z0){if((Z0=N.offset-Z0)>N.whave&&N.sane){S.msg="invalid distance too far back",N.mode=30;break}p=Z0>N.wnext?(Z0-=N.wnext,N.wsize-Z0):N.wnext-Z0,Z0>N.length&&(Z0=N.length),P=N.window}else P=$0,p=J0-N.offset,Z0=N.length;for(L0g?(E=p[P+O[h]],_[r+O[h]]):(E=96,0),j=1<>J0)+(M-=j)]=d<<24|E<<16|s|0,M!==0;);for(j=1<>=1;if(j!==0?(i&=j-1,i+=j):i=0,h++,--n[S]==0){if(S===a)break;S=W[k+O[h]]}if($0>>7)]}function r(q,w){q.pending_buf[q.pending++]=255&w,q.pending_buf[q.pending++]=w>>>8&255}function n(q,w,x){q.bi_valid>V-x?(q.bi_buf|=w<>V-q.bi_valid,q.bi_valid+=x-V):(q.bi_buf|=w<>>=1,x<<=1,0<--w;);return x>>>1}function P(q,w,x){var l,u,Q0=Array(O+1),q0=0;for(l=1;l<=O;l++)Q0[l]=q0=q0+x[l-1]<<1;for(u=0;u<=w;u++){var K0=q[2*u+1];K0!==0&&(q[2*u]=p(Q0[K0]++,K0))}}function R(q){var w;for(w=0;w>1;1<=x;x--)v(q,Q0,x);for(u=M0;x=q.heap[1],q.heap[1]=q.heap[q.heap_len--],v(q,Q0,1),l=q.heap[1],q.heap[--q.heap_max]=x,q.heap[--q.heap_max]=l,Q0[2*u]=Q0[2*x]+Q0[2*l],q.depth[u]=(q.depth[x]>=q.depth[l]?q.depth[x]:q.depth[l])+1,Q0[2*x+1]=Q0[2*l+1]=u,q.heap[1]=u++,v(q,Q0,1),2<=q.heap_len;);q.heap[--q.heap_max]=q.heap[1],function(H0,v0){var j2,l0,t2,D0,A1,z8,K2=v0.dyn_tree,NU=v0.max_code,H7=v0.stat_desc.static_tree,j7=v0.stat_desc.has_stree,z7=v0.stat_desc.extra_bits,RU=v0.stat_desc.extra_base,e2=v0.stat_desc.max_length,P1=0;for(D0=0;D0<=O;D0++)H0.bl_count[D0]=0;for(K2[2*H0.heap[H0.heap_max]+1]=0,j2=H0.heap_max+1;j2>=7;u>>=1)if(1&w0&&K0.dyn_ltree[2*M0]!==0)return X;if(K0.dyn_ltree[18]!==0||K0.dyn_ltree[20]!==0||K0.dyn_ltree[26]!==0)return Q;for(M0=32;M0>>3,(Q0=q.static_len+3+7>>>3)<=u&&(u=Q0)):u=Q0=x+5,x+4<=u&&w!==-1?K(q,w,x,l):q.strategy===4||Q0===u?(n(q,2+(l?1:0),3),b(q,V0,S)):(n(q,4+(l?1:0),3),function(K0,M0,w0,H0){var v0;for(n(K0,M0-257,5),n(K0,w0-1,5),n(K0,H0-4,4),v0=0;v0>>8&255,q.pending_buf[q.d_buf+2*q.last_lit+1]=255&w,q.pending_buf[q.l_buf+q.last_lit]=255&x,q.last_lit++,w===0?q.dyn_ltree[2*x]++:(q.matches++,w--,q.dyn_ltree[2*(N[x]+W+1)]++,q.dyn_dtree[2*_(w)]++),q.last_lit===q.lit_bufsize-1},J._tr_align=function(q){n(q,2,3),Z0(q,M,V0),function(w){w.bi_valid===16?(r(w,w.bi_buf),w.bi_buf=0,w.bi_valid=0):8<=w.bi_valid&&(w.pending_buf[w.pending++]=255&w.bi_buf,w.bi_buf>>=8,w.bi_valid-=8)}(q)}},{"../utils/common":41}],53:[function(Y,Z,J){Z.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(Y,Z,J){(function(G){(function(X,Q){if(!X.setImmediate){var B,F,z,W,k=1,D={},C=!1,H=X.document,O=Object.getPrototypeOf&&Object.getPrototypeOf(X);O=O&&O.setTimeout?O:X,B={}.toString.call(X.process)==="[object process]"?function(L){j0.nextTick(function(){j(L)})}:function(){if(X.postMessage&&!X.importScripts){var L=!0,A=X.onmessage;return X.onmessage=function(){L=!1},X.postMessage("","*"),X.onmessage=A,L}}()?(W="setImmediate$"+Math.random()+"$",X.addEventListener?X.addEventListener("message",M,!1):X.attachEvent("onmessage",M),function(L){X.postMessage(W+L,"*")}):X.MessageChannel?((z=new MessageChannel).port1.onmessage=function(L){j(L.data)},function(L){z.port2.postMessage(L)}):H&&("onreadystatechange"in H.createElement("script"))?(F=H.documentElement,function(L){var A=H.createElement("script");A.onreadystatechange=function(){j(L),A.onreadystatechange=null,F.removeChild(A),A=null},F.appendChild(A)}):function(L){setTimeout(j,0,L)},O.setImmediate=function(L){typeof L!="function"&&(L=Function(""+L));for(var A=Array(arguments.length-1),y=0;y"u"?G===void 0?this:G:self)}).call(this,typeof c0<"u"?c0:typeof self<"u"?self:typeof window<"u"?window:{})},{}]},{},[10])(10)})}(I9),I9.exports}var YB=UB(),c2=g9(YB),Z1={exports:{}},w9,dZ;function ZB(){if(dZ)return w9;dZ=1;var $={"&":"&",'"':""","'":"'","<":"<",">":">"};function U(Y){return Y&&Y.replace?Y.replace(/([&"<>'])/g,function(Z,J){return $[J]}):Y}return w9=U,w9}var cZ;function QB(){if(cZ)return Z1.exports;cZ=1;var $=ZB(),U=m9().Stream,Y=" ";function Z(F,z){if(typeof z!=="object")z={indent:z};var W=z.stream?new U:null,k="",D=!1,C=!z.indent?"":z.indent===!0?Y:z.indent,H=!0;function O(A){if(!H)A();else j0.nextTick(A)}function V(A,y){if(y!==void 0)k+=y;if(A&&!D)W=W||new U,D=!0;if(A&&D){var g=k;O(function(){W.emit("data",g)}),k=""}}function j(A,y){Q(V,X(A,C,C?1:0),y)}function M(){if(W){var A=k;O(function(){W.emit("data",A),W.emit("end"),W.readable=!1,W.emit("close")})}}function L(A){var y=A.encoding||"UTF-8",g={version:"1.0",encoding:y};if(A.standalone)g.standalone=A.standalone;j({"?xml":{_attr:g}}),k=k.replace("/>","?>")}if(O(function(){H=!1}),z.declaration)L(z.declaration);if(F&&F.forEach)F.forEach(function(A,y){var g;if(y+1===F.length)g=M;j(A,g)});else j(F,M);if(W)return W.readable=!0,W;return k}function J(){var F=Array.prototype.slice.call(arguments),z={_elem:X(F)};return z.push=function(W){if(!this.append)throw Error("not assigned to a parent!");var k=this,D=this._elem.indent;Q(this.append,X(W,D,this._elem.icount+(D?1:0)),function(){k.append(!0)})},z.close=function(W){if(W!==void 0)this.push(W);if(this.end)this.end()},z}function G(F,z){return Array(z||0).join(F||"")}function X(F,z,W){W=W||0;var k=G(z,W),D,C=F,H=!1;if(typeof F==="object"){var O=Object.keys(F);if(D=O[0],C=F[D],C&&C._elem)return C._elem.name=D,C._elem.icount=W,C._elem.indent=z,C._elem.indents=k,C._elem.interrupt=C,C._elem}var V=[],j=[],M;function L(A){var y=Object.keys(A);y.forEach(function(g){V.push(B(g,A[g]))})}switch(typeof C){case"object":if(C===null)break;if(C._attr)L(C._attr);if(C._cdata)j.push(("/g,"]]]]>")+"]]>");if(C.forEach){if(M=!1,j.push(""),C.forEach(function(A){if(typeof A=="object"){var y=Object.keys(A)[0];if(y=="_attr")L(A._attr);else j.push(X(A,z,W+1))}else j.pop(),M=!0,j.push($(A))}),!M)j.push("")}break;default:j.push($(C))}return{name:D,interrupt:H,attributes:V,content:j,icount:W,indents:k,indent:z}}function Q(F,z,W){if(typeof z!="object")return F(!1,z);var k=z.interrupt?1:z.content.length;function D(){while(z.content.length){var H=z.content.shift();if(H===void 0)continue;if(C(H))return;Q(F,H)}if(F(!1,(k>1?z.indents:"")+(z.name?"":"")+(z.indent&&!W?` +`:"")),W)W()}function C(H){if(H.interrupt)return H.interrupt.append=F,H.interrupt.end=D,H.interrupt=!1,F(!0),!0;return!1}if(F(!1,z.indents+(z.name?"<"+z.name:"")+(z.attributes.length?" "+z.attributes.join(" "):"")+(k?z.name?">":"":z.name?"/>":"")+(z.indent&&k>1?` +`:"")),!k)return F(!1,z.indent?` +`:"");if(!C(z))D()}function B(F,z){return F+'="'+$(z)+'"'}return Z1.exports=Z,Z1.exports.element=Z1.exports.Element=J,Z1.exports}var JB=QB(),F0=g9(JB),Q1=0,W9=32,GB=32,KB=($,U)=>{let Y=U.replace(/-/g,"");if(Y.length!==GB)throw Error(`Error: Cannot extract GUID from font filename: ${U}`);let J=Y.replace(/(..)/g,"$1 ").trim().split(" ").map((B)=>parseInt(B,16));J.reverse();let X=$.slice(Q1,W9).map((B,F)=>B^J[F%J.length]),Q=new Uint8Array(Q1+X.length+Math.max(0,$.length-W9));return Q.set($.slice(0,Q1)),Q.set(X,Q1),Q.set($.slice(W9),Q1+X.length),Q};class H8{format($,U={stack:[]}){let Y=$.prepForXml(U);if(Y)return Y;else throw Error("XMLComponent did not format correctly")}}class jU{replace($,U,Y){let Z=$;return U.forEach((J,G)=>{Z=Z.replace(new RegExp(`{${J.fileName}}`,"g"),(Y+G).toString())}),Z}getMediaData($,U){return U.Array.filter((Y)=>$.search(`{${Y.fileName}}`)>0)}}class K7{replace($,U){let Y=$;for(let Z of U)Y=Y.replace(new RegExp(`{${Z.reference}-${Z.instance}}`,"g"),Z.numId.toString());return Y}}class q7{constructor(){Y0(this,"formatter"),Y0(this,"imageReplacer"),Y0(this,"numberingReplacer"),this.formatter=new H8,this.imageReplacer=new jU,this.numberingReplacer=new K7}compile($,U,Y=[]){let Z=new c2,J=this.xmlifyFile($,U),G=new Map(Object.entries(J));for(let[,X]of G)if(Array.isArray(X))for(let Q of X)Z.file(Q.path,X1(Q.data));else Z.file(X.path,X1(X.data));for(let X of Y)Z.file(X.path,X1(X.data));for(let X of $.Media.Array)if(X.type!=="svg")Z.file(`word/media/${X.fileName}`,X.data);else Z.file(`word/media/${X.fileName}`,X.data),Z.file(`word/media/${X.fallback.fileName}`,X.fallback.data);for(let{data:X,name:Q,fontKey:B}of $.FontTable.fontOptionsWithKey){let[F]=Q.split(".");Z.file(`word/fonts/${F}.odttf`,KB(X,B))}return Z}xmlifyFile($,U){let Y=$.Document.Relationships.RelationshipCount+1,Z=F0(this.formatter.format($.Document.View,{viewWrapper:$.Document,file:$,stack:[]}),{indent:U,declaration:{standalone:"yes",encoding:"UTF-8"}}),J=$.Comments.Relationships.RelationshipCount+1,G=F0(this.formatter.format($.Comments,{viewWrapper:{View:$.Comments,Relationships:$.Comments.Relationships},file:$,stack:[]}),{indent:U,declaration:{standalone:"yes",encoding:"UTF-8"}}),X=$.FootNotes.Relationships.RelationshipCount+1,Q=F0(this.formatter.format($.FootNotes.View,{viewWrapper:$.FootNotes,file:$,stack:[]}),{indent:U,declaration:{standalone:"yes",encoding:"UTF-8"}}),B=this.imageReplacer.getMediaData(Z,$.Media),F=this.imageReplacer.getMediaData(G,$.Media),z=this.imageReplacer.getMediaData(Q,$.Media);return{Relationships:{data:(()=>{return B.forEach((W,k)=>{$.Document.Relationships.addRelationship(Y+k,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",`media/${W.fileName}`)}),$.Document.Relationships.addRelationship($.Document.Relationships.RelationshipCount+1,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable","fontTable.xml"),F0(this.formatter.format($.Document.Relationships,{viewWrapper:$.Document,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}})})(),path:"word/_rels/document.xml.rels"},Document:{data:(()=>{let W=this.imageReplacer.replace(Z,B,Y);return this.numberingReplacer.replace(W,$.Numbering.ConcreteNumbering)})(),path:"word/document.xml"},Styles:{data:(()=>{let W=F0(this.formatter.format($.Styles,{viewWrapper:$.Document,file:$,stack:[]}),{indent:U,declaration:{standalone:"yes",encoding:"UTF-8"}});return this.numberingReplacer.replace(W,$.Numbering.ConcreteNumbering)})(),path:"word/styles.xml"},Properties:{data:F0(this.formatter.format($.CoreProperties,{viewWrapper:$.Document,file:$,stack:[]}),{indent:U,declaration:{standalone:"yes",encoding:"UTF-8"}}),path:"docProps/core.xml"},Numbering:{data:F0(this.formatter.format($.Numbering,{viewWrapper:$.Document,file:$,stack:[]}),{indent:U,declaration:{standalone:"yes",encoding:"UTF-8"}}),path:"word/numbering.xml"},FileRelationships:{data:F0(this.formatter.format($.FileRelationships,{viewWrapper:$.Document,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}}),path:"_rels/.rels"},HeaderRelationships:$.Headers.map((W,k)=>{let D=F0(this.formatter.format(W.View,{viewWrapper:W,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}});return this.imageReplacer.getMediaData(D,$.Media).forEach((H,O)=>{W.Relationships.addRelationship(O,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",`media/${H.fileName}`)}),{data:F0(this.formatter.format(W.Relationships,{viewWrapper:W,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}}),path:`word/_rels/header${k+1}.xml.rels`}}),FooterRelationships:$.Footers.map((W,k)=>{let D=F0(this.formatter.format(W.View,{viewWrapper:W,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}});return this.imageReplacer.getMediaData(D,$.Media).forEach((H,O)=>{W.Relationships.addRelationship(O,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",`media/${H.fileName}`)}),{data:F0(this.formatter.format(W.Relationships,{viewWrapper:W,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}}),path:`word/_rels/footer${k+1}.xml.rels`}}),Headers:$.Headers.map((W,k)=>{let D=F0(this.formatter.format(W.View,{viewWrapper:W,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}}),C=this.imageReplacer.getMediaData(D,$.Media),H=this.imageReplacer.replace(D,C,0);return{data:this.numberingReplacer.replace(H,$.Numbering.ConcreteNumbering),path:`word/header${k+1}.xml`}}),Footers:$.Footers.map((W,k)=>{let D=F0(this.formatter.format(W.View,{viewWrapper:W,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}}),C=this.imageReplacer.getMediaData(D,$.Media),H=this.imageReplacer.replace(D,C,0);return{data:this.numberingReplacer.replace(H,$.Numbering.ConcreteNumbering),path:`word/footer${k+1}.xml`}}),ContentTypes:{data:F0(this.formatter.format($.ContentTypes,{viewWrapper:$.Document,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}}),path:"[Content_Types].xml"},CustomProperties:{data:F0(this.formatter.format($.CustomProperties,{viewWrapper:$.Document,file:$,stack:[]}),{indent:U,declaration:{standalone:"yes",encoding:"UTF-8"}}),path:"docProps/custom.xml"},AppProperties:{data:F0(this.formatter.format($.AppProperties,{viewWrapper:$.Document,file:$,stack:[]}),{indent:U,declaration:{standalone:"yes",encoding:"UTF-8"}}),path:"docProps/app.xml"},FootNotes:{data:(()=>{let W=this.imageReplacer.replace(Q,z,X);return this.numberingReplacer.replace(W,$.Numbering.ConcreteNumbering)})(),path:"word/footnotes.xml"},FootNotesRelationships:{data:(()=>{return z.forEach((W,k)=>{$.FootNotes.Relationships.addRelationship(X+k,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",`media/${W.fileName}`)}),F0(this.formatter.format($.FootNotes.Relationships,{viewWrapper:$.FootNotes,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}})})(),path:"word/_rels/footnotes.xml.rels"},Endnotes:{data:F0(this.formatter.format($.Endnotes.View,{viewWrapper:$.Endnotes,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}}),path:"word/endnotes.xml"},EndnotesRelationships:{data:F0(this.formatter.format($.Endnotes.Relationships,{viewWrapper:$.Endnotes,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}}),path:"word/_rels/endnotes.xml.rels"},Settings:{data:F0(this.formatter.format($.Settings,{viewWrapper:$.Document,file:$,stack:[]}),{indent:U,declaration:{standalone:"yes",encoding:"UTF-8"}}),path:"word/settings.xml"},Comments:{data:(()=>{let W=this.imageReplacer.replace(G,F,J);return this.numberingReplacer.replace(W,$.Numbering.ConcreteNumbering)})(),path:"word/comments.xml"},CommentsRelationships:{data:(()=>{return F.forEach((W,k)=>{$.Comments.Relationships.addRelationship(J+k,"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",`media/${W.fileName}`)}),F0(this.formatter.format($.Comments.Relationships,{viewWrapper:{View:$.Comments,Relationships:$.Comments.Relationships},file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}})})(),path:"word/_rels/comments.xml.rels"},FontTable:{data:F0(this.formatter.format($.FontTable.View,{viewWrapper:$.Document,file:$,stack:[]}),{indent:U,declaration:{standalone:"yes",encoding:"UTF-8"}}),path:"word/fontTable.xml"},FontTableRelationships:{data:(()=>F0(this.formatter.format($.FontTable.Relationships,{viewWrapper:$.Document,file:$,stack:[]}),{indent:U,declaration:{encoding:"UTF-8"}}))(),path:"word/_rels/fontTable.xml.rels"}}}}var X7={NONE:"",WITH_2_BLANKS:" ",WITH_4_BLANKS:" ",WITH_TAB:"\t"},mZ=($)=>$===!0?X7.WITH_2_BLANKS:$===!1?void 0:$,V7=class ${static pack(U,Y,Z){return b9(this,arguments,function*(J,G,X,Q=[]){return this.compiler.compile(J,mZ(X),Q).generateAsync({type:G,mimeType:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",compression:"DEFLATE"})})}static toString(U,Y,Z=[]){return $.pack(U,"string",Y,Z)}static toBuffer(U,Y,Z=[]){return $.pack(U,"nodebuffer",Y,Z)}static toBase64String(U,Y,Z=[]){return $.pack(U,"base64",Y,Z)}static toBlob(U,Y,Z=[]){return $.pack(U,"blob",Y,Z)}static toArrayBuffer(U,Y,Z=[]){return $.pack(U,"arraybuffer",Y,Z)}static toStream(U,Y,Z=[]){let J=new $B.Stream;return this.compiler.compile(U,mZ(Y),Z).generateAsync({type:"nodebuffer",mimeType:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",compression:"DEFLATE"}).then((X)=>{J.emit("data",X),J.emit("end")}),J}};Y0(V7,"compiler",new q7);var qB=V7,XB=new H8,j8=($)=>{return $8.xml2js($,{compact:!1,captureSpacesBetweenElements:!0})},B7=($)=>{var U;return(U=j8(F0(XB.format(new a2({text:$})))).elements[0].elements)!=null?U:[]},L7=($)=>R0(W0({},$),{attributes:{"xml:space":"preserve"}}),zU=($,U)=>{var Y,Z;return(Z=(Y=$.elements)==null?void 0:Y.filter((J)=>J.name===U)[0].elements)!=null?Z:[]},h2=($,U,Y)=>{let Z=zU($,"Types");if(Z.some((G)=>{var X,Q;return G.type==="element"&&G.name==="Default"&&((X=G==null?void 0:G.attributes)==null?void 0:X.ContentType)===U&&((Q=G==null?void 0:G.attributes)==null?void 0:Q.Extension)===Y}))return;Z.push({attributes:{ContentType:U,Extension:Y},name:"Default",type:"element"})},VB=($)=>{let U=parseInt($.substring(3),10);return isNaN(U)?0:U},BB=($)=>{return zU($,"Relationships").map((Y)=>{var Z,J,G;return VB((G=(J=(Z=Y.attributes)==null?void 0:Z.Id)==null?void 0:J.toString())!=null?G:"")}).reduce((Y,Z)=>Math.max(Y,Z),0)+1},lZ=($,U,Y,Z,J)=>{let G=zU($,"Relationships");return G.push({attributes:{Id:`rId${U}`,Type:Y,Target:Z,TargetMode:J},name:"Relationship",type:"element"}),G};class M7 extends Error{constructor($){super(`Token ${$} not found`);this.name="TokenNotFoundError"}}var LB=($,U)=>{var Y,Z,J,G;for(let X=0;X<((Y=$.elements)!=null?Y:[]).length;X++){let Q=$.elements[X];if(Q.type==="element"&&Q.name==="w:r"){let B=((Z=Q.elements)!=null?Z:[]).filter((F)=>F.type==="element"&&F.name==="w:t");for(let F of B){if(!((J=F.elements)==null?void 0:J[0]))continue;if((G=F.elements[0].text)==null?void 0:G.includes(U))return X}}}throw new M7(U)},MB=($,U)=>{var Y,Z;let J=-1,G=(Z=(Y=$.elements)==null?void 0:Y.map((B,F)=>{var z,W,k;if(J!==-1)return B;if(B.type==="element"&&B.name==="w:t"){let C=((k=(W=(z=B.elements)==null?void 0:z[0])==null?void 0:W.text)!=null?k:"").split(U),H=C.map((O)=>R0(W0(W0({},B),L7(B)),{elements:B7(O)}));if(C.length>1)J=F;return H}else return B}).flat())!=null?Z:[],X=R0(W0({},JSON.parse(JSON.stringify($))),{elements:G.slice(0,J+1)}),Q=R0(W0({},JSON.parse(JSON.stringify($))),{elements:G.slice(J+1)});return{left:X,right:Q}},J1={START:0,MIDDLE:1,END:2},IB=({paragraphElement:$,renderedParagraph:U,originalText:Y,replacementText:Z})=>{let J=U.text.indexOf(Y),G=J+Y.length-1,X=J1.START;for(let Q of U.runs)for(let{text:B,index:F,start:z,end:W}of Q.parts)switch(X){case J1.START:if(J>=z&&J<=W){let k=J-z,D=Math.min(G,W)-z,C=Q.text.substring(k,D+1);if(C==="")continue;let H=B.replace(C,Z);H9($.elements[Q.index].elements[F],H),X=J1.MIDDLE;continue}break;case J1.MIDDLE:if(G<=W){let k=B.substring(G-z+1);H9($.elements[Q.index].elements[F],k);let D=$.elements[Q.index].elements[F];$.elements[Q.index].elements[F]=L7(D),X=J1.END}else H9($.elements[Q.index].elements[F],"");break}return $},H9=($,U)=>{return $.elements=B7(U),$},wB=($)=>{if($.element.name!=="w:p")throw Error(`Invalid node type: ${$.element.name}`);if(!$.element.elements)return{text:"",runs:[],index:-1,pathToParagraph:[]};let U=0,Y=$.element.elements.map((J,G)=>({element:J,i:G})).filter(({element:J})=>J.name==="w:r").map(({element:J,i:G})=>{let X=WB(J,G,U);return U+=X.text.length,X}).filter((J)=>!!J);return{text:Y.reduce((J,G)=>J+G.text,""),runs:Y,index:$.index,pathToParagraph:I7($)}},WB=($,U,Y)=>{if(!$.elements)return{text:"",parts:[],index:-1,start:Y,end:Y};let Z=Y,J=$.elements.map((X,Q)=>{var B,F;return X.name==="w:t"&&X.elements&&X.elements.length>0?{text:(F=(B=X.elements[0].text)==null?void 0:B.toString())!=null?F:"",index:Q,start:Z,end:(()=>{var z,W;return Z+=((W=(z=X.elements[0].text)==null?void 0:z.toString())!=null?W:"").length-1,Z})()}:void 0}).filter((X)=>!!X).map((X)=>X);return{text:J.reduce((X,Q)=>X+Q.text,""),parts:J,index:U,start:Y,end:Z}},I7=($)=>$.parent?[...I7($.parent),$.index]:[$.index],aZ=($)=>{var U,Y;return(Y=(U=$.element.elements)==null?void 0:U.map((Z,J)=>({element:Z,index:J,parent:$})))!=null?Y:[]},w7=($)=>{let U=[],Y=[...aZ({element:$,index:0,parent:void 0})],Z;while(Y.length>0){if(Z=Y.shift(),Z.element.name==="w:p")U=[...U,wB(Z)];Y.push(...aZ(Z))}return U},HB=($,U)=>w7($).filter((Y)=>Y.text.includes(U)),jB=new H8,j9="ɵ",zB=({json:$,patch:U,patchText:Y,context:Z,keepOriginalStyles:J=!0})=>{let G=HB($,Y);if(G.length===0)return{element:$,didFindOccurrence:!1};for(let X of G){let Q=U.children.map((B)=>j8(F0(jB.format(B,Z)))).map((B)=>B.elements[0]);switch(U.type){case y9.DOCUMENT:{let B=FB($,X.pathToParagraph),F=NB(X.pathToParagraph);B.elements.splice(F,1,...Q);break}case y9.PARAGRAPH:default:{let B=W7($,X.pathToParagraph);IB({paragraphElement:B,renderedParagraph:X,originalText:Y,replacementText:j9});let F=LB(B,j9),z=B.elements[F],{left:W,right:k}=MB(z,j9),D=Q,C=k;if(J){let H=z.elements.filter((O)=>O.type==="element"&&O.name==="w:rPr");D=Q.map((O)=>{var V;return R0(W0({},O),{elements:[...H,...(V=O.elements)!=null?V:[]]})}),C=R0(W0({},k),{elements:[...H,...k.elements]})}B.elements.splice(F,1,W,...D,C);break}}}return{element:$,didFindOccurrence:!0}},W7=($,U)=>{let Y=$;for(let Z=1;ZW7($,U.slice(0,U.length-1)),NB=($)=>$[$.length-1],y9={DOCUMENT:"file",PARAGRAPH:"paragraph"},pZ=new jU,RB=new Uint8Array([255,254]),DB=new Uint8Array([254,255]),iZ=($,U)=>{if($.length!==U.length)return!1;for(let Y=0;Y<$.length;Y++)if($[Y]!==U[Y])return!1;return!0},AB=($)=>b9(null,[$],function*({outputType:U,data:Y,patches:Z,keepOriginalStyles:J,placeholderDelimiters:G={start:"{{",end:"}}"},recursive:X=!0}){var Q,B,F;let z=Y instanceof c2?Y:yield c2.loadAsync(Y),W=new Map,k={Media:new w8},D=new Map,C=[],H=[],O=!1,V=new Map;for(let[M,L]of Object.entries(z.files)){let A=yield L.async("uint8array"),y=A.slice(0,2);if(iZ(y,RB)||iZ(y,DB)){V.set(M,A);continue}if(!M.endsWith(".xml")&&!M.endsWith(".rels")){V.set(M,A);continue}let g=j8(yield L.async("text"));if(M==="word/document.xml"){let d=(Q=g.elements)==null?void 0:Q.find((E)=>E.name==="w:document");if(d&&d.attributes){for(let E of["mc","wp","r","w15","m"])d.attributes[`xmlns:${E}`]=p1[E];d.attributes["mc:Ignorable"]=`${d.attributes["mc:Ignorable"]||""} w15`.trim()}}if(M.startsWith("word/")&&!M.endsWith(".xml.rels")){let d={file:k,viewWrapper:{Relationships:{addRelationship:(S,h,N,a)=>{H.push({key:M,hyperlink:{id:S,link:N}})}}},stack:[]};if(W.set(M,d),!(G==null?void 0:G.start.trim())||!(G==null?void 0:G.end.trim()))throw Error("Both start and end delimiters must be non-empty strings.");let{start:E,end:s}=G;for(let[S,h]of Object.entries(Z)){let N=`${E}${S}${s}`;while(!0){let{didFindOccurrence:a}=zB({json:g,patch:R0(W0({},h),{children:h.children.map(($0)=>{if($0 instanceof K8){let m=new _2($0.options.children,R1());return H.push({key:M,hyperlink:{id:m.linkId,link:$0.options.link}}),m}else return $0})}),patchText:N,context:d,keepOriginalStyles:J});if(!X||!a)break}}let V0=pZ.getMediaData(JSON.stringify(g),d.file.Media);if(V0.length>0)O=!0,C.push({key:M,mediaDatas:V0})}D.set(M,g)}for(let{key:M,mediaDatas:L}of C){let A=`word/_rels/${M.split("/").pop()}.rels`,y=(B=D.get(A))!=null?B:rZ();D.set(A,y);let g=BB(y),d=pZ.replace(JSON.stringify(D.get(M)),L,g);D.set(M,JSON.parse(d));for(let E=0;E{return $8.js2xml($,{attributeValueFn:(Y)=>String(Y).replace(/&(?!amp;|lt;|gt;|quot;|apos;)/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")})},rZ=()=>({declaration:{attributes:{version:"1.0",encoding:"UTF-8",standalone:"yes"}},elements:[{type:"element",name:"Relationships",attributes:{xmlns:"http://schemas.openxmlformats.org/package/2006/relationships"},elements:[]}]}),TB=($)=>b9(null,[$],function*({data:U}){let Y=U instanceof c2?U:yield c2.loadAsync(U),Z=new Set;for(let[J,G]of Object.entries(Y.files)){if(!J.endsWith(".xml")&&!J.endsWith(".rels"))continue;if(J.startsWith("word/")&&!J.endsWith(".xml.rels")){let X=j8(yield G.async("text"));w7(X).forEach((Q)=>CB(Q.text).forEach((B)=>Z.add(B)))}}return Array.from(Z)}),CB=($)=>{var U;let Y=new RegExp("(?<=\\{\\{).+?(?=\\}\\})","gs");return(U=$.match(Y))!=null?U:[]};if(typeof globalThis.Buffer>"u")globalThis.Buffer=G0;if(typeof globalThis.process>"u")globalThis.process=OB;globalThis.__bundles=globalThis.__bundles||{};globalThis.__bundles.docx=FU;})(); diff --git a/apps/sim/lib/execution/sandbox/bundles/pdf-lib.cjs b/apps/sim/lib/execution/sandbox/bundles/pdf-lib.cjs index 830ff9cf783..f56f8e9699a 100644 --- a/apps/sim/lib/execution/sandbox/bundles/pdf-lib.cjs +++ b/apps/sim/lib/execution/sandbox/bundles/pdf-lib.cjs @@ -1,7 +1,7 @@ // sandbox bundle: pdf-lib // generated by apps/sim/lib/execution/sandbox/bundles/build.ts // do not edit by hand. run `bun run build:sandbox-bundles` to regenerate. -(()=>{var d3=Object.create;var{getPrototypeOf:n3,defineProperty:fq,getOwnPropertyNames:r3}=Object;var i3=Object.prototype.hasOwnProperty;var $2=(V,q,X)=>{X=V!=null?d3(n3(V)):{};let K=q||!V||!V.__esModule?fq(X,"default",{value:V,enumerable:!0}):X;for(let Q of r3(V))if(!i3.call(K,Q))fq(K,Q,{get:()=>V[Q],enumerable:!0});return K};var g0=(V,q)=>()=>(q||V((q={exports:{}}).exports,q),q.exports);var a3=(V,q)=>{for(var X in q)fq(V,X,{get:q[X],enumerable:!0,configurable:!0,set:(K)=>q[X]=()=>K})};var gX=g0((hZ,uX)=>{var A0=uX.exports={},F6,P6;function sq(){throw new Error("setTimeout has not been defined")}function tq(){throw new Error("clearTimeout has not been defined")}(function(){try{if(typeof setTimeout==="function")F6=setTimeout;else F6=sq}catch(V){F6=sq}try{if(typeof clearTimeout==="function")P6=clearTimeout;else P6=tq}catch(V){P6=tq}})();function FX(V){if(F6===setTimeout)return setTimeout(V,0);if((F6===sq||!F6)&&setTimeout)return F6=setTimeout,setTimeout(V,0);try{return F6(V,0)}catch(q){try{return F6.call(null,V,0)}catch(X){return F6.call(this,V,0)}}}function NK(V){if(P6===clearTimeout)return clearTimeout(V);if((P6===tq||!P6)&&clearTimeout)return P6=clearTimeout,clearTimeout(V);try{return P6(V)}catch(q){try{return P6.call(null,V)}catch(X){return P6.call(this,V)}}}var o6=[],$8=!1,d5,h1=-1;function SK(){if(!$8||!d5)return;if($8=!1,d5.length)o6=d5.concat(o6);else h1=-1;if(o6.length)PX()}function PX(){if($8)return;var V=FX(SK);$8=!0;var q=o6.length;while(q){d5=o6,o6=[];while(++h11)for(var X=1;X{var gK=typeof Uint8Array!=="undefined"&&typeof Uint16Array!=="undefined"&&typeof Int32Array!=="undefined";function xK(V,q){return Object.prototype.hasOwnProperty.call(V,q)}r0.assign=function(V){var q=Array.prototype.slice.call(arguments,1);while(q.length){var X=q.shift();if(!X)continue;if(typeof X!=="object")throw new TypeError(X+"must be non-object");for(var K in X)if(xK(X,K))V[K]=X[K]}return V};r0.shrinkBuf=function(V,q){if(V.length===q)return V;if(V.subarray)return V.subarray(0,q);return V.length=q,V};var bK={arraySet:function(V,q,X,K,Q){if(q.subarray&&V.subarray){V.set(q.subarray(X,X+K),Q);return}for(var Y=0;Y{var fK=t6(),lK=4,pX=0,dX=1,_K=2;function u8(V){var q=V.length;while(--q>=0)V[q]=0}var cK=0,sX=1,pK=2,dK=3,nK=258,N4=29,p2=256,f2=p2+1+N4,D8=30,S4=19,tX=2*f2+1,i5=15,T4=16,rK=7,y4=256,eX=16,qV=17,XV=18,w4=[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],g1=[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],iK=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],VV=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],aK=512,e6=new Array((f2+2)*2);u8(e6);var m2=new Array(D8*2);u8(m2);var l2=new Array(aK);u8(l2);var _2=new Array(nK-dK+1);u8(_2);var $4=new Array(N4);u8($4);var x1=new Array(D8);u8(x1);function v4(V,q,X,K,Q){this.static_tree=V,this.extra_bits=q,this.extra_base=X,this.elems=K,this.max_length=Q,this.has_stree=V&&V.length}var KV,QV,YV;function R4(V,q){this.dyn_tree=V,this.max_code=0,this.stat_desc=q}function JV(V){return V<256?l2[V]:l2[256+(V>>>7)]}function c2(V,q){V.pending_buf[V.pending++]=q&255,V.pending_buf[V.pending++]=q>>>8&255}function q6(V,q,X){if(V.bi_valid>T4-X)V.bi_buf|=q<>T4-V.bi_valid,V.bi_valid+=X-T4;else V.bi_buf|=q<>>=1,X<<=1;while(--q>0);return X>>>1}function oK(V){if(V.bi_valid===16)c2(V,V.bi_buf),V.bi_buf=0,V.bi_valid=0;else if(V.bi_valid>=8)V.pending_buf[V.pending++]=V.bi_buf&255,V.bi_buf>>=8,V.bi_valid-=8}function sK(V,q){var{dyn_tree:X,max_code:K}=q,Q=q.stat_desc.static_tree,Y=q.stat_desc.has_stree,J=q.stat_desc.extra_bits,G=q.stat_desc.extra_base,W=q.stat_desc.max_length,Z,U,H,z,I,M,L=0;for(z=0;z<=i5;z++)V.bl_count[z]=0;X[V.heap[V.heap_max]*2+1]=0;for(Z=V.heap_max+1;ZW)z=W,L++;if(X[U*2+1]=z,U>K)continue;if(V.bl_count[z]++,I=0,U>=G)I=J[U-G];if(M=X[U*2],V.opt_len+=M*(z+I),Y)V.static_len+=M*(Q[U*2+1]+I)}if(L===0)return;do{z=W-1;while(V.bl_count[z]===0)z--;V.bl_count[z]--,V.bl_count[z+1]+=2,V.bl_count[W]--,L-=2}while(L>0);for(z=W;z!==0;z--){U=V.bl_count[z];while(U!==0){if(H=V.heap[--Z],H>K)continue;if(X[H*2+1]!==z)V.opt_len+=(z-X[H*2+1])*X[H*2],X[H*2+1]=z;U--}}}function ZV(V,q,X){var K=new Array(i5+1),Q=0,Y,J;for(Y=1;Y<=i5;Y++)K[Y]=Q=Q+X[Y-1]<<1;for(J=0;J<=q;J++){var G=V[J*2+1];if(G===0)continue;V[J*2]=GV(K[G]++,G)}}function tK(){var V,q,X,K,Q,Y=new Array(i5+1);X=0;for(K=0;K>=7;for(;K8)c2(V,V.bi_buf);else if(V.bi_valid>0)V.pending_buf[V.pending++]=V.bi_buf;V.bi_buf=0,V.bi_valid=0}function eK(V,q,X,K){if(UV(V),K)c2(V,X),c2(V,~X);fK.arraySet(V.pending_buf,V.window,q,X,V.pending),V.pending+=X}function nX(V,q,X,K){var Q=q*2,Y=X*2;return V[Q]>1;J>=1;J--)O4(V,X,J);Z=Y;do J=V.heap[1],V.heap[1]=V.heap[V.heap_len--],O4(V,X,1),G=V.heap[1],V.heap[--V.heap_max]=J,V.heap[--V.heap_max]=G,X[Z*2]=X[J*2]+X[G*2],V.depth[Z]=(V.depth[J]>=V.depth[G]?V.depth[J]:V.depth[G])+1,X[J*2+1]=X[G*2+1]=Z,V.heap[1]=Z++,O4(V,X,1);while(V.heap_len>=2);V.heap[--V.heap_max]=V.heap[1],sK(V,q),ZV(X,W,V.bl_count)}function iX(V,q,X){var K,Q=-1,Y,J=q[1],G=0,W=7,Z=4;if(J===0)W=138,Z=3;q[(X+1)*2+1]=65535;for(K=0;K<=X;K++){if(Y=J,J=q[(K+1)*2+1],++G=3;q--)if(V.bl_tree[VV[q]*2+1]!==0)break;return V.opt_len+=3*(q+1)+5+5+4,q}function XQ(V,q,X,K){var Q;q6(V,q-257,5),q6(V,X-1,5),q6(V,K-4,4);for(Q=0;Q>>=1)if(q&1&&V.dyn_ltree[X*2]!==0)return pX;if(V.dyn_ltree[18]!==0||V.dyn_ltree[20]!==0||V.dyn_ltree[26]!==0)return dX;for(X=32;X0){if(V.strm.data_type===_K)V.strm.data_type=VQ(V);if(A4(V,V.l_desc),A4(V,V.d_desc),J=qQ(V),Q=V.opt_len+3+7>>>3,Y=V.static_len+3+7>>>3,Y<=Q)Q=Y}else Q=Y=X+5;if(X+4<=Q&&q!==-1)HV(V,q,X,K);else if(V.strategy===lK||Y===Q)q6(V,(sX<<1)+(K?1:0),3),rX(V,e6,m2);else q6(V,(pK<<1)+(K?1:0),3),XQ(V,V.l_desc.max_code+1,V.d_desc.max_code+1,J+1),rX(V,V.dyn_ltree,V.dyn_dtree);if(WV(V),K)UV(V)}function JQ(V,q,X){if(V.pending_buf[V.d_buf+V.last_lit*2]=q>>>8&255,V.pending_buf[V.d_buf+V.last_lit*2+1]=q&255,V.pending_buf[V.l_buf+V.last_lit]=X&255,V.last_lit++,q===0)V.dyn_ltree[X*2]++;else V.matches++,q--,V.dyn_ltree[(_2[X]+p2+1)*2]++,V.dyn_dtree[JV(q)*2]++;return V.last_lit===V.lit_bufsize-1}g8._tr_init=KQ;g8._tr_stored_block=HV;g8._tr_flush_block=YQ;g8._tr_tally=JQ;g8._tr_align=QQ});var C4=g0((dZ,MV)=>{function GQ(V,q,X,K){var Q=V&65535|0,Y=V>>>16&65535|0,J=0;while(X!==0){J=X>2000?2000:X,X-=J;do Q=Q+q[K++]|0,Y=Y+Q|0;while(--J);Q%=65521,Y%=65521}return Q|Y<<16|0}MV.exports=GQ});var h4=g0((nZ,IV)=>{function ZQ(){var V,q=[];for(var X=0;X<256;X++){V=X;for(var K=0;K<8;K++)V=V&1?3988292384^V>>>1:V>>>1;q[X]=V}return q}var WQ=ZQ();function UQ(V,q,X,K){var Q=WQ,Y=K+X;V^=-1;for(var J=K;J>>8^Q[(V^q[J])&255];return V^-1}IV.exports=UQ});var b1=g0((rZ,kV)=>{kV.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}});var wV=g0((m6)=>{var i0=t6(),U6=zV(),BV=C4(),B5=h4(),HQ=b1(),t5=0,zQ=1,MQ=3,w5=4,EV=5,b6=0,LV=1,H6=-2,IQ=-3,F4=-5,kQ=-1,EQ=1,m1=2,LQ=3,jQ=4,BQ=0,TQ=2,c1=8,vQ=9,RQ=15,OQ=8,wQ=29,AQ=256,D4=AQ+1+wQ,NQ=30,SQ=19,yQ=2*D4+1,$Q=15,U0=3,R5=258,O6=R5+U0+1,CQ=32,p1=42,u4=69,f1=73,l1=91,_1=103,a5=113,n2=666,h0=1,r2=2,o5=3,m8=4,hQ=3;function O5(V,q){return V.msg=HQ[q],q}function jV(V){return(V<<1)-(V>4?9:0)}function v5(V){var q=V.length;while(--q>=0)V[q]=0}function T5(V){var q=V.state,X=q.pending;if(X>V.avail_out)X=V.avail_out;if(X===0)return;if(i0.arraySet(V.output,q.pending_buf,q.pending_out,X,V.next_out),V.next_out+=X,q.pending_out+=X,V.total_out+=X,V.avail_out-=X,q.pending-=X,q.pending===0)q.pending_out=0}function x0(V,q){U6._tr_flush_block(V,V.block_start>=0?V.block_start:-1,V.strstart-V.block_start,q),V.block_start=V.strstart,T5(V.strm)}function H0(V,q){V.pending_buf[V.pending++]=q}function d2(V,q){V.pending_buf[V.pending++]=q>>>8&255,V.pending_buf[V.pending++]=q&255}function FQ(V,q,X,K){var Q=V.avail_in;if(Q>K)Q=K;if(Q===0)return 0;if(V.avail_in-=Q,i0.arraySet(q,V.input,V.next_in,Q,X),V.state.wrap===1)V.adler=BV(V.adler,q,Q,X);else if(V.state.wrap===2)V.adler=B5(V.adler,q,Q,X);return V.next_in+=Q,V.total_in+=Q,Q}function TV(V,q){var{max_chain_length:X,strstart:K}=V,Q,Y,J=V.prev_length,G=V.nice_match,W=V.strstart>V.w_size-O6?V.strstart-(V.w_size-O6):0,Z=V.window,U=V.w_mask,H=V.prev,z=V.strstart+R5,I=Z[K+J-1],M=Z[K+J];if(V.prev_length>=V.good_match)X>>=2;if(G>V.lookahead)G=V.lookahead;do{if(Q=q,Z[Q+J]!==M||Z[Q+J-1]!==I||Z[Q]!==Z[K]||Z[++Q]!==Z[K+1])continue;K+=2,Q++;do;while(Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&KJ){if(V.match_start=q,J=Y,Y>=G)break;I=Z[K+J-1],M=Z[K+J]}}while((q=H[q&U])>W&&--X!==0);if(J<=V.lookahead)return J;return V.lookahead}function s5(V){var q=V.w_size,X,K,Q,Y,J;do{if(Y=V.window_size-V.lookahead-V.strstart,V.strstart>=q+(q-O6)){i0.arraySet(V.window,V.window,q,q,0),V.match_start-=q,V.strstart-=q,V.block_start-=q,K=V.hash_size,X=K;do Q=V.head[--X],V.head[X]=Q>=q?Q-q:0;while(--K);K=q,X=K;do Q=V.prev[--X],V.prev[X]=Q>=q?Q-q:0;while(--K);Y+=q}if(V.strm.avail_in===0)break;if(K=FQ(V.strm,V.window,V.strstart+V.lookahead,Y),V.lookahead+=K,V.lookahead+V.insert>=U0){J=V.strstart-V.insert,V.ins_h=V.window[J],V.ins_h=(V.ins_h<V.pending_buf_size-5)X=V.pending_buf_size-5;for(;;){if(V.lookahead<=1){if(s5(V),V.lookahead===0&&q===t5)return h0;if(V.lookahead===0)break}V.strstart+=V.lookahead,V.lookahead=0;var K=V.block_start+X;if(V.strstart===0||V.strstart>=K){if(V.lookahead=V.strstart-K,V.strstart=K,x0(V,!1),V.strm.avail_out===0)return h0}if(V.strstart-V.block_start>=V.w_size-O6){if(x0(V,!1),V.strm.avail_out===0)return h0}}if(V.insert=0,q===w5){if(x0(V,!0),V.strm.avail_out===0)return o5;return m8}if(V.strstart>V.block_start){if(x0(V,!1),V.strm.avail_out===0)return h0}return h0}function P4(V,q){var X,K;for(;;){if(V.lookahead=U0)V.ins_h=(V.ins_h<=U0)if(K=U6._tr_tally(V,V.strstart-V.match_start,V.match_length-U0),V.lookahead-=V.match_length,V.match_length<=V.max_lazy_match&&V.lookahead>=U0){V.match_length--;do V.strstart++,V.ins_h=(V.ins_h<=U0)V.ins_h=(V.ins_h<4096))V.match_length=U0-1}if(V.prev_length>=U0&&V.match_length<=V.prev_length){Q=V.strstart+V.lookahead-U0,K=U6._tr_tally(V,V.strstart-1-V.prev_match,V.prev_length-U0),V.lookahead-=V.prev_length-1,V.prev_length-=2;do if(++V.strstart<=Q)V.ins_h=(V.ins_h<=U0&&V.strstart>0){if(Q=V.strstart-1,K=J[Q],K===J[++Q]&&K===J[++Q]&&K===J[++Q]){Y=V.strstart+R5;do;while(K===J[++Q]&&K===J[++Q]&&K===J[++Q]&&K===J[++Q]&&K===J[++Q]&&K===J[++Q]&&K===J[++Q]&&K===J[++Q]&&QV.lookahead)V.match_length=V.lookahead}}if(V.match_length>=U0)X=U6._tr_tally(V,1,V.match_length-U0),V.lookahead-=V.match_length,V.strstart+=V.match_length,V.match_length=0;else X=U6._tr_tally(V,0,V.window[V.strstart]),V.lookahead--,V.strstart++;if(X){if(x0(V,!1),V.strm.avail_out===0)return h0}}if(V.insert=0,q===w5){if(x0(V,!0),V.strm.avail_out===0)return o5;return m8}if(V.last_lit){if(x0(V,!1),V.strm.avail_out===0)return h0}return r2}function uQ(V,q){var X;for(;;){if(V.lookahead===0){if(s5(V),V.lookahead===0){if(q===t5)return h0;break}}if(V.match_length=0,X=U6._tr_tally(V,0,V.window[V.strstart]),V.lookahead--,V.strstart++,X){if(x0(V,!1),V.strm.avail_out===0)return h0}}if(V.insert=0,q===w5){if(x0(V,!0),V.strm.avail_out===0)return o5;return m8}if(V.last_lit){if(x0(V,!1),V.strm.avail_out===0)return h0}return r2}function x6(V,q,X,K,Q){this.good_length=V,this.max_lazy=q,this.nice_length=X,this.max_chain=K,this.func=Q}var b8;b8=[new x6(0,0,0,0,PQ),new x6(4,4,8,4,P4),new x6(4,5,16,8,P4),new x6(4,6,32,32,P4),new x6(4,4,16,16,x8),new x6(8,16,32,32,x8),new x6(8,16,128,128,x8),new x6(8,32,128,256,x8),new x6(32,128,258,1024,x8),new x6(32,258,258,4096,x8)];function gQ(V){V.window_size=2*V.w_size,v5(V.head),V.max_lazy_match=b8[V.level].max_lazy,V.good_match=b8[V.level].good_length,V.nice_match=b8[V.level].nice_length,V.max_chain_length=b8[V.level].max_chain,V.strstart=0,V.block_start=0,V.lookahead=0,V.insert=0,V.match_length=V.prev_length=U0-1,V.match_available=0,V.ins_h=0}function xQ(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=c1,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new i0.Buf16(yQ*2),this.dyn_dtree=new i0.Buf16((2*NQ+1)*2),this.bl_tree=new i0.Buf16((2*SQ+1)*2),v5(this.dyn_ltree),v5(this.dyn_dtree),v5(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new i0.Buf16($Q+1),this.heap=new i0.Buf16(2*D4+1),v5(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new i0.Buf16(2*D4+1),v5(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function vV(V){var q;if(!V||!V.state)return O5(V,H6);if(V.total_in=V.total_out=0,V.data_type=TQ,q=V.state,q.pending=0,q.pending_out=0,q.wrap<0)q.wrap=-q.wrap;return q.status=q.wrap?p1:a5,V.adler=q.wrap===2?0:1,q.last_flush=t5,U6._tr_init(q),b6}function RV(V){var q=vV(V);if(q===b6)gQ(V.state);return q}function bQ(V,q){if(!V||!V.state)return H6;if(V.state.wrap!==2)return H6;return V.state.gzhead=q,b6}function OV(V,q,X,K,Q,Y){if(!V)return H6;var J=1;if(q===kQ)q=6;if(K<0)J=0,K=-K;else if(K>15)J=2,K-=16;if(Q<1||Q>vQ||X!==c1||K<8||K>15||q<0||q>9||Y<0||Y>jQ)return O5(V,H6);if(K===8)K=9;var G=new xQ;return V.state=G,G.strm=V,G.wrap=J,G.gzhead=null,G.w_bits=K,G.w_size=1<EV||q<0)return V?O5(V,H6):H6;if(K=V.state,!V.output||!V.input&&V.avail_in!==0||K.status===n2&&q!==w5)return O5(V,V.avail_out===0?F4:H6);if(K.strm=V,X=K.last_flush,K.last_flush=q,K.status===p1)if(K.wrap===2)if(V.adler=0,H0(K,31),H0(K,139),H0(K,8),!K.gzhead)H0(K,0),H0(K,0),H0(K,0),H0(K,0),H0(K,0),H0(K,K.level===9?2:K.strategy>=m1||K.level<2?4:0),H0(K,hQ),K.status=a5;else{if(H0(K,(K.gzhead.text?1:0)+(K.gzhead.hcrc?2:0)+(!K.gzhead.extra?0:4)+(!K.gzhead.name?0:8)+(!K.gzhead.comment?0:16)),H0(K,K.gzhead.time&255),H0(K,K.gzhead.time>>8&255),H0(K,K.gzhead.time>>16&255),H0(K,K.gzhead.time>>24&255),H0(K,K.level===9?2:K.strategy>=m1||K.level<2?4:0),H0(K,K.gzhead.os&255),K.gzhead.extra&&K.gzhead.extra.length)H0(K,K.gzhead.extra.length&255),H0(K,K.gzhead.extra.length>>8&255);if(K.gzhead.hcrc)V.adler=B5(V.adler,K.pending_buf,K.pending,0);K.gzindex=0,K.status=u4}else{var J=c1+(K.w_bits-8<<4)<<8,G=-1;if(K.strategy>=m1||K.level<2)G=0;else if(K.level<6)G=1;else if(K.level===6)G=2;else G=3;if(J|=G<<6,K.strstart!==0)J|=CQ;if(J+=31-J%31,K.status=a5,d2(K,J),K.strstart!==0)d2(K,V.adler>>>16),d2(K,V.adler&65535);V.adler=1}if(K.status===u4)if(K.gzhead.extra){Q=K.pending;while(K.gzindex<(K.gzhead.extra.length&65535)){if(K.pending===K.pending_buf_size){if(K.gzhead.hcrc&&K.pending>Q)V.adler=B5(V.adler,K.pending_buf,K.pending-Q,Q);if(T5(V),Q=K.pending,K.pending===K.pending_buf_size)break}H0(K,K.gzhead.extra[K.gzindex]&255),K.gzindex++}if(K.gzhead.hcrc&&K.pending>Q)V.adler=B5(V.adler,K.pending_buf,K.pending-Q,Q);if(K.gzindex===K.gzhead.extra.length)K.gzindex=0,K.status=f1}else K.status=f1;if(K.status===f1)if(K.gzhead.name){Q=K.pending;do{if(K.pending===K.pending_buf_size){if(K.gzhead.hcrc&&K.pending>Q)V.adler=B5(V.adler,K.pending_buf,K.pending-Q,Q);if(T5(V),Q=K.pending,K.pending===K.pending_buf_size){Y=1;break}}if(K.gzindexQ)V.adler=B5(V.adler,K.pending_buf,K.pending-Q,Q);if(Y===0)K.gzindex=0,K.status=l1}else K.status=l1;if(K.status===l1)if(K.gzhead.comment){Q=K.pending;do{if(K.pending===K.pending_buf_size){if(K.gzhead.hcrc&&K.pending>Q)V.adler=B5(V.adler,K.pending_buf,K.pending-Q,Q);if(T5(V),Q=K.pending,K.pending===K.pending_buf_size){Y=1;break}}if(K.gzindexQ)V.adler=B5(V.adler,K.pending_buf,K.pending-Q,Q);if(Y===0)K.status=_1}else K.status=_1;if(K.status===_1)if(K.gzhead.hcrc){if(K.pending+2>K.pending_buf_size)T5(V);if(K.pending+2<=K.pending_buf_size)H0(K,V.adler&255),H0(K,V.adler>>8&255),V.adler=0,K.status=a5}else K.status=a5;if(K.pending!==0){if(T5(V),V.avail_out===0)return K.last_flush=-1,b6}else if(V.avail_in===0&&jV(q)<=jV(X)&&q!==w5)return O5(V,F4);if(K.status===n2&&V.avail_in!==0)return O5(V,F4);if(V.avail_in!==0||K.lookahead!==0||q!==t5&&K.status!==n2){var W=K.strategy===m1?uQ(K,q):K.strategy===LQ?DQ(K,q):b8[K.level].func(K,q);if(W===o5||W===m8)K.status=n2;if(W===h0||W===o5){if(V.avail_out===0)K.last_flush=-1;return b6}if(W===r2){if(q===zQ)U6._tr_align(K);else if(q!==EV){if(U6._tr_stored_block(K,0,0,!1),q===MQ){if(v5(K.head),K.lookahead===0)K.strstart=0,K.block_start=0,K.insert=0}}if(T5(V),V.avail_out===0)return K.last_flush=-1,b6}}if(q!==w5)return b6;if(K.wrap<=0)return LV;if(K.wrap===2)H0(K,V.adler&255),H0(K,V.adler>>8&255),H0(K,V.adler>>16&255),H0(K,V.adler>>24&255),H0(K,V.total_in&255),H0(K,V.total_in>>8&255),H0(K,V.total_in>>16&255),H0(K,V.total_in>>24&255);else d2(K,V.adler>>>16),d2(K,V.adler&65535);if(T5(V),K.wrap>0)K.wrap=-K.wrap;return K.pending!==0?b6:LV}function lQ(V){var q;if(!V||!V.state)return H6;if(q=V.state.status,q!==p1&&q!==u4&&q!==f1&&q!==l1&&q!==_1&&q!==a5&&q!==n2)return O5(V,H6);return V.state=null,q===a5?O5(V,IQ):b6}function _Q(V,q){var X=q.length,K,Q,Y,J,G,W,Z,U;if(!V||!V.state)return H6;if(K=V.state,J=K.wrap,J===2||J===1&&K.status!==p1||K.lookahead)return H6;if(J===1)V.adler=BV(V.adler,q,X,0);if(K.wrap=0,X>=K.w_size){if(J===0)v5(K.head),K.strstart=0,K.block_start=0,K.insert=0;U=new i0.Buf8(K.w_size),i0.arraySet(U,q,X-K.w_size,K.w_size,0),q=U,X=K.w_size}G=V.avail_in,W=V.next_in,Z=V.input,V.avail_in=X,V.next_in=0,V.input=q,s5(K);while(K.lookahead>=U0){Q=K.strstart,Y=K.lookahead-(U0-1);do K.ins_h=(K.ins_h<{var d1=t6(),AV=!0,NV=!0;try{String.fromCharCode.apply(null,[0])}catch(V){AV=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(V){NV=!1}var i2=new d1.Buf8(256);for(f6=0;f6<256;f6++)i2[f6]=f6>=252?6:f6>=248?5:f6>=240?4:f6>=224?3:f6>=192?2:1;var f6;i2[254]=i2[254]=1;f8.string2buf=function(V){var q,X,K,Q,Y,J=V.length,G=0;for(Q=0;Q>>6,q[Y++]=128|X&63;else if(X<65536)q[Y++]=224|X>>>12,q[Y++]=128|X>>>6&63,q[Y++]=128|X&63;else q[Y++]=240|X>>>18,q[Y++]=128|X>>>12&63,q[Y++]=128|X>>>6&63,q[Y++]=128|X&63}return q};function SV(V,q){if(q<65534){if(V.subarray&&NV||!V.subarray&&AV)return String.fromCharCode.apply(null,d1.shrinkBuf(V,q))}var X="";for(var K=0;K4){G[K++]=65533,X+=Y-1;continue}Q&=Y===2?31:Y===3?15:7;while(Y>1&&X1){G[K++]=65533;continue}if(Q<65536)G[K++]=Q;else Q-=65536,G[K++]=55296|Q>>10&1023,G[K++]=56320|Q&1023}return SV(G,K)};f8.utf8border=function(V,q){var X;if(q=q||V.length,q>V.length)q=V.length;X=q-1;while(X>=0&&(V[X]&192)===128)X--;if(X<0)return q;if(X===0)return q;return X+i2[V[X]]>q?X:q}});var x4=g0((oZ,yV)=>{function cQ(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}yV.exports=cQ});var FV=g0((s2)=>{var a2=wV(),o2=t6(),m4=g4(),f4=b1(),pQ=x4(),hV=Object.prototype.toString,dQ=0,b4=4,l8=0,$V=1,CV=2,nQ=-1,rQ=0,iQ=8;function e5(V){if(!(this instanceof e5))return new e5(V);this.options=o2.assign({level:nQ,method:iQ,chunkSize:16384,windowBits:15,memLevel:8,strategy:rQ,to:""},V||{});var q=this.options;if(q.raw&&q.windowBits>0)q.windowBits=-q.windowBits;else if(q.gzip&&q.windowBits>0&&q.windowBits<16)q.windowBits+=16;this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new pQ,this.strm.avail_out=0;var X=a2.deflateInit2(this.strm,q.level,q.method,q.windowBits,q.memLevel,q.strategy);if(X!==l8)throw new Error(f4[X]);if(q.header)a2.deflateSetHeader(this.strm,q.header);if(q.dictionary){var K;if(typeof q.dictionary==="string")K=m4.string2buf(q.dictionary);else if(hV.call(q.dictionary)==="[object ArrayBuffer]")K=new Uint8Array(q.dictionary);else K=q.dictionary;if(X=a2.deflateSetDictionary(this.strm,K),X!==l8)throw new Error(f4[X]);this._dict_set=!0}}e5.prototype.push=function(V,q){var X=this.strm,K=this.options.chunkSize,Q,Y;if(this.ended)return!1;if(Y=q===~~q?q:q===!0?b4:dQ,typeof V==="string")X.input=m4.string2buf(V);else if(hV.call(V)==="[object ArrayBuffer]")X.input=new Uint8Array(V);else X.input=V;X.next_in=0,X.avail_in=X.input.length;do{if(X.avail_out===0)X.output=new o2.Buf8(K),X.next_out=0,X.avail_out=K;if(Q=a2.deflate(X,Y),Q!==$V&&Q!==l8)return this.onEnd(Q),this.ended=!0,!1;if(X.avail_out===0||X.avail_in===0&&(Y===b4||Y===CV))if(this.options.to==="string")this.onData(m4.buf2binstring(o2.shrinkBuf(X.output,X.next_out)));else this.onData(o2.shrinkBuf(X.output,X.next_out))}while((X.avail_in>0||X.avail_out===0)&&Q!==$V);if(Y===b4)return Q=a2.deflateEnd(this.strm),this.onEnd(Q),this.ended=!0,Q===l8;if(Y===CV)return this.onEnd(l8),X.avail_out=0,!0;return!0};e5.prototype.onData=function(V){this.chunks.push(V)};e5.prototype.onEnd=function(V){if(V===l8)if(this.options.to==="string")this.result=this.chunks.join("");else this.result=o2.flattenChunks(this.chunks);this.chunks=[],this.err=V,this.msg=this.strm.msg};function l4(V,q){var X=new e5(q);if(X.push(V,!0),X.err)throw X.msg||f4[X.err];return X.result}function aQ(V,q){return q=q||{},q.raw=!0,l4(V,q)}function oQ(V,q){return q=q||{},q.gzip=!0,l4(V,q)}s2.Deflate=e5;s2.deflate=l4;s2.deflateRaw=aQ;s2.gzip=oQ});var DV=g0((tZ,PV)=>{var n1=30,sQ=12;PV.exports=function V(q,X){var K,Q,Y,J,G,W,Z,U,H,z,I,M,L,B,j,O,N,R,v,w,$,S,h,b,C;K=q.state,Q=q.next_in,b=q.input,Y=Q+(q.avail_in-5),J=q.next_out,C=q.output,G=J-(X-q.avail_out),W=J+(q.avail_out-257),Z=K.dmax,U=K.wsize,H=K.whave,z=K.wnext,I=K.window,M=K.hold,L=K.bits,B=K.lencode,j=K.distcode,O=(1<>>24,M>>>=v,L-=v,v=R>>>16&255,v===0)C[J++]=R&65535;else if(v&16){if(w=R&65535,v&=15,v){if(L>>=v,L-=v}if(L<15)M+=b[Q++]<>>24,M>>>=v,L-=v,v=R>>>16&255,v&16){if($=R&65535,v&=15,LZ){q.msg="invalid distance too far back",K.mode=n1;break q}if(M>>>=v,L-=v,v=J-G,$>v){if(v=$-v,v>H){if(K.sane){q.msg="invalid distance too far back",K.mode=n1;break q}}if(S=0,h=I,z===0){if(S+=U-v,v2)C[J++]=h[S++],C[J++]=h[S++],C[J++]=h[S++],w-=3;if(w){if(C[J++]=h[S++],w>1)C[J++]=h[S++]}}else{S=J-$;do C[J++]=C[S++],C[J++]=C[S++],C[J++]=C[S++],w-=3;while(w>2);if(w){if(C[J++]=C[S++],w>1)C[J++]=C[S++]}}}else if((v&64)===0){R=j[(R&65535)+(M&(1<>3,Q-=w,L-=w<<3,M&=(1<{var uV=t6(),_8=15,gV=852,xV=592,bV=0,_4=1,mV=2,tQ=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],eQ=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],qY=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],XY=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];fV.exports=function V(q,X,K,Q,Y,J,G,W){var Z=W.bits,U=0,H=0,z=0,I=0,M=0,L=0,B=0,j=0,O=0,N=0,R,v,w,$,S,h=null,b=0,C,D=new uV.Buf16(_8+1),l=new uV.Buf16(_8+1),u=null,q0=0,J0,r,k0;for(U=0;U<=_8;U++)D[U]=0;for(H=0;H=1;I--)if(D[I]!==0)break;if(M>I)M=I;if(I===0)return Y[J++]=20971520,Y[J++]=20971520,W.bits=1,0;for(z=1;z0&&(q===bV||I!==1))return-1;l[1]=0;for(U=1;U<_8;U++)l[U+1]=l[U]+D[U];for(H=0;HgV||q===mV&&O>xV)return 1;for(;;){if(J0=U-B,G[H]C)r=u[q0+G[H]],k0=h[b+G[H]];else r=96,k0=0;R=1<>B)+v]=J0<<24|r<<16|k0|0;while(v!==0);R=1<>=1;if(R!==0)N&=R-1,N+=R;else N=0;if(H++,--D[U]===0){if(U===I)break;U=X[K+G[H]]}if(U>M&&(N&$)!==w){if(B===0)B=M;S+=z,L=U-B,j=1<gV||q===mV&&O>xV)return 1;w=N&$,Y[w]=M<<24|L<<16|S-J|0}}if(N!==0)Y[S+N]=U-B<<24|4194304|0;return W.bits=M,0}});var R9=g0((w6)=>{var Q6=t6(),i4=C4(),l6=h4(),VY=DV(),t2=lV(),KY=0,M9=1,I9=2,_V=4,QY=5,r1=6,q8=0,YY=1,JY=2,z6=-2,k9=-3,a4=-4,GY=-5,cV=8,E9=1,pV=2,dV=3,nV=4,rV=5,iV=6,aV=7,oV=8,sV=9,tV=10,o1=11,q5=12,c4=13,eV=14,p4=15,q9=16,X9=17,V9=18,K9=19,i1=20,a1=21,Q9=22,Y9=23,J9=24,G9=25,Z9=26,d4=27,W9=28,U9=29,j0=30,o4=31,ZY=32,WY=852,UY=592,HY=15,zY=HY;function H9(V){return(V>>>24&255)+(V>>>8&65280)+((V&65280)<<8)+((V&255)<<24)}function MY(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Q6.Buf16(320),this.work=new Q6.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function L9(V){var q;if(!V||!V.state)return z6;if(q=V.state,V.total_in=V.total_out=q.total=0,V.msg="",q.wrap)V.adler=q.wrap&1;return q.mode=E9,q.last=0,q.havedict=0,q.dmax=32768,q.head=null,q.hold=0,q.bits=0,q.lencode=q.lendyn=new Q6.Buf32(WY),q.distcode=q.distdyn=new Q6.Buf32(UY),q.sane=1,q.back=-1,q8}function j9(V){var q;if(!V||!V.state)return z6;return q=V.state,q.wsize=0,q.whave=0,q.wnext=0,L9(V)}function B9(V,q){var X,K;if(!V||!V.state)return z6;if(K=V.state,q<0)X=0,q=-q;else if(X=(q>>4)+1,q<48)q&=15;if(q&&(q<8||q>15))return z6;if(K.window!==null&&K.wbits!==q)K.window=null;return K.wrap=X,K.wbits=q,j9(V)}function T9(V,q){var X,K;if(!V)return z6;if(K=new MY,V.state=K,K.window=null,X=B9(V,q),X!==q8)V.state=null;return X}function IY(V){return T9(V,zY)}var z9=!0,n4,r4;function kY(V){if(z9){var q;n4=new Q6.Buf32(512),r4=new Q6.Buf32(32),q=0;while(q<144)V.lens[q++]=8;while(q<256)V.lens[q++]=9;while(q<280)V.lens[q++]=7;while(q<288)V.lens[q++]=8;t2(M9,V.lens,0,288,n4,0,V.work,{bits:9}),q=0;while(q<32)V.lens[q++]=5;t2(I9,V.lens,0,32,r4,0,V.work,{bits:5}),z9=!1}V.lencode=n4,V.lenbits=9,V.distcode=r4,V.distbits=5}function v9(V,q,X,K){var Q,Y=V.state;if(Y.window===null)Y.wsize=1<=Y.wsize)Q6.arraySet(Y.window,q,X-Y.wsize,Y.wsize,0),Y.wnext=0,Y.whave=Y.wsize;else{if(Q=Y.wsize-Y.wnext,Q>K)Q=K;if(Q6.arraySet(Y.window,q,X-K,Q,Y.wnext),K-=Q,K)Q6.arraySet(Y.window,q,X-K,K,0),Y.wnext=K,Y.whave=Y.wsize;else{if(Y.wnext+=Q,Y.wnext===Y.wsize)Y.wnext=0;if(Y.whave>>8&255,X.check=l6(X.check,h,2,0),Z=0,U=0,X.mode=pV;break}if(X.flags=0,X.head)X.head.done=!1;if(!(X.wrap&1)||(((Z&255)<<8)+(Z>>8))%31){V.msg="incorrect header check",X.mode=j0;break}if((Z&15)!==cV){V.msg="unknown compression method",X.mode=j0;break}if(Z>>>=4,U-=4,$=(Z&15)+8,X.wbits===0)X.wbits=$;else if($>X.wbits){V.msg="invalid window size",X.mode=j0;break}X.dmax=1<<$,V.adler=X.check=1,X.mode=Z&512?tV:q5,Z=0,U=0;break;case pV:while(U<16){if(G===0)break q;G--,Z+=K[Y++]<>8&1;if(X.flags&512)h[0]=Z&255,h[1]=Z>>>8&255,X.check=l6(X.check,h,2,0);Z=0,U=0,X.mode=dV;case dV:while(U<32){if(G===0)break q;G--,Z+=K[Y++]<>>8&255,h[2]=Z>>>16&255,h[3]=Z>>>24&255,X.check=l6(X.check,h,4,0);Z=0,U=0,X.mode=nV;case nV:while(U<16){if(G===0)break q;G--,Z+=K[Y++]<>8;if(X.flags&512)h[0]=Z&255,h[1]=Z>>>8&255,X.check=l6(X.check,h,2,0);Z=0,U=0,X.mode=rV;case rV:if(X.flags&1024){while(U<16){if(G===0)break q;G--,Z+=K[Y++]<>>8&255,X.check=l6(X.check,h,2,0);Z=0,U=0}else if(X.head)X.head.extra=null;X.mode=iV;case iV:if(X.flags&1024){if(I=X.length,I>G)I=G;if(I){if(X.head){if($=X.head.extra_len-X.length,!X.head.extra)X.head.extra=new Array(X.head.extra_len);Q6.arraySet(X.head.extra,K,Y,I,$)}if(X.flags&512)X.check=l6(X.check,K,I,Y);G-=I,Y+=I,X.length-=I}if(X.length)break q}X.length=0,X.mode=aV;case aV:if(X.flags&2048){if(G===0)break q;I=0;do if($=K[Y+I++],X.head&&$&&X.length<65536)X.head.name+=String.fromCharCode($);while($&&I>9&1,X.head.done=!0;V.adler=X.check=0,X.mode=q5;break;case tV:while(U<32){if(G===0)break q;G--,Z+=K[Y++]<>>=U&7,U-=U&7,X.mode=d4;break}while(U<3){if(G===0)break q;G--,Z+=K[Y++]<>>=1,U-=1,Z&3){case 0:X.mode=eV;break;case 1:if(kY(X),X.mode=i1,q===r1){Z>>>=2,U-=2;break q}break;case 2:X.mode=X9;break;case 3:V.msg="invalid block type",X.mode=j0}Z>>>=2,U-=2;break;case eV:Z>>>=U&7,U-=U&7;while(U<32){if(G===0)break q;G--,Z+=K[Y++]<>>16^65535)){V.msg="invalid stored block lengths",X.mode=j0;break}if(X.length=Z&65535,Z=0,U=0,X.mode=p4,q===r1)break q;case p4:X.mode=q9;case q9:if(I=X.length,I){if(I>G)I=G;if(I>W)I=W;if(I===0)break q;Q6.arraySet(Q,K,Y,I,J),G-=I,Y+=I,W-=I,J+=I,X.length-=I;break}X.mode=q5;break;case X9:while(U<14){if(G===0)break q;G--,Z+=K[Y++]<>>=5,U-=5,X.ndist=(Z&31)+1,Z>>>=5,U-=5,X.ncode=(Z&15)+4,Z>>>=4,U-=4,X.nlen>286||X.ndist>30){V.msg="too many length or distance symbols",X.mode=j0;break}X.have=0,X.mode=V9;case V9:while(X.have>>=3,U-=3}while(X.have<19)X.lens[D[X.have++]]=0;if(X.lencode=X.lendyn,X.lenbits=7,b={bits:X.lenbits},S=t2(KY,X.lens,0,19,X.lencode,0,X.work,b),X.lenbits=b.bits,S){V.msg="invalid code lengths set",X.mode=j0;break}X.have=0,X.mode=K9;case K9:while(X.have>>24,O=B>>>16&255,N=B&65535,j<=U)break;if(G===0)break q;G--,Z+=K[Y++]<>>=j,U-=j,X.lens[X.have++]=N;else{if(N===16){C=j+2;while(U>>=j,U-=j,X.have===0){V.msg="invalid bit length repeat",X.mode=j0;break}$=X.lens[X.have-1],I=3+(Z&3),Z>>>=2,U-=2}else if(N===17){C=j+3;while(U>>=j,U-=j,$=0,I=3+(Z&7),Z>>>=3,U-=3}else{C=j+7;while(U>>=j,U-=j,$=0,I=11+(Z&127),Z>>>=7,U-=7}if(X.have+I>X.nlen+X.ndist){V.msg="invalid bit length repeat",X.mode=j0;break}while(I--)X.lens[X.have++]=$}}if(X.mode===j0)break;if(X.lens[256]===0){V.msg="invalid code -- missing end-of-block",X.mode=j0;break}if(X.lenbits=9,b={bits:X.lenbits},S=t2(M9,X.lens,0,X.nlen,X.lencode,0,X.work,b),X.lenbits=b.bits,S){V.msg="invalid literal/lengths set",X.mode=j0;break}if(X.distbits=6,X.distcode=X.distdyn,b={bits:X.distbits},S=t2(I9,X.lens,X.nlen,X.ndist,X.distcode,0,X.work,b),X.distbits=b.bits,S){V.msg="invalid distances set",X.mode=j0;break}if(X.mode=i1,q===r1)break q;case i1:X.mode=a1;case a1:if(G>=6&&W>=258){if(V.next_out=J,V.avail_out=W,V.next_in=Y,V.avail_in=G,X.hold=Z,X.bits=U,VY(V,z),J=V.next_out,Q=V.output,W=V.avail_out,Y=V.next_in,K=V.input,G=V.avail_in,Z=X.hold,U=X.bits,X.mode===q5)X.back=-1;break}X.back=0;for(;;){if(B=X.lencode[Z&(1<>>24,O=B>>>16&255,N=B&65535,j<=U)break;if(G===0)break q;G--,Z+=K[Y++]<>R)],j=B>>>24,O=B>>>16&255,N=B&65535,R+j<=U)break;if(G===0)break q;G--,Z+=K[Y++]<>>=R,U-=R,X.back+=R}if(Z>>>=j,U-=j,X.back+=j,X.length=N,O===0){X.mode=Z9;break}if(O&32){X.back=-1,X.mode=q5;break}if(O&64){V.msg="invalid literal/length code",X.mode=j0;break}X.extra=O&15,X.mode=Q9;case Q9:if(X.extra){C=X.extra;while(U>>=X.extra,U-=X.extra,X.back+=X.extra}X.was=X.length,X.mode=Y9;case Y9:for(;;){if(B=X.distcode[Z&(1<>>24,O=B>>>16&255,N=B&65535,j<=U)break;if(G===0)break q;G--,Z+=K[Y++]<>R)],j=B>>>24,O=B>>>16&255,N=B&65535,R+j<=U)break;if(G===0)break q;G--,Z+=K[Y++]<>>=R,U-=R,X.back+=R}if(Z>>>=j,U-=j,X.back+=j,O&64){V.msg="invalid distance code",X.mode=j0;break}X.offset=N,X.extra=O&15,X.mode=J9;case J9:if(X.extra){C=X.extra;while(U>>=X.extra,U-=X.extra,X.back+=X.extra}if(X.offset>X.dmax){V.msg="invalid distance too far back",X.mode=j0;break}X.mode=G9;case G9:if(W===0)break q;if(I=z-W,X.offset>I){if(I=X.offset-I,I>X.whave){if(X.sane){V.msg="invalid distance too far back",X.mode=j0;break}}if(I>X.wnext)I-=X.wnext,M=X.wsize-I;else M=X.wnext-I;if(I>X.length)I=X.length;L=X.window}else L=Q,M=J-X.offset,I=X.length;if(I>W)I=W;W-=I,X.length-=I;do Q[J++]=L[M++];while(--I);if(X.length===0)X.mode=a1;break;case Z9:if(W===0)break q;Q[J++]=X.length,W--,X.mode=a1;break;case d4:if(X.wrap){while(U<32){if(G===0)break q;G--,Z|=K[Y++]<{O9.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}});var A9=g0((VW,w9)=>{function TY(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}w9.exports=TY});var S9=g0((q1)=>{var c8=R9(),e2=t6(),s1=g4(),N0=s4(),t4=b1(),vY=x4(),RY=A9(),N9=Object.prototype.toString;function X8(V){if(!(this instanceof X8))return new X8(V);this.options=e2.assign({chunkSize:16384,windowBits:0,to:""},V||{});var q=this.options;if(q.raw&&q.windowBits>=0&&q.windowBits<16){if(q.windowBits=-q.windowBits,q.windowBits===0)q.windowBits=-15}if(q.windowBits>=0&&q.windowBits<16&&!(V&&V.windowBits))q.windowBits+=32;if(q.windowBits>15&&q.windowBits<48){if((q.windowBits&15)===0)q.windowBits|=15}this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new vY,this.strm.avail_out=0;var X=c8.inflateInit2(this.strm,q.windowBits);if(X!==N0.Z_OK)throw new Error(t4[X]);if(this.header=new RY,c8.inflateGetHeader(this.strm,this.header),q.dictionary){if(typeof q.dictionary==="string")q.dictionary=s1.string2buf(q.dictionary);else if(N9.call(q.dictionary)==="[object ArrayBuffer]")q.dictionary=new Uint8Array(q.dictionary);if(q.raw){if(X=c8.inflateSetDictionary(this.strm,q.dictionary),X!==N0.Z_OK)throw new Error(t4[X])}}}X8.prototype.push=function(V,q){var X=this.strm,K=this.options.chunkSize,Q=this.options.dictionary,Y,J,G,W,Z,U=!1;if(this.ended)return!1;if(J=q===~~q?q:q===!0?N0.Z_FINISH:N0.Z_NO_FLUSH,typeof V==="string")X.input=s1.binstring2buf(V);else if(N9.call(V)==="[object ArrayBuffer]")X.input=new Uint8Array(V);else X.input=V;X.next_in=0,X.avail_in=X.input.length;do{if(X.avail_out===0)X.output=new e2.Buf8(K),X.next_out=0,X.avail_out=K;if(Y=c8.inflate(X,N0.Z_NO_FLUSH),Y===N0.Z_NEED_DICT&&Q)Y=c8.inflateSetDictionary(this.strm,Q);if(Y===N0.Z_BUF_ERROR&&U===!0)Y=N0.Z_OK,U=!1;if(Y!==N0.Z_STREAM_END&&Y!==N0.Z_OK)return this.onEnd(Y),this.ended=!0,!1;if(X.next_out){if(X.avail_out===0||Y===N0.Z_STREAM_END||X.avail_in===0&&(J===N0.Z_FINISH||J===N0.Z_SYNC_FLUSH))if(this.options.to==="string"){if(G=s1.utf8border(X.output,X.next_out),W=X.next_out-G,Z=s1.buf2string(X.output,G),X.next_out=W,X.avail_out=K-W,W)e2.arraySet(X.output,X.output,G,W,0);this.onData(Z)}else this.onData(e2.shrinkBuf(X.output,X.next_out))}if(X.avail_in===0&&X.avail_out===0)U=!0}while((X.avail_in>0||X.avail_out===0)&&Y!==N0.Z_STREAM_END);if(Y===N0.Z_STREAM_END)J=N0.Z_FINISH;if(J===N0.Z_FINISH)return Y=c8.inflateEnd(this.strm),this.onEnd(Y),this.ended=!0,Y===N0.Z_OK;if(J===N0.Z_SYNC_FLUSH)return this.onEnd(N0.Z_OK),X.avail_out=0,!0;return!0};X8.prototype.onData=function(V){this.chunks.push(V)};X8.prototype.onEnd=function(V){if(V===N0.Z_OK)if(this.options.to==="string")this.result=this.chunks.join("");else this.result=e2.flattenChunks(this.chunks);this.chunks=[],this.err=V,this.msg=this.strm.msg};function e4(V,q){var X=new X8(q);if(X.push(V,!0),X.err)throw X.msg||t4[X.err];return X.result}function OY(V,q){return q=q||{},q.raw=!0,e4(V,q)}q1.Inflate=X8;q1.inflate=e4;q1.inflateRaw=OY;q1.ungzip=e4});var X1=g0((QW,$9)=>{var wY=t6().assign,AY=FV(),NY=S9(),SY=s4(),y9={};wY(y9,AY,NY,SY);$9.exports=y9});var zX=globalThis;if(typeof zX.global==="undefined")zX.global=globalThis;var C6=[],W6=[],lq="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(c5=0,MX=lq.length;c50)throw new Error("Invalid string. Length must be a multiple of 4");var X=V.indexOf("=");if(X===-1)X=q;var K=X===q?0:4-X%4;return[X,K]}function s3(V,q){return(V+q)*3/4-q}function t3(V){var q,X=o3(V),K=X[0],Q=X[1],Y=new Uint8Array(s3(K,Q)),J=0,G=Q>0?K-4:K,W;for(W=0;W>16&255,Y[J++]=q>>8&255,Y[J++]=q&255;if(Q===2)q=W6[V.charCodeAt(W)]<<2|W6[V.charCodeAt(W+1)]>>4,Y[J++]=q&255;if(Q===1)q=W6[V.charCodeAt(W)]<<10|W6[V.charCodeAt(W+1)]<<4|W6[V.charCodeAt(W+2)]>>2,Y[J++]=q>>8&255,Y[J++]=q&255;return Y}function e3(V){return C6[V>>18&63]+C6[V>>12&63]+C6[V>>6&63]+C6[V&63]}function qK(V,q,X){var K,Q=[];for(var Y=q;YG?G:J+Y));if(K===1)q=V[X-1],Q.push(C6[q>>2]+C6[q<<4&63]+"==");else if(K===2)q=(V[X-2]<<8)+V[X-1],Q.push(C6[q>>10]+C6[q>>4&63]+C6[q<<2&63]+"=");return Q.join("")}function $1(V,q,X,K,Q){var Y,J,G=Q*8-K-1,W=(1<>1,U=-7,H=X?Q-1:0,z=X?-1:1,I=V[q+H];H+=z,Y=I&(1<<-U)-1,I>>=-U,U+=G;for(;U>0;Y=Y*256+V[q+H],H+=z,U-=8);J=Y&(1<<-U)-1,Y>>=-U,U+=K;for(;U>0;J=J*256+V[q+H],H+=z,U-=8);if(Y===0)Y=1-Z;else if(Y===W)return J?NaN:(I?-1:1)*(1/0);else J=J+Math.pow(2,K),Y=Y-Z;return(I?-1:1)*J*Math.pow(2,Y-K)}function BX(V,q,X,K,Q,Y){var J,G,W,Z=Y*8-Q-1,U=(1<>1,z=Q===23?Math.pow(2,-24)-Math.pow(2,-77):0,I=K?0:Y-1,M=K?1:-1,L=q<0||q===0&&1/q<0?1:0;if(q=Math.abs(q),isNaN(q)||q===1/0)G=isNaN(q)?1:0,J=U;else{if(J=Math.floor(Math.log(q)/Math.LN2),q*(W=Math.pow(2,-J))<1)J--,W*=2;if(J+H>=1)q+=z/W;else q+=z*Math.pow(2,1-H);if(q*W>=2)J++,W/=2;if(J+H>=U)G=0,J=U;else if(J+H>=1)G=(q*W-1)*Math.pow(2,Q),J=J+H;else G=q*Math.pow(2,H-1)*Math.pow(2,Q),J=0}for(;Q>=8;V[X+I]=G&255,I+=M,G/=256,Q-=8);J=J<0;V[X+I]=J&255,I+=M,J/=256,Z-=8);V[X+I-M]|=L*128}var kX=typeof Symbol==="function"&&typeof Symbol.for==="function"?Symbol.for("nodejs.util.inspect.custom"):null;var _q=2147483647;var{btoa:OZ,atob:wZ,File:AZ,Blob:NZ}=globalThis;function a6(V){if(V>_q)throw new RangeError('The value "'+V+'" is invalid for option "size"');let q=new Uint8Array(V);return Object.setPrototypeOf(q,y.prototype),q}function rq(V,q,X){return class K extends X{constructor(){super();Object.defineProperty(this,"message",{value:q.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${V}]`,this.stack,delete this.name}get code(){return V}set code(Q){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:Q,writable:!0})}toString(){return`${this.name} [${V}]: ${this.message}`}}}var XK=rq("ERR_BUFFER_OUT_OF_BOUNDS",function(V){if(V)return`${V} is outside of buffer bounds`;return"Attempt to access memory outside buffer bounds"},RangeError),VK=rq("ERR_INVALID_ARG_TYPE",function(V,q){return`The "${V}" argument must be of type number. Received type ${typeof q}`},TypeError),cq=rq("ERR_OUT_OF_RANGE",function(V,q,X){let K=`The value of "${V}" is out of range.`,Q=X;if(Number.isInteger(X)&&Math.abs(X)>4294967296)Q=jX(String(X));else if(typeof X==="bigint"){if(Q=String(X),X>BigInt(2)**BigInt(32)||X<-(BigInt(2)**BigInt(32)))Q=jX(Q);Q+="n"}return K+=` It must be ${q}. Received ${Q}`,K},RangeError);function y(V,q,X){if(typeof V==="number"){if(typeof q==="string")throw new TypeError('The "string" argument must be of type string. Received type number');return iq(V)}return TX(V,q,X)}Object.defineProperty(y.prototype,"parent",{enumerable:!0,get:function(){if(!y.isBuffer(this))return;return this.buffer}});Object.defineProperty(y.prototype,"offset",{enumerable:!0,get:function(){if(!y.isBuffer(this))return;return this.byteOffset}});y.poolSize=8192;function TX(V,q,X){if(typeof V==="string")return QK(V,q);if(ArrayBuffer.isView(V))return YK(V);if(V==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof V);if(h6(V,ArrayBuffer)||V&&h6(V.buffer,ArrayBuffer))return dq(V,q,X);if(typeof SharedArrayBuffer!=="undefined"&&(h6(V,SharedArrayBuffer)||V&&h6(V.buffer,SharedArrayBuffer)))return dq(V,q,X);if(typeof V==="number")throw new TypeError('The "value" argument must not be of type number. Received type number');let K=V.valueOf&&V.valueOf();if(K!=null&&K!==V)return y.from(K,q,X);let Q=JK(V);if(Q)return Q;if(typeof Symbol!=="undefined"&&Symbol.toPrimitive!=null&&typeof V[Symbol.toPrimitive]==="function")return y.from(V[Symbol.toPrimitive]("string"),q,X);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof V)}y.from=function(V,q,X){return TX(V,q,X)};Object.setPrototypeOf(y.prototype,Uint8Array.prototype);Object.setPrototypeOf(y,Uint8Array);function vX(V){if(typeof V!=="number")throw new TypeError('"size" argument must be of type number');else if(V<0)throw new RangeError('The value "'+V+'" is invalid for option "size"')}function KK(V,q,X){if(vX(V),V<=0)return a6(V);if(q!==void 0)return typeof X==="string"?a6(V).fill(q,X):a6(V).fill(q);return a6(V)}y.alloc=function(V,q,X){return KK(V,q,X)};function iq(V){return vX(V),a6(V<0?0:aq(V)|0)}y.allocUnsafe=function(V){return iq(V)};y.allocUnsafeSlow=function(V){return iq(V)};function QK(V,q){if(typeof q!=="string"||q==="")q="utf8";if(!y.isEncoding(q))throw new TypeError("Unknown encoding: "+q);let X=RX(V,q)|0,K=a6(X),Q=K.write(V,q);if(Q!==X)K=K.slice(0,Q);return K}function pq(V){let q=V.length<0?0:aq(V.length)|0,X=a6(q);for(let K=0;K=_q)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+_q.toString(16)+" bytes");return V|0}y.isBuffer=function V(q){return q!=null&&q._isBuffer===!0&&q!==y.prototype};y.compare=function V(q,X){if(h6(q,Uint8Array))q=y.from(q,q.offset,q.byteLength);if(h6(X,Uint8Array))X=y.from(X,X.offset,X.byteLength);if(!y.isBuffer(q)||!y.isBuffer(X))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(q===X)return 0;let K=q.length,Q=X.length;for(let Y=0,J=Math.min(K,Q);YQ.length){if(!y.isBuffer(J))J=y.from(J);J.copy(Q,Y)}else Uint8Array.prototype.set.call(Q,J,Y);else if(!y.isBuffer(J))throw new TypeError('"list" argument must be an Array of Buffers');else J.copy(Q,Y);Y+=J.length}return Q};function RX(V,q){if(y.isBuffer(V))return V.length;if(ArrayBuffer.isView(V)||h6(V,ArrayBuffer))return V.byteLength;if(typeof V!=="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof V);let X=V.length,K=arguments.length>2&&arguments[2]===!0;if(!K&&X===0)return 0;let Q=!1;for(;;)switch(q){case"ascii":case"latin1":case"binary":return X;case"utf8":case"utf-8":return nq(V).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return X*2;case"hex":return X>>>1;case"base64":return hX(V).length;default:if(Q)return K?-1:nq(V).length;q=(""+q).toLowerCase(),Q=!0}}y.byteLength=RX;function GK(V,q,X){let K=!1;if(q===void 0||q<0)q=0;if(q>this.length)return"";if(X===void 0||X>this.length)X=this.length;if(X<=0)return"";if(X>>>=0,q>>>=0,X<=q)return"";if(!V)V="utf8";while(!0)switch(V){case"hex":return LK(this,q,X);case"utf8":case"utf-8":return wX(this,q,X);case"ascii":return kK(this,q,X);case"latin1":case"binary":return EK(this,q,X);case"base64":return MK(this,q,X);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return jK(this,q,X);default:if(K)throw new TypeError("Unknown encoding: "+V);V=(V+"").toLowerCase(),K=!0}}y.prototype._isBuffer=!0;function p5(V,q,X){let K=V[q];V[q]=V[X],V[X]=K}y.prototype.swap16=function V(){let q=this.length;if(q%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let X=0;XX)q+=" ... ";return""};if(kX)y.prototype[kX]=y.prototype.inspect;y.prototype.compare=function V(q,X,K,Q,Y){if(h6(q,Uint8Array))q=y.from(q,q.offset,q.byteLength);if(!y.isBuffer(q))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof q);if(X===void 0)X=0;if(K===void 0)K=q?q.length:0;if(Q===void 0)Q=0;if(Y===void 0)Y=this.length;if(X<0||K>q.length||Q<0||Y>this.length)throw new RangeError("out of range index");if(Q>=Y&&X>=K)return 0;if(Q>=Y)return-1;if(X>=K)return 1;if(X>>>=0,K>>>=0,Q>>>=0,Y>>>=0,this===q)return 0;let J=Y-Q,G=K-X,W=Math.min(J,G),Z=this.slice(Q,Y),U=q.slice(X,K);for(let H=0;H2147483647)X=2147483647;else if(X<-2147483648)X=-2147483648;if(X=+X,Number.isNaN(X))X=Q?0:V.length-1;if(X<0)X=V.length+X;if(X>=V.length)if(Q)return-1;else X=V.length-1;else if(X<0)if(Q)X=0;else return-1;if(typeof q==="string")q=y.from(q,K);if(y.isBuffer(q)){if(q.length===0)return-1;return EX(V,q,X,K,Q)}else if(typeof q==="number"){if(q=q&255,typeof Uint8Array.prototype.indexOf==="function")if(Q)return Uint8Array.prototype.indexOf.call(V,q,X);else return Uint8Array.prototype.lastIndexOf.call(V,q,X);return EX(V,[q],X,K,Q)}throw new TypeError("val must be string, number or Buffer")}function EX(V,q,X,K,Q){let Y=1,J=V.length,G=q.length;if(K!==void 0){if(K=String(K).toLowerCase(),K==="ucs2"||K==="ucs-2"||K==="utf16le"||K==="utf-16le"){if(V.length<2||q.length<2)return-1;Y=2,J/=2,G/=2,X/=2}}function W(U,H){if(Y===1)return U[H];else return U.readUInt16BE(H*Y)}let Z;if(Q){let U=-1;for(Z=X;ZJ)X=J-G;for(Z=X;Z>=0;Z--){let U=!0;for(let H=0;HQ)K=Q;let Y=q.length;if(K>Y/2)K=Y/2;let J;for(J=0;J>>0,isFinite(K)){if(K=K>>>0,Q===void 0)Q="utf8"}else Q=K,K=void 0;else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");let Y=this.length-X;if(K===void 0||K>Y)K=Y;if(q.length>0&&(K<0||X<0)||X>this.length)throw new RangeError("Attempt to write outside buffer bounds");if(!Q)Q="utf8";let J=!1;for(;;)switch(Q){case"hex":return ZK(this,q,X,K);case"utf8":case"utf-8":return WK(this,q,X,K);case"ascii":case"latin1":case"binary":return UK(this,q,X,K);case"base64":return HK(this,q,X,K);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return zK(this,q,X,K);default:if(J)throw new TypeError("Unknown encoding: "+Q);Q=(""+Q).toLowerCase(),J=!0}};y.prototype.toJSON=function V(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function MK(V,q,X){if(q===0&&X===V.length)return IX(V);else return IX(V.slice(q,X))}function wX(V,q,X){X=Math.min(V.length,X);let K=[],Q=q;while(Q239?4:Y>223?3:Y>191?2:1;if(Q+G<=X){let W,Z,U,H;switch(G){case 1:if(Y<128)J=Y;break;case 2:if(W=V[Q+1],(W&192)===128){if(H=(Y&31)<<6|W&63,H>127)J=H}break;case 3:if(W=V[Q+1],Z=V[Q+2],(W&192)===128&&(Z&192)===128){if(H=(Y&15)<<12|(W&63)<<6|Z&63,H>2047&&(H<55296||H>57343))J=H}break;case 4:if(W=V[Q+1],Z=V[Q+2],U=V[Q+3],(W&192)===128&&(Z&192)===128&&(U&192)===128){if(H=(Y&15)<<18|(W&63)<<12|(Z&63)<<6|U&63,H>65535&&H<1114112)J=H}}}if(J===null)J=65533,G=1;else if(J>65535)J-=65536,K.push(J>>>10&1023|55296),J=56320|J&1023;K.push(J),Q+=G}return IK(K)}var LX=4096;function IK(V){let q=V.length;if(q<=LX)return String.fromCharCode.apply(String,V);let X="",K=0;while(KK)X=K;let Q="";for(let Y=q;YK)q=K;if(X<0){if(X+=K,X<0)X=0}else if(X>K)X=K;if(XX)throw new RangeError("Trying to access beyond buffer length")}y.prototype.readUintLE=y.prototype.readUIntLE=function V(q,X,K){if(q=q>>>0,X=X>>>0,!K)D0(q,X,this.length);let Q=this[q],Y=1,J=0;while(++J>>0,X=X>>>0,!K)D0(q,X,this.length);let Q=this[q+--X],Y=1;while(X>0&&(Y*=256))Q+=this[q+--X]*Y;return Q};y.prototype.readUint8=y.prototype.readUInt8=function V(q,X){if(q=q>>>0,!X)D0(q,1,this.length);return this[q]};y.prototype.readUint16LE=y.prototype.readUInt16LE=function V(q,X){if(q=q>>>0,!X)D0(q,2,this.length);return this[q]|this[q+1]<<8};y.prototype.readUint16BE=y.prototype.readUInt16BE=function V(q,X){if(q=q>>>0,!X)D0(q,2,this.length);return this[q]<<8|this[q+1]};y.prototype.readUint32LE=y.prototype.readUInt32LE=function V(q,X){if(q=q>>>0,!X)D0(q,4,this.length);return(this[q]|this[q+1]<<8|this[q+2]<<16)+this[q+3]*16777216};y.prototype.readUint32BE=y.prototype.readUInt32BE=function V(q,X){if(q=q>>>0,!X)D0(q,4,this.length);return this[q]*16777216+(this[q+1]<<16|this[q+2]<<8|this[q+3])};y.prototype.readBigUInt64LE=M5(function V(q){q=q>>>0,y8(q,"offset");let X=this[q],K=this[q+7];if(X===void 0||K===void 0)C2(q,this.length-8);let Q=X+this[++q]*256+this[++q]*65536+this[++q]*16777216,Y=this[++q]+this[++q]*256+this[++q]*65536+K*16777216;return BigInt(Q)+(BigInt(Y)<>>0,y8(q,"offset");let X=this[q],K=this[q+7];if(X===void 0||K===void 0)C2(q,this.length-8);let Q=X*16777216+this[++q]*65536+this[++q]*256+this[++q],Y=this[++q]*16777216+this[++q]*65536+this[++q]*256+K;return(BigInt(Q)<>>0,X=X>>>0,!K)D0(q,X,this.length);let Q=this[q],Y=1,J=0;while(++J=Y)Q-=Math.pow(2,8*X);return Q};y.prototype.readIntBE=function V(q,X,K){if(q=q>>>0,X=X>>>0,!K)D0(q,X,this.length);let Q=X,Y=1,J=this[q+--Q];while(Q>0&&(Y*=256))J+=this[q+--Q]*Y;if(Y*=128,J>=Y)J-=Math.pow(2,8*X);return J};y.prototype.readInt8=function V(q,X){if(q=q>>>0,!X)D0(q,1,this.length);if(!(this[q]&128))return this[q];return(255-this[q]+1)*-1};y.prototype.readInt16LE=function V(q,X){if(q=q>>>0,!X)D0(q,2,this.length);let K=this[q]|this[q+1]<<8;return K&32768?K|4294901760:K};y.prototype.readInt16BE=function V(q,X){if(q=q>>>0,!X)D0(q,2,this.length);let K=this[q+1]|this[q]<<8;return K&32768?K|4294901760:K};y.prototype.readInt32LE=function V(q,X){if(q=q>>>0,!X)D0(q,4,this.length);return this[q]|this[q+1]<<8|this[q+2]<<16|this[q+3]<<24};y.prototype.readInt32BE=function V(q,X){if(q=q>>>0,!X)D0(q,4,this.length);return this[q]<<24|this[q+1]<<16|this[q+2]<<8|this[q+3]};y.prototype.readBigInt64LE=M5(function V(q){q=q>>>0,y8(q,"offset");let X=this[q],K=this[q+7];if(X===void 0||K===void 0)C2(q,this.length-8);let Q=this[q+4]+this[q+5]*256+this[q+6]*65536+(K<<24);return(BigInt(Q)<>>0,y8(q,"offset");let X=this[q],K=this[q+7];if(X===void 0||K===void 0)C2(q,this.length-8);let Q=(X<<24)+this[++q]*65536+this[++q]*256+this[++q];return(BigInt(Q)<>>0,!X)D0(q,4,this.length);return $1(this,q,!0,23,4)};y.prototype.readFloatBE=function V(q,X){if(q=q>>>0,!X)D0(q,4,this.length);return $1(this,q,!1,23,4)};y.prototype.readDoubleLE=function V(q,X){if(q=q>>>0,!X)D0(q,8,this.length);return $1(this,q,!0,52,8)};y.prototype.readDoubleBE=function V(q,X){if(q=q>>>0,!X)D0(q,8,this.length);return $1(this,q,!1,52,8)};function s0(V,q,X,K,Q,Y){if(!y.isBuffer(V))throw new TypeError('"buffer" argument must be a Buffer instance');if(q>Q||qV.length)throw new RangeError("Index out of range")}y.prototype.writeUintLE=y.prototype.writeUIntLE=function V(q,X,K,Q){if(q=+q,X=X>>>0,K=K>>>0,!Q){let G=Math.pow(2,8*K)-1;s0(this,q,X,K,G,0)}let Y=1,J=0;this[X]=q&255;while(++J>>0,K=K>>>0,!Q){let G=Math.pow(2,8*K)-1;s0(this,q,X,K,G,0)}let Y=K-1,J=1;this[X+Y]=q&255;while(--Y>=0&&(J*=256))this[X+Y]=q/J&255;return X+K};y.prototype.writeUint8=y.prototype.writeUInt8=function V(q,X,K){if(q=+q,X=X>>>0,!K)s0(this,q,X,1,255,0);return this[X]=q&255,X+1};y.prototype.writeUint16LE=y.prototype.writeUInt16LE=function V(q,X,K){if(q=+q,X=X>>>0,!K)s0(this,q,X,2,65535,0);return this[X]=q&255,this[X+1]=q>>>8,X+2};y.prototype.writeUint16BE=y.prototype.writeUInt16BE=function V(q,X,K){if(q=+q,X=X>>>0,!K)s0(this,q,X,2,65535,0);return this[X]=q>>>8,this[X+1]=q&255,X+2};y.prototype.writeUint32LE=y.prototype.writeUInt32LE=function V(q,X,K){if(q=+q,X=X>>>0,!K)s0(this,q,X,4,4294967295,0);return this[X+3]=q>>>24,this[X+2]=q>>>16,this[X+1]=q>>>8,this[X]=q&255,X+4};y.prototype.writeUint32BE=y.prototype.writeUInt32BE=function V(q,X,K){if(q=+q,X=X>>>0,!K)s0(this,q,X,4,4294967295,0);return this[X]=q>>>24,this[X+1]=q>>>16,this[X+2]=q>>>8,this[X+3]=q&255,X+4};function AX(V,q,X,K,Q){CX(q,K,Q,V,X,7);let Y=Number(q&BigInt(4294967295));V[X++]=Y,Y=Y>>8,V[X++]=Y,Y=Y>>8,V[X++]=Y,Y=Y>>8,V[X++]=Y;let J=Number(q>>BigInt(32)&BigInt(4294967295));return V[X++]=J,J=J>>8,V[X++]=J,J=J>>8,V[X++]=J,J=J>>8,V[X++]=J,X}function NX(V,q,X,K,Q){CX(q,K,Q,V,X,7);let Y=Number(q&BigInt(4294967295));V[X+7]=Y,Y=Y>>8,V[X+6]=Y,Y=Y>>8,V[X+5]=Y,Y=Y>>8,V[X+4]=Y;let J=Number(q>>BigInt(32)&BigInt(4294967295));return V[X+3]=J,J=J>>8,V[X+2]=J,J=J>>8,V[X+1]=J,J=J>>8,V[X]=J,X+8}y.prototype.writeBigUInt64LE=M5(function V(q,X=0){return AX(this,q,X,BigInt(0),BigInt("0xffffffffffffffff"))});y.prototype.writeBigUInt64BE=M5(function V(q,X=0){return NX(this,q,X,BigInt(0),BigInt("0xffffffffffffffff"))});y.prototype.writeIntLE=function V(q,X,K,Q){if(q=+q,X=X>>>0,!Q){let W=Math.pow(2,8*K-1);s0(this,q,X,K,W-1,-W)}let Y=0,J=1,G=0;this[X]=q&255;while(++Y>0)-G&255}return X+K};y.prototype.writeIntBE=function V(q,X,K,Q){if(q=+q,X=X>>>0,!Q){let W=Math.pow(2,8*K-1);s0(this,q,X,K,W-1,-W)}let Y=K-1,J=1,G=0;this[X+Y]=q&255;while(--Y>=0&&(J*=256)){if(q<0&&G===0&&this[X+Y+1]!==0)G=1;this[X+Y]=(q/J>>0)-G&255}return X+K};y.prototype.writeInt8=function V(q,X,K){if(q=+q,X=X>>>0,!K)s0(this,q,X,1,127,-128);if(q<0)q=255+q+1;return this[X]=q&255,X+1};y.prototype.writeInt16LE=function V(q,X,K){if(q=+q,X=X>>>0,!K)s0(this,q,X,2,32767,-32768);return this[X]=q&255,this[X+1]=q>>>8,X+2};y.prototype.writeInt16BE=function V(q,X,K){if(q=+q,X=X>>>0,!K)s0(this,q,X,2,32767,-32768);return this[X]=q>>>8,this[X+1]=q&255,X+2};y.prototype.writeInt32LE=function V(q,X,K){if(q=+q,X=X>>>0,!K)s0(this,q,X,4,2147483647,-2147483648);return this[X]=q&255,this[X+1]=q>>>8,this[X+2]=q>>>16,this[X+3]=q>>>24,X+4};y.prototype.writeInt32BE=function V(q,X,K){if(q=+q,X=X>>>0,!K)s0(this,q,X,4,2147483647,-2147483648);if(q<0)q=4294967295+q+1;return this[X]=q>>>24,this[X+1]=q>>>16,this[X+2]=q>>>8,this[X+3]=q&255,X+4};y.prototype.writeBigInt64LE=M5(function V(q,X=0){return AX(this,q,X,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});y.prototype.writeBigInt64BE=M5(function V(q,X=0){return NX(this,q,X,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});function SX(V,q,X,K,Q,Y){if(X+K>V.length)throw new RangeError("Index out of range");if(X<0)throw new RangeError("Index out of range")}function yX(V,q,X,K,Q){if(q=+q,X=X>>>0,!Q)SX(V,q,X,4,340282346638528860000000000000000000000,-340282346638528860000000000000000000000);return BX(V,q,X,K,23,4),X+4}y.prototype.writeFloatLE=function V(q,X,K){return yX(this,q,X,!0,K)};y.prototype.writeFloatBE=function V(q,X,K){return yX(this,q,X,!1,K)};function $X(V,q,X,K,Q){if(q=+q,X=X>>>0,!Q)SX(V,q,X,8,179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,-179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);return BX(V,q,X,K,52,8),X+8}y.prototype.writeDoubleLE=function V(q,X,K){return $X(this,q,X,!0,K)};y.prototype.writeDoubleBE=function V(q,X,K){return $X(this,q,X,!1,K)};y.prototype.copy=function V(q,X,K,Q){if(!y.isBuffer(q))throw new TypeError("argument should be a Buffer");if(!K)K=0;if(!Q&&Q!==0)Q=this.length;if(X>=q.length)X=q.length;if(!X)X=0;if(Q>0&&Q=this.length)throw new RangeError("Index out of range");if(Q<0)throw new RangeError("sourceEnd out of bounds");if(Q>this.length)Q=this.length;if(q.length-X>>0,K=K===void 0?this.length:K>>>0,!q)q=0;let Y;if(typeof q==="number")for(Y=X;Y=K+4;X-=3)q=`_${V.slice(X-3,X)}${q}`;return`${V.slice(0,X)}${q}`}function BK(V,q,X){if(y8(q,"offset"),V[q]===void 0||V[q+X]===void 0)C2(q,V.length-(X+1))}function CX(V,q,X,K,Q,Y){if(V>X||V3)if(q===0||q===BigInt(0))G=`>= 0${J} and < 2${J} ** ${(Y+1)*8}${J}`;else G=`>= -(2${J} ** ${(Y+1)*8-1}${J}) and < 2 ** ${(Y+1)*8-1}${J}`;else G=`>= ${q}${J} and <= ${X}${J}`;throw new cq("value",G,V)}BK(K,Q,Y)}function y8(V,q){if(typeof V!=="number")throw new VK(q,"number",V)}function C2(V,q,X){if(Math.floor(V)!==V)throw y8(V,X),new cq(X||"offset","an integer",V);if(q<0)throw new XK;throw new cq(X||"offset",`>= ${X?1:0} and <= ${q}`,V)}var TK=/[^+/0-9A-Za-z-_]/g;function vK(V){if(V=V.split("=")[0],V=V.trim().replace(TK,""),V.length<2)return"";while(V.length%4!==0)V=V+"=";return V}function nq(V,q){q=q||1/0;let X,K=V.length,Q=null,Y=[];for(let J=0;J55295&&X<57344){if(!Q){if(X>56319){if((q-=3)>-1)Y.push(239,191,189);continue}else if(J+1===K){if((q-=3)>-1)Y.push(239,191,189);continue}Q=X;continue}if(X<56320){if((q-=3)>-1)Y.push(239,191,189);Q=X;continue}X=(Q-55296<<10|X-56320)+65536}else if(Q){if((q-=3)>-1)Y.push(239,191,189)}if(Q=null,X<128){if((q-=1)<0)break;Y.push(X)}else if(X<2048){if((q-=2)<0)break;Y.push(X>>6|192,X&63|128)}else if(X<65536){if((q-=3)<0)break;Y.push(X>>12|224,X>>6&63|128,X&63|128)}else if(X<1114112){if((q-=4)<0)break;Y.push(X>>18|240,X>>12&63|128,X>>6&63|128,X&63|128)}else throw new Error("Invalid code point")}return Y}function RK(V){let q=[];for(let X=0;X>8,Q=X%256,Y.push(Q),Y.push(K)}return Y}function hX(V){return t3(vK(V))}function C1(V,q,X,K){let Q;for(Q=0;Q=q.length||Q>=V.length)break;q[Q+X]=V[Q]}return Q}function h6(V,q){return V instanceof q||V!=null&&V.constructor!=null&&V.constructor.name!=null&&V.constructor.name===q.name}var wK=function(){let V=new Array(256);for(let q=0;q<16;++q){let X=q*16;for(let K=0;K<16;++K)V[X+K]="0123456789abcdef"[q]+"0123456789abcdef"[K]}return V}();function M5(V){return typeof BigInt==="undefined"?AK:V}function AK(){throw new Error("BigInt not supported")}function oq(V){return()=>{throw new Error(V+" is not implemented for node:buffer browser polyfill")}}var SZ=oq("resolveObjectURL"),yZ=oq("isUtf8");var $Z=oq("transcode");var TZ=$2(gX());var HX={};a3(HX,{waitForTick:()=>R6,values:()=>d8,utf8Encode:()=>PK,utf16Encode:()=>E4,utf16Decode:()=>x2,typedArrayFor:()=>D2,translate:()=>c0,toUint8Array:()=>r5,toRadians:()=>O0,toHexStringOfMinLength:()=>D6,toHexString:()=>u6,toDegrees:()=>I1,toCodePoint:()=>K4,toCharCode:()=>s,sum:()=>z4,stroke:()=>B8,square:()=>uG,sortedUniq:()=>H4,skewRadians:()=>I2,skewDegrees:()=>FG,sizeInBytes:()=>P8,singleQuote:()=>t9,showText:()=>j1,setWordSpacing:()=>bG,setTextRise:()=>fG,setTextRenderingMode:()=>lG,setTextMatrix:()=>F3,setStrokingRgbColor:()=>g7,setStrokingGrayscaleColor:()=>D7,setStrokingColor:()=>v8,setStrokingCmykColor:()=>b7,setLineWidth:()=>j8,setLineJoin:()=>DG,setLineHeight:()=>F7,setLineCap:()=>k2,setGraphicsState:()=>i6,setFontAndSize:()=>T8,setFillingRgbColor:()=>u7,setFillingGrayscaleColor:()=>P7,setFillingColor:()=>E6,setFillingCmykColor:()=>x7,setDashPattern:()=>L8,setCharacterSqueeze:()=>mG,setCharacterSpacing:()=>xG,scale:()=>g5,rotateRectangle:()=>y7,rotateRadians:()=>x5,rotateInPlace:()=>L6,rotateDegrees:()=>M2,rotateAndSkewTextRadiansAndTranslate:()=>L2,rotateAndSkewTextDegreesAndTranslate:()=>_G,rgb:()=>Y0,reverseArray:()=>k5,restoreDashPattern:()=>PG,reduceRotation:()=>k6,rectanglesAreEqual:()=>n8,rectangle:()=>h3,range:()=>M4,radiansToDegrees:()=>C3,radians:()=>CG,pushGraphicsState:()=>B0,popGraphicsState:()=>T0,pluckIndices:()=>I4,pdfDocEncodingDecode:()=>J1,parseDate:()=>P2,padStart:()=>e0,numberToString:()=>B4,normalizeAppearance:()=>G6,nextLine:()=>h7,newlineChars:()=>CK,moveTo:()=>J6,moveText:()=>gG,mergeUint8Arrays:()=>W4,mergeLines:()=>F1,mergeIntoTypedArray:()=>Z4,lowSurrogate:()=>u1,lineTo:()=>S0,lineSplit:()=>F2,layoutSinglelineText:()=>v2,layoutMultilineText:()=>uq,layoutCombedText:()=>KX,last:()=>n5,isWithinBMP:()=>L4,isType:()=>X3,isStandardFont:()=>e1,isNewlineChar:()=>Y4,highSurrogate:()=>D1,hasUtf16BOM:()=>b2,hasSurrogates:()=>j4,grayscale:()=>Sq,getType:()=>q3,findLastMatch:()=>F8,fillAndStroke:()=>L1,fill:()=>E1,escapedNewlineChars:()=>mX,escapeRegExp:()=>bX,error:()=>j5,endText:()=>T1,endPath:()=>wq,endMarkedContent:()=>Nq,encodeToBase64:()=>X4,drawTextLines:()=>Fq,drawTextField:()=>Pq,drawText:()=>rG,drawSvgPath:()=>d7,drawRectangle:()=>b5,drawRadioButton:()=>T2,drawPage:()=>c7,drawOptionList:()=>n7,drawObject:()=>j2,drawLinesOfText:()=>_7,drawLine:()=>p7,drawImage:()=>w1,drawEllipsePath:()=>x3,drawEllipse:()=>O1,drawCheckMark:()=>b3,drawCheckBox:()=>B2,drawButton:()=>hq,degreesToRadians:()=>U5,degrees:()=>p,defaultTextFieldAppearanceProvider:()=>GX,defaultRadioGroupAppearanceProvider:()=>YX,defaultOptionListAppearanceProvider:()=>WX,defaultDropdownAppearanceProvider:()=>ZX,defaultCheckBoxAppearanceProvider:()=>QX,defaultButtonAppearanceProvider:()=>JX,decodePDFRawStream:()=>V2,decodeFromBase64DataUri:()=>V4,decodeFromBase64:()=>q4,createValueErrorMsg:()=>e9,createTypeErrorMsg:()=>V3,createPDFAcroFields:()=>Z2,createPDFAcroField:()=>Iq,copyStringIntoBuffer:()=>I0,concatTransformationMatrix:()=>k1,componentsToColor:()=>l0,colorToComponents:()=>$q,cmyk:()=>yq,closePath:()=>N6,clipEvenOdd:()=>hG,clip:()=>Oq,cleanText:()=>I5,charSplit:()=>J4,charFromHexCode:()=>Q4,charFromCode:()=>t0,charAtIndex:()=>P1,canBeConvertedToUint8Array:()=>k4,bytesFor:()=>L5,byAscendingId:()=>U4,breakTextIntoLines:()=>G4,beginText:()=>B1,beginMarkedContent:()=>Aq,backtick:()=>$0,assertRangeOrUndefined:()=>X6,assertRange:()=>b0,assertPositive:()=>X5,assertOrUndefined:()=>F,assertMultiple:()=>Y1,assertIsSubset:()=>V7,assertIsOneOfOrUndefined:()=>a0,assertIsOneOf:()=>M6,assertIs:()=>T,assertInteger:()=>K7,assertEachIs:()=>Q1,asPDFNumber:()=>f,asPDFName:()=>z2,asNumber:()=>t,arrayAsString:()=>u2,appendQuadraticCurve:()=>E2,appendBezierCurve:()=>p0,adjustDimsForRotation:()=>r6,addRandomSuffix:()=>$K,ViewerPreferences:()=>W1,UnsupportedEncodingError:()=>Q7,UnrecognizedStreamTypeError:()=>J7,UnexpectedObjectTypeError:()=>A5,UnexpectedFieldTypeError:()=>z5,UnbalancedParenthesisError:()=>E7,TextRenderingMode:()=>C7,TextAlignment:()=>v0,StandardFonts:()=>N8,StandardFontValues:()=>o9,StandardFontEmbedder:()=>$5,StalledParserError:()=>L7,RotationTypes:()=>E8,RichTextFieldReadError:()=>e7,ReparseError:()=>Q8,RemovePageFromEmptyDocumentError:()=>o7,ReadingDirection:()=>H8,PrivateConstructorError:()=>K8,PrintScaling:()=>z8,PngEmbedder:()=>X2,ParseSpeeds:()=>A1,PageSizes:()=>UX,PageEmbeddingMismatchedContextError:()=>G7,PDFXRefStreamParser:()=>jq,PDFWriter:()=>o8,PDFWidgetAnnotation:()=>M8,PDFTrailerDict:()=>Qq,PDFTrailer:()=>S5,PDFTextField:()=>A8,PDFString:()=>K0,PDFStreamWriter:()=>Jq,PDFStreamParsingError:()=>k7,PDFStream:()=>E0,PDFSignature:()=>O2,PDFRef:()=>a,PDFRawStream:()=>A6,PDFRadioGroup:()=>l5,PDFParsingError:()=>V5,PDFParser:()=>Bq,PDFPageTree:()=>U2,PDFPageLeaf:()=>_0,PDFPageEmbedder:()=>K2,PDFPage:()=>y0,PDFOptionList:()=>w8,PDFOperatorNames:()=>X0,PDFOperator:()=>e,PDFObjectStreamParser:()=>Lq,PDFObjectStream:()=>a8,PDFObjectParsingError:()=>M7,PDFObjectParser:()=>H2,PDFObjectCopier:()=>Z1,PDFObject:()=>z0,PDFNumber:()=>x,PDFNull:()=>F0,PDFName:()=>k,PDFJavaScript:()=>xq,PDFInvalidObjectParsingError:()=>I7,PDFInvalidObject:()=>s8,PDFImage:()=>R8,PDFHexString:()=>g,PDFHeader:()=>_6,PDFForm:()=>gq,PDFFont:()=>w0,PDFFlateStream:()=>N5,PDFField:()=>d0,PDFEmbeddedPage:()=>R2,PDFDropdown:()=>O8,PDFDocument:()=>o0,PDFDict:()=>m,PDFCrossRefStream:()=>Yq,PDFCrossRefSection:()=>i8,PDFContext:()=>Z8,PDFContentStream:()=>p6,PDFCheckBox:()=>f5,PDFCatalog:()=>W2,PDFButton:()=>S8,PDFBool:()=>c6,PDFArrayIsNotRectangleError:()=>Z7,PDFArray:()=>i,PDFAnnotation:()=>Mq,PDFAcroText:()=>J5,PDFAcroTerminal:()=>K6,PDFAcroSignature:()=>F5,PDFAcroRadioButton:()=>Z5,PDFAcroPushButton:()=>G5,PDFAcroNonTerminal:()=>Y5,PDFAcroListBox:()=>W5,PDFAcroForm:()=>P5,PDFAcroField:()=>Y2,PDFAcroComboBox:()=>Q5,PDFAcroChoice:()=>G2,PDFAcroCheckBox:()=>K5,PDFAcroButton:()=>h5,NumberParsingError:()=>Vq,NonFullScreenPageMode:()=>U8,NoSuchFieldError:()=>s7,NextByteAssertionError:()=>z7,MultiSelectValueError:()=>W7,MissingTfOperatorError:()=>H7,MissingPageContentsEmbeddingError:()=>Y7,MissingPDFHeaderError:()=>j7,MissingOnValueCheckError:()=>aG,MissingKeywordError:()=>B7,MissingDAEntryError:()=>U7,MissingCatalogError:()=>iY,MethodNotImplementedError:()=>u0,LineJoinStyle:()=>$7,LineCapStyle:()=>u5,JpegEmbedder:()=>q2,InvalidTargetIndexError:()=>qq,InvalidPDFDateStringError:()=>G1,InvalidMaxLengthError:()=>VX,InvalidFieldNamePartError:()=>t7,InvalidAcroFieldValueError:()=>J8,IndexOutOfBoundsError:()=>Y8,ImageAlignment:()=>T6,ForeignPageError:()=>a7,FontkitNotRegisteredError:()=>i7,FileEmbedder:()=>Wq,FieldExistsAsNonTerminalError:()=>oG,FieldAlreadyExistsError:()=>Dq,ExceededMaxLengthError:()=>XX,EncryptedPDFError:()=>r7,Duplex:()=>Q2,CustomFontSubsetEmbedder:()=>Zq,CustomFontEmbedder:()=>C5,CorruptPageTreeError:()=>Xq,CombedTextLayoutError:()=>qX,ColorTypes:()=>H5,CharCodes:()=>E,Cache:()=>m0,BlendMode:()=>S6,AppearanceCharacteristics:()=>J2,AnnotationFlags:()=>k8,AcroTextFlags:()=>L0,AcroFieldFlags:()=>Y6,AcroChoiceFlags:()=>G0,AcroButtonFlags:()=>f0,AFRelationship:()=>t8});/*! ***************************************************************************** +(()=>{var dK=Object.create;var{getPrototypeOf:nK,defineProperty:fq,getOwnPropertyNames:rK}=Object;var iK=Object.prototype.hasOwnProperty;function aK(q){return this[q]}var oK,sK,$8=(q,X,V)=>{var K=q!=null&&typeof q==="object";if(K){var Q=X?oK??=new WeakMap:sK??=new WeakMap,Y=Q.get(q);if(Y)return Y}V=q!=null?dK(nK(q)):{};let J=X||!q||!q.__esModule?fq(V,"default",{value:q,enumerable:!0}):V;for(let G of rK(q))if(!iK.call(J,G))fq(J,G,{get:aK.bind(q,G),enumerable:!0});if(K)Q.set(q,J);return J};var g0=(q,X)=>()=>(X||q((X={exports:{}}).exports,X),X.exports);var tK=(q)=>q;function eK(q,X){this[q]=tK.bind(null,X)}var qQ=(q,X)=>{for(var V in X)fq(q,V,{get:X[V],enumerable:!0,configurable:!0,set:eK.bind(X,V)})};var gX=g0((b3,uX)=>{var A0=uX.exports={},F2,P2;function sq(){throw Error("setTimeout has not been defined")}function tq(){throw Error("clearTimeout has not been defined")}(function(){try{if(typeof setTimeout==="function")F2=setTimeout;else F2=sq}catch(q){F2=sq}try{if(typeof clearTimeout==="function")P2=clearTimeout;else P2=tq}catch(q){P2=tq}})();function FX(q){if(F2===setTimeout)return setTimeout(q,0);if((F2===sq||!F2)&&setTimeout)return F2=setTimeout,setTimeout(q,0);try{return F2(q,0)}catch(X){try{return F2.call(null,q,0)}catch(V){return F2.call(this,q,0)}}}function FQ(q){if(P2===clearTimeout)return clearTimeout(q);if((P2===tq||!P2)&&clearTimeout)return P2=clearTimeout,clearTimeout(q);try{return P2(q)}catch(X){try{return P2.call(null,q)}catch(V){return P2.call(this,q)}}}var o2=[],$5=!1,d6,h1=-1;function PQ(){if(!$5||!d6)return;if($5=!1,d6.length)o2=d6.concat(o2);else h1=-1;if(o2.length)PX()}function PX(){if($5)return;var q=FX(PQ);$5=!0;var X=o2.length;while(X){d6=o2,o2=[];while(++h11)for(var V=1;V{var _Q=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Int32Array<"u";function cQ(q,X){return Object.prototype.hasOwnProperty.call(q,X)}r0.assign=function(q){var X=Array.prototype.slice.call(arguments,1);while(X.length){var V=X.shift();if(!V)continue;if(typeof V!=="object")throw TypeError(V+"must be non-object");for(var K in V)if(cQ(V,K))q[K]=V[K]}return q};r0.shrinkBuf=function(q,X){if(q.length===X)return q;if(q.subarray)return q.subarray(0,X);return q.length=X,q};var pQ={arraySet:function(q,X,V,K,Q){if(X.subarray&&q.subarray){q.set(X.subarray(V,V+K),Q);return}for(var Y=0;Y{var nQ=t2(),rQ=4,pX=0,dX=1,iQ=2;function u5(q){var X=q.length;while(--X>=0)q[X]=0}var aQ=0,sX=1,oQ=2,sQ=3,tQ=258,N4=29,p8=256,f8=p8+1+N4,D5=30,S4=19,tX=2*f8+1,i6=15,T4=16,eQ=7,y4=256,eX=16,qV=17,XV=18,w4=[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],g1=[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],qY=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],VV=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],XY=512,e2=Array((f8+2)*2);u5(e2);var m8=Array(D5*2);u5(m8);var l8=Array(XY);u5(l8);var _8=Array(tQ-sQ+1);u5(_8);var $4=Array(N4);u5($4);var x1=Array(D5);u5(x1);function v4(q,X,V,K,Q){this.static_tree=q,this.extra_bits=X,this.extra_base=V,this.elems=K,this.max_length=Q,this.has_stree=q&&q.length}var KV,QV,YV;function R4(q,X){this.dyn_tree=q,this.max_code=0,this.stat_desc=X}function JV(q){return q<256?l8[q]:l8[256+(q>>>7)]}function c8(q,X){q.pending_buf[q.pending++]=X&255,q.pending_buf[q.pending++]=X>>>8&255}function q2(q,X,V){if(q.bi_valid>T4-V)q.bi_buf|=X<>T4-q.bi_valid,q.bi_valid+=V-T4;else q.bi_buf|=X<>>=1,V<<=1;while(--X>0);return V>>>1}function VY(q){if(q.bi_valid===16)c8(q,q.bi_buf),q.bi_buf=0,q.bi_valid=0;else if(q.bi_valid>=8)q.pending_buf[q.pending++]=q.bi_buf&255,q.bi_buf>>=8,q.bi_valid-=8}function KY(q,X){var{dyn_tree:V,max_code:K}=X,Q=X.stat_desc.static_tree,Y=X.stat_desc.has_stree,J=X.stat_desc.extra_bits,G=X.stat_desc.extra_base,W=X.stat_desc.max_length,Z,H,U,z,k,M,j=0;for(z=0;z<=i6;z++)q.bl_count[z]=0;V[q.heap[q.heap_max]*2+1]=0;for(Z=q.heap_max+1;ZW)z=W,j++;if(V[H*2+1]=z,H>K)continue;if(q.bl_count[z]++,k=0,H>=G)k=J[H-G];if(M=V[H*2],q.opt_len+=M*(z+k),Y)q.static_len+=M*(Q[H*2+1]+k)}if(j===0)return;do{z=W-1;while(q.bl_count[z]===0)z--;q.bl_count[z]--,q.bl_count[z+1]+=2,q.bl_count[W]--,j-=2}while(j>0);for(z=W;z!==0;z--){H=q.bl_count[z];while(H!==0){if(U=q.heap[--Z],U>K)continue;if(V[U*2+1]!==z)q.opt_len+=(z-V[U*2+1])*V[U*2],V[U*2+1]=z;H--}}}function ZV(q,X,V){var K=Array(i6+1),Q=0,Y,J;for(Y=1;Y<=i6;Y++)K[Y]=Q=Q+V[Y-1]<<1;for(J=0;J<=X;J++){var G=q[J*2+1];if(G===0)continue;q[J*2]=GV(K[G]++,G)}}function QY(){var q,X,V,K,Q,Y=Array(i6+1);V=0;for(K=0;K>=7;for(;K8)c8(q,q.bi_buf);else if(q.bi_valid>0)q.pending_buf[q.pending++]=q.bi_buf;q.bi_buf=0,q.bi_valid=0}function YY(q,X,V,K){if(HV(q),K)c8(q,V),c8(q,~V);nQ.arraySet(q.pending_buf,q.window,X,V,q.pending),q.pending+=V}function nX(q,X,V,K){var Q=X*2,Y=V*2;return q[Q]>1;J>=1;J--)O4(q,V,J);Z=Y;do J=q.heap[1],q.heap[1]=q.heap[q.heap_len--],O4(q,V,1),G=q.heap[1],q.heap[--q.heap_max]=J,q.heap[--q.heap_max]=G,V[Z*2]=V[J*2]+V[G*2],q.depth[Z]=(q.depth[J]>=q.depth[G]?q.depth[J]:q.depth[G])+1,V[J*2+1]=V[G*2+1]=Z,q.heap[1]=Z++,O4(q,V,1);while(q.heap_len>=2);q.heap[--q.heap_max]=q.heap[1],KY(q,X),ZV(V,W,q.bl_count)}function iX(q,X,V){var K,Q=-1,Y,J=X[1],G=0,W=7,Z=4;if(J===0)W=138,Z=3;X[(V+1)*2+1]=65535;for(K=0;K<=V;K++){if(Y=J,J=X[(K+1)*2+1],++G=3;X--)if(q.bl_tree[VV[X]*2+1]!==0)break;return q.opt_len+=3*(X+1)+5+5+4,X}function GY(q,X,V,K){var Q;q2(q,X-257,5),q2(q,V-1,5),q2(q,K-4,4);for(Q=0;Q>>=1)if(X&1&&q.dyn_ltree[V*2]!==0)return pX;if(q.dyn_ltree[18]!==0||q.dyn_ltree[20]!==0||q.dyn_ltree[26]!==0)return dX;for(V=32;V0){if(q.strm.data_type===iQ)q.strm.data_type=ZY(q);if(A4(q,q.l_desc),A4(q,q.d_desc),J=JY(q),Q=q.opt_len+3+7>>>3,Y=q.static_len+3+7>>>3,Y<=Q)Q=Y}else Q=Y=V+5;if(V+4<=Q&&X!==-1)UV(q,X,V,K);else if(q.strategy===rQ||Y===Q)q2(q,(sX<<1)+(K?1:0),3),rX(q,e2,m8);else q2(q,(oQ<<1)+(K?1:0),3),GY(q,q.l_desc.max_code+1,q.d_desc.max_code+1,J+1),rX(q,q.dyn_ltree,q.dyn_dtree);if(WV(q),K)HV(q)}function zY(q,X,V){if(q.pending_buf[q.d_buf+q.last_lit*2]=X>>>8&255,q.pending_buf[q.d_buf+q.last_lit*2+1]=X&255,q.pending_buf[q.l_buf+q.last_lit]=V&255,q.last_lit++,X===0)q.dyn_ltree[V*2]++;else q.matches++,X--,q.dyn_ltree[(_8[V]+p8+1)*2]++,q.dyn_dtree[JV(X)*2]++;return q.last_lit===q.lit_bufsize-1}g5._tr_init=WY;g5._tr_stored_block=UV;g5._tr_flush_block=UY;g5._tr_tally=zY;g5._tr_align=HY});var C4=g0((t3,MV)=>{function MY(q,X,V,K){var Q=q&65535|0,Y=q>>>16&65535|0,J=0;while(V!==0){J=V>2000?2000:V,V-=J;do Q=Q+X[K++]|0,Y=Y+Q|0;while(--J);Q%=65521,Y%=65521}return Q|Y<<16|0}MV.exports=MY});var h4=g0((e3,kV)=>{function kY(){var q,X=[];for(var V=0;V<256;V++){q=V;for(var K=0;K<8;K++)q=q&1?3988292384^q>>>1:q>>>1;X[V]=q}return X}var IY=kY();function EY(q,X,V,K){var Q=IY,Y=K+V;q^=-1;for(var J=K;J>>8^Q[(q^X[J])&255];return q^-1}kV.exports=EY});var b1=g0((qW,IV)=>{IV.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}});var wV=g0((m2)=>{var i0=t2(),H2=zV(),BV=C4(),B6=h4(),jY=b1(),t6=0,LY=1,BY=3,w6=4,EV=5,b2=0,jV=1,U2=-2,TY=-3,F4=-5,vY=-1,RY=1,m1=2,OY=3,wY=4,AY=0,NY=2,c1=8,SY=9,yY=15,$Y=8,CY=29,hY=256,D4=hY+1+CY,FY=30,PY=19,DY=2*D4+1,uY=15,H0=3,R6=258,O2=R6+H0+1,gY=32,p1=42,u4=69,f1=73,l1=91,_1=103,a6=113,n8=666,h0=1,r8=2,o6=3,m5=4,xY=3;function O6(q,X){return q.msg=jY[X],X}function LV(q){return(q<<1)-(q>4?9:0)}function v6(q){var X=q.length;while(--X>=0)q[X]=0}function T6(q){var X=q.state,V=X.pending;if(V>q.avail_out)V=q.avail_out;if(V===0)return;if(i0.arraySet(q.output,X.pending_buf,X.pending_out,V,q.next_out),q.next_out+=V,X.pending_out+=V,q.total_out+=V,q.avail_out-=V,X.pending-=V,X.pending===0)X.pending_out=0}function x0(q,X){H2._tr_flush_block(q,q.block_start>=0?q.block_start:-1,q.strstart-q.block_start,X),q.block_start=q.strstart,T6(q.strm)}function U0(q,X){q.pending_buf[q.pending++]=X}function d8(q,X){q.pending_buf[q.pending++]=X>>>8&255,q.pending_buf[q.pending++]=X&255}function bY(q,X,V,K){var Q=q.avail_in;if(Q>K)Q=K;if(Q===0)return 0;if(q.avail_in-=Q,i0.arraySet(X,q.input,q.next_in,Q,V),q.state.wrap===1)q.adler=BV(q.adler,X,Q,V);else if(q.state.wrap===2)q.adler=B6(q.adler,X,Q,V);return q.next_in+=Q,q.total_in+=Q,Q}function TV(q,X){var{max_chain_length:V,strstart:K}=q,Q,Y,J=q.prev_length,G=q.nice_match,W=q.strstart>q.w_size-O2?q.strstart-(q.w_size-O2):0,Z=q.window,H=q.w_mask,U=q.prev,z=q.strstart+R6,k=Z[K+J-1],M=Z[K+J];if(q.prev_length>=q.good_match)V>>=2;if(G>q.lookahead)G=q.lookahead;do{if(Q=X,Z[Q+J]!==M||Z[Q+J-1]!==k||Z[Q]!==Z[K]||Z[++Q]!==Z[K+1])continue;K+=2,Q++;do;while(Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&Z[++K]===Z[++Q]&&KJ){if(q.match_start=X,J=Y,Y>=G)break;k=Z[K+J-1],M=Z[K+J]}}while((X=U[X&H])>W&&--V!==0);if(J<=q.lookahead)return J;return q.lookahead}function s6(q){var X=q.w_size,V,K,Q,Y,J;do{if(Y=q.window_size-q.lookahead-q.strstart,q.strstart>=X+(X-O2)){i0.arraySet(q.window,q.window,X,X,0),q.match_start-=X,q.strstart-=X,q.block_start-=X,K=q.hash_size,V=K;do Q=q.head[--V],q.head[V]=Q>=X?Q-X:0;while(--K);K=X,V=K;do Q=q.prev[--V],q.prev[V]=Q>=X?Q-X:0;while(--K);Y+=X}if(q.strm.avail_in===0)break;if(K=bY(q.strm,q.window,q.strstart+q.lookahead,Y),q.lookahead+=K,q.lookahead+q.insert>=H0){J=q.strstart-q.insert,q.ins_h=q.window[J],q.ins_h=(q.ins_h<q.pending_buf_size-5)V=q.pending_buf_size-5;for(;;){if(q.lookahead<=1){if(s6(q),q.lookahead===0&&X===t6)return h0;if(q.lookahead===0)break}q.strstart+=q.lookahead,q.lookahead=0;var K=q.block_start+V;if(q.strstart===0||q.strstart>=K){if(q.lookahead=q.strstart-K,q.strstart=K,x0(q,!1),q.strm.avail_out===0)return h0}if(q.strstart-q.block_start>=q.w_size-O2){if(x0(q,!1),q.strm.avail_out===0)return h0}}if(q.insert=0,X===w6){if(x0(q,!0),q.strm.avail_out===0)return o6;return m5}if(q.strstart>q.block_start){if(x0(q,!1),q.strm.avail_out===0)return h0}return h0}function P4(q,X){var V,K;for(;;){if(q.lookahead=H0)q.ins_h=(q.ins_h<=H0)if(K=H2._tr_tally(q,q.strstart-q.match_start,q.match_length-H0),q.lookahead-=q.match_length,q.match_length<=q.max_lazy_match&&q.lookahead>=H0){q.match_length--;do q.strstart++,q.ins_h=(q.ins_h<=H0)q.ins_h=(q.ins_h<4096))q.match_length=H0-1}if(q.prev_length>=H0&&q.match_length<=q.prev_length){Q=q.strstart+q.lookahead-H0,K=H2._tr_tally(q,q.strstart-1-q.prev_match,q.prev_length-H0),q.lookahead-=q.prev_length-1,q.prev_length-=2;do if(++q.strstart<=Q)q.ins_h=(q.ins_h<=H0&&q.strstart>0){if(Q=q.strstart-1,K=J[Q],K===J[++Q]&&K===J[++Q]&&K===J[++Q]){Y=q.strstart+R6;do;while(K===J[++Q]&&K===J[++Q]&&K===J[++Q]&&K===J[++Q]&&K===J[++Q]&&K===J[++Q]&&K===J[++Q]&&K===J[++Q]&&Qq.lookahead)q.match_length=q.lookahead}}if(q.match_length>=H0)V=H2._tr_tally(q,1,q.match_length-H0),q.lookahead-=q.match_length,q.strstart+=q.match_length,q.match_length=0;else V=H2._tr_tally(q,0,q.window[q.strstart]),q.lookahead--,q.strstart++;if(V){if(x0(q,!1),q.strm.avail_out===0)return h0}}if(q.insert=0,X===w6){if(x0(q,!0),q.strm.avail_out===0)return o6;return m5}if(q.last_lit){if(x0(q,!1),q.strm.avail_out===0)return h0}return r8}function lY(q,X){var V;for(;;){if(q.lookahead===0){if(s6(q),q.lookahead===0){if(X===t6)return h0;break}}if(q.match_length=0,V=H2._tr_tally(q,0,q.window[q.strstart]),q.lookahead--,q.strstart++,V){if(x0(q,!1),q.strm.avail_out===0)return h0}}if(q.insert=0,X===w6){if(x0(q,!0),q.strm.avail_out===0)return o6;return m5}if(q.last_lit){if(x0(q,!1),q.strm.avail_out===0)return h0}return r8}function x2(q,X,V,K,Q){this.good_length=q,this.max_lazy=X,this.nice_length=V,this.max_chain=K,this.func=Q}var b5;b5=[new x2(0,0,0,0,mY),new x2(4,4,8,4,P4),new x2(4,5,16,8,P4),new x2(4,6,32,32,P4),new x2(4,4,16,16,x5),new x2(8,16,32,32,x5),new x2(8,16,128,128,x5),new x2(8,32,128,256,x5),new x2(32,128,258,1024,x5),new x2(32,258,258,4096,x5)];function _Y(q){q.window_size=2*q.w_size,v6(q.head),q.max_lazy_match=b5[q.level].max_lazy,q.good_match=b5[q.level].good_length,q.nice_match=b5[q.level].nice_length,q.max_chain_length=b5[q.level].max_chain,q.strstart=0,q.block_start=0,q.lookahead=0,q.insert=0,q.match_length=q.prev_length=H0-1,q.match_available=0,q.ins_h=0}function cY(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=c1,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new i0.Buf16(DY*2),this.dyn_dtree=new i0.Buf16((2*FY+1)*2),this.bl_tree=new i0.Buf16((2*PY+1)*2),v6(this.dyn_ltree),v6(this.dyn_dtree),v6(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new i0.Buf16(uY+1),this.heap=new i0.Buf16(2*D4+1),v6(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new i0.Buf16(2*D4+1),v6(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function vV(q){var X;if(!q||!q.state)return O6(q,U2);if(q.total_in=q.total_out=0,q.data_type=NY,X=q.state,X.pending=0,X.pending_out=0,X.wrap<0)X.wrap=-X.wrap;return X.status=X.wrap?p1:a6,q.adler=X.wrap===2?0:1,X.last_flush=t6,H2._tr_init(X),b2}function RV(q){var X=vV(q);if(X===b2)_Y(q.state);return X}function pY(q,X){if(!q||!q.state)return U2;if(q.state.wrap!==2)return U2;return q.state.gzhead=X,b2}function OV(q,X,V,K,Q,Y){if(!q)return U2;var J=1;if(X===vY)X=6;if(K<0)J=0,K=-K;else if(K>15)J=2,K-=16;if(Q<1||Q>SY||V!==c1||K<8||K>15||X<0||X>9||Y<0||Y>wY)return O6(q,U2);if(K===8)K=9;var G=new cY;return q.state=G,G.strm=q,G.wrap=J,G.gzhead=null,G.w_bits=K,G.w_size=1<EV||X<0)return q?O6(q,U2):U2;if(K=q.state,!q.output||!q.input&&q.avail_in!==0||K.status===n8&&X!==w6)return O6(q,q.avail_out===0?F4:U2);if(K.strm=q,V=K.last_flush,K.last_flush=X,K.status===p1)if(K.wrap===2)if(q.adler=0,U0(K,31),U0(K,139),U0(K,8),!K.gzhead)U0(K,0),U0(K,0),U0(K,0),U0(K,0),U0(K,0),U0(K,K.level===9?2:K.strategy>=m1||K.level<2?4:0),U0(K,xY),K.status=a6;else{if(U0(K,(K.gzhead.text?1:0)+(K.gzhead.hcrc?2:0)+(!K.gzhead.extra?0:4)+(!K.gzhead.name?0:8)+(!K.gzhead.comment?0:16)),U0(K,K.gzhead.time&255),U0(K,K.gzhead.time>>8&255),U0(K,K.gzhead.time>>16&255),U0(K,K.gzhead.time>>24&255),U0(K,K.level===9?2:K.strategy>=m1||K.level<2?4:0),U0(K,K.gzhead.os&255),K.gzhead.extra&&K.gzhead.extra.length)U0(K,K.gzhead.extra.length&255),U0(K,K.gzhead.extra.length>>8&255);if(K.gzhead.hcrc)q.adler=B6(q.adler,K.pending_buf,K.pending,0);K.gzindex=0,K.status=u4}else{var J=c1+(K.w_bits-8<<4)<<8,G=-1;if(K.strategy>=m1||K.level<2)G=0;else if(K.level<6)G=1;else if(K.level===6)G=2;else G=3;if(J|=G<<6,K.strstart!==0)J|=gY;if(J+=31-J%31,K.status=a6,d8(K,J),K.strstart!==0)d8(K,q.adler>>>16),d8(K,q.adler&65535);q.adler=1}if(K.status===u4)if(K.gzhead.extra){Q=K.pending;while(K.gzindex<(K.gzhead.extra.length&65535)){if(K.pending===K.pending_buf_size){if(K.gzhead.hcrc&&K.pending>Q)q.adler=B6(q.adler,K.pending_buf,K.pending-Q,Q);if(T6(q),Q=K.pending,K.pending===K.pending_buf_size)break}U0(K,K.gzhead.extra[K.gzindex]&255),K.gzindex++}if(K.gzhead.hcrc&&K.pending>Q)q.adler=B6(q.adler,K.pending_buf,K.pending-Q,Q);if(K.gzindex===K.gzhead.extra.length)K.gzindex=0,K.status=f1}else K.status=f1;if(K.status===f1)if(K.gzhead.name){Q=K.pending;do{if(K.pending===K.pending_buf_size){if(K.gzhead.hcrc&&K.pending>Q)q.adler=B6(q.adler,K.pending_buf,K.pending-Q,Q);if(T6(q),Q=K.pending,K.pending===K.pending_buf_size){Y=1;break}}if(K.gzindexQ)q.adler=B6(q.adler,K.pending_buf,K.pending-Q,Q);if(Y===0)K.gzindex=0,K.status=l1}else K.status=l1;if(K.status===l1)if(K.gzhead.comment){Q=K.pending;do{if(K.pending===K.pending_buf_size){if(K.gzhead.hcrc&&K.pending>Q)q.adler=B6(q.adler,K.pending_buf,K.pending-Q,Q);if(T6(q),Q=K.pending,K.pending===K.pending_buf_size){Y=1;break}}if(K.gzindexQ)q.adler=B6(q.adler,K.pending_buf,K.pending-Q,Q);if(Y===0)K.status=_1}else K.status=_1;if(K.status===_1)if(K.gzhead.hcrc){if(K.pending+2>K.pending_buf_size)T6(q);if(K.pending+2<=K.pending_buf_size)U0(K,q.adler&255),U0(K,q.adler>>8&255),q.adler=0,K.status=a6}else K.status=a6;if(K.pending!==0){if(T6(q),q.avail_out===0)return K.last_flush=-1,b2}else if(q.avail_in===0&&LV(X)<=LV(V)&&X!==w6)return O6(q,F4);if(K.status===n8&&q.avail_in!==0)return O6(q,F4);if(q.avail_in!==0||K.lookahead!==0||X!==t6&&K.status!==n8){var W=K.strategy===m1?lY(K,X):K.strategy===OY?fY(K,X):b5[K.level].func(K,X);if(W===o6||W===m5)K.status=n8;if(W===h0||W===o6){if(q.avail_out===0)K.last_flush=-1;return b2}if(W===r8){if(X===LY)H2._tr_align(K);else if(X!==EV){if(H2._tr_stored_block(K,0,0,!1),X===BY){if(v6(K.head),K.lookahead===0)K.strstart=0,K.block_start=0,K.insert=0}}if(T6(q),q.avail_out===0)return K.last_flush=-1,b2}}if(X!==w6)return b2;if(K.wrap<=0)return jV;if(K.wrap===2)U0(K,q.adler&255),U0(K,q.adler>>8&255),U0(K,q.adler>>16&255),U0(K,q.adler>>24&255),U0(K,q.total_in&255),U0(K,q.total_in>>8&255),U0(K,q.total_in>>16&255),U0(K,q.total_in>>24&255);else d8(K,q.adler>>>16),d8(K,q.adler&65535);if(T6(q),K.wrap>0)K.wrap=-K.wrap;return K.pending!==0?b2:jV}function rY(q){var X;if(!q||!q.state)return U2;if(X=q.state.status,X!==p1&&X!==u4&&X!==f1&&X!==l1&&X!==_1&&X!==a6&&X!==n8)return O6(q,U2);return q.state=null,X===a6?O6(q,TY):b2}function iY(q,X){var V=X.length,K,Q,Y,J,G,W,Z,H;if(!q||!q.state)return U2;if(K=q.state,J=K.wrap,J===2||J===1&&K.status!==p1||K.lookahead)return U2;if(J===1)q.adler=BV(q.adler,X,V,0);if(K.wrap=0,V>=K.w_size){if(J===0)v6(K.head),K.strstart=0,K.block_start=0,K.insert=0;H=new i0.Buf8(K.w_size),i0.arraySet(H,X,V-K.w_size,K.w_size,0),X=H,V=K.w_size}G=q.avail_in,W=q.next_in,Z=q.input,q.avail_in=V,q.next_in=0,q.input=X,s6(K);while(K.lookahead>=H0){Q=K.strstart,Y=K.lookahead-(H0-1);do K.ins_h=(K.ins_h<{var d1=t2(),AV=!0,NV=!0;try{String.fromCharCode.apply(null,[0])}catch(q){AV=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(q){NV=!1}var i8=new d1.Buf8(256);for(f2=0;f2<256;f2++)i8[f2]=f2>=252?6:f2>=248?5:f2>=240?4:f2>=224?3:f2>=192?2:1;var f2;i8[254]=i8[254]=1;f5.string2buf=function(q){var X,V,K,Q,Y,J=q.length,G=0;for(Q=0;Q>>6,X[Y++]=128|V&63;else if(V<65536)X[Y++]=224|V>>>12,X[Y++]=128|V>>>6&63,X[Y++]=128|V&63;else X[Y++]=240|V>>>18,X[Y++]=128|V>>>12&63,X[Y++]=128|V>>>6&63,X[Y++]=128|V&63}return X};function SV(q,X){if(X<65534){if(q.subarray&&NV||!q.subarray&&AV)return String.fromCharCode.apply(null,d1.shrinkBuf(q,X))}var V="";for(var K=0;K4){G[K++]=65533,V+=Y-1;continue}Q&=Y===2?31:Y===3?15:7;while(Y>1&&V1){G[K++]=65533;continue}if(Q<65536)G[K++]=Q;else Q-=65536,G[K++]=55296|Q>>10&1023,G[K++]=56320|Q&1023}return SV(G,K)};f5.utf8border=function(q,X){var V;if(X=X||q.length,X>q.length)X=q.length;V=X-1;while(V>=0&&(q[V]&192)===128)V--;if(V<0)return X;if(V===0)return X;return V+i8[q[V]]>X?V:X}});var x4=g0((KW,yV)=>{function aY(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}yV.exports=aY});var FV=g0((s8)=>{var a8=wV(),o8=t2(),m4=g4(),f4=b1(),oY=x4(),hV=Object.prototype.toString,sY=0,b4=4,l5=0,$V=1,CV=2,tY=-1,eY=0,qJ=8;function e6(q){if(!(this instanceof e6))return new e6(q);this.options=o8.assign({level:tY,method:qJ,chunkSize:16384,windowBits:15,memLevel:8,strategy:eY,to:""},q||{});var X=this.options;if(X.raw&&X.windowBits>0)X.windowBits=-X.windowBits;else if(X.gzip&&X.windowBits>0&&X.windowBits<16)X.windowBits+=16;this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new oY,this.strm.avail_out=0;var V=a8.deflateInit2(this.strm,X.level,X.method,X.windowBits,X.memLevel,X.strategy);if(V!==l5)throw Error(f4[V]);if(X.header)a8.deflateSetHeader(this.strm,X.header);if(X.dictionary){var K;if(typeof X.dictionary==="string")K=m4.string2buf(X.dictionary);else if(hV.call(X.dictionary)==="[object ArrayBuffer]")K=new Uint8Array(X.dictionary);else K=X.dictionary;if(V=a8.deflateSetDictionary(this.strm,K),V!==l5)throw Error(f4[V]);this._dict_set=!0}}e6.prototype.push=function(q,X){var V=this.strm,K=this.options.chunkSize,Q,Y;if(this.ended)return!1;if(Y=X===~~X?X:X===!0?b4:sY,typeof q==="string")V.input=m4.string2buf(q);else if(hV.call(q)==="[object ArrayBuffer]")V.input=new Uint8Array(q);else V.input=q;V.next_in=0,V.avail_in=V.input.length;do{if(V.avail_out===0)V.output=new o8.Buf8(K),V.next_out=0,V.avail_out=K;if(Q=a8.deflate(V,Y),Q!==$V&&Q!==l5)return this.onEnd(Q),this.ended=!0,!1;if(V.avail_out===0||V.avail_in===0&&(Y===b4||Y===CV))if(this.options.to==="string")this.onData(m4.buf2binstring(o8.shrinkBuf(V.output,V.next_out)));else this.onData(o8.shrinkBuf(V.output,V.next_out))}while((V.avail_in>0||V.avail_out===0)&&Q!==$V);if(Y===b4)return Q=a8.deflateEnd(this.strm),this.onEnd(Q),this.ended=!0,Q===l5;if(Y===CV)return this.onEnd(l5),V.avail_out=0,!0;return!0};e6.prototype.onData=function(q){this.chunks.push(q)};e6.prototype.onEnd=function(q){if(q===l5)if(this.options.to==="string")this.result=this.chunks.join("");else this.result=o8.flattenChunks(this.chunks);this.chunks=[],this.err=q,this.msg=this.strm.msg};function l4(q,X){var V=new e6(X);if(V.push(q,!0),V.err)throw V.msg||f4[V.err];return V.result}function XJ(q,X){return X=X||{},X.raw=!0,l4(q,X)}function VJ(q,X){return X=X||{},X.gzip=!0,l4(q,X)}s8.Deflate=e6;s8.deflate=l4;s8.deflateRaw=XJ;s8.gzip=VJ});var DV=g0((YW,PV)=>{var n1=30,KJ=12;PV.exports=function(X,V){var K,Q,Y,J,G,W,Z,H,U,z,k,M,j,B,L,O,N,R,v,w,$,S,h,b,C;K=X.state,Q=X.next_in,b=X.input,Y=Q+(X.avail_in-5),J=X.next_out,C=X.output,G=J-(V-X.avail_out),W=J+(X.avail_out-257),Z=K.dmax,H=K.wsize,U=K.whave,z=K.wnext,k=K.window,M=K.hold,j=K.bits,B=K.lencode,L=K.distcode,O=(1<>>24,M>>>=v,j-=v,v=R>>>16&255,v===0)C[J++]=R&65535;else if(v&16){if(w=R&65535,v&=15,v){if(j>>=v,j-=v}if(j<15)M+=b[Q++]<>>24,M>>>=v,j-=v,v=R>>>16&255,v&16){if($=R&65535,v&=15,jZ){X.msg="invalid distance too far back",K.mode=n1;break q}if(M>>>=v,j-=v,v=J-G,$>v){if(v=$-v,v>U){if(K.sane){X.msg="invalid distance too far back",K.mode=n1;break q}}if(S=0,h=k,z===0){if(S+=H-v,v2)C[J++]=h[S++],C[J++]=h[S++],C[J++]=h[S++],w-=3;if(w){if(C[J++]=h[S++],w>1)C[J++]=h[S++]}}else{S=J-$;do C[J++]=C[S++],C[J++]=C[S++],C[J++]=C[S++],w-=3;while(w>2);if(w){if(C[J++]=C[S++],w>1)C[J++]=C[S++]}}}else if((v&64)===0){R=L[(R&65535)+(M&(1<>3,Q-=w,j-=w<<3,M&=(1<{var uV=t2(),_5=15,gV=852,xV=592,bV=0,_4=1,mV=2,QJ=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],YJ=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],JJ=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],GJ=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];fV.exports=function(X,V,K,Q,Y,J,G,W){var Z=W.bits,H=0,U=0,z=0,k=0,M=0,j=0,B=0,L=0,O=0,N=0,R,v,w,$,S,h=null,b=0,C,D=new uV.Buf16(_5+1),l=new uV.Buf16(_5+1),u=null,q0=0,J0,r,I0;for(H=0;H<=_5;H++)D[H]=0;for(U=0;U=1;k--)if(D[k]!==0)break;if(M>k)M=k;if(k===0)return Y[J++]=20971520,Y[J++]=20971520,W.bits=1,0;for(z=1;z0&&(X===bV||k!==1))return-1;l[1]=0;for(H=1;H<_5;H++)l[H+1]=l[H]+D[H];for(U=0;UgV||X===mV&&O>xV)return 1;for(;;){if(J0=H-B,G[U]C)r=u[q0+G[U]],I0=h[b+G[U]];else r=96,I0=0;R=1<>B)+v]=J0<<24|r<<16|I0|0;while(v!==0);R=1<>=1;if(R!==0)N&=R-1,N+=R;else N=0;if(U++,--D[H]===0){if(H===k)break;H=V[K+G[U]]}if(H>M&&(N&$)!==w){if(B===0)B=M;S+=z,j=H-B,L=1<gV||X===mV&&O>xV)return 1;w=N&$,Y[w]=M<<24|j<<16|S-J|0}}if(N!==0)Y[S+N]=H-B<<24|4194304|0;return W.bits=M,0}});var R9=g0((w2)=>{var Q2=t2(),i4=C4(),l2=h4(),ZJ=DV(),t8=lV(),WJ=0,M9=1,k9=2,_V=4,HJ=5,r1=6,q5=0,UJ=1,zJ=2,z2=-2,I9=-3,a4=-4,MJ=-5,cV=8,E9=1,pV=2,dV=3,nV=4,rV=5,iV=6,aV=7,oV=8,sV=9,tV=10,o1=11,q6=12,c4=13,eV=14,p4=15,q9=16,X9=17,V9=18,K9=19,i1=20,a1=21,Q9=22,Y9=23,J9=24,G9=25,Z9=26,d4=27,W9=28,H9=29,L0=30,o4=31,kJ=32,IJ=852,EJ=592,jJ=15,LJ=jJ;function U9(q){return(q>>>24&255)+(q>>>8&65280)+((q&65280)<<8)+((q&255)<<24)}function BJ(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Q2.Buf16(320),this.work=new Q2.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function j9(q){var X;if(!q||!q.state)return z2;if(X=q.state,q.total_in=q.total_out=X.total=0,q.msg="",X.wrap)q.adler=X.wrap&1;return X.mode=E9,X.last=0,X.havedict=0,X.dmax=32768,X.head=null,X.hold=0,X.bits=0,X.lencode=X.lendyn=new Q2.Buf32(IJ),X.distcode=X.distdyn=new Q2.Buf32(EJ),X.sane=1,X.back=-1,q5}function L9(q){var X;if(!q||!q.state)return z2;return X=q.state,X.wsize=0,X.whave=0,X.wnext=0,j9(q)}function B9(q,X){var V,K;if(!q||!q.state)return z2;if(K=q.state,X<0)V=0,X=-X;else if(V=(X>>4)+1,X<48)X&=15;if(X&&(X<8||X>15))return z2;if(K.window!==null&&K.wbits!==X)K.window=null;return K.wrap=V,K.wbits=X,L9(q)}function T9(q,X){var V,K;if(!q)return z2;if(K=new BJ,q.state=K,K.window=null,V=B9(q,X),V!==q5)q.state=null;return V}function TJ(q){return T9(q,LJ)}var z9=!0,n4,r4;function vJ(q){if(z9){var X;n4=new Q2.Buf32(512),r4=new Q2.Buf32(32),X=0;while(X<144)q.lens[X++]=8;while(X<256)q.lens[X++]=9;while(X<280)q.lens[X++]=7;while(X<288)q.lens[X++]=8;t8(M9,q.lens,0,288,n4,0,q.work,{bits:9}),X=0;while(X<32)q.lens[X++]=5;t8(k9,q.lens,0,32,r4,0,q.work,{bits:5}),z9=!1}q.lencode=n4,q.lenbits=9,q.distcode=r4,q.distbits=5}function v9(q,X,V,K){var Q,Y=q.state;if(Y.window===null)Y.wsize=1<=Y.wsize)Q2.arraySet(Y.window,X,V-Y.wsize,Y.wsize,0),Y.wnext=0,Y.whave=Y.wsize;else{if(Q=Y.wsize-Y.wnext,Q>K)Q=K;if(Q2.arraySet(Y.window,X,V-K,Q,Y.wnext),K-=Q,K)Q2.arraySet(Y.window,X,V-K,K,0),Y.wnext=K,Y.whave=Y.wsize;else{if(Y.wnext+=Q,Y.wnext===Y.wsize)Y.wnext=0;if(Y.whave>>8&255,V.check=l2(V.check,h,2,0),Z=0,H=0,V.mode=pV;break}if(V.flags=0,V.head)V.head.done=!1;if(!(V.wrap&1)||(((Z&255)<<8)+(Z>>8))%31){q.msg="incorrect header check",V.mode=L0;break}if((Z&15)!==cV){q.msg="unknown compression method",V.mode=L0;break}if(Z>>>=4,H-=4,$=(Z&15)+8,V.wbits===0)V.wbits=$;else if($>V.wbits){q.msg="invalid window size",V.mode=L0;break}V.dmax=1<<$,q.adler=V.check=1,V.mode=Z&512?tV:q6,Z=0,H=0;break;case pV:while(H<16){if(G===0)break q;G--,Z+=K[Y++]<>8&1;if(V.flags&512)h[0]=Z&255,h[1]=Z>>>8&255,V.check=l2(V.check,h,2,0);Z=0,H=0,V.mode=dV;case dV:while(H<32){if(G===0)break q;G--,Z+=K[Y++]<>>8&255,h[2]=Z>>>16&255,h[3]=Z>>>24&255,V.check=l2(V.check,h,4,0);Z=0,H=0,V.mode=nV;case nV:while(H<16){if(G===0)break q;G--,Z+=K[Y++]<>8;if(V.flags&512)h[0]=Z&255,h[1]=Z>>>8&255,V.check=l2(V.check,h,2,0);Z=0,H=0,V.mode=rV;case rV:if(V.flags&1024){while(H<16){if(G===0)break q;G--,Z+=K[Y++]<>>8&255,V.check=l2(V.check,h,2,0);Z=0,H=0}else if(V.head)V.head.extra=null;V.mode=iV;case iV:if(V.flags&1024){if(k=V.length,k>G)k=G;if(k){if(V.head){if($=V.head.extra_len-V.length,!V.head.extra)V.head.extra=Array(V.head.extra_len);Q2.arraySet(V.head.extra,K,Y,k,$)}if(V.flags&512)V.check=l2(V.check,K,k,Y);G-=k,Y+=k,V.length-=k}if(V.length)break q}V.length=0,V.mode=aV;case aV:if(V.flags&2048){if(G===0)break q;k=0;do if($=K[Y+k++],V.head&&$&&V.length<65536)V.head.name+=String.fromCharCode($);while($&&k>9&1,V.head.done=!0;q.adler=V.check=0,V.mode=q6;break;case tV:while(H<32){if(G===0)break q;G--,Z+=K[Y++]<>>=H&7,H-=H&7,V.mode=d4;break}while(H<3){if(G===0)break q;G--,Z+=K[Y++]<>>=1,H-=1,Z&3){case 0:V.mode=eV;break;case 1:if(vJ(V),V.mode=i1,X===r1){Z>>>=2,H-=2;break q}break;case 2:V.mode=X9;break;case 3:q.msg="invalid block type",V.mode=L0}Z>>>=2,H-=2;break;case eV:Z>>>=H&7,H-=H&7;while(H<32){if(G===0)break q;G--,Z+=K[Y++]<>>16^65535)){q.msg="invalid stored block lengths",V.mode=L0;break}if(V.length=Z&65535,Z=0,H=0,V.mode=p4,X===r1)break q;case p4:V.mode=q9;case q9:if(k=V.length,k){if(k>G)k=G;if(k>W)k=W;if(k===0)break q;Q2.arraySet(Q,K,Y,k,J),G-=k,Y+=k,W-=k,J+=k,V.length-=k;break}V.mode=q6;break;case X9:while(H<14){if(G===0)break q;G--,Z+=K[Y++]<>>=5,H-=5,V.ndist=(Z&31)+1,Z>>>=5,H-=5,V.ncode=(Z&15)+4,Z>>>=4,H-=4,V.nlen>286||V.ndist>30){q.msg="too many length or distance symbols",V.mode=L0;break}V.have=0,V.mode=V9;case V9:while(V.have>>=3,H-=3}while(V.have<19)V.lens[D[V.have++]]=0;if(V.lencode=V.lendyn,V.lenbits=7,b={bits:V.lenbits},S=t8(WJ,V.lens,0,19,V.lencode,0,V.work,b),V.lenbits=b.bits,S){q.msg="invalid code lengths set",V.mode=L0;break}V.have=0,V.mode=K9;case K9:while(V.have>>24,O=B>>>16&255,N=B&65535,L<=H)break;if(G===0)break q;G--,Z+=K[Y++]<>>=L,H-=L,V.lens[V.have++]=N;else{if(N===16){C=L+2;while(H>>=L,H-=L,V.have===0){q.msg="invalid bit length repeat",V.mode=L0;break}$=V.lens[V.have-1],k=3+(Z&3),Z>>>=2,H-=2}else if(N===17){C=L+3;while(H>>=L,H-=L,$=0,k=3+(Z&7),Z>>>=3,H-=3}else{C=L+7;while(H>>=L,H-=L,$=0,k=11+(Z&127),Z>>>=7,H-=7}if(V.have+k>V.nlen+V.ndist){q.msg="invalid bit length repeat",V.mode=L0;break}while(k--)V.lens[V.have++]=$}}if(V.mode===L0)break;if(V.lens[256]===0){q.msg="invalid code -- missing end-of-block",V.mode=L0;break}if(V.lenbits=9,b={bits:V.lenbits},S=t8(M9,V.lens,0,V.nlen,V.lencode,0,V.work,b),V.lenbits=b.bits,S){q.msg="invalid literal/lengths set",V.mode=L0;break}if(V.distbits=6,V.distcode=V.distdyn,b={bits:V.distbits},S=t8(k9,V.lens,V.nlen,V.ndist,V.distcode,0,V.work,b),V.distbits=b.bits,S){q.msg="invalid distances set",V.mode=L0;break}if(V.mode=i1,X===r1)break q;case i1:V.mode=a1;case a1:if(G>=6&&W>=258){if(q.next_out=J,q.avail_out=W,q.next_in=Y,q.avail_in=G,V.hold=Z,V.bits=H,ZJ(q,z),J=q.next_out,Q=q.output,W=q.avail_out,Y=q.next_in,K=q.input,G=q.avail_in,Z=V.hold,H=V.bits,V.mode===q6)V.back=-1;break}V.back=0;for(;;){if(B=V.lencode[Z&(1<>>24,O=B>>>16&255,N=B&65535,L<=H)break;if(G===0)break q;G--,Z+=K[Y++]<>R)],L=B>>>24,O=B>>>16&255,N=B&65535,R+L<=H)break;if(G===0)break q;G--,Z+=K[Y++]<>>=R,H-=R,V.back+=R}if(Z>>>=L,H-=L,V.back+=L,V.length=N,O===0){V.mode=Z9;break}if(O&32){V.back=-1,V.mode=q6;break}if(O&64){q.msg="invalid literal/length code",V.mode=L0;break}V.extra=O&15,V.mode=Q9;case Q9:if(V.extra){C=V.extra;while(H>>=V.extra,H-=V.extra,V.back+=V.extra}V.was=V.length,V.mode=Y9;case Y9:for(;;){if(B=V.distcode[Z&(1<>>24,O=B>>>16&255,N=B&65535,L<=H)break;if(G===0)break q;G--,Z+=K[Y++]<>R)],L=B>>>24,O=B>>>16&255,N=B&65535,R+L<=H)break;if(G===0)break q;G--,Z+=K[Y++]<>>=R,H-=R,V.back+=R}if(Z>>>=L,H-=L,V.back+=L,O&64){q.msg="invalid distance code",V.mode=L0;break}V.offset=N,V.extra=O&15,V.mode=J9;case J9:if(V.extra){C=V.extra;while(H>>=V.extra,H-=V.extra,V.back+=V.extra}if(V.offset>V.dmax){q.msg="invalid distance too far back",V.mode=L0;break}V.mode=G9;case G9:if(W===0)break q;if(k=z-W,V.offset>k){if(k=V.offset-k,k>V.whave){if(V.sane){q.msg="invalid distance too far back",V.mode=L0;break}}if(k>V.wnext)k-=V.wnext,M=V.wsize-k;else M=V.wnext-k;if(k>V.length)k=V.length;j=V.window}else j=Q,M=J-V.offset,k=V.length;if(k>W)k=W;W-=k,V.length-=k;do Q[J++]=j[M++];while(--k);if(V.length===0)V.mode=a1;break;case Z9:if(W===0)break q;Q[J++]=V.length,W--,V.mode=a1;break;case d4:if(V.wrap){while(H<32){if(G===0)break q;G--,Z|=K[Y++]<{O9.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}});var A9=g0((WW,w9)=>{function NJ(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}w9.exports=NJ});var S9=g0((q1)=>{var c5=R9(),e8=t2(),s1=g4(),N0=s4(),t4=b1(),SJ=x4(),yJ=A9(),N9=Object.prototype.toString;function X5(q){if(!(this instanceof X5))return new X5(q);this.options=e8.assign({chunkSize:16384,windowBits:0,to:""},q||{});var X=this.options;if(X.raw&&X.windowBits>=0&&X.windowBits<16){if(X.windowBits=-X.windowBits,X.windowBits===0)X.windowBits=-15}if(X.windowBits>=0&&X.windowBits<16&&!(q&&q.windowBits))X.windowBits+=32;if(X.windowBits>15&&X.windowBits<48){if((X.windowBits&15)===0)X.windowBits|=15}this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new SJ,this.strm.avail_out=0;var V=c5.inflateInit2(this.strm,X.windowBits);if(V!==N0.Z_OK)throw Error(t4[V]);if(this.header=new yJ,c5.inflateGetHeader(this.strm,this.header),X.dictionary){if(typeof X.dictionary==="string")X.dictionary=s1.string2buf(X.dictionary);else if(N9.call(X.dictionary)==="[object ArrayBuffer]")X.dictionary=new Uint8Array(X.dictionary);if(X.raw){if(V=c5.inflateSetDictionary(this.strm,X.dictionary),V!==N0.Z_OK)throw Error(t4[V])}}}X5.prototype.push=function(q,X){var V=this.strm,K=this.options.chunkSize,Q=this.options.dictionary,Y,J,G,W,Z,H=!1;if(this.ended)return!1;if(J=X===~~X?X:X===!0?N0.Z_FINISH:N0.Z_NO_FLUSH,typeof q==="string")V.input=s1.binstring2buf(q);else if(N9.call(q)==="[object ArrayBuffer]")V.input=new Uint8Array(q);else V.input=q;V.next_in=0,V.avail_in=V.input.length;do{if(V.avail_out===0)V.output=new e8.Buf8(K),V.next_out=0,V.avail_out=K;if(Y=c5.inflate(V,N0.Z_NO_FLUSH),Y===N0.Z_NEED_DICT&&Q)Y=c5.inflateSetDictionary(this.strm,Q);if(Y===N0.Z_BUF_ERROR&&H===!0)Y=N0.Z_OK,H=!1;if(Y!==N0.Z_STREAM_END&&Y!==N0.Z_OK)return this.onEnd(Y),this.ended=!0,!1;if(V.next_out){if(V.avail_out===0||Y===N0.Z_STREAM_END||V.avail_in===0&&(J===N0.Z_FINISH||J===N0.Z_SYNC_FLUSH))if(this.options.to==="string"){if(G=s1.utf8border(V.output,V.next_out),W=V.next_out-G,Z=s1.buf2string(V.output,G),V.next_out=W,V.avail_out=K-W,W)e8.arraySet(V.output,V.output,G,W,0);this.onData(Z)}else this.onData(e8.shrinkBuf(V.output,V.next_out))}if(V.avail_in===0&&V.avail_out===0)H=!0}while((V.avail_in>0||V.avail_out===0)&&Y!==N0.Z_STREAM_END);if(Y===N0.Z_STREAM_END)J=N0.Z_FINISH;if(J===N0.Z_FINISH)return Y=c5.inflateEnd(this.strm),this.onEnd(Y),this.ended=!0,Y===N0.Z_OK;if(J===N0.Z_SYNC_FLUSH)return this.onEnd(N0.Z_OK),V.avail_out=0,!0;return!0};X5.prototype.onData=function(q){this.chunks.push(q)};X5.prototype.onEnd=function(q){if(q===N0.Z_OK)if(this.options.to==="string")this.result=this.chunks.join("");else this.result=e8.flattenChunks(this.chunks);this.chunks=[],this.err=q,this.msg=this.strm.msg};function e4(q,X){var V=new X5(X);if(V.push(q,!0),V.err)throw V.msg||t4[V.err];return V.result}function $J(q,X){return X=X||{},X.raw=!0,e4(q,X)}q1.Inflate=X5;q1.inflate=e4;q1.inflateRaw=$J;q1.ungzip=e4});var X1=g0((UW,$9)=>{var CJ=t2().assign,hJ=FV(),FJ=S9(),PJ=s4(),y9={};CJ(y9,hJ,FJ,PJ);$9.exports=y9});var zX=globalThis;if(typeof zX.global>"u")zX.global=globalThis;var C2=[],W2=[],lq="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(c6=0,MX=lq.length;c60)throw Error("Invalid string. Length must be a multiple of 4");var V=q.indexOf("=");if(V===-1)V=X;var K=V===X?0:4-V%4;return[V,K]}function VQ(q,X){return(q+X)*3/4-X}function KQ(q){var X,V=XQ(q),K=V[0],Q=V[1],Y=new Uint8Array(VQ(K,Q)),J=0,G=Q>0?K-4:K,W;for(W=0;W>16&255,Y[J++]=X>>8&255,Y[J++]=X&255;if(Q===2)X=W2[q.charCodeAt(W)]<<2|W2[q.charCodeAt(W+1)]>>4,Y[J++]=X&255;if(Q===1)X=W2[q.charCodeAt(W)]<<10|W2[q.charCodeAt(W+1)]<<4|W2[q.charCodeAt(W+2)]>>2,Y[J++]=X>>8&255,Y[J++]=X&255;return Y}function QQ(q){return C2[q>>18&63]+C2[q>>12&63]+C2[q>>6&63]+C2[q&63]}function YQ(q,X,V){var K,Q=[];for(var Y=X;YG?G:J+Y));if(K===1)X=q[V-1],Q.push(C2[X>>2]+C2[X<<4&63]+"==");else if(K===2)X=(q[V-2]<<8)+q[V-1],Q.push(C2[X>>10]+C2[X>>4&63]+C2[X<<2&63]+"=");return Q.join("")}function $1(q,X,V,K,Q){var Y,J,G=Q*8-K-1,W=(1<>1,H=-7,U=V?Q-1:0,z=V?-1:1,k=q[X+U];U+=z,Y=k&(1<<-H)-1,k>>=-H,H+=G;for(;H>0;Y=Y*256+q[X+U],U+=z,H-=8);J=Y&(1<<-H)-1,Y>>=-H,H+=K;for(;H>0;J=J*256+q[X+U],U+=z,H-=8);if(Y===0)Y=1-Z;else if(Y===W)return J?NaN:(k?-1:1)*(1/0);else J=J+Math.pow(2,K),Y=Y-Z;return(k?-1:1)*J*Math.pow(2,Y-K)}function BX(q,X,V,K,Q,Y){var J,G,W,Z=Y*8-Q-1,H=(1<>1,z=Q===23?Math.pow(2,-24)-Math.pow(2,-77):0,k=K?0:Y-1,M=K?1:-1,j=X<0||X===0&&1/X<0?1:0;if(X=Math.abs(X),isNaN(X)||X===1/0)G=isNaN(X)?1:0,J=H;else{if(J=Math.floor(Math.log(X)/Math.LN2),X*(W=Math.pow(2,-J))<1)J--,W*=2;if(J+U>=1)X+=z/W;else X+=z*Math.pow(2,1-U);if(X*W>=2)J++,W/=2;if(J+U>=H)G=0,J=H;else if(J+U>=1)G=(X*W-1)*Math.pow(2,Q),J=J+U;else G=X*Math.pow(2,U-1)*Math.pow(2,Q),J=0}for(;Q>=8;q[V+k]=G&255,k+=M,G/=256,Q-=8);J=J<0;q[V+k]=J&255,k+=M,J/=256,Z-=8);q[V+k-M]|=j*128}var IX=typeof Symbol==="function"&&typeof Symbol.for==="function"?Symbol.for("nodejs.util.inspect.custom"):null,JQ=50,_q=2147483647;var{btoa:$3,atob:C3,File:h3,Blob:F3}=globalThis;function a2(q){if(q>_q)throw RangeError('The value "'+q+'" is invalid for option "size"');let X=new Uint8Array(q);return Object.setPrototypeOf(X,y.prototype),X}function rq(q,X,V){return class extends V{constructor(){super();Object.defineProperty(this,"message",{value:X.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${q}]`,this.stack,delete this.name}get code(){return q}set code(K){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:K,writable:!0})}toString(){return`${this.name} [${q}]: ${this.message}`}}}var GQ=rq("ERR_BUFFER_OUT_OF_BOUNDS",function(q){if(q)return`${q} is outside of buffer bounds`;return"Attempt to access memory outside buffer bounds"},RangeError),ZQ=rq("ERR_INVALID_ARG_TYPE",function(q,X){return`The "${q}" argument must be of type number. Received type ${typeof X}`},TypeError),cq=rq("ERR_OUT_OF_RANGE",function(q,X,V){let K=`The value of "${q}" is out of range.`,Q=V;if(Number.isInteger(V)&&Math.abs(V)>4294967296)Q=LX(String(V));else if(typeof V==="bigint"){if(Q=String(V),V>BigInt(2)**BigInt(32)||V<-(BigInt(2)**BigInt(32)))Q=LX(Q);Q+="n"}return K+=` It must be ${X}. Received ${Q}`,K},RangeError);function y(q,X,V){if(typeof q==="number"){if(typeof X==="string")throw TypeError('The "string" argument must be of type string. Received type number');return iq(q)}return TX(q,X,V)}Object.defineProperty(y.prototype,"parent",{enumerable:!0,get:function(){if(!y.isBuffer(this))return;return this.buffer}});Object.defineProperty(y.prototype,"offset",{enumerable:!0,get:function(){if(!y.isBuffer(this))return;return this.byteOffset}});y.poolSize=8192;function TX(q,X,V){if(typeof q==="string")return HQ(q,X);if(ArrayBuffer.isView(q))return UQ(q);if(q==null)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof q);if(h2(q,ArrayBuffer)||q&&h2(q.buffer,ArrayBuffer))return dq(q,X,V);if(typeof SharedArrayBuffer<"u"&&(h2(q,SharedArrayBuffer)||q&&h2(q.buffer,SharedArrayBuffer)))return dq(q,X,V);if(typeof q==="number")throw TypeError('The "value" argument must not be of type number. Received type number');let K=q.valueOf&&q.valueOf();if(K!=null&&K!==q)return y.from(K,X,V);let Q=zQ(q);if(Q)return Q;if(typeof Symbol<"u"&&Symbol.toPrimitive!=null&&typeof q[Symbol.toPrimitive]==="function")return y.from(q[Symbol.toPrimitive]("string"),X,V);throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof q)}y.from=function(q,X,V){return TX(q,X,V)};Object.setPrototypeOf(y.prototype,Uint8Array.prototype);Object.setPrototypeOf(y,Uint8Array);function vX(q){if(typeof q!=="number")throw TypeError('"size" argument must be of type number');else if(q<0)throw RangeError('The value "'+q+'" is invalid for option "size"')}function WQ(q,X,V){if(vX(q),q<=0)return a2(q);if(X!==void 0)return typeof V==="string"?a2(q).fill(X,V):a2(q).fill(X);return a2(q)}y.alloc=function(q,X,V){return WQ(q,X,V)};function iq(q){return vX(q),a2(q<0?0:aq(q)|0)}y.allocUnsafe=function(q){return iq(q)};y.allocUnsafeSlow=function(q){return iq(q)};function HQ(q,X){if(typeof X!=="string"||X==="")X="utf8";if(!y.isEncoding(X))throw TypeError("Unknown encoding: "+X);let V=RX(q,X)|0,K=a2(V),Q=K.write(q,X);if(Q!==V)K=K.slice(0,Q);return K}function pq(q){let X=q.length<0?0:aq(q.length)|0,V=a2(X);for(let K=0;K=_q)throw RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+_q.toString(16)+" bytes");return q|0}y.isBuffer=function(q){return q!=null&&q._isBuffer===!0&&q!==y.prototype};y.compare=function(q,X){if(h2(q,Uint8Array))q=y.from(q,q.offset,q.byteLength);if(h2(X,Uint8Array))X=y.from(X,X.offset,X.byteLength);if(!y.isBuffer(q)||!y.isBuffer(X))throw TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(q===X)return 0;let V=q.length,K=X.length;for(let Q=0,Y=Math.min(V,K);QK.length){if(!y.isBuffer(Y))Y=y.from(Y);Y.copy(K,Q)}else Uint8Array.prototype.set.call(K,Y,Q);else if(!y.isBuffer(Y))throw TypeError('"list" argument must be an Array of Buffers');else Y.copy(K,Q);Q+=Y.length}return K};function RX(q,X){if(y.isBuffer(q))return q.length;if(ArrayBuffer.isView(q)||h2(q,ArrayBuffer))return q.byteLength;if(typeof q!=="string")throw TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof q);let V=q.length,K=arguments.length>2&&arguments[2]===!0;if(!K&&V===0)return 0;let Q=!1;for(;;)switch(X){case"ascii":case"latin1":case"binary":return V;case"utf8":case"utf-8":return nq(q).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return V*2;case"hex":return V>>>1;case"base64":return hX(q).length;default:if(Q)return K?-1:nq(q).length;X=(""+X).toLowerCase(),Q=!0}}y.byteLength=RX;function MQ(q,X,V){let K=!1;if(X===void 0||X<0)X=0;if(X>this.length)return"";if(V===void 0||V>this.length)V=this.length;if(V<=0)return"";if(V>>>=0,X>>>=0,V<=X)return"";if(!q)q="utf8";while(!0)switch(q){case"hex":return OQ(this,X,V);case"utf8":case"utf-8":return wX(this,X,V);case"ascii":return vQ(this,X,V);case"latin1":case"binary":return RQ(this,X,V);case"base64":return BQ(this,X,V);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return wQ(this,X,V);default:if(K)throw TypeError("Unknown encoding: "+q);q=(q+"").toLowerCase(),K=!0}}y.prototype._isBuffer=!0;function p6(q,X,V){let K=q[X];q[X]=q[V],q[V]=K}y.prototype.swap16=function(){let q=this.length;if(q%2!==0)throw RangeError("Buffer size must be a multiple of 16-bits");for(let X=0;XX)q+=" ... ";return""};if(IX)y.prototype[IX]=y.prototype.inspect;y.prototype.compare=function(q,X,V,K,Q){if(h2(q,Uint8Array))q=y.from(q,q.offset,q.byteLength);if(!y.isBuffer(q))throw TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof q);if(X===void 0)X=0;if(V===void 0)V=q?q.length:0;if(K===void 0)K=0;if(Q===void 0)Q=this.length;if(X<0||V>q.length||K<0||Q>this.length)throw RangeError("out of range index");if(K>=Q&&X>=V)return 0;if(K>=Q)return-1;if(X>=V)return 1;if(X>>>=0,V>>>=0,K>>>=0,Q>>>=0,this===q)return 0;let Y=Q-K,J=V-X,G=Math.min(Y,J),W=this.slice(K,Q),Z=q.slice(X,V);for(let H=0;H2147483647)V=2147483647;else if(V<-2147483648)V=-2147483648;if(V=+V,Number.isNaN(V))V=Q?0:q.length-1;if(V<0)V=q.length+V;if(V>=q.length)if(Q)return-1;else V=q.length-1;else if(V<0)if(Q)V=0;else return-1;if(typeof X==="string")X=y.from(X,K);if(y.isBuffer(X)){if(X.length===0)return-1;return EX(q,X,V,K,Q)}else if(typeof X==="number"){if(X=X&255,typeof Uint8Array.prototype.indexOf==="function")if(Q)return Uint8Array.prototype.indexOf.call(q,X,V);else return Uint8Array.prototype.lastIndexOf.call(q,X,V);return EX(q,[X],V,K,Q)}throw TypeError("val must be string, number or Buffer")}function EX(q,X,V,K,Q){let Y=1,J=q.length,G=X.length;if(K!==void 0){if(K=String(K).toLowerCase(),K==="ucs2"||K==="ucs-2"||K==="utf16le"||K==="utf-16le"){if(q.length<2||X.length<2)return-1;Y=2,J/=2,G/=2,V/=2}}function W(H,U){if(Y===1)return H[U];else return H.readUInt16BE(U*Y)}let Z;if(Q){let H=-1;for(Z=V;ZJ)V=J-G;for(Z=V;Z>=0;Z--){let H=!0;for(let U=0;UQ)K=Q;let Y=X.length;if(K>Y/2)K=Y/2;let J;for(J=0;J>>0,isFinite(V)){if(V=V>>>0,K===void 0)K="utf8"}else K=V,V=void 0;else throw Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");let Q=this.length-X;if(V===void 0||V>Q)V=Q;if(q.length>0&&(V<0||X<0)||X>this.length)throw RangeError("Attempt to write outside buffer bounds");if(!K)K="utf8";let Y=!1;for(;;)switch(K){case"hex":return kQ(this,q,X,V);case"utf8":case"utf-8":return IQ(this,q,X,V);case"ascii":case"latin1":case"binary":return EQ(this,q,X,V);case"base64":return jQ(this,q,X,V);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return LQ(this,q,X,V);default:if(Y)throw TypeError("Unknown encoding: "+K);K=(""+K).toLowerCase(),Y=!0}};y.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function BQ(q,X,V){if(X===0&&V===q.length)return kX(q);else return kX(q.slice(X,V))}function wX(q,X,V){V=Math.min(q.length,V);let K=[],Q=X;while(Q239?4:Y>223?3:Y>191?2:1;if(Q+G<=V){let W,Z,H,U;switch(G){case 1:if(Y<128)J=Y;break;case 2:if(W=q[Q+1],(W&192)===128){if(U=(Y&31)<<6|W&63,U>127)J=U}break;case 3:if(W=q[Q+1],Z=q[Q+2],(W&192)===128&&(Z&192)===128){if(U=(Y&15)<<12|(W&63)<<6|Z&63,U>2047&&(U<55296||U>57343))J=U}break;case 4:if(W=q[Q+1],Z=q[Q+2],H=q[Q+3],(W&192)===128&&(Z&192)===128&&(H&192)===128){if(U=(Y&15)<<18|(W&63)<<12|(Z&63)<<6|H&63,U>65535&&U<1114112)J=U}}}if(J===null)J=65533,G=1;else if(J>65535)J-=65536,K.push(J>>>10&1023|55296),J=56320|J&1023;K.push(J),Q+=G}return TQ(K)}var jX=4096;function TQ(q){let X=q.length;if(X<=jX)return String.fromCharCode.apply(String,q);let V="",K=0;while(KK)V=K;let Q="";for(let Y=X;YV)q=V;if(X<0){if(X+=V,X<0)X=0}else if(X>V)X=V;if(XV)throw RangeError("Trying to access beyond buffer length")}y.prototype.readUintLE=y.prototype.readUIntLE=function(q,X,V){if(q=q>>>0,X=X>>>0,!V)D0(q,X,this.length);let K=this[q],Q=1,Y=0;while(++Y>>0,X=X>>>0,!V)D0(q,X,this.length);let K=this[q+--X],Q=1;while(X>0&&(Q*=256))K+=this[q+--X]*Q;return K};y.prototype.readUint8=y.prototype.readUInt8=function(q,X){if(q=q>>>0,!X)D0(q,1,this.length);return this[q]};y.prototype.readUint16LE=y.prototype.readUInt16LE=function(q,X){if(q=q>>>0,!X)D0(q,2,this.length);return this[q]|this[q+1]<<8};y.prototype.readUint16BE=y.prototype.readUInt16BE=function(q,X){if(q=q>>>0,!X)D0(q,2,this.length);return this[q]<<8|this[q+1]};y.prototype.readUint32LE=y.prototype.readUInt32LE=function(q,X){if(q=q>>>0,!X)D0(q,4,this.length);return(this[q]|this[q+1]<<8|this[q+2]<<16)+this[q+3]*16777216};y.prototype.readUint32BE=y.prototype.readUInt32BE=function(q,X){if(q=q>>>0,!X)D0(q,4,this.length);return this[q]*16777216+(this[q+1]<<16|this[q+2]<<8|this[q+3])};y.prototype.readBigUInt64LE=M6(function(q){q=q>>>0,y5(q,"offset");let X=this[q],V=this[q+7];if(X===void 0||V===void 0)C8(q,this.length-8);let K=X+this[++q]*256+this[++q]*65536+this[++q]*16777216,Q=this[++q]+this[++q]*256+this[++q]*65536+V*16777216;return BigInt(K)+(BigInt(Q)<>>0,y5(q,"offset");let X=this[q],V=this[q+7];if(X===void 0||V===void 0)C8(q,this.length-8);let K=X*16777216+this[++q]*65536+this[++q]*256+this[++q],Q=this[++q]*16777216+this[++q]*65536+this[++q]*256+V;return(BigInt(K)<>>0,X=X>>>0,!V)D0(q,X,this.length);let K=this[q],Q=1,Y=0;while(++Y=Q)K-=Math.pow(2,8*X);return K};y.prototype.readIntBE=function(q,X,V){if(q=q>>>0,X=X>>>0,!V)D0(q,X,this.length);let K=X,Q=1,Y=this[q+--K];while(K>0&&(Q*=256))Y+=this[q+--K]*Q;if(Q*=128,Y>=Q)Y-=Math.pow(2,8*X);return Y};y.prototype.readInt8=function(q,X){if(q=q>>>0,!X)D0(q,1,this.length);if(!(this[q]&128))return this[q];return(255-this[q]+1)*-1};y.prototype.readInt16LE=function(q,X){if(q=q>>>0,!X)D0(q,2,this.length);let V=this[q]|this[q+1]<<8;return V&32768?V|4294901760:V};y.prototype.readInt16BE=function(q,X){if(q=q>>>0,!X)D0(q,2,this.length);let V=this[q+1]|this[q]<<8;return V&32768?V|4294901760:V};y.prototype.readInt32LE=function(q,X){if(q=q>>>0,!X)D0(q,4,this.length);return this[q]|this[q+1]<<8|this[q+2]<<16|this[q+3]<<24};y.prototype.readInt32BE=function(q,X){if(q=q>>>0,!X)D0(q,4,this.length);return this[q]<<24|this[q+1]<<16|this[q+2]<<8|this[q+3]};y.prototype.readBigInt64LE=M6(function(q){q=q>>>0,y5(q,"offset");let X=this[q],V=this[q+7];if(X===void 0||V===void 0)C8(q,this.length-8);let K=this[q+4]+this[q+5]*256+this[q+6]*65536+(V<<24);return(BigInt(K)<>>0,y5(q,"offset");let X=this[q],V=this[q+7];if(X===void 0||V===void 0)C8(q,this.length-8);let K=(X<<24)+this[++q]*65536+this[++q]*256+this[++q];return(BigInt(K)<>>0,!X)D0(q,4,this.length);return $1(this,q,!0,23,4)};y.prototype.readFloatBE=function(q,X){if(q=q>>>0,!X)D0(q,4,this.length);return $1(this,q,!1,23,4)};y.prototype.readDoubleLE=function(q,X){if(q=q>>>0,!X)D0(q,8,this.length);return $1(this,q,!0,52,8)};y.prototype.readDoubleBE=function(q,X){if(q=q>>>0,!X)D0(q,8,this.length);return $1(this,q,!1,52,8)};function s0(q,X,V,K,Q,Y){if(!y.isBuffer(q))throw TypeError('"buffer" argument must be a Buffer instance');if(X>Q||Xq.length)throw RangeError("Index out of range")}y.prototype.writeUintLE=y.prototype.writeUIntLE=function(q,X,V,K){if(q=+q,X=X>>>0,V=V>>>0,!K){let J=Math.pow(2,8*V)-1;s0(this,q,X,V,J,0)}let Q=1,Y=0;this[X]=q&255;while(++Y>>0,V=V>>>0,!K){let J=Math.pow(2,8*V)-1;s0(this,q,X,V,J,0)}let Q=V-1,Y=1;this[X+Q]=q&255;while(--Q>=0&&(Y*=256))this[X+Q]=q/Y&255;return X+V};y.prototype.writeUint8=y.prototype.writeUInt8=function(q,X,V){if(q=+q,X=X>>>0,!V)s0(this,q,X,1,255,0);return this[X]=q&255,X+1};y.prototype.writeUint16LE=y.prototype.writeUInt16LE=function(q,X,V){if(q=+q,X=X>>>0,!V)s0(this,q,X,2,65535,0);return this[X]=q&255,this[X+1]=q>>>8,X+2};y.prototype.writeUint16BE=y.prototype.writeUInt16BE=function(q,X,V){if(q=+q,X=X>>>0,!V)s0(this,q,X,2,65535,0);return this[X]=q>>>8,this[X+1]=q&255,X+2};y.prototype.writeUint32LE=y.prototype.writeUInt32LE=function(q,X,V){if(q=+q,X=X>>>0,!V)s0(this,q,X,4,4294967295,0);return this[X+3]=q>>>24,this[X+2]=q>>>16,this[X+1]=q>>>8,this[X]=q&255,X+4};y.prototype.writeUint32BE=y.prototype.writeUInt32BE=function(q,X,V){if(q=+q,X=X>>>0,!V)s0(this,q,X,4,4294967295,0);return this[X]=q>>>24,this[X+1]=q>>>16,this[X+2]=q>>>8,this[X+3]=q&255,X+4};function AX(q,X,V,K,Q){CX(X,K,Q,q,V,7);let Y=Number(X&BigInt(4294967295));q[V++]=Y,Y=Y>>8,q[V++]=Y,Y=Y>>8,q[V++]=Y,Y=Y>>8,q[V++]=Y;let J=Number(X>>BigInt(32)&BigInt(4294967295));return q[V++]=J,J=J>>8,q[V++]=J,J=J>>8,q[V++]=J,J=J>>8,q[V++]=J,V}function NX(q,X,V,K,Q){CX(X,K,Q,q,V,7);let Y=Number(X&BigInt(4294967295));q[V+7]=Y,Y=Y>>8,q[V+6]=Y,Y=Y>>8,q[V+5]=Y,Y=Y>>8,q[V+4]=Y;let J=Number(X>>BigInt(32)&BigInt(4294967295));return q[V+3]=J,J=J>>8,q[V+2]=J,J=J>>8,q[V+1]=J,J=J>>8,q[V]=J,V+8}y.prototype.writeBigUInt64LE=M6(function(q,X=0){return AX(this,q,X,BigInt(0),BigInt("0xffffffffffffffff"))});y.prototype.writeBigUInt64BE=M6(function(q,X=0){return NX(this,q,X,BigInt(0),BigInt("0xffffffffffffffff"))});y.prototype.writeIntLE=function(q,X,V,K){if(q=+q,X=X>>>0,!K){let G=Math.pow(2,8*V-1);s0(this,q,X,V,G-1,-G)}let Q=0,Y=1,J=0;this[X]=q&255;while(++Q>0)-J&255}return X+V};y.prototype.writeIntBE=function(q,X,V,K){if(q=+q,X=X>>>0,!K){let G=Math.pow(2,8*V-1);s0(this,q,X,V,G-1,-G)}let Q=V-1,Y=1,J=0;this[X+Q]=q&255;while(--Q>=0&&(Y*=256)){if(q<0&&J===0&&this[X+Q+1]!==0)J=1;this[X+Q]=(q/Y>>0)-J&255}return X+V};y.prototype.writeInt8=function(q,X,V){if(q=+q,X=X>>>0,!V)s0(this,q,X,1,127,-128);if(q<0)q=255+q+1;return this[X]=q&255,X+1};y.prototype.writeInt16LE=function(q,X,V){if(q=+q,X=X>>>0,!V)s0(this,q,X,2,32767,-32768);return this[X]=q&255,this[X+1]=q>>>8,X+2};y.prototype.writeInt16BE=function(q,X,V){if(q=+q,X=X>>>0,!V)s0(this,q,X,2,32767,-32768);return this[X]=q>>>8,this[X+1]=q&255,X+2};y.prototype.writeInt32LE=function(q,X,V){if(q=+q,X=X>>>0,!V)s0(this,q,X,4,2147483647,-2147483648);return this[X]=q&255,this[X+1]=q>>>8,this[X+2]=q>>>16,this[X+3]=q>>>24,X+4};y.prototype.writeInt32BE=function(q,X,V){if(q=+q,X=X>>>0,!V)s0(this,q,X,4,2147483647,-2147483648);if(q<0)q=4294967295+q+1;return this[X]=q>>>24,this[X+1]=q>>>16,this[X+2]=q>>>8,this[X+3]=q&255,X+4};y.prototype.writeBigInt64LE=M6(function(q,X=0){return AX(this,q,X,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});y.prototype.writeBigInt64BE=M6(function(q,X=0){return NX(this,q,X,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});function SX(q,X,V,K,Q,Y){if(V+K>q.length)throw RangeError("Index out of range");if(V<0)throw RangeError("Index out of range")}function yX(q,X,V,K,Q){if(X=+X,V=V>>>0,!Q)SX(q,X,V,4,340282346638528860000000000000000000000,-340282346638528860000000000000000000000);return BX(q,X,V,K,23,4),V+4}y.prototype.writeFloatLE=function(q,X,V){return yX(this,q,X,!0,V)};y.prototype.writeFloatBE=function(q,X,V){return yX(this,q,X,!1,V)};function $X(q,X,V,K,Q){if(X=+X,V=V>>>0,!Q)SX(q,X,V,8,179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,-179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);return BX(q,X,V,K,52,8),V+8}y.prototype.writeDoubleLE=function(q,X,V){return $X(this,q,X,!0,V)};y.prototype.writeDoubleBE=function(q,X,V){return $X(this,q,X,!1,V)};y.prototype.copy=function(q,X,V,K){if(!y.isBuffer(q))throw TypeError("argument should be a Buffer");if(!V)V=0;if(!K&&K!==0)K=this.length;if(X>=q.length)X=q.length;if(!X)X=0;if(K>0&&K=this.length)throw RangeError("Index out of range");if(K<0)throw RangeError("sourceEnd out of bounds");if(K>this.length)K=this.length;if(q.length-X>>0,V=V===void 0?this.length:V>>>0,!q)q=0;let Q;if(typeof q==="number")for(Q=X;Q=K+4;V-=3)X=`_${q.slice(V-3,V)}${X}`;return`${q.slice(0,V)}${X}`}function AQ(q,X,V){if(y5(X,"offset"),q[X]===void 0||q[X+V]===void 0)C8(X,q.length-(V+1))}function CX(q,X,V,K,Q,Y){if(q>V||q3)if(X===0||X===BigInt(0))G=`>= 0${J} and < 2${J} ** ${(Y+1)*8}${J}`;else G=`>= -(2${J} ** ${(Y+1)*8-1}${J}) and < 2 ** ${(Y+1)*8-1}${J}`;else G=`>= ${X}${J} and <= ${V}${J}`;throw new cq("value",G,q)}AQ(K,Q,Y)}function y5(q,X){if(typeof q!=="number")throw new ZQ(X,"number",q)}function C8(q,X,V){if(Math.floor(q)!==q)throw y5(q,V),new cq(V||"offset","an integer",q);if(X<0)throw new GQ;throw new cq(V||"offset",`>= ${V?1:0} and <= ${X}`,q)}var NQ=/[^+/0-9A-Za-z-_]/g;function SQ(q){if(q=q.split("=")[0],q=q.trim().replace(NQ,""),q.length<2)return"";while(q.length%4!==0)q=q+"=";return q}function nq(q,X){X=X||1/0;let V,K=q.length,Q=null,Y=[];for(let J=0;J55295&&V<57344){if(!Q){if(V>56319){if((X-=3)>-1)Y.push(239,191,189);continue}else if(J+1===K){if((X-=3)>-1)Y.push(239,191,189);continue}Q=V;continue}if(V<56320){if((X-=3)>-1)Y.push(239,191,189);Q=V;continue}V=(Q-55296<<10|V-56320)+65536}else if(Q){if((X-=3)>-1)Y.push(239,191,189)}if(Q=null,V<128){if((X-=1)<0)break;Y.push(V)}else if(V<2048){if((X-=2)<0)break;Y.push(V>>6|192,V&63|128)}else if(V<65536){if((X-=3)<0)break;Y.push(V>>12|224,V>>6&63|128,V&63|128)}else if(V<1114112){if((X-=4)<0)break;Y.push(V>>18|240,V>>12&63|128,V>>6&63|128,V&63|128)}else throw Error("Invalid code point")}return Y}function yQ(q){let X=[];for(let V=0;V>8,Q=V%256,Y.push(Q),Y.push(K)}return Y}function hX(q){return KQ(SQ(q))}function C1(q,X,V,K){let Q;for(Q=0;Q=X.length||Q>=q.length)break;X[Q+V]=q[Q]}return Q}function h2(q,X){return q instanceof X||q!=null&&q.constructor!=null&&q.constructor.name!=null&&q.constructor.name===X.name}var CQ=function(){let q=Array(256);for(let X=0;X<16;++X){let V=X*16;for(let K=0;K<16;++K)q[V+K]="0123456789abcdef"[X]+"0123456789abcdef"[K]}return q}();function M6(q){return typeof BigInt>"u"?hQ:q}function hQ(){throw Error("BigInt not supported")}function oq(q){return()=>{throw Error(q+" is not implemented for node:buffer browser polyfill")}}var P3=oq("resolveObjectURL"),D3=oq("isUtf8");var u3=oq("transcode");var N3=$8(gX(),1);var UX={};qQ(UX,{waitForTick:()=>R2,values:()=>d5,utf8Encode:()=>mQ,utf16Encode:()=>E4,utf16Decode:()=>x8,typedArrayFor:()=>D8,translate:()=>c0,toUint8Array:()=>r6,toRadians:()=>O0,toHexStringOfMinLength:()=>D2,toHexString:()=>u2,toDegrees:()=>k1,toCodePoint:()=>K4,toCharCode:()=>s,sum:()=>z4,stroke:()=>B5,square:()=>lZ,sortedUniq:()=>U4,skewRadians:()=>k8,skewDegrees:()=>bZ,sizeInBytes:()=>P5,singleQuote:()=>t9,showText:()=>L1,setWordSpacing:()=>pZ,setTextRise:()=>nZ,setTextRenderingMode:()=>rZ,setTextMatrix:()=>FK,setStrokingRgbColor:()=>g7,setStrokingGrayscaleColor:()=>D7,setStrokingColor:()=>v5,setStrokingCmykColor:()=>b7,setLineWidth:()=>L5,setLineJoin:()=>fZ,setLineHeight:()=>F7,setLineCap:()=>I8,setGraphicsState:()=>i2,setFontAndSize:()=>T5,setFillingRgbColor:()=>u7,setFillingGrayscaleColor:()=>P7,setFillingColor:()=>E2,setFillingCmykColor:()=>x7,setDashPattern:()=>j5,setCharacterSqueeze:()=>dZ,setCharacterSpacing:()=>cZ,scale:()=>g6,rotateRectangle:()=>y7,rotateRadians:()=>x6,rotateInPlace:()=>j2,rotateDegrees:()=>M8,rotateAndSkewTextRadiansAndTranslate:()=>j8,rotateAndSkewTextDegreesAndTranslate:()=>iZ,rgb:()=>Y0,reverseArray:()=>I6,restoreDashPattern:()=>mZ,reduceRotation:()=>I2,rectanglesAreEqual:()=>n5,rectangle:()=>hK,range:()=>M4,radiansToDegrees:()=>CK,radians:()=>gZ,pushGraphicsState:()=>B0,popGraphicsState:()=>T0,pluckIndices:()=>k4,pdfDocEncodingDecode:()=>J1,parseDate:()=>P8,padStart:()=>e0,numberToString:()=>B4,normalizeAppearance:()=>G2,nextLine:()=>h7,newlineChars:()=>gQ,moveTo:()=>J2,moveText:()=>_Z,mergeUint8Arrays:()=>W4,mergeLines:()=>F1,mergeIntoTypedArray:()=>Z4,lowSurrogate:()=>u1,lineTo:()=>S0,lineSplit:()=>F8,layoutSinglelineText:()=>v8,layoutMultilineText:()=>uq,layoutCombedText:()=>KX,last:()=>n6,isWithinBMP:()=>j4,isType:()=>XK,isStandardFont:()=>e1,isNewlineChar:()=>Y4,highSurrogate:()=>D1,hasUtf16BOM:()=>b8,hasSurrogates:()=>L4,grayscale:()=>Sq,getType:()=>qK,findLastMatch:()=>F5,fillAndStroke:()=>j1,fill:()=>E1,escapedNewlineChars:()=>mX,escapeRegExp:()=>bX,error:()=>L6,endText:()=>T1,endPath:()=>wq,endMarkedContent:()=>Nq,encodeToBase64:()=>X4,drawTextLines:()=>Fq,drawTextField:()=>Pq,drawText:()=>eZ,drawSvgPath:()=>d7,drawRectangle:()=>b6,drawRadioButton:()=>T8,drawPage:()=>c7,drawOptionList:()=>n7,drawObject:()=>L8,drawLinesOfText:()=>_7,drawLine:()=>p7,drawImage:()=>w1,drawEllipsePath:()=>xK,drawEllipse:()=>O1,drawCheckMark:()=>bK,drawCheckBox:()=>B8,drawButton:()=>hq,degreesToRadians:()=>H6,degrees:()=>p,defaultTextFieldAppearanceProvider:()=>GX,defaultRadioGroupAppearanceProvider:()=>YX,defaultOptionListAppearanceProvider:()=>WX,defaultDropdownAppearanceProvider:()=>ZX,defaultCheckBoxAppearanceProvider:()=>QX,defaultButtonAppearanceProvider:()=>JX,decodePDFRawStream:()=>V8,decodeFromBase64DataUri:()=>V4,decodeFromBase64:()=>q4,createValueErrorMsg:()=>e9,createTypeErrorMsg:()=>VK,createPDFAcroFields:()=>Z8,createPDFAcroField:()=>kq,copyStringIntoBuffer:()=>k0,concatTransformationMatrix:()=>I1,componentsToColor:()=>l0,colorToComponents:()=>$q,cmyk:()=>yq,closePath:()=>N2,clipEvenOdd:()=>xZ,clip:()=>Oq,cleanText:()=>k6,charSplit:()=>J4,charFromHexCode:()=>Q4,charFromCode:()=>t0,charAtIndex:()=>P1,canBeConvertedToUint8Array:()=>I4,bytesFor:()=>j6,byAscendingId:()=>H4,breakTextIntoLines:()=>G4,beginText:()=>B1,beginMarkedContent:()=>Aq,backtick:()=>$0,assertRangeOrUndefined:()=>X2,assertRange:()=>b0,assertPositive:()=>X6,assertOrUndefined:()=>F,assertMultiple:()=>Y1,assertIsSubset:()=>V7,assertIsOneOfOrUndefined:()=>a0,assertIsOneOf:()=>M2,assertIs:()=>T,assertInteger:()=>K7,assertEachIs:()=>Q1,asPDFNumber:()=>f,asPDFName:()=>z8,asNumber:()=>t,arrayAsString:()=>u8,appendQuadraticCurve:()=>E8,appendBezierCurve:()=>p0,adjustDimsForRotation:()=>r2,addRandomSuffix:()=>uQ,ViewerPreferences:()=>W1,UnsupportedEncodingError:()=>Q7,UnrecognizedStreamTypeError:()=>J7,UnexpectedObjectTypeError:()=>A6,UnexpectedFieldTypeError:()=>z6,UnbalancedParenthesisError:()=>E7,TextRenderingMode:()=>C7,TextAlignment:()=>v0,StandardFonts:()=>N5,StandardFontValues:()=>o9,StandardFontEmbedder:()=>$6,StalledParserError:()=>j7,RotationTypes:()=>E5,RichTextFieldReadError:()=>e7,ReparseError:()=>Q5,RemovePageFromEmptyDocumentError:()=>o7,ReadingDirection:()=>U5,PrivateConstructorError:()=>K5,PrintScaling:()=>z5,PngEmbedder:()=>X8,ParseSpeeds:()=>A1,PageSizes:()=>HX,PageEmbeddingMismatchedContextError:()=>G7,PDFXRefStreamParser:()=>Lq,PDFWriter:()=>o5,PDFWidgetAnnotation:()=>M5,PDFTrailerDict:()=>Qq,PDFTrailer:()=>S6,PDFTextField:()=>A5,PDFString:()=>K0,PDFStreamWriter:()=>Jq,PDFStreamParsingError:()=>I7,PDFStream:()=>E0,PDFSignature:()=>O8,PDFRef:()=>a,PDFRawStream:()=>A2,PDFRadioGroup:()=>l6,PDFParsingError:()=>V6,PDFParser:()=>Bq,PDFPageTree:()=>H8,PDFPageLeaf:()=>_0,PDFPageEmbedder:()=>K8,PDFPage:()=>y0,PDFOptionList:()=>w5,PDFOperatorNames:()=>X0,PDFOperator:()=>e,PDFObjectStreamParser:()=>jq,PDFObjectStream:()=>a5,PDFObjectParsingError:()=>M7,PDFObjectParser:()=>U8,PDFObjectCopier:()=>Z1,PDFObject:()=>z0,PDFNumber:()=>x,PDFNull:()=>F0,PDFName:()=>I,PDFJavaScript:()=>xq,PDFInvalidObjectParsingError:()=>k7,PDFInvalidObject:()=>s5,PDFImage:()=>R5,PDFHexString:()=>g,PDFHeader:()=>_2,PDFForm:()=>gq,PDFFont:()=>w0,PDFFlateStream:()=>N6,PDFField:()=>d0,PDFEmbeddedPage:()=>R8,PDFDropdown:()=>O5,PDFDocument:()=>o0,PDFDict:()=>m,PDFCrossRefStream:()=>Yq,PDFCrossRefSection:()=>i5,PDFContext:()=>Z5,PDFContentStream:()=>p2,PDFCheckBox:()=>f6,PDFCatalog:()=>W8,PDFButton:()=>S5,PDFBool:()=>c2,PDFArrayIsNotRectangleError:()=>Z7,PDFArray:()=>i,PDFAnnotation:()=>Mq,PDFAcroText:()=>J6,PDFAcroTerminal:()=>K2,PDFAcroSignature:()=>F6,PDFAcroRadioButton:()=>Z6,PDFAcroPushButton:()=>G6,PDFAcroNonTerminal:()=>Y6,PDFAcroListBox:()=>W6,PDFAcroForm:()=>P6,PDFAcroField:()=>Y8,PDFAcroComboBox:()=>Q6,PDFAcroChoice:()=>G8,PDFAcroCheckBox:()=>K6,PDFAcroButton:()=>h6,NumberParsingError:()=>Vq,NonFullScreenPageMode:()=>H5,NoSuchFieldError:()=>s7,NextByteAssertionError:()=>z7,MultiSelectValueError:()=>W7,MissingTfOperatorError:()=>U7,MissingPageContentsEmbeddingError:()=>Y7,MissingPDFHeaderError:()=>L7,MissingOnValueCheckError:()=>X3,MissingKeywordError:()=>B7,MissingDAEntryError:()=>H7,MissingCatalogError:()=>qG,MethodNotImplementedError:()=>u0,LineJoinStyle:()=>$7,LineCapStyle:()=>u6,JpegEmbedder:()=>q8,InvalidTargetIndexError:()=>qq,InvalidPDFDateStringError:()=>G1,InvalidMaxLengthError:()=>VX,InvalidFieldNamePartError:()=>t7,InvalidAcroFieldValueError:()=>J5,IndexOutOfBoundsError:()=>Y5,ImageAlignment:()=>T2,ForeignPageError:()=>a7,FontkitNotRegisteredError:()=>i7,FileEmbedder:()=>Wq,FieldExistsAsNonTerminalError:()=>V3,FieldAlreadyExistsError:()=>Dq,ExceededMaxLengthError:()=>XX,EncryptedPDFError:()=>r7,Duplex:()=>Q8,CustomFontSubsetEmbedder:()=>Zq,CustomFontEmbedder:()=>C6,CorruptPageTreeError:()=>Xq,CombedTextLayoutError:()=>qX,ColorTypes:()=>U6,CharCodes:()=>E,Cache:()=>m0,BlendMode:()=>S2,AppearanceCharacteristics:()=>J8,AnnotationFlags:()=>I5,AcroTextFlags:()=>j0,AcroFieldFlags:()=>Y2,AcroChoiceFlags:()=>G0,AcroButtonFlags:()=>f0,AFRelationship:()=>t5});/*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any @@ -14,22 +14,22 @@ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */var eq=function(V,q){return eq=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(X,K){X.__proto__=K}||function(X,K){for(var Q in K)if(K.hasOwnProperty(Q))X[Q]=K[Q]},eq(V,q)};function A(V,q){eq(V,q);function X(){this.constructor=V}V.prototype=q===null?Object.create(q):(X.prototype=q.prototype,new X)}var o=function(){return o=Object.assign||function V(q){for(var X,K=1,Q=arguments.length;K0&&Y[Y.length-1]))&&(Z[0]===6||Z[0]===2)){X=0;continue}if(Z[0]===3&&(!Y||Z[1]>Y[0]&&Z[1]>2],q+=h8[(V[K]&3)<<4|V[K+1]>>4],q+=h8[(V[K+1]&15)<<2|V[K+2]>>6],q+=h8[V[K+2]&63];if(X%3===2)q=q.substring(0,q.length-1)+"=";else if(X%3===1)q=q.substring(0,q.length-2)+"==";return q},q4=function(V){var q=V.length*0.75,X=V.length,K,Q=0,Y,J,G,W;if(V[V.length-1]==="="){if(q--,V[V.length-2]==="=")q--}var Z=new Uint8Array(q);for(K=0;K>4,Z[Q++]=(J&15)<<4|G>>2,Z[Q++]=(G&3)<<6|W&63;return Z},yK=/^(data)?:?([\w\/\+]+)?;?(charset=[\w-]+|base64)?.*,/i,V4=function(V){var q=V.trim(),X=q.substring(0,100),K=X.match(yK);if(!K)return q4(q);var Q=K[0],Y=q.substring(Q.length);return q4(Y)};var s=function(V){return V.charCodeAt(0)},K4=function(V){return V.codePointAt(0)},D6=function(V,q){return e0(V.toString(16),q,"0").toUpperCase()},u6=function(V){return D6(V,2)},t0=function(V){return String.fromCharCode(V)},Q4=function(V){return t0(parseInt(V,16))},e0=function(V,q,X){var K="";for(var Q=0,Y=q-V.length;Q=55296&&X<=56319&&V.length>Q){if(K=V.charCodeAt(Q),K>=56320&&K<=57343)Y=2}return[V.slice(q,q+Y),Y]},J4=function(V){var q=[];for(var X=0,K=V.length;XX)Z();J+=z,G+=I}}return Z(),W},FK=/^D:(\d\d\d\d)(\d\d)?(\d\d)?(\d\d)?(\d\d)?(\d\d)?([+\-Z])?(\d\d)?'?(\d\d)?'?$/,P2=function(V){var q=V.match(FK);if(!q)return;var X=q[1],K=q[2],Q=K===void 0?"01":K,Y=q[3],J=Y===void 0?"01":Y,G=q[4],W=G===void 0?"00":G,Z=q[5],U=Z===void 0?"00":Z,H=q[6],z=H===void 0?"00":H,I=q[7],M=I===void 0?"Z":I,L=q[8],B=L===void 0?"00":L,j=q[9],O=j===void 0?"00":j,N=M==="Z"?"Z":""+M+B+":"+O,R=new Date(X+"-"+Q+"-"+J+"T"+W+":"+U+":"+z+N);return R},F8=function(V,q){var X,K=0,Q;while(K>6&31|192,G=Y&63|128;X.push(J,G),K+=1}else if(Y<65536){var J=Y>>12&15|224,G=Y>>6&63|128,W=Y&63|128;X.push(J,G,W),K+=1}else if(Y<1114112){var J=Y>>18&7|240,G=Y>>12&63|128,W=Y>>6&63|128,Z=Y>>0&63|128;X.push(J,G,W,Z),K+=2}else throw new Error("Invalid code point: 0x"+u6(Y))}return new Uint8Array(X)},E4=function(V,q){if(q===void 0)q=!0;var X=[];if(q)X.push(65279);for(var K=0,Q=V.length;K=0&&V<=65535},j4=function(V){return V>=65536&&V<=1114111},D1=function(V){return Math.floor((V-65536)/1024)+55296},u1=function(V){return(V-65536)%1024+56320},E5;(function(V){V.BigEndian="BigEndian",V.LittleEndian="LittleEndian"})(E5||(E5={}));var g2="�".codePointAt(0),x2=function(V,q){if(q===void 0)q=!0;if(V.length<=1)return String.fromCodePoint(g2);var X=q?uK(V):E5.BigEndian,K=q?2:0,Q=[];while(V.length-K>=2){var Y=lX(V[K++],V[K++],X);if(DK(Y))if(V.length-K<2)Q.push(g2);else{var J=lX(V[K++],V[K++],X);if(fX(J))Q.push(Y,J);else Q.push(g2)}else if(fX(Y))K+=2,Q.push(g2);else Q.push(Y)}if(K=55296&&V<=56319},fX=function(V){return V>=56320&&V<=57343},lX=function(V,q,X){if(X===E5.LittleEndian)return q<<8|V;if(X===E5.BigEndian)return V<<8|q;throw new Error("Invalid byteOrder: "+X)},uK=function(V){return _X(V)?E5.BigEndian:cX(V)?E5.LittleEndian:E5.BigEndian},_X=function(V){return V[0]===254&&V[1]===255},cX=function(V){return V[0]===255&&V[1]===254},b2=function(V){return _X(V)||cX(V)};var B4=function(V){var q=String(V);if(Math.abs(V)<1){var X=parseInt(V.toString().split("e-")[1]);if(X){var K=V<0;if(K)V*=-1;if(V*=Math.pow(10,X-1),q="0."+new Array(X).join("0")+V.toString().substring(2),K)q="-"+q}}else{var X=parseInt(V.toString().split("+")[1]);if(X>20)X-=20,V/=Math.pow(10,X),q=V.toString()+new Array(X+1).join("0")}return q},P8=function(V){return Math.ceil(V.toString(2).length/8)},L5=function(V){var q=new Uint8Array(P8(V));for(var X=1;X<=q.length;X++)q[X-1]=V>>(q.length-X)*8;return q};var j5=function(V){throw new Error(V)};var h9=$2(X1()),C9="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",V1=new Uint8Array(256);for(p8=0;p8>4,Z[Q++]=(J&15)<<4|G>>2,Z[Q++]=(G&3)<<6|W&63;return Z},$Y=function(V){var q="";for(var X=0;XK)throw new Error($0(q)+" must be at least "+X+" and at most "+K+", but was actually "+V)},X6=function(V,q,X,K){if(T(V,q,["number","undefined"]),typeof V==="number")b0(V,q,X,K)},Y1=function(V,q,X){if(T(V,q,["number"]),V%X!==0)throw new Error($0(q)+" must be a multiple of "+X+", but was actually "+V)},K7=function(V,q){if(!Number.isInteger(V))throw new Error($0(q)+" must be an integer, but was actually "+V)},X5=function(V,q){if(![1,0].includes(Math.sign(V)))throw new Error($0(q)+" must be a positive number or 0, but was actually "+V)};var V0=new Uint16Array(256);for(r8=0;r8<256;r8++)V0[r8]=r8;var r8;V0[22]=s("\x17");V0[24]=s("˘");V0[25]=s("ˇ");V0[26]=s("ˆ");V0[27]=s("˙");V0[28]=s("˝");V0[29]=s("˛");V0[30]=s("˚");V0[31]=s("˜");V0[127]=s("�");V0[128]=s("•");V0[129]=s("†");V0[130]=s("‡");V0[131]=s("…");V0[132]=s("—");V0[133]=s("–");V0[134]=s("ƒ");V0[135]=s("⁄");V0[136]=s("‹");V0[137]=s("›");V0[138]=s("−");V0[139]=s("‰");V0[140]=s("„");V0[141]=s("“");V0[142]=s("”");V0[143]=s("‘");V0[144]=s("’");V0[145]=s("‚");V0[146]=s("™");V0[147]=s("fi");V0[148]=s("fl");V0[149]=s("Ł");V0[150]=s("Œ");V0[151]=s("Š");V0[152]=s("Ÿ");V0[153]=s("Ž");V0[154]=s("ı");V0[155]=s("ł");V0[156]=s("œ");V0[157]=s("š");V0[158]=s("ž");V0[159]=s("�");V0[160]=s("€");V0[173]=s("�");var J1=function(V){var q=new Array(V.length);for(var X=0,K=V.length;X=E.ExclamationPoint&&V<=E.Tilde&&!Kq[V]},K3={},Q3=new Map,VJ=function(V){A(q,V);function q(X,K){var Q=this;if(X!==K3)throw new K8("PDFName");Q=V.call(this)||this;var Y="/";for(var J=0,G=K.length;J=E.Zero&&Z<=E.Nine||Z>=E.a&&Z<=E.f||Z>=E.A&&Z<=E.F){if(K+=W,K.length===2||!(U>="0"&&U<="9"||U>="a"&&U<="f"||U>="A"&&U<="F"))Y(parseInt(K,16)),K=""}else Y(Z)}return new Uint8Array(X)},q.prototype.decodeText=function(){var X=this.asBytes();return String.fromCharCode.apply(String,Array.from(X))},q.prototype.asString=function(){return this.encodedName},q.prototype.value=function(){return this.encodedName},q.prototype.clone=function(){return this},q.prototype.toString=function(){return this.encodedName},q.prototype.sizeInBytes=function(){return this.encodedName.length},q.prototype.copyBytesInto=function(X,K){return K+=I0(this.encodedName,X,K),this.encodedName.length},q.of=function(X){var K=qJ(X),Q=Q3.get(K);if(!Q)Q=new q(K3,K),Q3.set(K,Q);return Q},q.Length=q.of("Length"),q.FlateDecode=q.of("FlateDecode"),q.Resources=q.of("Resources"),q.Font=q.of("Font"),q.XObject=q.of("XObject"),q.ExtGState=q.of("ExtGState"),q.Contents=q.of("Contents"),q.Type=q.of("Type"),q.Parent=q.of("Parent"),q.MediaBox=q.of("MediaBox"),q.Page=q.of("Page"),q.Annots=q.of("Annots"),q.TrimBox=q.of("TrimBox"),q.ArtBox=q.of("ArtBox"),q.BleedBox=q.of("BleedBox"),q.CropBox=q.of("CropBox"),q.Rotate=q.of("Rotate"),q.Title=q.of("Title"),q.Author=q.of("Author"),q.Subject=q.of("Subject"),q.Creator=q.of("Creator"),q.Keywords=q.of("Keywords"),q.Producer=q.of("Producer"),q.CreationDate=q.of("CreationDate"),q.ModDate=q.of("ModDate"),q}(z0),k=VJ;var KJ=function(V){A(q,V);function q(){return V!==null&&V.apply(this,arguments)||this}return q.prototype.asNull=function(){return null},q.prototype.clone=function(){return this},q.prototype.toString=function(){return"null"},q.prototype.sizeInBytes=function(){return 4},q.prototype.copyBytesInto=function(X,K){return X[K++]=E.n,X[K++]=E.u,X[K++]=E.l,X[K++]=E.l,4},q}(z0),F0=new KJ;var QJ=function(V){A(q,V);function q(X,K){var Q=V.call(this)||this;return Q.dict=X,Q.context=K,Q}return q.prototype.keys=function(){return Array.from(this.dict.keys())},q.prototype.values=function(){return Array.from(this.dict.values())},q.prototype.entries=function(){return Array.from(this.dict.entries())},q.prototype.set=function(X,K){this.dict.set(X,K)},q.prototype.get=function(X,K){if(K===void 0)K=!1;var Q=this.dict.get(X);if(Q===F0&&!K)return;return Q},q.prototype.has=function(X){var K=this.dict.get(X);return K!==void 0&&K!==F0},q.prototype.lookupMaybe=function(X){var K,Q=[];for(var Y=1;Y0&&Y[Y.length-1]))&&(Z[0]===6||Z[0]===2)){V=0;continue}if(Z[0]===3&&(!Y||Z[1]>Y[0]&&Z[1]>2],X+=h5[(q[K]&3)<<4|q[K+1]>>4],X+=h5[(q[K+1]&15)<<2|q[K+2]>>6],X+=h5[q[K+2]&63];if(V%3===2)X=X.substring(0,X.length-1)+"=";else if(V%3===1)X=X.substring(0,X.length-2)+"==";return X},q4=function(q){var X=q.length*0.75,V=q.length,K,Q=0,Y,J,G,W;if(q[q.length-1]==="="){if(X--,q[q.length-2]==="=")X--}var Z=new Uint8Array(X);for(K=0;K>4,Z[Q++]=(J&15)<<4|G>>2,Z[Q++]=(G&3)<<6|W&63;return Z},DQ=/^(data)?:?([\w\/\+]+)?;?(charset=[\w-]+|base64)?.*,/i,V4=function(q){var X=q.trim(),V=X.substring(0,100),K=V.match(DQ);if(!K)return q4(X);var Q=K[0],Y=X.substring(Q.length);return q4(Y)};var s=function(q){return q.charCodeAt(0)},K4=function(q){return q.codePointAt(0)},D2=function(q,X){return e0(q.toString(16),X,"0").toUpperCase()},u2=function(q){return D2(q,2)},t0=function(q){return String.fromCharCode(q)},Q4=function(q){return t0(parseInt(q,16))},e0=function(q,X,V){var K="";for(var Q=0,Y=X-q.length;Q=55296&&V<=56319&&q.length>Q){if(K=q.charCodeAt(Q),K>=56320&&K<=57343)Y=2}return[q.slice(X,X+Y),Y]},J4=function(q){var X=[];for(var V=0,K=q.length;VV)Z();J+=z,G+=k}}return Z(),W},bQ=/^D:(\d\d\d\d)(\d\d)?(\d\d)?(\d\d)?(\d\d)?(\d\d)?([+\-Z])?(\d\d)?'?(\d\d)?'?$/,P8=function(q){var X=q.match(bQ);if(!X)return;var V=X[1],K=X[2],Q=K===void 0?"01":K,Y=X[3],J=Y===void 0?"01":Y,G=X[4],W=G===void 0?"00":G,Z=X[5],H=Z===void 0?"00":Z,U=X[6],z=U===void 0?"00":U,k=X[7],M=k===void 0?"Z":k,j=X[8],B=j===void 0?"00":j,L=X[9],O=L===void 0?"00":L,N=M==="Z"?"Z":""+M+B+":"+O,R=new Date(V+"-"+Q+"-"+J+"T"+W+":"+H+":"+z+N);return R},F5=function(q,X){var V,K=0,Q;while(K>6&31|192,G=Y&63|128;V.push(J,G),K+=1}else if(Y<65536){var J=Y>>12&15|224,G=Y>>6&63|128,W=Y&63|128;V.push(J,G,W),K+=1}else if(Y<1114112){var J=Y>>18&7|240,G=Y>>12&63|128,W=Y>>6&63|128,Z=Y>>0&63|128;V.push(J,G,W,Z),K+=2}else throw Error("Invalid code point: 0x"+u2(Y))}return new Uint8Array(V)},E4=function(q,X){if(X===void 0)X=!0;var V=[];if(X)V.push(65279);for(var K=0,Q=q.length;K=0&&q<=65535},L4=function(q){return q>=65536&&q<=1114111},D1=function(q){return Math.floor((q-65536)/1024)+55296},u1=function(q){return(q-65536)%1024+56320},E6;(function(q){q.BigEndian="BigEndian",q.LittleEndian="LittleEndian"})(E6||(E6={}));var g8="�".codePointAt(0),x8=function(q,X){if(X===void 0)X=!0;if(q.length<=1)return String.fromCodePoint(g8);var V=X?lQ(q):E6.BigEndian,K=X?2:0,Q=[];while(q.length-K>=2){var Y=lX(q[K++],q[K++],V);if(fQ(Y))if(q.length-K<2)Q.push(g8);else{var J=lX(q[K++],q[K++],V);if(fX(J))Q.push(Y,J);else Q.push(g8)}else if(fX(Y))K+=2,Q.push(g8);else Q.push(Y)}if(K=55296&&q<=56319},fX=function(q){return q>=56320&&q<=57343},lX=function(q,X,V){if(V===E6.LittleEndian)return X<<8|q;if(V===E6.BigEndian)return q<<8|X;throw Error("Invalid byteOrder: "+V)},lQ=function(q){return _X(q)?E6.BigEndian:cX(q)?E6.LittleEndian:E6.BigEndian},_X=function(q){return q[0]===254&&q[1]===255},cX=function(q){return q[0]===255&&q[1]===254},b8=function(q){return _X(q)||cX(q)};var B4=function(q){var X=String(q);if(Math.abs(q)<1){var V=parseInt(q.toString().split("e-")[1]);if(V){var K=q<0;if(K)q*=-1;if(q*=Math.pow(10,V-1),X="0."+Array(V).join("0")+q.toString().substring(2),K)X="-"+X}}else{var V=parseInt(q.toString().split("+")[1]);if(V>20)V-=20,q/=Math.pow(10,V),X=q.toString()+Array(V+1).join("0")}return X},P5=function(q){return Math.ceil(q.toString(2).length/8)},j6=function(q){var X=new Uint8Array(P5(q));for(var V=1;V<=X.length;V++)X[V-1]=q>>(X.length-V)*8;return X};var L6=function(q){throw Error(q)};var h9=$8(X1(),1),C9="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",V1=new Uint8Array(256);for(p5=0;p5>4,Z[Q++]=(J&15)<<4|G>>2,Z[Q++]=(G&3)<<6|W&63;return Z},uJ=function(q){var X="";for(var V=0;VK)throw Error($0(X)+" must be at least "+V+" and at most "+K+", but was actually "+q)},X2=function(q,X,V,K){if(T(q,X,["number","undefined"]),typeof q==="number")b0(q,X,V,K)},Y1=function(q,X,V){if(T(q,X,["number"]),q%V!==0)throw Error($0(X)+" must be a multiple of "+V+", but was actually "+q)},K7=function(q,X){if(!Number.isInteger(q))throw Error($0(X)+" must be an integer, but was actually "+q)},X6=function(q,X){if(![1,0].includes(Math.sign(q)))throw Error($0(X)+" must be a positive number or 0, but was actually "+q)};var V0=new Uint16Array(256);for(r5=0;r5<256;r5++)V0[r5]=r5;var r5;V0[22]=s("\x17");V0[24]=s("˘");V0[25]=s("ˇ");V0[26]=s("ˆ");V0[27]=s("˙");V0[28]=s("˝");V0[29]=s("˛");V0[30]=s("˚");V0[31]=s("˜");V0[127]=s("�");V0[128]=s("•");V0[129]=s("†");V0[130]=s("‡");V0[131]=s("…");V0[132]=s("—");V0[133]=s("–");V0[134]=s("ƒ");V0[135]=s("⁄");V0[136]=s("‹");V0[137]=s("›");V0[138]=s("−");V0[139]=s("‰");V0[140]=s("„");V0[141]=s("“");V0[142]=s("”");V0[143]=s("‘");V0[144]=s("’");V0[145]=s("‚");V0[146]=s("™");V0[147]=s("fi");V0[148]=s("fl");V0[149]=s("Ł");V0[150]=s("Œ");V0[151]=s("Š");V0[152]=s("Ÿ");V0[153]=s("Ž");V0[154]=s("ı");V0[155]=s("ł");V0[156]=s("œ");V0[157]=s("š");V0[158]=s("ž");V0[159]=s("�");V0[160]=s("€");V0[173]=s("�");var J1=function(q){var X=Array(q.length);for(var V=0,K=q.length;V=E.ExclamationPoint&&q<=E.Tilde&&!Kq[q]},KK={},QK=new Map,ZG=function(q){A(X,q);function X(V,K){var Q=this;if(V!==KK)throw new K5("PDFName");Q=q.call(this)||this;var Y="/";for(var J=0,G=K.length;J=E.Zero&&Z<=E.Nine||Z>=E.a&&Z<=E.f||Z>=E.A&&Z<=E.F){if(K+=W,K.length===2||!(H>="0"&&H<="9"||H>="a"&&H<="f"||H>="A"&&H<="F"))Y(parseInt(K,16)),K=""}else Y(Z)}return new Uint8Array(V)},X.prototype.decodeText=function(){var V=this.asBytes();return String.fromCharCode.apply(String,Array.from(V))},X.prototype.asString=function(){return this.encodedName},X.prototype.value=function(){return this.encodedName},X.prototype.clone=function(){return this},X.prototype.toString=function(){return this.encodedName},X.prototype.sizeInBytes=function(){return this.encodedName.length},X.prototype.copyBytesInto=function(V,K){return K+=k0(this.encodedName,V,K),this.encodedName.length},X.of=function(V){var K=JG(V),Q=QK.get(K);if(!Q)Q=new X(KK,K),QK.set(K,Q);return Q},X.Length=X.of("Length"),X.FlateDecode=X.of("FlateDecode"),X.Resources=X.of("Resources"),X.Font=X.of("Font"),X.XObject=X.of("XObject"),X.ExtGState=X.of("ExtGState"),X.Contents=X.of("Contents"),X.Type=X.of("Type"),X.Parent=X.of("Parent"),X.MediaBox=X.of("MediaBox"),X.Page=X.of("Page"),X.Annots=X.of("Annots"),X.TrimBox=X.of("TrimBox"),X.ArtBox=X.of("ArtBox"),X.BleedBox=X.of("BleedBox"),X.CropBox=X.of("CropBox"),X.Rotate=X.of("Rotate"),X.Title=X.of("Title"),X.Author=X.of("Author"),X.Subject=X.of("Subject"),X.Creator=X.of("Creator"),X.Keywords=X.of("Keywords"),X.Producer=X.of("Producer"),X.CreationDate=X.of("CreationDate"),X.ModDate=X.of("ModDate"),X}(z0),I=ZG;var WG=function(q){A(X,q);function X(){return q!==null&&q.apply(this,arguments)||this}return X.prototype.asNull=function(){return null},X.prototype.clone=function(){return this},X.prototype.toString=function(){return"null"},X.prototype.sizeInBytes=function(){return 4},X.prototype.copyBytesInto=function(V,K){return V[K++]=E.n,V[K++]=E.u,V[K++]=E.l,V[K++]=E.l,4},X}(z0),F0=new WG;var HG=function(q){A(X,q);function X(V,K){var Q=q.call(this)||this;return Q.dict=V,Q.context=K,Q}return X.prototype.keys=function(){return Array.from(this.dict.keys())},X.prototype.values=function(){return Array.from(this.dict.values())},X.prototype.entries=function(){return Array.from(this.dict.entries())},X.prototype.set=function(V,K){this.dict.set(V,K)},X.prototype.get=function(V,K){if(K===void 0)K=!1;var Q=this.dict.get(V);if(Q===F0&&!K)return;return Q},X.prototype.has=function(V){var K=this.dict.get(V);return K!==void 0&&K!==F0},X.prototype.lookupMaybe=function(V){var K,Q=[];for(var Y=1;Ythis.largestObjectNumber)this.largestObjectNumber=q.objectNumber},V.prototype.nextRef=function(){return this.largestObjectNumber+=1,a.of(this.largestObjectNumber)},V.prototype.register=function(q){var X=this.nextRef();return this.assign(X,q),X},V.prototype.delete=function(q){return this.indirectObjects.delete(q)},V.prototype.lookupMaybe=function(q){var X=[];for(var K=1;K1)this.subsections.push([q]),this.chunkIdx+=1,this.chunkLength=1;else X.push(q),this.chunkLength+=1},V.create=function(){return new V({ref:a.of(0,65535),offset:0,deleted:!0})},V.createEmpty=function(){return new V},V}(),i8=kJ;var EJ=function(){function V(q){this.lastXRefOffset=String(q)}return V.prototype.toString=function(){return`startxref +`,V+=this.getContentsString(),V+=` +endstream`,V},X.prototype.copyBytesInto=function(V,K){this.updateDict();var Q=K;K+=this.dict.copyBytesInto(V,K),V[K++]=E.Newline,V[K++]=E.s,V[K++]=E.t,V[K++]=E.r,V[K++]=E.e,V[K++]=E.a,V[K++]=E.m,V[K++]=E.Newline;var Y=this.getContents();for(var J=0,G=Y.length;Jthis.largestObjectNumber)this.largestObjectNumber=X.objectNumber},q.prototype.nextRef=function(){return this.largestObjectNumber+=1,a.of(this.largestObjectNumber)},q.prototype.register=function(X){var V=this.nextRef();return this.assign(V,X),V},q.prototype.delete=function(X){return this.indirectObjects.delete(X)},q.prototype.lookupMaybe=function(X){var V=[];for(var K=1;K1)this.subsections.push([X]),this.chunkIdx+=1,this.chunkLength=1;else V.push(X),this.chunkLength+=1},q.create=function(){return new q({ref:a.of(0,65535),offset:0,deleted:!0})},q.createEmpty=function(){return new q},q}(),i5=vG;var RG=function(){function q(X){this.lastXRefOffset=String(X)}return q.prototype.toString=function(){return`startxref `+this.lastXRefOffset+` -%%EOF`},V.prototype.sizeInBytes=function(){return 16+this.lastXRefOffset.length},V.prototype.copyBytesInto=function(q,X){var K=X;return q[X++]=E.s,q[X++]=E.t,q[X++]=E.a,q[X++]=E.r,q[X++]=E.t,q[X++]=E.x,q[X++]=E.r,q[X++]=E.e,q[X++]=E.f,q[X++]=E.Newline,X+=I0(this.lastXRefOffset,q,X),q[X++]=E.Newline,q[X++]=E.Percent,q[X++]=E.Percent,q[X++]=E.E,q[X++]=E.O,q[X++]=E.F,X-K},V.forLastCrossRefSectionOffset=function(q){return new V(q)},V}(),S5=EJ;var LJ=function(){function V(q){this.dict=q}return V.prototype.toString=function(){return`trailer -`+this.dict.toString()},V.prototype.sizeInBytes=function(){return 8+this.dict.sizeInBytes()},V.prototype.copyBytesInto=function(q,X){var K=X;return q[X++]=E.t,q[X++]=E.r,q[X++]=E.a,q[X++]=E.i,q[X++]=E.l,q[X++]=E.e,q[X++]=E.r,q[X++]=E.Newline,X+=this.dict.copyBytesInto(q,X),X-K},V.of=function(q){return new V(q)},V}(),Qq=LJ;var jJ=function(V){A(q,V);function q(X,K,Q){if(Q===void 0)Q=!0;var Y=V.call(this,X.obj({}),Q)||this;return Y.objects=K,Y.offsets=Y.computeObjectOffsets(),Y.offsetsString=Y.computeOffsetsString(),Y.dict.set(k.of("Type"),k.of("ObjStm")),Y.dict.set(k.of("N"),x.of(Y.objects.length)),Y.dict.set(k.of("First"),x.of(Y.offsetsString.length)),Y}return q.prototype.getObjectsCount=function(){return this.objects.length},q.prototype.clone=function(X){return q.withContextAndObjects(X||this.dict.context,this.objects.slice(),this.encode)},q.prototype.getContentsString=function(){var X=this.offsetsString;for(var K=0,Q=this.objects.length;K1)J.push(G),J.push(U.ref.objectNumber),G=0;G+=1}return J.push(G),J},Y.computeEntryTuples=function(){var J=new Array(Y.entries.length);for(var G=0,W=Y.entries.length;GG[0])G[0]=M;if(L>G[1])G[1]=L;if(B>G[2])G[2]=B}return G},Y.entries=K||[],Y.entryTuplesCache=m0.populatedBy(Y.computeEntryTuples),Y.maxByteWidthsCache=m0.populatedBy(Y.computeMaxEntryByteWidths),Y.indexCache=m0.populatedBy(Y.computeIndex),X.set(k.of("Type"),k.of("XRef")),Y}return q.prototype.addDeletedEntry=function(X,K){var Q=y5.Deleted;this.entries.push({type:Q,ref:X,nextFreeObjectNumber:K}),this.entryTuplesCache.invalidate(),this.maxByteWidthsCache.invalidate(),this.indexCache.invalidate(),this.contentsCache.invalidate()},q.prototype.addUncompressedEntry=function(X,K){var Q=y5.Uncompressed;this.entries.push({type:Q,ref:X,offset:K}),this.entryTuplesCache.invalidate(),this.maxByteWidthsCache.invalidate(),this.indexCache.invalidate(),this.contentsCache.invalidate()},q.prototype.addCompressedEntry=function(X,K,Q){var Y=y5.Compressed;this.entries.push({type:Y,ref:X,objectStreamRef:K,index:Q}),this.entryTuplesCache.invalidate(),this.maxByteWidthsCache.invalidate(),this.indexCache.invalidate(),this.contentsCache.invalidate()},q.prototype.clone=function(X){var K=this,Q=K.dict,Y=K.entries,J=K.encode;return q.of(Q.clone(X),Y.slice(),J)},q.prototype.getContentsString=function(){var X=this.entryTuplesCache.access(),K=this.maxByteWidthsCache.access(),Q="";for(var Y=0,J=X.length;Y=0;M--)Q+=(H[M]||0).toString(2);for(var M=K[1]-1;M>=0;M--)Q+=(z[M]||0).toString(2);for(var M=K[2]-1;M>=0;M--)Q+=(I[M]||0).toString(2)}return Q},q.prototype.getUnencodedContents=function(){var X=this.entryTuplesCache.access(),K=this.maxByteWidthsCache.access(),Q=new Uint8Array(this.getUnencodedContentsSize()),Y=0;for(var J=0,G=X.length;J=0;L--)Q[Y++]=z[L]||0;for(var L=K[1]-1;L>=0;L--)Q[Y++]=I[L]||0;for(var L=K[2]-1;L>=0;L--)Q[Y++]=M[L]||0}return Q},q.prototype.getUnencodedContentsSize=function(){var X=this.maxByteWidthsCache.access(),K=z4(X);return K*this.entries.length},q.prototype.updateDict=function(){V.prototype.updateDict.call(this);var X=this.maxByteWidthsCache.access(),K=this.indexCache.access(),Q=this.dict.context;this.dict.set(k.of("W"),Q.obj(X)),this.dict.set(k.of("Index"),Q.obj(K))},q.create=function(X,K){if(K===void 0)K=!0;var Q=new q(X,[],K);return Q.addDeletedEntry(a.of(0,65535),0),Q},q.of=function(X,K,Q){if(Q===void 0)Q=!0;return new q(X,K,Q)},q}(N5),Yq=vJ;var RJ=function(V){A(q,V);function q(X,K,Q,Y){var J=V.call(this,X,K)||this;return J.encodeStreams=Q,J.objectsPerStream=Y,J}return q.prototype.computeBufferSize=function(){return _(this,void 0,void 0,function(){var X,K,Q,Y,J,G,W,Z,M,L,U,j,H,z,B,I,M,L,B,j,O,N,R,v;return c(this,function(w){switch(w.label){case 0:X=this.context.largestObjectNumber+1,K=_6.forVersion(1,7),Q=K.sizeInBytes()+2,Y=Yq.create(this.createTrailerDict(),this.encodeStreams),J=[],G=[],W=[],Z=this.context.enumerateIndirectObjects(),M=0,L=Z.length,w.label=1;case 1:if(!(M"},q.prototype.sizeInBytes=function(){return this.value.length+2},q.prototype.copyBytesInto=function(X,K){return X[K++]=E.LessThan,K+=I0(this.value,X,K),X[K++]=E.GreaterThan,this.value.length+2},q.of=function(X){return new q(X)},q.fromText=function(X){var K=E4(X),Q="";for(var Y=0,J=K.length;Y1)J.push(G),J.push(H.ref.objectNumber),G=0;G+=1}return J.push(G),J},Y.computeEntryTuples=function(){var J=Array(Y.entries.length);for(var G=0,W=Y.entries.length;GG[0])G[0]=M;if(j>G[1])G[1]=j;if(B>G[2])G[2]=B}return G},Y.entries=K||[],Y.entryTuplesCache=m0.populatedBy(Y.computeEntryTuples),Y.maxByteWidthsCache=m0.populatedBy(Y.computeMaxEntryByteWidths),Y.indexCache=m0.populatedBy(Y.computeIndex),V.set(I.of("Type"),I.of("XRef")),Y}return X.prototype.addDeletedEntry=function(V,K){var Q=y6.Deleted;this.entries.push({type:Q,ref:V,nextFreeObjectNumber:K}),this.entryTuplesCache.invalidate(),this.maxByteWidthsCache.invalidate(),this.indexCache.invalidate(),this.contentsCache.invalidate()},X.prototype.addUncompressedEntry=function(V,K){var Q=y6.Uncompressed;this.entries.push({type:Q,ref:V,offset:K}),this.entryTuplesCache.invalidate(),this.maxByteWidthsCache.invalidate(),this.indexCache.invalidate(),this.contentsCache.invalidate()},X.prototype.addCompressedEntry=function(V,K,Q){var Y=y6.Compressed;this.entries.push({type:Y,ref:V,objectStreamRef:K,index:Q}),this.entryTuplesCache.invalidate(),this.maxByteWidthsCache.invalidate(),this.indexCache.invalidate(),this.contentsCache.invalidate()},X.prototype.clone=function(V){var K=this,Q=K.dict,Y=K.entries,J=K.encode;return X.of(Q.clone(V),Y.slice(),J)},X.prototype.getContentsString=function(){var V=this.entryTuplesCache.access(),K=this.maxByteWidthsCache.access(),Q="";for(var Y=0,J=V.length;Y=0;M--)Q+=(U[M]||0).toString(2);for(var M=K[1]-1;M>=0;M--)Q+=(z[M]||0).toString(2);for(var M=K[2]-1;M>=0;M--)Q+=(k[M]||0).toString(2)}return Q},X.prototype.getUnencodedContents=function(){var V=this.entryTuplesCache.access(),K=this.maxByteWidthsCache.access(),Q=new Uint8Array(this.getUnencodedContentsSize()),Y=0;for(var J=0,G=V.length;J=0;j--)Q[Y++]=z[j]||0;for(var j=K[1]-1;j>=0;j--)Q[Y++]=k[j]||0;for(var j=K[2]-1;j>=0;j--)Q[Y++]=M[j]||0}return Q},X.prototype.getUnencodedContentsSize=function(){var V=this.maxByteWidthsCache.access(),K=z4(V);return K*this.entries.length},X.prototype.updateDict=function(){q.prototype.updateDict.call(this);var V=this.maxByteWidthsCache.access(),K=this.indexCache.access(),Q=this.dict.context;this.dict.set(I.of("W"),Q.obj(V)),this.dict.set(I.of("Index"),Q.obj(K))},X.create=function(V,K){if(K===void 0)K=!0;var Q=new X(V,[],K);return Q.addDeletedEntry(a.of(0,65535),0),Q},X.of=function(V,K,Q){if(Q===void 0)Q=!0;return new X(V,K,Q)},X}(N6),Yq=SG;var yG=function(q){A(X,q);function X(V,K,Q,Y){var J=q.call(this,V,K)||this;return J.encodeStreams=Q,J.objectsPerStream=Y,J}return X.prototype.computeBufferSize=function(){return _(this,void 0,void 0,function(){var V,K,Q,Y,J,G,W,Z,M,j,H,L,U,z,B,k,M,j,B,L,O,N,R,v;return c(this,function(w){switch(w.label){case 0:V=this.context.largestObjectNumber+1,K=_2.forVersion(1,7),Q=K.sizeInBytes()+2,Y=Yq.create(this.createTrailerDict(),this.encodeStreams),J=[],G=[],W=[],Z=this.context.enumerateIndirectObjects(),M=0,j=Z.length,w.label=1;case 1:if(!(M"},X.prototype.sizeInBytes=function(){return this.value.length+2},X.prototype.copyBytesInto=function(V,K){return V[K++]=E.LessThan,K+=k0(this.value,V,K),V[K++]=E.GreaterThan,this.value.length+2},X.of=function(V){return new X(V)},X.fromText=function(V){var K=E4(V),Q="";for(var Y=0,J=K.length;Y endcodespacerange -`+V.length+` beginbfchar -`+V.map(function(q){var X=q[0],K=q[1];return X+" "+K}).join(` +`+q.length+` beginbfchar +`+q.map(function(X){var V=X[0],K=X[1];return V+" "+K}).join(` `)+` endbfchar endcmap CMapName currentdict /CMap defineresource pop end -end`},U3=function(){var V=[];for(var q=0;q"},Gq=function(V){return D6(V,4)},NJ=function(V){if(L4(V))return Gq(V);if(j4(V)){var q=D1(V),X=u1(V);return""+Gq(q)+Gq(X)}var K=u6(V),Q="0x"+K+" is not a valid UTF-8 or UTF-16 codepoint.";throw new Error(Q)};var SJ=function(V){var q=0,X=function(K){q|=1<=E.Zero&&Z<=E.Seven){if(K+=W,K.length===3||!(U>="0"&&U<="7"))Y(parseInt(K,8)),K=""}else Y(Z)}return new Uint8Array(X)},q.prototype.decodeText=function(){var X=this.asBytes();if(b2(X))return x2(X);return J1(X)},q.prototype.decodeDate=function(){var X=this.decodeText(),K=P2(X);if(!K)throw new G1(X);return K},q.prototype.asString=function(){return this.value},q.prototype.clone=function(){return q.of(this.value)},q.prototype.toString=function(){return"("+this.value+")"},q.prototype.sizeInBytes=function(){return this.value.length+2},q.prototype.copyBytesInto=function(X,K){return X[K++]=E.LeftParen,K+=I0(this.value,X,K),X[K++]=E.RightParen,this.value.length+2},q.of=function(X){return new q(X)},q.fromDate=function(X){var K=e0(String(X.getUTCFullYear()),4,"0"),Q=e0(String(X.getUTCMonth()+1),2,"0"),Y=e0(String(X.getUTCDate()),2,"0"),J=e0(String(X.getUTCHours()),2,"0"),G=e0(String(X.getUTCMinutes()),2,"0"),W=e0(String(X.getUTCSeconds()),2,"0");return new q("D:"+K+Q+Y+J+G+W+"Z")},q}(z0),K0=yJ;var $J=function(){function V(q,X,K,Q){var Y=this;this.allGlyphsInFontSortedById=function(){var J=new Array(Y.font.characterSet.length);for(var G=0,W=J.length;G>3)]>>7-((M&7)<<0)&1,D=3*C;G[R]=v[D],G[R+1]=v[D+1],G[R+2]=v[D+2],G[R+3]=C<$?w[C]:255}}if(U==2)for(var S=0;S>2)]>>6-((M&3)<<1)&3,D=3*C;G[R]=v[D],G[R+1]=v[D+1],G[R+2]=v[D+2],G[R+3]=C<$?w[C]:255}}if(U==4)for(var S=0;S>1)]>>4-((M&1)<<2)&15,D=3*C;G[R]=v[D],G[R+1]=v[D+1],G[R+2]=v[D+2],G[R+3]=C<$?w[C]:255}}if(U==8)for(var M=0;M>>3)]>>>7-(r&7)&1),k0=u==j*255?0:255;W[J0+r]=k0<<24|u<<16|u<<8|u}else if(U==2)for(var r=0;r>>2)]>>>6-((r&3)<<1)&3),k0=u==j*85?0:255;W[J0+r]=k0<<24|u<<16|u<<8|u}else if(U==4)for(var r=0;r>>1)]>>>4-((r&1)<<2)&15),k0=u==j*17?0:255;W[J0+r]=k0<<24|u<<16|u<<8|u}else if(U==8)for(var r=0;r>>2<<3);while(Q==0){if(Q=B(q,z,1),Y=B(q,z+1,2),z+=3,Y==0){if((z&7)!=0)z+=8-(z&7);var S=(z>>>3)+4,h=q[S-4]|q[S-3]<<8;if($)X=V.H.W(X,H+h);X.set(new K(q.buffer,q.byteOffset+S,h),H),z=S+h<<3,H+=h;continue}if($)X=V.H.W(X,H+131072);if(Y==1)I=w.J,M=w.h,Z=511,U=31;if(Y==2){J=j(q,z,5)+257,G=j(q,z+5,5)+1,W=j(q,z+10,4)+4,z+=14;var b=z,C=1;for(var D=0;D<38;D+=2)w.Q[D]=0,w.Q[D+1]=0;for(var D=0;DC)C=l}z+=3*W,N(w.Q,C),R(w.Q,C,w.u),I=w.w,M=w.d,z=O(w.u,(1<>>4;if(r>>>8==0)X[H++]=r;else if(r==256)break;else{var k0=H+r-254;if(r>264){var n0=w.q[r-257];k0=H+(n0>>>3)+j(q,z,n0&7),z+=n0&7}var N2=M[v(q,z)&U];z+=N2&15;var S2=N2>>>4,y6=w.c[S2],Z6=(y6>>>4)+B(q,z,y6&15);z+=y6&15;while(H>>4;if(H<=15)J[Z]=H,Z++;else{var z=0,I=0;if(H==16)I=3+G(Q,Y,2),Y+=2,z=J[Z-1];else if(H==17)I=3+G(Q,Y,3),Y+=3;else if(H==18)I=11+G(Q,Y,7),Y+=7;var M=Z+I;while(Z>>1;while(JY)Y=W;J++}while(J>1,Z=q[G+1],U=W<<4|Z,H=X-Z,z=q[G]<>>15-X;K[M]=U,z++}}},V.H.l=function(q,X){var K=V.H.m.r,Q=15-X;for(var Y=0;Y>>Q}},V.H.M=function(q,X,K){K=K<<(X&7);var Q=X>>>3;q[Q]|=K,q[Q+1]|=K>>>8},V.H.I=function(q,X,K){K=K<<(X&7);var Q=X>>>3;q[Q]|=K,q[Q+1]|=K>>>8,q[Q+2]|=K>>>16},V.H.e=function(q,X,K){return(q[X>>>3]|q[(X>>>3)+1]<<8)>>>(X&7)&(1<>>3]|q[(X>>>3)+1]<<8|q[(X>>>3)+2]<<16)>>>(X&7)&(1<>>3]|q[(X>>>3)+1]<<8|q[(X>>>3)+2]<<16)>>>(X&7)},V.H.i=function(q,X){return(q[X>>>3]|q[(X>>>3)+1]<<8|q[(X>>>3)+2]<<16|q[(X>>>3)+3]<<24)>>>(X&7)},V.H.m=function(){var q=Uint16Array,X=Uint32Array;return{K:new q(16),j:new q(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[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,0,0,0],q:new q(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[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,0,0],c:new X(32),J:new q(512),_:[],h:new q(32),$:[],w:new q(32768),C:[],v:[],d:new q(32768),D:[],u:new q(512),Q:[],r:new q(32768),s:new X(286),Y:new X(30),a:new X(19),t:new X(15000),k:new q(65536),g:new q(32768)}}(),function(){var q=V.H.m,X=32768;for(var K=0;K>>1|(Q&1431655765)<<1,Q=(Q&3435973836)>>>2|(Q&858993459)<<2,Q=(Q&4042322160)>>>4|(Q&252645135)<<4,Q=(Q&4278255360)>>>8|(Q&16711935)<<8,q.r[K]=(Q>>>16|Q<<16)>>>17}function Y(J,G,W){while(G--!=0)J.push(0,W)}for(var K=0;K<32;K++)q.q[K]=q.S[K]<<3|q.T[K],q.c[K]=q.p[K]<<4|q.z[K];Y(q._,144,8),Y(q._,112,9),Y(q._,24,7),Y(q._,8,8),V.H.n(q._,9),V.H.A(q._,9,q.J),V.H.l(q._,9),Y(q.$,32,5),V.H.n(q.$,5),V.H.A(q.$,5,q.h),V.H.l(q.$,5),Y(q.Q,19,0),Y(q.C,286,0),Y(q.D,30,0),Y(q.v,320,0)}(),V.H.N}();P.decode._readInterlace=function(V,q){var{width:X,height:K}=q,Q=P.decode._getBPP(q),Y=Q>>3,J=Math.ceil(X*Q/8),G=new Uint8Array(K*J),W=0,Z=[0,0,4,0,2,0,1],U=[0,4,0,2,0,1,0],H=[8,8,8,4,4,2,2],z=[8,8,4,4,2,2,1],I=0;while(I<7){var M=H[I],L=z[I],B=0,j=0,O=Z[I];while(O>3];h=h>>7-(S&7)&1,G[w*J+($>>3)]|=h<<7-(($&7)<<0)}if(Q==2){var h=V[S>>3];h=h>>6-(S&7)&3,G[w*J+($>>2)]|=h<<6-(($&3)<<1)}if(Q==4){var h=V[S>>3];h=h>>4-(S&7)&15,G[w*J+($>>1)]|=h<<4-(($&1)<<2)}if(Q>=8){var b=w*J+$*Y;for(var C=0;C>3)+C]}S+=Q,$+=L}v++,w+=M}if(B*j!=0)W+=j*(1+R);I=I+1}return G};P.decode._getBPP=function(V){var q=[1,null,3,1,2,null,4][V.ctype];return q*V.depth};P.decode._filterZero=function(V,q,X,K,Q){var Y=P.decode._getBPP(q),J=Math.ceil(K*Y/8),G=P.decode._paeth;Y=Math.ceil(Y/8);var W=0,Z=1,U=V[X],H=0;if(U>1)V[X]=[0,0,1][U-2];if(U==3)for(H=Y;H>>1)&255;for(var z=0;z>>1);for(;H>>1)}else{for(;H>8&255,V[q+1]=X&255},readUint:function(V,q){return V[q]*16777216+(V[q+1]<<16|V[q+2]<<8|V[q+3])},writeUint:function(V,q,X){V[q]=X>>24&255,V[q+1]=X>>16&255,V[q+2]=X>>8&255,V[q+3]=X&255},readASCII:function(V,q,X){var K="";for(var Q=0;Q=0&&G>=0)H=I*q+M<<2,z=(G+I)*Q+J+M<<2;else H=(-G+I)*q-J+M<<2,z=I*Q+M<<2;if(W==0)K[z]=V[H],K[z+1]=V[H+1],K[z+2]=V[H+2],K[z+3]=V[H+3];else if(W==1){var L=V[H+3]*0.00392156862745098,B=V[H]*L,j=V[H+1]*L,O=V[H+2]*L,N=K[z+3]*0.00392156862745098,R=K[z]*N,v=K[z+1]*N,w=K[z+2]*N,$=1-L,S=L+N*$,h=S==0?0:1/S;K[z+3]=255*S,K[z+0]=(B+R*$)*h,K[z+1]=(j+v*$)*h,K[z+2]=(O+w*$)*h}else if(W==2){var L=V[H+3],B=V[H],j=V[H+1],O=V[H+2],N=K[z+3],R=K[z],v=K[z+1],w=K[z+2];if(L==N&&B==R&&j==v&&O==w)K[z]=0,K[z+1]=0,K[z+2]=0,K[z+3]=0;else K[z]=B,K[z+1]=j,K[z+2]=O,K[z+3]=L}else if(W==3){var L=V[H+3],B=V[H],j=V[H+1],O=V[H+2],N=K[z+3],R=K[z],v=K[z+1],w=K[z+2];if(L==N&&B==R&&j==v&&O==w)continue;if(L<220&&N>20)return!1}}return!0};P.encode=function(V,q,X,K,Q,Y,J){if(K==null)K=0;if(J==null)J=!1;var G=P.encode.compress(V,q,X,K,[!1,!1,!1,0,J]);return P.encode.compressPNG(G,-1),P.encode._main(G,q,X,Q,Y)};P.encodeLL=function(V,q,X,K,Q,Y,J,G){var W={ctype:0+(K==1?0:2)+(Q==0?0:4),depth:Y,frames:[]},Z=Date.now(),U=(K+Q)*Y,H=U*q;for(var z=0;z1,H=!1,z=33+(U?20:0);if(Q.sRGB!=null)z+=13;if(Q.pHYs!=null)z+=21;if(V.ctype==3){var I=V.plte.length;for(var M=0;M>>24!=255)H=!0;z+=8+I*3+4+(H?8+I*1+4:0)}for(var L=0;L>>8&255,$=R>>>16&255;j[Z+N+0]=v,j[Z+N+1]=w,j[Z+N+2]=$}if(Z+=I*3,J(j,Z,Y(j,Z-I*3-4,I*3+4)),Z+=4,H){J(j,Z,I),Z+=4,W(j,Z,"tRNS"),Z+=4;for(var M=0;M>>24&255;Z+=I,J(j,Z,Y(j,Z-I-4,I+4)),Z+=4}}var S=0;for(var L=0;L>2,D>>2));for(var I=0;Iq0&&r==u[B-q0])J0[B]=J0[B-q0];else{var k0=N[r];if(k0==null){if(N[r]=k0=R.length,R.push(r),R.length>=300)break}J0[B]=k0}}}var n0=R.length;if(n0<=256&&Z==!1){if(n0<=2)H=1;else if(n0<=4)H=2;else if(n0<=16)H=4;else H=8;H=Math.max(H,W)}for(var I=0;I>1)]|=N1[y1+R0]<<4-(R0&1)*4;else if(H==2)for(var R0=0;R0>2)]|=N1[y1+R0]<<6-(R0&3)*2;else if(H==1)for(var R0=0;R0>3)]|=N1[y1+R0]<<7-(R0&7)*1}Z6=$6,U=3,bq=1}else if(j==!1&&O.length==1){var $6=new Uint8Array(q0*y6*3),p3=q0*y6;for(var B=0;B$)$=b;if(hS)S=h}}if($==-1)v=w=$=S=0;if(Q){if((v&1)==1)v--;if((w&1)==1)w--}var D=($-v+1)*(S-w+1);if(DB)B=R;if(vj)j=v}}if(B==-1)M=L=B=j=0;if(J){if((M&1)==1)M--;if((L&1)==1)L--}Y={x:M,y:L,width:B-M+1,height:j-L+1};var S=K[Q];if(S.rect=Y,S.blend=1,S.img=new Uint8Array(Y.width*Y.height*4),K[Q-1].dispose==0)P._copyTile(Z,q,X,S.img,Y.width,Y.height,-Y.x,-Y.y,0),P.encode._prepareDiff(z,q,X,S.img,Y);else P._copyTile(z,q,X,S.img,Y.width,Y.height,-Y.x,-Y.y,0)};P.encode._prepareDiff=function(V,q,X,K,Q){P._copyTile(V,q,X,K,Q.width,Q.height,-Q.x,-Q.y,2)};P.encode._filterZero=function(V,q,X,K,Q,Y,J){var G=[],W=[0,1,2,3,4];if(Y!=-1)W=[Y];else if(q*K>500000||X==1)W=[0];var Z;if(J)Z={level:0};var U=J&&UZIP!=null?UZIP:I3.default;for(var H=0;H>1)+256&255;if(Y==4)for(var Z=Q;Z>1)&255;for(var Z=Q;Z>1)&255}if(Y==4){for(var Z=0;Z>>1;else X=X>>>1;V[q]=X}return V}(),update:function(V,q,X,K){for(var Q=0;Q>>8;return V},crc:function(V,q,X){return P.crc.update(4294967295,V,q,X)^4294967295}};P.quantize=function(V,q){var X=new Uint8Array(V),K=X.slice(0),Q=new Uint32Array(K.buffer),Y=P.quantize.getKDtree(K,q),J=Y[0],G=Y[1],W=P.quantize.planeDst,Z=X,U=Q,H=Z.length,z=new Uint8Array(X.length>>2);for(var I=0;I>2]=O.ind,U[I>>2]=O.est.rgba}return{abuf:K.buffer,inds:z,plte:G}};P.quantize.getKDtree=function(V,q,X){if(X==null)X=0.0001;var K=new Uint32Array(V.buffer),Q={i0:0,i1:V.length,bst:null,est:null,tdst:0,left:null,right:null};Q.bst=P.quantize.stats(V,Q.i0,Q.i1),Q.est=P.quantize.estats(Q.bst);var Y=[Q];while(Y.lengthJ)J=Y[W].est.L,G=W;if(J=U||Z.i1<=U;if(H){Z.est.L=0;continue}var z={i0:Z.i0,i1:U,bst:null,est:null,tdst:0,left:null,right:null};z.bst=P.quantize.stats(V,z.i0,z.i1),z.est=P.quantize.estats(z.bst);var I={i0:U,i1:Z.i1,bst:null,est:null,tdst:0,left:null,right:null};I.bst={R:[],m:[],N:Z.bst.N-z.bst.N};for(var W=0;W<16;W++)I.bst.R[W]=Z.bst.R[W]-z.bst.R[W];for(var W=0;W<4;W++)I.bst.m[W]=Z.bst.m[W]-z.bst.m[W];I.est=P.quantize.estats(I.bst),Z.left=z,Z.right=I,Y[G]=z,Y.push(I)}Y.sort(function(M,L){return L.bst.N-M.bst.N});for(var W=0;W0)J=V.right,G=V.left;var W=P.quantize.getNearest(J,q,X,K,Q);if(W.tdst<=Y*Y)return W;var Z=P.quantize.getNearest(G,q,X,K,Q);return Z.tdstY)K-=4;if(X>=K)break;var W=q[X>>2];q[X>>2]=q[K>>2],q[K>>2]=W,X+=4,K-=4}while(J(V,X,Q)>Y)X-=4;return X+4};P.quantize.vecDot=function(V,q,X){return V[q]*X[0]+V[q+1]*X[1]+V[q+2]*X[2]+V[q+3]*X[3]};P.quantize.stats=function(V,q,X){var K=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],Q=[0,0,0,0],Y=X-q>>2;for(var J=q;J>>0}};P.M4={multVec:function(V,q){return[V[0]*q[0]+V[1]*q[1]+V[2]*q[2]+V[3]*q[3],V[4]*q[0]+V[5]*q[1]+V[6]*q[2]+V[7]*q[3],V[8]*q[0]+V[9]*q[1]+V[10]*q[2]+V[11]*q[3],V[12]*q[0]+V[13]*q[1]+V[14]*q[2]+V[15]*q[3]]},dot:function(V,q){return V[0]*q[0]+V[1]*q[1]+V[2]*q[2]+V[3]*q[3]},sml:function(V,q){return[V*q[0],V*q[1],V*q[2],V*q[3]]}};P.encode.concatRGBA=function(V){var q=0;for(var X=0;X1)throw new Error("Animated PNGs are not supported");var Q=new Uint8Array(K[0]),Y=uJ(Q),J=Y.rgbChannel,G=Y.alphaChannel;this.rgbChannel=J;var W=G.some(function(Z){return Z<255});if(W)this.alphaChannel=G;this.type=DJ(X.ctype),this.width=X.width,this.height=X.height,this.bitsPerComponent=8}return V.load=function(q){return new V(q)},V}();var gJ=function(){function V(q){this.image=q,this.bitsPerComponent=q.bitsPerComponent,this.width=q.width,this.height=q.height,this.colorSpace="DeviceRGB"}return V.for=function(q){return _(this,void 0,void 0,function(){var X;return c(this,function(K){return X=k3.load(q),[2,new V(X)]})})},V.prototype.embedIntoContext=function(q,X){return _(this,void 0,void 0,function(){var K,Q;return c(this,function(Y){if(K=this.embedAlphaChannel(q),Q=q.flateStream(this.image.rgbChannel,{Type:"XObject",Subtype:"Image",BitsPerComponent:this.image.bitsPerComponent,Width:this.image.width,Height:this.image.height,ColorSpace:this.colorSpace,SMask:K}),X)return q.assign(X,Q),[2,X];else return[2,q.register(Q)];return[2]})})},V.prototype.embedAlphaChannel=function(q){if(!this.image.alphaChannel)return;var X=q.flateStream(this.image.alphaChannel,{Type:"XObject",Subtype:"Image",Height:this.image.height,Width:this.image.width,BitsPerComponent:this.image.bitsPerComponent,ColorSpace:"DeviceGray",Decode:[0,1]});return q.register(X)},V}(),X2=gJ;var xJ=function(){function V(q,X,K){this.bytes=q,this.start=X||0,this.pos=this.start,this.end=!!X&&!!K?X+K:this.bytes.length}return Object.defineProperty(V.prototype,"length",{get:function(){return this.end-this.start},enumerable:!1,configurable:!0}),Object.defineProperty(V.prototype,"isEmpty",{get:function(){return this.length===0},enumerable:!1,configurable:!0}),V.prototype.getByte=function(){if(this.pos>=this.end)return-1;return this.bytes[this.pos++]},V.prototype.getUint16=function(){var q=this.getByte(),X=this.getByte();if(q===-1||X===-1)return-1;return(q<<8)+X},V.prototype.getInt32=function(){var q=this.getByte(),X=this.getByte(),K=this.getByte(),Q=this.getByte();return(q<<24)+(X<<16)+(K<<8)+Q},V.prototype.getBytes=function(q,X){if(X===void 0)X=!1;var K=this.bytes,Q=this.pos,Y=this.end;if(!q){var J=K.subarray(Q,Y);return X?new Uint8ClampedArray(J):J}else{var G=Q+q;if(G>Y)G=Y;this.pos=G;var J=K.subarray(Q,G);return X?new Uint8ClampedArray(J):J}},V.prototype.peekByte=function(){var q=this.getByte();return this.pos--,q},V.prototype.peekBytes=function(q,X){if(X===void 0)X=!1;var K=this.getBytes(q,X);return this.pos-=K.length,K},V.prototype.skip=function(q){if(!q)q=1;this.pos+=q},V.prototype.reset=function(){this.pos=this.start},V.prototype.moveStart=function(){this.start=this.pos},V.prototype.makeSubStream=function(q,X){return new V(this.bytes,q,X)},V.prototype.decode=function(){return this.bytes},V}(),Uq=xJ;var bJ=new Uint8Array(0),mJ=function(){function V(q){if(this.pos=0,this.bufferLength=0,this.eof=!1,this.buffer=bJ,this.minBufferLength=512,q)while(this.minBufferLengthY)K=Y}else{while(!this.eof)this.readBlock();K=this.bufferLength}this.pos=K;var J=this.buffer.subarray(Q,K);return X&&!(J instanceof Uint8ClampedArray)?new Uint8ClampedArray(J):J},V.prototype.peekByte=function(){var q=this.getByte();return this.pos--,q},V.prototype.peekBytes=function(q,X){if(X===void 0)X=!1;var K=this.getBytes(q,X);return this.pos-=K.length,K},V.prototype.skip=function(q){if(!q)q=1;this.pos+=q},V.prototype.reset=function(){this.pos=0},V.prototype.makeSubStream=function(q,X){var K=q+X;while(this.bufferLength<=K&&!this.eof)this.readBlock();return new Uq(this.buffer,q,X)},V.prototype.decode=function(){while(!this.eof)this.readBlock();return this.buffer.subarray(0,this.bufferLength)},V.prototype.readBlock=function(){throw new u0(this.constructor.name,"readBlock")},V.prototype.ensureBuffer=function(q){var X=this.buffer;if(q<=X.byteLength)return X;var K=this.minBufferLength;while(K=0;--Z)W[G+Z]=H&255,H>>=8}},q}(d6),L3=fJ;var lJ=function(V){A(q,V);function q(X,K){var Q=V.call(this,K)||this;if(Q.stream=X,Q.firstDigit=-1,K)K=0.5*K;return Q}return q.prototype.readBlock=function(){var X=8000,K=this.stream.getBytes(X);if(!K.length){this.eof=!0;return}var Q=K.length+1>>1,Y=this.ensureBuffer(this.bufferLength+Q),J=this.bufferLength,G=this.firstDigit;for(var W=0,Z=K.length;W=48&&U<=57)H=U&15;else if(U>=65&&U<=70||U>=97&&U<=102)H=(U&15)+9;else if(U===62){this.eof=!0;break}else continue;if(G<0)G=H;else Y[J++]=G<<4|H,G=-1}if(G>=0&&this.eof)Y[J++]=G<<4,G=-1;this.firstDigit=G,this.bufferLength=J},q}(d6),j3=lJ;var B3=new Int32Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),_J=new Int32Array([3,4,5,6,7,8,9,10,65547,65549,65551,65553,131091,131095,131099,131103,196643,196651,196659,196667,262211,262227,262243,262259,327811,327843,327875,327907,258,258,258]),cJ=new Int32Array([1,2,3,4,65541,65543,131081,131085,196625,196633,262177,262193,327745,327777,393345,393409,459009,459137,524801,525057,590849,591361,657409,658433,724993,727041,794625,798721,868353,876545]),pJ=[new Int32Array([459008,524368,524304,524568,459024,524400,524336,590016,459016,524384,524320,589984,524288,524416,524352,590048,459012,524376,524312,589968,459028,524408,524344,590032,459020,524392,524328,590000,524296,524424,524360,590064,459010,524372,524308,524572,459026,524404,524340,590024,459018,524388,524324,589992,524292,524420,524356,590056,459014,524380,524316,589976,459030,524412,524348,590040,459022,524396,524332,590008,524300,524428,524364,590072,459009,524370,524306,524570,459025,524402,524338,590020,459017,524386,524322,589988,524290,524418,524354,590052,459013,524378,524314,589972,459029,524410,524346,590036,459021,524394,524330,590004,524298,524426,524362,590068,459011,524374,524310,524574,459027,524406,524342,590028,459019,524390,524326,589996,524294,524422,524358,590060,459015,524382,524318,589980,459031,524414,524350,590044,459023,524398,524334,590012,524302,524430,524366,590076,459008,524369,524305,524569,459024,524401,524337,590018,459016,524385,524321,589986,524289,524417,524353,590050,459012,524377,524313,589970,459028,524409,524345,590034,459020,524393,524329,590002,524297,524425,524361,590066,459010,524373,524309,524573,459026,524405,524341,590026,459018,524389,524325,589994,524293,524421,524357,590058,459014,524381,524317,589978,459030,524413,524349,590042,459022,524397,524333,590010,524301,524429,524365,590074,459009,524371,524307,524571,459025,524403,524339,590022,459017,524387,524323,589990,524291,524419,524355,590054,459013,524379,524315,589974,459029,524411,524347,590038,459021,524395,524331,590006,524299,524427,524363,590070,459011,524375,524311,524575,459027,524407,524343,590030,459019,524391,524327,589998,524295,524423,524359,590062,459015,524383,524319,589982,459031,524415,524351,590046,459023,524399,524335,590014,524303,524431,524367,590078,459008,524368,524304,524568,459024,524400,524336,590017,459016,524384,524320,589985,524288,524416,524352,590049,459012,524376,524312,589969,459028,524408,524344,590033,459020,524392,524328,590001,524296,524424,524360,590065,459010,524372,524308,524572,459026,524404,524340,590025,459018,524388,524324,589993,524292,524420,524356,590057,459014,524380,524316,589977,459030,524412,524348,590041,459022,524396,524332,590009,524300,524428,524364,590073,459009,524370,524306,524570,459025,524402,524338,590021,459017,524386,524322,589989,524290,524418,524354,590053,459013,524378,524314,589973,459029,524410,524346,590037,459021,524394,524330,590005,524298,524426,524362,590069,459011,524374,524310,524574,459027,524406,524342,590029,459019,524390,524326,589997,524294,524422,524358,590061,459015,524382,524318,589981,459031,524414,524350,590045,459023,524398,524334,590013,524302,524430,524366,590077,459008,524369,524305,524569,459024,524401,524337,590019,459016,524385,524321,589987,524289,524417,524353,590051,459012,524377,524313,589971,459028,524409,524345,590035,459020,524393,524329,590003,524297,524425,524361,590067,459010,524373,524309,524573,459026,524405,524341,590027,459018,524389,524325,589995,524293,524421,524357,590059,459014,524381,524317,589979,459030,524413,524349,590043,459022,524397,524333,590011,524301,524429,524365,590075,459009,524371,524307,524571,459025,524403,524339,590023,459017,524387,524323,589991,524291,524419,524355,590055,459013,524379,524315,589975,459029,524411,524347,590039,459021,524395,524331,590007,524299,524427,524363,590071,459011,524375,524311,524575,459027,524407,524343,590031,459019,524391,524327,589999,524295,524423,524359,590063,459015,524383,524319,589983,459031,524415,524351,590047,459023,524399,524335,590015,524303,524431,524367,590079]),9],dJ=[new Int32Array([327680,327696,327688,327704,327684,327700,327692,327708,327682,327698,327690,327706,327686,327702,327694,0,327681,327697,327689,327705,327685,327701,327693,327709,327683,327699,327691,327707,327687,327703,327695,0]),5],nJ=function(V){A(q,V);function q(X,K){var Q=V.call(this,K)||this;Q.stream=X;var Y=X.getByte(),J=X.getByte();if(Y===-1||J===-1)throw new Error("Invalid header in flate stream: "+Y+", "+J);if((Y&15)!==8)throw new Error("Unknown compression method in flate stream: "+Y+", "+J);if(((Y<<8)+J)%31!==0)throw new Error("Bad FCHECK in flate stream: "+Y+", "+J);if(J&32)throw new Error("FDICT bit set in flate stream: "+Y+", "+J);return Q.codeSize=0,Q.codeBuf=0,Q}return q.prototype.readBlock=function(){var X,K,Q=this.stream,Y=this.getBits(3);if(Y&1)this.eof=!0;if(Y>>=1,Y===0){var J=void 0;if((J=Q.getByte())===-1)throw new Error("Bad block header in flate stream");var G=J;if((J=Q.getByte())===-1)throw new Error("Bad block header in flate stream");if(G|=J<<8,(J=Q.getByte())===-1)throw new Error("Bad block header in flate stream");var W=J;if((J=Q.getByte())===-1)throw new Error("Bad block header in flate stream");if(W|=J<<8,W!==(~G&65535)&&(G!==0||W!==0))throw new Error("Bad uncompressed block length in flate stream");this.codeBuf=0,this.codeSize=0;var Z=this.bufferLength;X=this.ensureBuffer(Z+G);var U=Z+G;if(this.bufferLength=U,G===0){if(Q.peekByte()===-1)this.eof=!0}else for(var H=Z;H0)v[O++]=S}z=this.generateHuffmanTable(v.subarray(0,M)),I=this.generateHuffmanTable(v.subarray(M,R))}else throw new Error("Unknown block type in flate stream");X=this.buffer;var C=X?X.length:0,D=this.bufferLength;while(!0){var l=this.getCode(z);if(l<256){if(D+1>=C)X=this.ensureBuffer(D+1),C=X.length;X[D++]=l;continue}if(l===256){this.bufferLength=D;return}l-=257,l=_J[l];var u=l>>16;if(u>0)u=this.getBits(u);if(K=(l&65535)+u,l=this.getCode(I),l=cJ[l],u=l>>16,u>0)u=this.getBits(u);var q0=(l&65535)+u;if(D+K>=C)X=this.ensureBuffer(D+K),C=X.length;for(var J0=0;J0>X,this.codeSize=Q-=X,J},q.prototype.getCode=function(X){var K=this.stream,Q=X[0],Y=X[1],J=this.codeSize,G=this.codeBuf,W;while(J>16,H=Z&65535;if(U<1||J>U,this.codeSize=J-U,H},q.prototype.generateHuffmanTable=function(X){var K=X.length,Q=0,Y;for(Y=0;YQ)Q=X[Y];var J=1<>=1;for(Y=z;Y0;if(!v||v<256)B[0]=v,j=1;else if(v>=258)if(v=0;J--)B[J]=H[G],G=I[G]}else B[j++]=B[0];else if(v===256){M=9,U=258,j=0;continue}else{this.eof=!0,delete this.lzwState;break}if(w)I[U]=L,z[U]=z[L]+1,H[U]=B[0],U++,M=U+Z&U+Z-1?M:Math.min(Math.log(U+Z)/0.6931471805599453+1,12)|0;if(L=v,O+=j,K>>K&(1<0){var J=this.stream.getBytes(Y);K.set(J,Q),Q+=Y}}else{Y=257-Y;var G=X[1];K=this.ensureBuffer(Q+Y+1);for(var W=0;WK.size())throw new Y8(X,0,K.size());K.remove(X)}},q.prototype.normalizedEntries=function(){var X=this.Kids();if(!X)X=this.dict.context.obj([this.ref]),this.dict.set(k.of("Kids"),X);return{Kids:X}},q.fromDict=function(X,K){return new q(X,K)},q}(Y2),K6=YG;var JG=function(V){A(q,V);function q(){return V!==null&&V.apply(this,arguments)||this}return q.prototype.Opt=function(){return this.dict.lookupMaybe(k.of("Opt"),K0,g,i)},q.prototype.setOpt=function(X){this.dict.set(k.of("Opt"),this.dict.context.obj(X))},q.prototype.getExportValues=function(){var X=this.Opt();if(!X)return;if(X instanceof K0||X instanceof g)return[X];var K=[];for(var Q=0,Y=X.size();QK.size())throw new Y8(X,0,K.size());K.remove(X)}},q.prototype.normalizeExportValues=function(){var X,K,Q,Y,J=(X=this.getExportValues())!==null&&X!==void 0?X:[],G=[],W=this.getWidgets();for(var Z=0,U=W.length;Z1){if(!this.hasFlag(G0.MultiSelect))throw new W7;this.dict.set(k.of("V"),this.dict.context.obj(X))}this.updateSelectedIndices(X)},q.prototype.valuesAreValid=function(X){var K=this.getOptions(),Q=function(W,Z){var U=X[W].decodeText();if(!K.find(function(H){return U===(H.display||H.value).decodeText()}))return{value:!1}};for(var Y=0,J=X.length;Y1){var K=new Array(X.length),Q=this.getOptions(),Y=function(W,Z){var U=X[W].decodeText();K[W]=Q.findIndex(function(H){return U===(H.display||H.value).decodeText()})};for(var J=0,G=X.length;J0){var G=J.lookup(0,K0,g),W=J.lookupMaybe(1,K0,g);K.push({value:G,display:W||G})}}}return K}return[]},q}(K6),G2=ZG;var WG=function(V){A(q,V);function q(){return V!==null&&V.apply(this,arguments)||this}return q.fromDict=function(X,K){return new q(X,K)},q.create=function(X){var K=X.obj({FT:"Ch",Ff:G0.Combo,Kids:[]}),Q=X.register(K);return new q(K,Q)},q}(G2),Q5=WG;var UG=function(V){A(q,V);function q(){return V!==null&&V.apply(this,arguments)||this}return q.prototype.addField=function(X){var K=this.normalizedEntries().Kids;K===null||K===void 0||K.push(X)},q.prototype.normalizedEntries=function(){var X=this.Kids();if(!X)X=this.dict.context.obj([]),this.dict.set(k.of("Kids"),X);return{Kids:X}},q.fromDict=function(X,K){return new q(X,K)},q.create=function(X){var K=X.obj({}),Q=X.register(K);return new q(K,Q)},q}(Y2),Y5=UG;var HG=function(V){A(q,V);function q(){return V!==null&&V.apply(this,arguments)||this}return q.fromDict=function(X,K){return new q(X,K)},q}(K6),F5=HG;var zG=function(V){A(q,V);function q(){return V!==null&&V.apply(this,arguments)||this}return q.prototype.MaxLen=function(){var X=this.dict.lookup(k.of("MaxLen"));if(X instanceof x)return X;return},q.prototype.Q=function(){var X=this.dict.lookup(k.of("Q"));if(X instanceof x)return X;return},q.prototype.setMaxLength=function(X){this.dict.set(k.of("MaxLen"),x.of(X))},q.prototype.removeMaxLength=function(){this.dict.delete(k.of("MaxLen"))},q.prototype.getMaxLength=function(){var X;return(X=this.MaxLen())===null||X===void 0?void 0:X.asNumber()},q.prototype.setQuadding=function(X){this.dict.set(k.of("Q"),x.of(X))},q.prototype.getQuadding=function(){var X;return(X=this.Q())===null||X===void 0?void 0:X.asNumber()},q.prototype.setValue=function(X){this.dict.set(k.of("V"),X)},q.prototype.removeValue=function(){this.dict.delete(k.of("V"))},q.prototype.getValue=function(){var X=this.V();if(X instanceof K0||X instanceof g)return X;return},q.fromDict=function(X,K){return new q(X,K)},q.create=function(X){var K=X.obj({FT:"Tx",Kids:[]}),Q=X.register(K);return new q(K,Q)},q}(K6),J5=zG;var MG=function(V){A(q,V);function q(){return V!==null&&V.apply(this,arguments)||this}return q.fromDict=function(X,K){return new q(X,K)},q.create=function(X){var K=X.obj({FT:"Btn",Ff:f0.PushButton,Kids:[]}),Q=X.register(K);return new q(K,Q)},q}(h5),G5=MG;var IG=function(V){A(q,V);function q(){return V!==null&&V.apply(this,arguments)||this}return q.prototype.setValue=function(X){var K=this.getOnValues();if(!K.includes(X)&&X!==k.of("Off"))throw new J8;this.dict.set(k.of("V"),X);var Q=this.getWidgets();for(var Y=0,J=Q.length;YY)throw new qq(K,Y);var J=K;for(var G=0,W=Q.size();GJ)return U.insertLeafNode(X,J)||Z;else J-=U.Count().asNumber();if(U instanceof _0)J-=1}if(J===0){this.insertLeafKid(Q.size(),X);return}throw new Xq(K,"insertLeafNode")},q.prototype.removeLeafNode=function(X,K){if(K===void 0)K=!0;var Q=this.Kids(),Y=this.Count().asNumber();if(X>=Y)throw new qq(X,Y);var J=X;for(var G=0,W=Q.size();GJ){if(U.removeLeafNode(J,K),K&&U.Kids().size()===0)Q.remove(G);return}else J-=U.Count().asNumber();if(U instanceof _0)if(J===0){this.removeKid(G);return}else J-=1}throw new Xq(X,"removeLeafNode")},q.prototype.ascend=function(X){X(this);var K=this.Parent();if(K)K.ascend(X)},q.prototype.traverse=function(X){var K=this.Kids();for(var Q=0,Y=K.size();QNumber.MAX_SAFE_INTEGER)if(this.capNumbers){var Q="Parsed number that is too large for some PDF readers: "+q+", using Number.MAX_SAFE_INTEGER instead.";return console.warn(Q),Number.MAX_SAFE_INTEGER}else{var Q="Parsed number that is too large for some PDF readers: "+q+", not capping.";console.warn(Q)}return K},V.prototype.skipWhitespace=function(){while(!this.bytes.done()&&I6[this.bytes.peek()])this.bytes.next()},V.prototype.skipLine=function(){while(!this.bytes.done()){var q=this.bytes.peek();if(q===A3||q===N3)return;this.bytes.next()}},V.prototype.skipComment=function(){if(this.bytes.peek()!==E.Percent)return!1;while(!this.bytes.done()){var q=this.bytes.peek();if(q===A3||q===N3)return!0;this.bytes.next()}return!0},V.prototype.skipWhitespaceAndComments=function(){this.skipWhitespace();while(this.skipComment())this.skipWhitespace()},V.prototype.matchKeyword=function(q){var X=this.bytes.offset();for(var K=0,Q=q.length;K=this.length},V.prototype.offset=function(){return this.idx},V.prototype.slice=function(q,X){return this.bytes.slice(q,X)},V.prototype.position=function(){return{line:this.line,column:this.column,offset:this.idx}},V.of=function(q){return new V(q)},V.fromPDFRawStream=function(q){return V.of(V2(q).decode())},V}(),D5=wG;var AG=E.Space,H1=E.CarriageReturn,z1=E.Newline,M1=[E.s,E.t,E.r,E.e,E.a,E.m],Eq=[E.e,E.n,E.d,E.s,E.t,E.r,E.e,E.a,E.m],M0={header:[E.Percent,E.P,E.D,E.F,E.Dash],eof:[E.Percent,E.Percent,E.E,E.O,E.F],obj:[E.o,E.b,E.j],endobj:[E.e,E.n,E.d,E.o,E.b,E.j],xref:[E.x,E.r,E.e,E.f],trailer:[E.t,E.r,E.a,E.i,E.l,E.e,E.r],startxref:[E.s,E.t,E.a,E.r,E.t,E.x,E.r,E.e,E.f],true:[E.t,E.r,E.u,E.e],false:[E.f,E.a,E.l,E.s,E.e],null:[E.n,E.u,E.l,E.l],stream:M1,streamEOF1:Q0(M1,[AG,H1,z1]),streamEOF2:Q0(M1,[H1,z1]),streamEOF3:Q0(M1,[H1]),streamEOF4:Q0(M1,[z1]),endstream:Eq,EOF1endstream:Q0([H1,z1],Eq),EOF2endstream:Q0([H1],Eq),EOF3endstream:Q0([z1],Eq)};var NG=function(V){A(q,V);function q(X,K,Q){if(Q===void 0)Q=!1;var Y=V.call(this,X,Q)||this;return Y.context=K,Y}return q.prototype.parseObject=function(){if(this.skipWhitespaceAndComments(),this.matchKeyword(M0.true))return c6.True;if(this.matchKeyword(M0.false))return c6.False;if(this.matchKeyword(M0.null))return F0;var X=this.bytes.peek();if(X===E.LessThan&&this.bytes.peekAhead(1)===E.LessThan)return this.parseDictOrStream();if(X===E.LessThan)return this.parseHexString();if(X===E.LeftParen)return this.parseString();if(X===E.ForwardSlash)return this.parseName();if(X===E.LeftSquareBracket)return this.parseArray();if(U1[X])return this.parseNumberOrRef();throw new M7(this.bytes.position(),X)},q.prototype.parseNumberOrRef=function(){var X=this.parseRawNumber();this.skipWhitespaceAndComments();var K=this.bytes.offset();if(P0[this.bytes.peek()]){var Q=this.parseRawNumber();if(this.skipWhitespaceAndComments(),this.bytes.peek()===E.R)return this.bytes.assertNext(E.R),a.of(X,Q)}return this.bytes.moveTo(K),x.of(X)},q.prototype.parseHexString=function(){var X="";this.bytes.assertNext(E.LessThan);while(!this.bytes.done()&&this.bytes.peek()!==E.GreaterThan)X+=t0(this.bytes.next());return this.bytes.assertNext(E.GreaterThan),g.of(X)},q.prototype.parseString=function(){var X=0,K=!1,Q="";while(!this.bytes.done()){var Y=this.bytes.next();if(Q+=t0(Y),!K){if(Y===E.LeftParen)X+=1;if(Y===E.RightParen)X-=1}if(Y===E.BackSlash)K=!K;else if(K)K=!1;if(X===0)return K0.of(Q.substring(1,Q.length-1))}throw new E7(this.bytes.position())},q.prototype.parseName=function(){this.bytes.assertNext(E.ForwardSlash);var X="";while(!this.bytes.done()){var K=this.bytes.peek();if(I6[K]||V6[K])break;X+=t0(K),this.bytes.next()}return k.of(X)},q.prototype.parseArray=function(){this.bytes.assertNext(E.LeftSquareBracket),this.skipWhitespaceAndComments();var X=i.withContext(this.context);while(this.bytes.peek()!==E.RightSquareBracket){var K=this.parseObject();X.push(K),this.skipWhitespaceAndComments()}return this.bytes.assertNext(E.RightSquareBracket),X},q.prototype.parseDict=function(){this.bytes.assertNext(E.LessThan),this.bytes.assertNext(E.LessThan),this.skipWhitespaceAndComments();var X=new Map;while(!this.bytes.done()&&this.bytes.peek()!==E.GreaterThan&&this.bytes.peekAhead(1)!==E.GreaterThan){var K=this.parseName(),Q=this.parseObject();X.set(K,Q),this.skipWhitespaceAndComments()}this.skipWhitespaceAndComments(),this.bytes.assertNext(E.GreaterThan),this.bytes.assertNext(E.GreaterThan);var Y=X.get(k.of("Type"));if(Y===k.of("Catalog"))return W2.fromMapWithContext(X,this.context);else if(Y===k.of("Pages"))return U2.fromMapWithContext(X,this.context);else if(Y===k.of("Page"))return _0.fromMapWithContext(X,this.context);else return m.fromMapWithContext(X,this.context)},q.prototype.parseDictOrStream=function(){var X=this.bytes.position(),K=this.parseDict();if(this.skipWhitespaceAndComments(),!this.matchKeyword(M0.streamEOF1)&&!this.matchKeyword(M0.streamEOF2)&&!this.matchKeyword(M0.streamEOF3)&&!this.matchKeyword(M0.streamEOF4)&&!this.matchKeyword(M0.stream))return K;var Q=this.bytes.offset(),Y,J=K.get(k.of("Length"));if(J instanceof x){if(Y=Q+J.asNumber(),this.bytes.moveTo(Y),this.skipWhitespaceAndComments(),!this.matchKeyword(M0.endstream))this.bytes.moveTo(Q),Y=this.findEndOfStreamFallback(X)}else Y=this.findEndOfStreamFallback(X);var G=this.bytes.slice(Q,Y);return A6.of(K,G)},q.prototype.findEndOfStreamFallback=function(X){var K=1,Q=this.bytes.offset();while(!this.bytes.done()){if(Q=this.bytes.offset(),this.matchKeyword(M0.stream))K+=1;else if(this.matchKeyword(M0.EOF1endstream)||this.matchKeyword(M0.EOF2endstream)||this.matchKeyword(M0.EOF3endstream)||this.matchKeyword(M0.endstream))K-=1;else this.bytes.next();if(K===0)break}if(K!==0)throw new k7(X);return Q},q.forBytes=function(X,K,Q){return new q(D5.of(X),K,Q)},q.forByteStream=function(X,K,Q){if(Q===void 0)Q=!1;return new q(X,K,Q)},q}(S3),H2=NG;var SG=function(V){A(q,V);function q(X,K){var Q=V.call(this,D5.fromPDFRawStream(X),X.dict.context)||this,Y=X.dict;return Q.alreadyParsed=!1,Q.shouldWaitForTick=K||function(){return!1},Q.firstOffset=Y.lookup(k.of("First"),x).asNumber(),Q.objectCount=Y.lookup(k.of("N"),x).asNumber(),Q}return q.prototype.parseIntoContext=function(){return _(this,void 0,void 0,function(){var X,K,Q,Y,J,G,W,Z;return c(this,function(U){switch(U.label){case 0:if(this.alreadyParsed)throw new Q8("PDFObjectStreamParser","parseIntoContext");this.alreadyParsed=!0,X=this.parseOffsetsAndObjectNumbers(),K=0,Q=X.length,U.label=1;case 1:if(!(K=E.Space&&K<=E.Tilde;if(Q){if(this.matchKeyword(M0.xref)||this.matchKeyword(M0.trailer)||this.matchKeyword(M0.startxref)||this.matchIndirectObjectHeader()){this.bytes.moveTo(X);break}}this.bytes.next()}},q.prototype.skipBinaryHeaderComment=function(){this.skipWhitespaceAndComments();try{var X=this.bytes.offset();this.parseIndirectObjectHeader(),this.bytes.moveTo(X)}catch(K){this.bytes.next(),this.skipWhitespaceAndComments()}},q.forBytesWithOptions=function(X,K,Q,Y){return new q(X,K,Q,Y)},q}(H2),Bq=$G;var n6=function(V){return 1<0)K[K.length]=+Q;X[X.length]={cmd:q,args:K},K=[],Q="",Y=!1}q=Z}else if([" ",","].includes(Z)||Z==="-"&&Q.length>0&&Q[Q.length-1]!=="e"||Z==="."&&Y){if(Q.length===0)continue;if(K.length===J){if(X[X.length]={cmd:q,args:K},K=[+Q],q==="M")q="L";if(q==="m")q="l"}else K[K.length]=+Q;Y=Z===".",Q=["-","."].includes(Z)?Z:""}else if(Q+=Z,Z===".")Y=!0}if(Q.length>0)if(K.length===J){if(X[X.length]={cmd:q,args:K},K=[+Q],q==="M")q="L";if(q==="m")q="l"}else K[K.length]=+Q;return X[X.length]={cmd:q,args:K},X},pG=function(V){d=n=Z0=W0=v1=R1=0;var q=[];for(var X=0;X1)z=Math.sqrt(z),X*=z,K*=z;var I=H/X,M=U/X,L=-U/K,B=H/K,j=I*G+M*W,O=L*G+B*W,N=I*V+M*q,R=L*V+B*q,v=(N-j)*(N-j)+(R-O)*(R-O),w=1/v-0.25;if(w<0)w=0;var $=Math.sqrt(w);if(Y===Q)$=-$;var S=0.5*(j+N)-$*(R-O),h=0.5*(O+R)+$*(N-j),b=Math.atan2(O-h,j-S),C=Math.atan2(R-h,N-S),D=C-b;if(D<0&&Y===1)D+=2*Math.PI;else if(D>0&&Y===0)D-=2*Math.PI;var l=Math.ceil(Math.abs(D/(Math.PI*0.5+0.001))),u=[];for(var q0=0;q0V.length)return Q-1;var B=q.heightAtSize(Q),j=B+B*0.2,O=j*Y;if(O>Math.abs(X.height))return Q-1;Q+=1}return Q},sG=function(V,q,X,K){var Q=X.width/K,Y=X.height,J=m3,G=J4(V);while(JQ*0.75;if(H)return J-1}var z=q.heightAtSize(J,{descender:!1});if(z>Y)return J-1;J+=1}return J},tG=function(V){for(var q=V.length;q>0;q--)if(/\s/.test(V[q]))return q;return},eG=function(V,q,X,K){var Q,Y=V.length;while(Y>0){var J=V.substring(0,Y),G=X.encodeText(J),W=X.widthOfTextAtSize(J,K);if(Wz)z=$+v;if(M+G>I)I=M+G;Z.push({text:N,encoded:R,width:v,height:G,x:$,y:M}),j=w===null||w===void 0?void 0:w.trim()}}return{fontSize:K,lineHeight:W,lines:Z,bounds:{x:U,y:H,width:z-U,height:I-H}}},KX=function(V,q){var{fontSize:X,font:K,bounds:Q,cellCount:Y}=q,J=F1(I5(V));if(J.length>Y)throw new qX(J.length,Y);if(X===void 0||X===0)X=sG(J,K,Q,Y);var G=Q.width/Y,W=K.heightAtSize(X,{descender:!1}),Z=Q.y+(Q.height/2-W/2),U=[],H=Q.x,z=Q.y,I=Q.x+Q.width,M=Q.y+Q.height,L=0,B=0;while(LI)I=$+v;if(Z+W>M)M=Z+W;U.push({text:J,encoded:R,width:v,height:W,x:$,y:Z}),L+=1,B+=N}return{fontSize:X,cells:U,bounds:{x:H,y:z,width:I-H,height:M-z}}},v2=function(V,q){var{alignment:X,fontSize:K,font:Q,bounds:Y}=q,J=F1(I5(V));if(K===void 0||K===0)K=l3([J],Q,Y);var G=Q.encodeText(J),W=Q.widthOfTextAtSize(J,K),Z=Q.heightAtSize(K,{descender:!1}),U=X===v0.Left?Y.x:X===v0.Center?Y.x+Y.width/2-W/2:X===v0.Right?Y.x+Y.width-W:Y.x,H=Y.y+(Y.height/2-Z/2);return{fontSize:K,line:{text:J,encoded:G,width:W,height:Z,x:U,y:H},bounds:{x:U,y:H,width:W,height:Z}}};var G6=function(V){if("normal"in V)return V;return{normal:V}},qZ=/\/([^\0\t\n\f\r\ ]+)[\0\t\n\f\r\ ]+(\d*\.\d+|\d+)[\0\t\n\f\r\ ]+Tf/,m5=function(V){var q,X,K=(q=V.getDefaultAppearance())!==null&&q!==void 0?q:"",Q=(X=F8(K,qZ).match)!==null&&X!==void 0?X:[],Y=Number(Q[2]);return isFinite(Y)?Y:void 0},XZ=/(\d*\.\d+|\d+)[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]+(g|rg|k)/,j6=function(V){var q,X=(q=V.getDefaultAppearance())!==null&&q!==void 0?q:"",K=F8(X,XZ).match,Q=K!==null&&K!==void 0?K:[],Y=Q[1],J=Q[2],G=Q[3],W=Q[4],Z=Q[5];if(Z==="g"&&Y)return Sq(Number(Y));if(Z==="rg"&&Y&&J&&G)return Y0(Number(Y),Number(J),Number(G));if(Z==="k"&&Y&&J&&G&&W)return yq(Number(Y),Number(J),Number(G),Number(W));return},B6=function(V,q,X,K){var Q;if(K===void 0)K=0;var Y=[E6(q).toString(),T8((Q=X===null||X===void 0?void 0:X.name)!==null&&Q!==void 0?Q:"dummy__noop",K).toString()].join(` -`);V.setDefaultAppearance(Y)},QX=function(V,q){var X,K,Q,Y=j6(q),J=j6(V.acroField),G=q.getRectangle(),W=q.getAppearanceCharacteristics(),Z=q.getBorderStyle(),U=(X=Z===null||Z===void 0?void 0:Z.getWidth())!==null&&X!==void 0?X:0,H=k6(W===null||W===void 0?void 0:W.getRotation()),z=r6(G,H),I=z.width,M=z.height,L=L6(o(o({},G),{rotation:H})),B=Y0(0,0,0),j=(K=l0(W===null||W===void 0?void 0:W.getBorderColor()))!==null&&K!==void 0?K:B,O=l0(W===null||W===void 0?void 0:W.getBackgroundColor()),N=l0(W===null||W===void 0?void 0:W.getBackgroundColor(),0.8),R=(Q=Y!==null&&Y!==void 0?Y:J)!==null&&Q!==void 0?Q:B;if(Y)B6(q,R);else B6(V.acroField,R);var v={x:0+U/2,y:0+U/2,width:I-U,height:M-U,thickness:1.5,borderWidth:U,borderColor:j,markColor:R};return{normal:{on:Q0(L,B2(o(o({},v),{color:O,filled:!0}))),off:Q0(L,B2(o(o({},v),{color:O,filled:!1})))},down:{on:Q0(L,B2(o(o({},v),{color:N,filled:!0}))),off:Q0(L,B2(o(o({},v),{color:N,filled:!1})))}}},YX=function(V,q){var X,K,Q,Y=j6(q),J=j6(V.acroField),G=q.getRectangle(),W=q.getAppearanceCharacteristics(),Z=q.getBorderStyle(),U=(X=Z===null||Z===void 0?void 0:Z.getWidth())!==null&&X!==void 0?X:0,H=k6(W===null||W===void 0?void 0:W.getRotation()),z=r6(G,H),I=z.width,M=z.height,L=L6(o(o({},G),{rotation:H})),B=Y0(0,0,0),j=(K=l0(W===null||W===void 0?void 0:W.getBorderColor()))!==null&&K!==void 0?K:B,O=l0(W===null||W===void 0?void 0:W.getBackgroundColor()),N=l0(W===null||W===void 0?void 0:W.getBackgroundColor(),0.8),R=(Q=Y!==null&&Y!==void 0?Y:J)!==null&&Q!==void 0?Q:B;if(Y)B6(q,R);else B6(V.acroField,R);var v={x:I/2,y:M/2,width:I-U,height:M-U,borderWidth:U,borderColor:j,dotColor:R};return{normal:{on:Q0(L,T2(o(o({},v),{color:O,filled:!0}))),off:Q0(L,T2(o(o({},v),{color:O,filled:!1})))},down:{on:Q0(L,T2(o(o({},v),{color:N,filled:!0}))),off:Q0(L,T2(o(o({},v),{color:N,filled:!1})))}}},JX=function(V,q,X){var K,Q,Y,J,G,W=j6(q),Z=j6(V.acroField),U=m5(q),H=m5(V.acroField),z=q.getRectangle(),I=q.getAppearanceCharacteristics(),M=q.getBorderStyle(),L=I===null||I===void 0?void 0:I.getCaptions(),B=(K=L===null||L===void 0?void 0:L.normal)!==null&&K!==void 0?K:"",j=(Y=(Q=L===null||L===void 0?void 0:L.down)!==null&&Q!==void 0?Q:B)!==null&&Y!==void 0?Y:"",O=(J=M===null||M===void 0?void 0:M.getWidth())!==null&&J!==void 0?J:0,N=k6(I===null||I===void 0?void 0:I.getRotation()),R=r6(z,N),v=R.width,w=R.height,$=L6(o(o({},z),{rotation:N})),S=Y0(0,0,0),h=l0(I===null||I===void 0?void 0:I.getBorderColor()),b=l0(I===null||I===void 0?void 0:I.getBackgroundColor()),C=l0(I===null||I===void 0?void 0:I.getBackgroundColor(),0.8),D={x:O,y:O,width:v-O*2,height:w-O*2},l=v2(B,{alignment:v0.Center,fontSize:U!==null&&U!==void 0?U:H,font:X,bounds:D}),u=v2(j,{alignment:v0.Center,fontSize:U!==null&&U!==void 0?U:H,font:X,bounds:D}),q0=Math.min(l.fontSize,u.fontSize),J0=(G=W!==null&&W!==void 0?W:Z)!==null&&G!==void 0?G:S;if(W||U!==void 0)B6(q,J0,X,q0);else B6(V.acroField,J0,X,q0);var r={x:0+O/2,y:0+O/2,width:v-O,height:w-O,borderWidth:O,borderColor:h,textColor:J0,font:X.name,fontSize:q0};return{normal:Q0($,hq(o(o({},r),{color:b,textLines:[l.line]}))),down:Q0($,hq(o(o({},r),{color:C,textLines:[u.line]})))}},GX=function(V,q,X){var K,Q,Y,J,G=j6(q),W=j6(V.acroField),Z=m5(q),U=m5(V.acroField),H=q.getRectangle(),z=q.getAppearanceCharacteristics(),I=q.getBorderStyle(),M=(K=V.getText())!==null&&K!==void 0?K:"",L=(Q=I===null||I===void 0?void 0:I.getWidth())!==null&&Q!==void 0?Q:0,B=k6(z===null||z===void 0?void 0:z.getRotation()),j=r6(H,B),O=j.width,N=j.height,R=L6(o(o({},H),{rotation:B})),v=Y0(0,0,0),w=l0(z===null||z===void 0?void 0:z.getBorderColor()),$=l0(z===null||z===void 0?void 0:z.getBackgroundColor()),S,h,b=V.isCombed()?0:1,C={x:L+b,y:L+b,width:O-(L+b)*2,height:N-(L+b)*2};if(V.isMultiline()){var D=uq(M,{alignment:V.getAlignment(),fontSize:Z!==null&&Z!==void 0?Z:U,font:X,bounds:C});S=D.lines,h=D.fontSize}else if(V.isCombed()){var D=KX(M,{fontSize:Z!==null&&Z!==void 0?Z:U,font:X,bounds:C,cellCount:(Y=V.getMaxLength())!==null&&Y!==void 0?Y:0});S=D.cells,h=D.fontSize}else{var D=v2(M,{alignment:V.getAlignment(),fontSize:Z!==null&&Z!==void 0?Z:U,font:X,bounds:C});S=[D.line],h=D.fontSize}var l=(J=G!==null&&G!==void 0?G:W)!==null&&J!==void 0?J:v;if(G||Z!==void 0)B6(q,l,X,h);else B6(V.acroField,l,X,h);var u={x:0+L/2,y:0+L/2,width:O-L,height:N-L,borderWidth:L!==null&&L!==void 0?L:0,borderColor:w,textColor:l,font:X.name,fontSize:h,color:$,textLines:S,padding:b};return Q0(R,Pq(u))},ZX=function(V,q,X){var K,Q,Y,J=j6(q),G=j6(V.acroField),W=m5(q),Z=m5(V.acroField),U=q.getRectangle(),H=q.getAppearanceCharacteristics(),z=q.getBorderStyle(),I=(K=V.getSelected()[0])!==null&&K!==void 0?K:"",M=(Q=z===null||z===void 0?void 0:z.getWidth())!==null&&Q!==void 0?Q:0,L=k6(H===null||H===void 0?void 0:H.getRotation()),B=r6(U,L),j=B.width,O=B.height,N=L6(o(o({},U),{rotation:L})),R=Y0(0,0,0),v=l0(H===null||H===void 0?void 0:H.getBorderColor()),w=l0(H===null||H===void 0?void 0:H.getBackgroundColor()),$=1,S={x:M+$,y:M+$,width:j-(M+$)*2,height:O-(M+$)*2},h=v2(I,{alignment:v0.Left,fontSize:W!==null&&W!==void 0?W:Z,font:X,bounds:S}),b=h.line,C=h.fontSize,D=(Y=J!==null&&J!==void 0?J:G)!==null&&Y!==void 0?Y:R;if(J||W!==void 0)B6(q,D,X,C);else B6(V.acroField,D,X,C);var l={x:0+M/2,y:0+M/2,width:j-M,height:O-M,borderWidth:M!==null&&M!==void 0?M:0,borderColor:v,textColor:D,font:X.name,fontSize:C,color:w,textLines:[b],padding:$};return Q0(N,Pq(l))},WX=function(V,q,X){var K,Q,Y=j6(q),J=j6(V.acroField),G=m5(q),W=m5(V.acroField),Z=q.getRectangle(),U=q.getAppearanceCharacteristics(),H=q.getBorderStyle(),z=(K=H===null||H===void 0?void 0:H.getWidth())!==null&&K!==void 0?K:0,I=k6(U===null||U===void 0?void 0:U.getRotation()),M=r6(Z,I),L=M.width,B=M.height,j=L6(o(o({},Z),{rotation:I})),O=Y0(0,0,0),N=l0(U===null||U===void 0?void 0:U.getBorderColor()),R=l0(U===null||U===void 0?void 0:U.getBackgroundColor()),v=V.getOptions(),w=V.getSelected();if(V.isSorted())v.sort();var $="";for(var S=0,h=v.length;S1||Q.length===1&&K)this.enableMultiselect();var G=new Array(Q.length);for(var W=0,Z=Q.length;W1||Q.length===1&&K)this.enableMultiselect();var J=new Array(Q.length);for(var G=0,W=Q.length;GK)throw new XX(X.length,K,this.getName());if(this.markAsDirty(),this.disableRichFormatting(),X)this.acroField.setValue(g.fromText(X));else this.acroField.removeValue()},q.prototype.getAlignment=function(){var X=this.acroField.getQuadding();return X===0?v0.Left:X===1?v0.Center:X===2?v0.Right:v0.Left},q.prototype.setAlignment=function(X){M6(X,"alignment",v0),this.markAsDirty(),this.acroField.setQuadding(X)},q.prototype.getMaxLength=function(){return this.acroField.getMaxLength()},q.prototype.setMaxLength=function(X){if(X6(X,"maxLength",0,Number.MAX_SAFE_INTEGER),this.markAsDirty(),X===void 0)this.acroField.removeMaxLength();else{var K=this.getText();if(K&&K.length>X)throw new VX(K.length,X,this.getName());this.acroField.setMaxLength(X)}},q.prototype.removeMaxLength=function(){this.markAsDirty(),this.acroField.removeMaxLength()},q.prototype.setImage=function(X){var K=this.getAlignment(),Q=K===v0.Center?T6.Center:K===v0.Right?T6.Right:T6.Left,Y=this.acroField.getWidgets();for(var J=0,G=Y.length;J"},Gq=function(q){return D2(q,4)},FG=function(q){if(j4(q))return Gq(q);if(L4(q)){var X=D1(q),V=u1(q);return""+Gq(X)+Gq(V)}var K=u2(q),Q="0x"+K+" is not a valid UTF-8 or UTF-16 codepoint.";throw Error(Q)};var PG=function(q){var X=0,V=function(K){X|=1<=E.Zero&&Z<=E.Seven){if(K+=W,K.length===3||!(H>="0"&&H<="7"))Y(parseInt(K,8)),K=""}else Y(Z)}return new Uint8Array(V)},X.prototype.decodeText=function(){var V=this.asBytes();if(b8(V))return x8(V);return J1(V)},X.prototype.decodeDate=function(){var V=this.decodeText(),K=P8(V);if(!K)throw new G1(V);return K},X.prototype.asString=function(){return this.value},X.prototype.clone=function(){return X.of(this.value)},X.prototype.toString=function(){return"("+this.value+")"},X.prototype.sizeInBytes=function(){return this.value.length+2},X.prototype.copyBytesInto=function(V,K){return V[K++]=E.LeftParen,K+=k0(this.value,V,K),V[K++]=E.RightParen,this.value.length+2},X.of=function(V){return new X(V)},X.fromDate=function(V){var K=e0(String(V.getUTCFullYear()),4,"0"),Q=e0(String(V.getUTCMonth()+1),2,"0"),Y=e0(String(V.getUTCDate()),2,"0"),J=e0(String(V.getUTCHours()),2,"0"),G=e0(String(V.getUTCMinutes()),2,"0"),W=e0(String(V.getUTCSeconds()),2,"0");return new X("D:"+K+Q+Y+J+G+W+"Z")},X}(z0),K0=DG;var uG=function(){function q(X,V,K,Q){var Y=this;this.allGlyphsInFontSortedById=function(){var J=Array(Y.font.characterSet.length);for(var G=0,W=J.length;G>3)]>>7-((M&7)<<0)&1,D=3*C;G[R]=v[D],G[R+1]=v[D+1],G[R+2]=v[D+2],G[R+3]=C<$?w[C]:255}}if(H==2)for(var S=0;S>2)]>>6-((M&3)<<1)&3,D=3*C;G[R]=v[D],G[R+1]=v[D+1],G[R+2]=v[D+2],G[R+3]=C<$?w[C]:255}}if(H==4)for(var S=0;S>1)]>>4-((M&1)<<2)&15,D=3*C;G[R]=v[D],G[R+1]=v[D+1],G[R+2]=v[D+2],G[R+3]=C<$?w[C]:255}}if(H==8)for(var M=0;M>>3)]>>>7-(r&7)&1),I0=u==L*255?0:255;W[J0+r]=I0<<24|u<<16|u<<8|u}else if(H==2)for(var r=0;r>>2)]>>>6-((r&3)<<1)&3),I0=u==L*85?0:255;W[J0+r]=I0<<24|u<<16|u<<8|u}else if(H==4)for(var r=0;r>>1)]>>>4-((r&1)<<2)&15),I0=u==L*17?0:255;W[J0+r]=I0<<24|u<<16|u<<8|u}else if(H==8)for(var r=0;r>>2<<3);while(Q==0){if(Q=B(X,z,1),Y=B(X,z+1,2),z+=3,Y==0){if((z&7)!=0)z+=8-(z&7);var S=(z>>>3)+4,h=X[S-4]|X[S-3]<<8;if($)V=q.H.W(V,U+h);V.set(new K(X.buffer,X.byteOffset+S,h),U),z=S+h<<3,U+=h;continue}if($)V=q.H.W(V,U+131072);if(Y==1)k=w.J,M=w.h,Z=511,H=31;if(Y==2){J=L(X,z,5)+257,G=L(X,z+5,5)+1,W=L(X,z+10,4)+4,z+=14;var b=z,C=1;for(var D=0;D<38;D+=2)w.Q[D]=0,w.Q[D+1]=0;for(var D=0;DC)C=l}z+=3*W,N(w.Q,C),R(w.Q,C,w.u),k=w.w,M=w.d,z=O(w.u,(1<>>4;if(r>>>8==0)V[U++]=r;else if(r==256)break;else{var I0=U+r-254;if(r>264){var n0=w.q[r-257];I0=U+(n0>>>3)+L(X,z,n0&7),z+=n0&7}var N8=M[v(X,z)&H];z+=N8&15;var S8=N8>>>4,y2=w.c[S8],Z2=(y2>>>4)+B(X,z,y2&15);z+=y2&15;while(U>>4;if(U<=15)J[Z]=U,Z++;else{var z=0,k=0;if(U==16)k=3+G(Q,Y,2),Y+=2,z=J[Z-1];else if(U==17)k=3+G(Q,Y,3),Y+=3;else if(U==18)k=11+G(Q,Y,7),Y+=7;var M=Z+k;while(Z>>1;while(JY)Y=W;J++}while(J>1,Z=X[G+1],H=W<<4|Z,U=V-Z,z=X[G]<>>15-V;K[M]=H,z++}}},q.H.l=function(X,V){var K=q.H.m.r,Q=15-V;for(var Y=0;Y>>Q}},q.H.M=function(X,V,K){K=K<<(V&7);var Q=V>>>3;X[Q]|=K,X[Q+1]|=K>>>8},q.H.I=function(X,V,K){K=K<<(V&7);var Q=V>>>3;X[Q]|=K,X[Q+1]|=K>>>8,X[Q+2]|=K>>>16},q.H.e=function(X,V,K){return(X[V>>>3]|X[(V>>>3)+1]<<8)>>>(V&7)&(1<>>3]|X[(V>>>3)+1]<<8|X[(V>>>3)+2]<<16)>>>(V&7)&(1<>>3]|X[(V>>>3)+1]<<8|X[(V>>>3)+2]<<16)>>>(V&7)},q.H.i=function(X,V){return(X[V>>>3]|X[(V>>>3)+1]<<8|X[(V>>>3)+2]<<16|X[(V>>>3)+3]<<24)>>>(V&7)},q.H.m=function(){var X=Uint16Array,V=Uint32Array;return{K:new X(16),j:new X(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[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,0,0,0],q:new X(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[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,0,0],c:new V(32),J:new X(512),_:[],h:new X(32),$:[],w:new X(32768),C:[],v:[],d:new X(32768),D:[],u:new X(512),Q:[],r:new X(32768),s:new V(286),Y:new V(30),a:new V(19),t:new V(15000),k:new X(65536),g:new X(32768)}}(),function(){var X=q.H.m,V=32768;for(var K=0;K>>1|(Q&1431655765)<<1,Q=(Q&3435973836)>>>2|(Q&858993459)<<2,Q=(Q&4042322160)>>>4|(Q&252645135)<<4,Q=(Q&4278255360)>>>8|(Q&16711935)<<8,X.r[K]=(Q>>>16|Q<<16)>>>17}function Y(J,G,W){while(G--!=0)J.push(0,W)}for(var K=0;K<32;K++)X.q[K]=X.S[K]<<3|X.T[K],X.c[K]=X.p[K]<<4|X.z[K];Y(X._,144,8),Y(X._,112,9),Y(X._,24,7),Y(X._,8,8),q.H.n(X._,9),q.H.A(X._,9,X.J),q.H.l(X._,9),Y(X.$,32,5),q.H.n(X.$,5),q.H.A(X.$,5,X.h),q.H.l(X.$,5),Y(X.Q,19,0),Y(X.C,286,0),Y(X.D,30,0),Y(X.v,320,0)}(),q.H.N}();P.decode._readInterlace=function(q,X){var{width:V,height:K}=X,Q=P.decode._getBPP(X),Y=Q>>3,J=Math.ceil(V*Q/8),G=new Uint8Array(K*J),W=0,Z=[0,0,4,0,2,0,1],H=[0,4,0,2,0,1,0],U=[8,8,8,4,4,2,2],z=[8,8,4,4,2,2,1],k=0;while(k<7){var M=U[k],j=z[k],B=0,L=0,O=Z[k];while(O>3];h=h>>7-(S&7)&1,G[w*J+($>>3)]|=h<<7-(($&7)<<0)}if(Q==2){var h=q[S>>3];h=h>>6-(S&7)&3,G[w*J+($>>2)]|=h<<6-(($&3)<<1)}if(Q==4){var h=q[S>>3];h=h>>4-(S&7)&15,G[w*J+($>>1)]|=h<<4-(($&1)<<2)}if(Q>=8){var b=w*J+$*Y;for(var C=0;C>3)+C]}S+=Q,$+=j}v++,w+=M}if(B*L!=0)W+=L*(1+R);k=k+1}return G};P.decode._getBPP=function(q){var X=[1,null,3,1,2,null,4][q.ctype];return X*q.depth};P.decode._filterZero=function(q,X,V,K,Q){var Y=P.decode._getBPP(X),J=Math.ceil(K*Y/8),G=P.decode._paeth;Y=Math.ceil(Y/8);var W=0,Z=1,H=q[V],U=0;if(H>1)q[V]=[0,0,1][H-2];if(H==3)for(U=Y;U>>1)&255;for(var z=0;z>>1);for(;U>>1)}else{for(;U>8&255,q[X+1]=V&255},readUint:function(q,X){return q[X]*16777216+(q[X+1]<<16|q[X+2]<<8|q[X+3])},writeUint:function(q,X,V){q[X]=V>>24&255,q[X+1]=V>>16&255,q[X+2]=V>>8&255,q[X+3]=V&255},readASCII:function(q,X,V){var K="";for(var Q=0;Q=0&&G>=0)U=k*X+M<<2,z=(G+k)*Q+J+M<<2;else U=(-G+k)*X-J+M<<2,z=k*Q+M<<2;if(W==0)K[z]=q[U],K[z+1]=q[U+1],K[z+2]=q[U+2],K[z+3]=q[U+3];else if(W==1){var j=q[U+3]*0.00392156862745098,B=q[U]*j,L=q[U+1]*j,O=q[U+2]*j,N=K[z+3]*0.00392156862745098,R=K[z]*N,v=K[z+1]*N,w=K[z+2]*N,$=1-j,S=j+N*$,h=S==0?0:1/S;K[z+3]=255*S,K[z+0]=(B+R*$)*h,K[z+1]=(L+v*$)*h,K[z+2]=(O+w*$)*h}else if(W==2){var j=q[U+3],B=q[U],L=q[U+1],O=q[U+2],N=K[z+3],R=K[z],v=K[z+1],w=K[z+2];if(j==N&&B==R&&L==v&&O==w)K[z]=0,K[z+1]=0,K[z+2]=0,K[z+3]=0;else K[z]=B,K[z+1]=L,K[z+2]=O,K[z+3]=j}else if(W==3){var j=q[U+3],B=q[U],L=q[U+1],O=q[U+2],N=K[z+3],R=K[z],v=K[z+1],w=K[z+2];if(j==N&&B==R&&L==v&&O==w)continue;if(j<220&&N>20)return!1}}return!0};P.encode=function(q,X,V,K,Q,Y,J){if(K==null)K=0;if(J==null)J=!1;var G=P.encode.compress(q,X,V,K,[!1,!1,!1,0,J]);return P.encode.compressPNG(G,-1),P.encode._main(G,X,V,Q,Y)};P.encodeLL=function(q,X,V,K,Q,Y,J,G){var W={ctype:0+(K==1?0:2)+(Q==0?0:4),depth:Y,frames:[]},Z=Date.now(),H=(K+Q)*Y,U=H*X;for(var z=0;z1,U=!1,z=33+(H?20:0);if(Q.sRGB!=null)z+=13;if(Q.pHYs!=null)z+=21;if(q.ctype==3){var k=q.plte.length;for(var M=0;M>>24!=255)U=!0;z+=8+k*3+4+(U?8+k*1+4:0)}for(var j=0;j>>8&255,$=R>>>16&255;L[Z+N+0]=v,L[Z+N+1]=w,L[Z+N+2]=$}if(Z+=k*3,J(L,Z,Y(L,Z-k*3-4,k*3+4)),Z+=4,U){J(L,Z,k),Z+=4,W(L,Z,"tRNS"),Z+=4;for(var M=0;M>>24&255;Z+=k,J(L,Z,Y(L,Z-k-4,k+4)),Z+=4}}var S=0;for(var j=0;j>2,D>>2));for(var k=0;kq0&&r==u[B-q0])J0[B]=J0[B-q0];else{var I0=N[r];if(I0==null){if(N[r]=I0=R.length,R.push(r),R.length>=300)break}J0[B]=I0}}}var n0=R.length;if(n0<=256&&Z==!1){if(n0<=2)U=1;else if(n0<=4)U=2;else if(n0<=16)U=4;else U=8;U=Math.max(U,W)}for(var k=0;k>1)]|=N1[y1+R0]<<4-(R0&1)*4;else if(U==2)for(var R0=0;R0>2)]|=N1[y1+R0]<<6-(R0&3)*2;else if(U==1)for(var R0=0;R0>3)]|=N1[y1+R0]<<7-(R0&7)*1}Z2=$2,H=3,bq=1}else if(L==!1&&O.length==1){var $2=new Uint8Array(q0*y2*3),pK=q0*y2;for(var B=0;B$)$=b;if(hS)S=h}}if($==-1)v=w=$=S=0;if(Q){if((v&1)==1)v--;if((w&1)==1)w--}var D=($-v+1)*(S-w+1);if(DB)B=R;if(vL)L=v}}if(B==-1)M=j=B=L=0;if(J){if((M&1)==1)M--;if((j&1)==1)j--}Y={x:M,y:j,width:B-M+1,height:L-j+1};var S=K[Q];if(S.rect=Y,S.blend=1,S.img=new Uint8Array(Y.width*Y.height*4),K[Q-1].dispose==0)P._copyTile(Z,X,V,S.img,Y.width,Y.height,-Y.x,-Y.y,0),P.encode._prepareDiff(z,X,V,S.img,Y);else P._copyTile(z,X,V,S.img,Y.width,Y.height,-Y.x,-Y.y,0)};P.encode._prepareDiff=function(q,X,V,K,Q){P._copyTile(q,X,V,K,Q.width,Q.height,-Q.x,-Q.y,2)};P.encode._filterZero=function(q,X,V,K,Q,Y,J){var G=[],W=[0,1,2,3,4];if(Y!=-1)W=[Y];else if(X*K>500000||V==1)W=[0];var Z;if(J)Z={level:0};var H=J&&UZIP!=null?UZIP:kK.default;for(var U=0;U>1)+256&255;if(Y==4)for(var Z=Q;Z>1)&255;for(var Z=Q;Z>1)&255}if(Y==4){for(var Z=0;Z>>1;else V=V>>>1;q[X]=V}return q}(),update:function(q,X,V,K){for(var Q=0;Q>>8;return q},crc:function(q,X,V){return P.crc.update(4294967295,q,X,V)^4294967295}};P.quantize=function(q,X){var V=new Uint8Array(q),K=V.slice(0),Q=new Uint32Array(K.buffer),Y=P.quantize.getKDtree(K,X),J=Y[0],G=Y[1],W=P.quantize.planeDst,Z=V,H=Q,U=Z.length,z=new Uint8Array(V.length>>2);for(var k=0;k>2]=O.ind,H[k>>2]=O.est.rgba}return{abuf:K.buffer,inds:z,plte:G}};P.quantize.getKDtree=function(q,X,V){if(V==null)V=0.0001;var K=new Uint32Array(q.buffer),Q={i0:0,i1:q.length,bst:null,est:null,tdst:0,left:null,right:null};Q.bst=P.quantize.stats(q,Q.i0,Q.i1),Q.est=P.quantize.estats(Q.bst);var Y=[Q];while(Y.lengthJ)J=Y[W].est.L,G=W;if(J=H||Z.i1<=H;if(U){Z.est.L=0;continue}var z={i0:Z.i0,i1:H,bst:null,est:null,tdst:0,left:null,right:null};z.bst=P.quantize.stats(q,z.i0,z.i1),z.est=P.quantize.estats(z.bst);var k={i0:H,i1:Z.i1,bst:null,est:null,tdst:0,left:null,right:null};k.bst={R:[],m:[],N:Z.bst.N-z.bst.N};for(var W=0;W<16;W++)k.bst.R[W]=Z.bst.R[W]-z.bst.R[W];for(var W=0;W<4;W++)k.bst.m[W]=Z.bst.m[W]-z.bst.m[W];k.est=P.quantize.estats(k.bst),Z.left=z,Z.right=k,Y[G]=z,Y.push(k)}Y.sort(function(M,j){return j.bst.N-M.bst.N});for(var W=0;W0)J=q.right,G=q.left;var W=P.quantize.getNearest(J,X,V,K,Q);if(W.tdst<=Y*Y)return W;var Z=P.quantize.getNearest(G,X,V,K,Q);return Z.tdstY)K-=4;if(V>=K)break;var W=X[V>>2];X[V>>2]=X[K>>2],X[K>>2]=W,V+=4,K-=4}while(J(q,V,Q)>Y)V-=4;return V+4};P.quantize.vecDot=function(q,X,V){return q[X]*V[0]+q[X+1]*V[1]+q[X+2]*V[2]+q[X+3]*V[3]};P.quantize.stats=function(q,X,V){var K=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],Q=[0,0,0,0],Y=V-X>>2;for(var J=X;J>>0}};P.M4={multVec:function(q,X){return[q[0]*X[0]+q[1]*X[1]+q[2]*X[2]+q[3]*X[3],q[4]*X[0]+q[5]*X[1]+q[6]*X[2]+q[7]*X[3],q[8]*X[0]+q[9]*X[1]+q[10]*X[2]+q[11]*X[3],q[12]*X[0]+q[13]*X[1]+q[14]*X[2]+q[15]*X[3]]},dot:function(q,X){return q[0]*X[0]+q[1]*X[1]+q[2]*X[2]+q[3]*X[3]},sml:function(q,X){return[q*X[0],q*X[1],q*X[2],q*X[3]]}};P.encode.concatRGBA=function(q){var X=0;for(var V=0;V1)throw Error("Animated PNGs are not supported");var Q=new Uint8Array(K[0]),Y=lG(Q),J=Y.rgbChannel,G=Y.alphaChannel;this.rgbChannel=J;var W=G.some(function(Z){return Z<255});if(W)this.alphaChannel=G;this.type=fG(V.ctype),this.width=V.width,this.height=V.height,this.bitsPerComponent=8}return q.load=function(X){return new q(X)},q}();var _G=function(){function q(X){this.image=X,this.bitsPerComponent=X.bitsPerComponent,this.width=X.width,this.height=X.height,this.colorSpace="DeviceRGB"}return q.for=function(X){return _(this,void 0,void 0,function(){var V;return c(this,function(K){return V=IK.load(X),[2,new q(V)]})})},q.prototype.embedIntoContext=function(X,V){return _(this,void 0,void 0,function(){var K,Q;return c(this,function(Y){if(K=this.embedAlphaChannel(X),Q=X.flateStream(this.image.rgbChannel,{Type:"XObject",Subtype:"Image",BitsPerComponent:this.image.bitsPerComponent,Width:this.image.width,Height:this.image.height,ColorSpace:this.colorSpace,SMask:K}),V)return X.assign(V,Q),[2,V];else return[2,X.register(Q)];return[2]})})},q.prototype.embedAlphaChannel=function(X){if(!this.image.alphaChannel)return;var V=X.flateStream(this.image.alphaChannel,{Type:"XObject",Subtype:"Image",Height:this.image.height,Width:this.image.width,BitsPerComponent:this.image.bitsPerComponent,ColorSpace:"DeviceGray",Decode:[0,1]});return X.register(V)},q}(),X8=_G;var cG=function(){function q(X,V,K){this.bytes=X,this.start=V||0,this.pos=this.start,this.end=!!V&&!!K?V+K:this.bytes.length}return Object.defineProperty(q.prototype,"length",{get:function(){return this.end-this.start},enumerable:!1,configurable:!0}),Object.defineProperty(q.prototype,"isEmpty",{get:function(){return this.length===0},enumerable:!1,configurable:!0}),q.prototype.getByte=function(){if(this.pos>=this.end)return-1;return this.bytes[this.pos++]},q.prototype.getUint16=function(){var X=this.getByte(),V=this.getByte();if(X===-1||V===-1)return-1;return(X<<8)+V},q.prototype.getInt32=function(){var X=this.getByte(),V=this.getByte(),K=this.getByte(),Q=this.getByte();return(X<<24)+(V<<16)+(K<<8)+Q},q.prototype.getBytes=function(X,V){if(V===void 0)V=!1;var K=this.bytes,Q=this.pos,Y=this.end;if(!X){var J=K.subarray(Q,Y);return V?new Uint8ClampedArray(J):J}else{var G=Q+X;if(G>Y)G=Y;this.pos=G;var J=K.subarray(Q,G);return V?new Uint8ClampedArray(J):J}},q.prototype.peekByte=function(){var X=this.getByte();return this.pos--,X},q.prototype.peekBytes=function(X,V){if(V===void 0)V=!1;var K=this.getBytes(X,V);return this.pos-=K.length,K},q.prototype.skip=function(X){if(!X)X=1;this.pos+=X},q.prototype.reset=function(){this.pos=this.start},q.prototype.moveStart=function(){this.start=this.pos},q.prototype.makeSubStream=function(X,V){return new q(this.bytes,X,V)},q.prototype.decode=function(){return this.bytes},q}(),Hq=cG;var pG=new Uint8Array(0),dG=function(){function q(X){if(this.pos=0,this.bufferLength=0,this.eof=!1,this.buffer=pG,this.minBufferLength=512,X)while(this.minBufferLengthY)K=Y}else{while(!this.eof)this.readBlock();K=this.bufferLength}this.pos=K;var J=this.buffer.subarray(Q,K);return V&&!(J instanceof Uint8ClampedArray)?new Uint8ClampedArray(J):J},q.prototype.peekByte=function(){var X=this.getByte();return this.pos--,X},q.prototype.peekBytes=function(X,V){if(V===void 0)V=!1;var K=this.getBytes(X,V);return this.pos-=K.length,K},q.prototype.skip=function(X){if(!X)X=1;this.pos+=X},q.prototype.reset=function(){this.pos=0},q.prototype.makeSubStream=function(X,V){var K=X+V;while(this.bufferLength<=K&&!this.eof)this.readBlock();return new Hq(this.buffer,X,V)},q.prototype.decode=function(){while(!this.eof)this.readBlock();return this.buffer.subarray(0,this.bufferLength)},q.prototype.readBlock=function(){throw new u0(this.constructor.name,"readBlock")},q.prototype.ensureBuffer=function(X){var V=this.buffer;if(X<=V.byteLength)return V;var K=this.minBufferLength;while(K=0;--Z)W[G+Z]=U&255,U>>=8}},X}(d2),jK=nG;var rG=function(q){A(X,q);function X(V,K){var Q=q.call(this,K)||this;if(Q.stream=V,Q.firstDigit=-1,K)K=0.5*K;return Q}return X.prototype.readBlock=function(){var V=8000,K=this.stream.getBytes(V);if(!K.length){this.eof=!0;return}var Q=K.length+1>>1,Y=this.ensureBuffer(this.bufferLength+Q),J=this.bufferLength,G=this.firstDigit;for(var W=0,Z=K.length;W=48&&H<=57)U=H&15;else if(H>=65&&H<=70||H>=97&&H<=102)U=(H&15)+9;else if(H===62){this.eof=!0;break}else continue;if(G<0)G=U;else Y[J++]=G<<4|U,G=-1}if(G>=0&&this.eof)Y[J++]=G<<4,G=-1;this.firstDigit=G,this.bufferLength=J},X}(d2),LK=rG;var BK=new Int32Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),iG=new Int32Array([3,4,5,6,7,8,9,10,65547,65549,65551,65553,131091,131095,131099,131103,196643,196651,196659,196667,262211,262227,262243,262259,327811,327843,327875,327907,258,258,258]),aG=new Int32Array([1,2,3,4,65541,65543,131081,131085,196625,196633,262177,262193,327745,327777,393345,393409,459009,459137,524801,525057,590849,591361,657409,658433,724993,727041,794625,798721,868353,876545]),oG=[new Int32Array([459008,524368,524304,524568,459024,524400,524336,590016,459016,524384,524320,589984,524288,524416,524352,590048,459012,524376,524312,589968,459028,524408,524344,590032,459020,524392,524328,590000,524296,524424,524360,590064,459010,524372,524308,524572,459026,524404,524340,590024,459018,524388,524324,589992,524292,524420,524356,590056,459014,524380,524316,589976,459030,524412,524348,590040,459022,524396,524332,590008,524300,524428,524364,590072,459009,524370,524306,524570,459025,524402,524338,590020,459017,524386,524322,589988,524290,524418,524354,590052,459013,524378,524314,589972,459029,524410,524346,590036,459021,524394,524330,590004,524298,524426,524362,590068,459011,524374,524310,524574,459027,524406,524342,590028,459019,524390,524326,589996,524294,524422,524358,590060,459015,524382,524318,589980,459031,524414,524350,590044,459023,524398,524334,590012,524302,524430,524366,590076,459008,524369,524305,524569,459024,524401,524337,590018,459016,524385,524321,589986,524289,524417,524353,590050,459012,524377,524313,589970,459028,524409,524345,590034,459020,524393,524329,590002,524297,524425,524361,590066,459010,524373,524309,524573,459026,524405,524341,590026,459018,524389,524325,589994,524293,524421,524357,590058,459014,524381,524317,589978,459030,524413,524349,590042,459022,524397,524333,590010,524301,524429,524365,590074,459009,524371,524307,524571,459025,524403,524339,590022,459017,524387,524323,589990,524291,524419,524355,590054,459013,524379,524315,589974,459029,524411,524347,590038,459021,524395,524331,590006,524299,524427,524363,590070,459011,524375,524311,524575,459027,524407,524343,590030,459019,524391,524327,589998,524295,524423,524359,590062,459015,524383,524319,589982,459031,524415,524351,590046,459023,524399,524335,590014,524303,524431,524367,590078,459008,524368,524304,524568,459024,524400,524336,590017,459016,524384,524320,589985,524288,524416,524352,590049,459012,524376,524312,589969,459028,524408,524344,590033,459020,524392,524328,590001,524296,524424,524360,590065,459010,524372,524308,524572,459026,524404,524340,590025,459018,524388,524324,589993,524292,524420,524356,590057,459014,524380,524316,589977,459030,524412,524348,590041,459022,524396,524332,590009,524300,524428,524364,590073,459009,524370,524306,524570,459025,524402,524338,590021,459017,524386,524322,589989,524290,524418,524354,590053,459013,524378,524314,589973,459029,524410,524346,590037,459021,524394,524330,590005,524298,524426,524362,590069,459011,524374,524310,524574,459027,524406,524342,590029,459019,524390,524326,589997,524294,524422,524358,590061,459015,524382,524318,589981,459031,524414,524350,590045,459023,524398,524334,590013,524302,524430,524366,590077,459008,524369,524305,524569,459024,524401,524337,590019,459016,524385,524321,589987,524289,524417,524353,590051,459012,524377,524313,589971,459028,524409,524345,590035,459020,524393,524329,590003,524297,524425,524361,590067,459010,524373,524309,524573,459026,524405,524341,590027,459018,524389,524325,589995,524293,524421,524357,590059,459014,524381,524317,589979,459030,524413,524349,590043,459022,524397,524333,590011,524301,524429,524365,590075,459009,524371,524307,524571,459025,524403,524339,590023,459017,524387,524323,589991,524291,524419,524355,590055,459013,524379,524315,589975,459029,524411,524347,590039,459021,524395,524331,590007,524299,524427,524363,590071,459011,524375,524311,524575,459027,524407,524343,590031,459019,524391,524327,589999,524295,524423,524359,590063,459015,524383,524319,589983,459031,524415,524351,590047,459023,524399,524335,590015,524303,524431,524367,590079]),9],sG=[new Int32Array([327680,327696,327688,327704,327684,327700,327692,327708,327682,327698,327690,327706,327686,327702,327694,0,327681,327697,327689,327705,327685,327701,327693,327709,327683,327699,327691,327707,327687,327703,327695,0]),5],tG=function(q){A(X,q);function X(V,K){var Q=q.call(this,K)||this;Q.stream=V;var Y=V.getByte(),J=V.getByte();if(Y===-1||J===-1)throw Error("Invalid header in flate stream: "+Y+", "+J);if((Y&15)!==8)throw Error("Unknown compression method in flate stream: "+Y+", "+J);if(((Y<<8)+J)%31!==0)throw Error("Bad FCHECK in flate stream: "+Y+", "+J);if(J&32)throw Error("FDICT bit set in flate stream: "+Y+", "+J);return Q.codeSize=0,Q.codeBuf=0,Q}return X.prototype.readBlock=function(){var V,K,Q=this.stream,Y=this.getBits(3);if(Y&1)this.eof=!0;if(Y>>=1,Y===0){var J=void 0;if((J=Q.getByte())===-1)throw Error("Bad block header in flate stream");var G=J;if((J=Q.getByte())===-1)throw Error("Bad block header in flate stream");if(G|=J<<8,(J=Q.getByte())===-1)throw Error("Bad block header in flate stream");var W=J;if((J=Q.getByte())===-1)throw Error("Bad block header in flate stream");if(W|=J<<8,W!==(~G&65535)&&(G!==0||W!==0))throw Error("Bad uncompressed block length in flate stream");this.codeBuf=0,this.codeSize=0;var Z=this.bufferLength;V=this.ensureBuffer(Z+G);var H=Z+G;if(this.bufferLength=H,G===0){if(Q.peekByte()===-1)this.eof=!0}else for(var U=Z;U0)v[O++]=S}z=this.generateHuffmanTable(v.subarray(0,M)),k=this.generateHuffmanTable(v.subarray(M,R))}else throw Error("Unknown block type in flate stream");V=this.buffer;var C=V?V.length:0,D=this.bufferLength;while(!0){var l=this.getCode(z);if(l<256){if(D+1>=C)V=this.ensureBuffer(D+1),C=V.length;V[D++]=l;continue}if(l===256){this.bufferLength=D;return}l-=257,l=iG[l];var u=l>>16;if(u>0)u=this.getBits(u);if(K=(l&65535)+u,l=this.getCode(k),l=aG[l],u=l>>16,u>0)u=this.getBits(u);var q0=(l&65535)+u;if(D+K>=C)V=this.ensureBuffer(D+K),C=V.length;for(var J0=0;J0>V,this.codeSize=Q-=V,J},X.prototype.getCode=function(V){var K=this.stream,Q=V[0],Y=V[1],J=this.codeSize,G=this.codeBuf,W;while(J>16,U=Z&65535;if(H<1||J>H,this.codeSize=J-H,U},X.prototype.generateHuffmanTable=function(V){var K=V.length,Q=0,Y;for(Y=0;YQ)Q=V[Y];var J=1<>=1;for(Y=z;Y0;if(!v||v<256)B[0]=v,L=1;else if(v>=258)if(v=0;J--)B[J]=U[G],G=k[G]}else B[L++]=B[0];else if(v===256){M=9,H=258,L=0;continue}else{this.eof=!0,delete this.lzwState;break}if(w)k[H]=j,z[H]=z[j]+1,U[H]=B[0],H++,M=H+Z&H+Z-1?M:Math.min(Math.log(H+Z)/0.6931471805599453+1,12)|0;if(j=v,O+=L,K>>K&(1<0){var J=this.stream.getBytes(Y);K.set(J,Q),Q+=Y}}else{Y=257-Y;var G=V[1];K=this.ensureBuffer(Q+Y+1);for(var W=0;WK.size())throw new Y5(V,0,K.size());K.remove(V)}},X.prototype.normalizedEntries=function(){var V=this.Kids();if(!V)V=this.dict.context.obj([this.ref]),this.dict.set(I.of("Kids"),V);return{Kids:V}},X.fromDict=function(V,K){return new X(V,K)},X}(Y8),K2=UZ;var zZ=function(q){A(X,q);function X(){return q!==null&&q.apply(this,arguments)||this}return X.prototype.Opt=function(){return this.dict.lookupMaybe(I.of("Opt"),K0,g,i)},X.prototype.setOpt=function(V){this.dict.set(I.of("Opt"),this.dict.context.obj(V))},X.prototype.getExportValues=function(){var V=this.Opt();if(!V)return;if(V instanceof K0||V instanceof g)return[V];var K=[];for(var Q=0,Y=V.size();QK.size())throw new Y5(V,0,K.size());K.remove(V)}},X.prototype.normalizeExportValues=function(){var V,K,Q,Y,J=(V=this.getExportValues())!==null&&V!==void 0?V:[],G=[],W=this.getWidgets();for(var Z=0,H=W.length;Z1){if(!this.hasFlag(G0.MultiSelect))throw new W7;this.dict.set(I.of("V"),this.dict.context.obj(V))}this.updateSelectedIndices(V)},X.prototype.valuesAreValid=function(V){var K=this.getOptions(),Q=function(W,Z){var H=V[W].decodeText();if(!K.find(function(U){return H===(U.display||U.value).decodeText()}))return{value:!1}};for(var Y=0,J=V.length;Y1){var K=Array(V.length),Q=this.getOptions(),Y=function(W,Z){var H=V[W].decodeText();K[W]=Q.findIndex(function(U){return H===(U.display||U.value).decodeText()})};for(var J=0,G=V.length;J0){var G=J.lookup(0,K0,g),W=J.lookupMaybe(1,K0,g);K.push({value:G,display:W||G})}}}return K}return[]},X}(K2),G8=kZ;var IZ=function(q){A(X,q);function X(){return q!==null&&q.apply(this,arguments)||this}return X.fromDict=function(V,K){return new X(V,K)},X.create=function(V){var K=V.obj({FT:"Ch",Ff:G0.Combo,Kids:[]}),Q=V.register(K);return new X(K,Q)},X}(G8),Q6=IZ;var EZ=function(q){A(X,q);function X(){return q!==null&&q.apply(this,arguments)||this}return X.prototype.addField=function(V){var K=this.normalizedEntries().Kids;K===null||K===void 0||K.push(V)},X.prototype.normalizedEntries=function(){var V=this.Kids();if(!V)V=this.dict.context.obj([]),this.dict.set(I.of("Kids"),V);return{Kids:V}},X.fromDict=function(V,K){return new X(V,K)},X.create=function(V){var K=V.obj({}),Q=V.register(K);return new X(K,Q)},X}(Y8),Y6=EZ;var jZ=function(q){A(X,q);function X(){return q!==null&&q.apply(this,arguments)||this}return X.fromDict=function(V,K){return new X(V,K)},X}(K2),F6=jZ;var LZ=function(q){A(X,q);function X(){return q!==null&&q.apply(this,arguments)||this}return X.prototype.MaxLen=function(){var V=this.dict.lookup(I.of("MaxLen"));if(V instanceof x)return V;return},X.prototype.Q=function(){var V=this.dict.lookup(I.of("Q"));if(V instanceof x)return V;return},X.prototype.setMaxLength=function(V){this.dict.set(I.of("MaxLen"),x.of(V))},X.prototype.removeMaxLength=function(){this.dict.delete(I.of("MaxLen"))},X.prototype.getMaxLength=function(){var V;return(V=this.MaxLen())===null||V===void 0?void 0:V.asNumber()},X.prototype.setQuadding=function(V){this.dict.set(I.of("Q"),x.of(V))},X.prototype.getQuadding=function(){var V;return(V=this.Q())===null||V===void 0?void 0:V.asNumber()},X.prototype.setValue=function(V){this.dict.set(I.of("V"),V)},X.prototype.removeValue=function(){this.dict.delete(I.of("V"))},X.prototype.getValue=function(){var V=this.V();if(V instanceof K0||V instanceof g)return V;return},X.fromDict=function(V,K){return new X(V,K)},X.create=function(V){var K=V.obj({FT:"Tx",Kids:[]}),Q=V.register(K);return new X(K,Q)},X}(K2),J6=LZ;var BZ=function(q){A(X,q);function X(){return q!==null&&q.apply(this,arguments)||this}return X.fromDict=function(V,K){return new X(V,K)},X.create=function(V){var K=V.obj({FT:"Btn",Ff:f0.PushButton,Kids:[]}),Q=V.register(K);return new X(K,Q)},X}(h6),G6=BZ;var TZ=function(q){A(X,q);function X(){return q!==null&&q.apply(this,arguments)||this}return X.prototype.setValue=function(V){var K=this.getOnValues();if(!K.includes(V)&&V!==I.of("Off"))throw new J5;this.dict.set(I.of("V"),V);var Q=this.getWidgets();for(var Y=0,J=Q.length;YY)throw new qq(K,Y);var J=K;for(var G=0,W=Q.size();GJ)return H.insertLeafNode(V,J)||Z;else J-=H.Count().asNumber();if(H instanceof _0)J-=1}if(J===0){this.insertLeafKid(Q.size(),V);return}throw new Xq(K,"insertLeafNode")},X.prototype.removeLeafNode=function(V,K){if(K===void 0)K=!0;var Q=this.Kids(),Y=this.Count().asNumber();if(V>=Y)throw new qq(V,Y);var J=V;for(var G=0,W=Q.size();GJ){if(H.removeLeafNode(J,K),K&&H.Kids().size()===0)Q.remove(G);return}else J-=H.Count().asNumber();if(H instanceof _0)if(J===0){this.removeKid(G);return}else J-=1}throw new Xq(V,"removeLeafNode")},X.prototype.ascend=function(V){V(this);var K=this.Parent();if(K)K.ascend(V)},X.prototype.traverse=function(V){var K=this.Kids();for(var Q=0,Y=K.size();QNumber.MAX_SAFE_INTEGER)if(this.capNumbers){var Q="Parsed number that is too large for some PDF readers: "+X+", using Number.MAX_SAFE_INTEGER instead.";return console.warn(Q),Number.MAX_SAFE_INTEGER}else{var Q="Parsed number that is too large for some PDF readers: "+X+", not capping.";console.warn(Q)}return K},q.prototype.skipWhitespace=function(){while(!this.bytes.done()&&k2[this.bytes.peek()])this.bytes.next()},q.prototype.skipLine=function(){while(!this.bytes.done()){var X=this.bytes.peek();if(X===AK||X===NK)return;this.bytes.next()}},q.prototype.skipComment=function(){if(this.bytes.peek()!==E.Percent)return!1;while(!this.bytes.done()){var X=this.bytes.peek();if(X===AK||X===NK)return!0;this.bytes.next()}return!0},q.prototype.skipWhitespaceAndComments=function(){this.skipWhitespace();while(this.skipComment())this.skipWhitespace()},q.prototype.matchKeyword=function(X){var V=this.bytes.offset();for(var K=0,Q=X.length;K=this.length},q.prototype.offset=function(){return this.idx},q.prototype.slice=function(X,V){return this.bytes.slice(X,V)},q.prototype.position=function(){return{line:this.line,column:this.column,offset:this.idx}},q.of=function(X){return new q(X)},q.fromPDFRawStream=function(X){return q.of(V8(X).decode())},q}(),D6=CZ;var hZ=E.Space,U1=E.CarriageReturn,z1=E.Newline,M1=[E.s,E.t,E.r,E.e,E.a,E.m],Eq=[E.e,E.n,E.d,E.s,E.t,E.r,E.e,E.a,E.m],M0={header:[E.Percent,E.P,E.D,E.F,E.Dash],eof:[E.Percent,E.Percent,E.E,E.O,E.F],obj:[E.o,E.b,E.j],endobj:[E.e,E.n,E.d,E.o,E.b,E.j],xref:[E.x,E.r,E.e,E.f],trailer:[E.t,E.r,E.a,E.i,E.l,E.e,E.r],startxref:[E.s,E.t,E.a,E.r,E.t,E.x,E.r,E.e,E.f],true:[E.t,E.r,E.u,E.e],false:[E.f,E.a,E.l,E.s,E.e],null:[E.n,E.u,E.l,E.l],stream:M1,streamEOF1:Q0(M1,[hZ,U1,z1]),streamEOF2:Q0(M1,[U1,z1]),streamEOF3:Q0(M1,[U1]),streamEOF4:Q0(M1,[z1]),endstream:Eq,EOF1endstream:Q0([U1,z1],Eq),EOF2endstream:Q0([U1],Eq),EOF3endstream:Q0([z1],Eq)};var FZ=function(q){A(X,q);function X(V,K,Q){if(Q===void 0)Q=!1;var Y=q.call(this,V,Q)||this;return Y.context=K,Y}return X.prototype.parseObject=function(){if(this.skipWhitespaceAndComments(),this.matchKeyword(M0.true))return c2.True;if(this.matchKeyword(M0.false))return c2.False;if(this.matchKeyword(M0.null))return F0;var V=this.bytes.peek();if(V===E.LessThan&&this.bytes.peekAhead(1)===E.LessThan)return this.parseDictOrStream();if(V===E.LessThan)return this.parseHexString();if(V===E.LeftParen)return this.parseString();if(V===E.ForwardSlash)return this.parseName();if(V===E.LeftSquareBracket)return this.parseArray();if(H1[V])return this.parseNumberOrRef();throw new M7(this.bytes.position(),V)},X.prototype.parseNumberOrRef=function(){var V=this.parseRawNumber();this.skipWhitespaceAndComments();var K=this.bytes.offset();if(P0[this.bytes.peek()]){var Q=this.parseRawNumber();if(this.skipWhitespaceAndComments(),this.bytes.peek()===E.R)return this.bytes.assertNext(E.R),a.of(V,Q)}return this.bytes.moveTo(K),x.of(V)},X.prototype.parseHexString=function(){var V="";this.bytes.assertNext(E.LessThan);while(!this.bytes.done()&&this.bytes.peek()!==E.GreaterThan)V+=t0(this.bytes.next());return this.bytes.assertNext(E.GreaterThan),g.of(V)},X.prototype.parseString=function(){var V=0,K=!1,Q="";while(!this.bytes.done()){var Y=this.bytes.next();if(Q+=t0(Y),!K){if(Y===E.LeftParen)V+=1;if(Y===E.RightParen)V-=1}if(Y===E.BackSlash)K=!K;else if(K)K=!1;if(V===0)return K0.of(Q.substring(1,Q.length-1))}throw new E7(this.bytes.position())},X.prototype.parseName=function(){this.bytes.assertNext(E.ForwardSlash);var V="";while(!this.bytes.done()){var K=this.bytes.peek();if(k2[K]||V2[K])break;V+=t0(K),this.bytes.next()}return I.of(V)},X.prototype.parseArray=function(){this.bytes.assertNext(E.LeftSquareBracket),this.skipWhitespaceAndComments();var V=i.withContext(this.context);while(this.bytes.peek()!==E.RightSquareBracket){var K=this.parseObject();V.push(K),this.skipWhitespaceAndComments()}return this.bytes.assertNext(E.RightSquareBracket),V},X.prototype.parseDict=function(){this.bytes.assertNext(E.LessThan),this.bytes.assertNext(E.LessThan),this.skipWhitespaceAndComments();var V=new Map;while(!this.bytes.done()&&this.bytes.peek()!==E.GreaterThan&&this.bytes.peekAhead(1)!==E.GreaterThan){var K=this.parseName(),Q=this.parseObject();V.set(K,Q),this.skipWhitespaceAndComments()}this.skipWhitespaceAndComments(),this.bytes.assertNext(E.GreaterThan),this.bytes.assertNext(E.GreaterThan);var Y=V.get(I.of("Type"));if(Y===I.of("Catalog"))return W8.fromMapWithContext(V,this.context);else if(Y===I.of("Pages"))return H8.fromMapWithContext(V,this.context);else if(Y===I.of("Page"))return _0.fromMapWithContext(V,this.context);else return m.fromMapWithContext(V,this.context)},X.prototype.parseDictOrStream=function(){var V=this.bytes.position(),K=this.parseDict();if(this.skipWhitespaceAndComments(),!this.matchKeyword(M0.streamEOF1)&&!this.matchKeyword(M0.streamEOF2)&&!this.matchKeyword(M0.streamEOF3)&&!this.matchKeyword(M0.streamEOF4)&&!this.matchKeyword(M0.stream))return K;var Q=this.bytes.offset(),Y,J=K.get(I.of("Length"));if(J instanceof x){if(Y=Q+J.asNumber(),this.bytes.moveTo(Y),this.skipWhitespaceAndComments(),!this.matchKeyword(M0.endstream))this.bytes.moveTo(Q),Y=this.findEndOfStreamFallback(V)}else Y=this.findEndOfStreamFallback(V);var G=this.bytes.slice(Q,Y);return A2.of(K,G)},X.prototype.findEndOfStreamFallback=function(V){var K=1,Q=this.bytes.offset();while(!this.bytes.done()){if(Q=this.bytes.offset(),this.matchKeyword(M0.stream))K+=1;else if(this.matchKeyword(M0.EOF1endstream)||this.matchKeyword(M0.EOF2endstream)||this.matchKeyword(M0.EOF3endstream)||this.matchKeyword(M0.endstream))K-=1;else this.bytes.next();if(K===0)break}if(K!==0)throw new I7(V);return Q},X.forBytes=function(V,K,Q){return new X(D6.of(V),K,Q)},X.forByteStream=function(V,K,Q){if(Q===void 0)Q=!1;return new X(V,K,Q)},X}(SK),U8=FZ;var PZ=function(q){A(X,q);function X(V,K){var Q=q.call(this,D6.fromPDFRawStream(V),V.dict.context)||this,Y=V.dict;return Q.alreadyParsed=!1,Q.shouldWaitForTick=K||function(){return!1},Q.firstOffset=Y.lookup(I.of("First"),x).asNumber(),Q.objectCount=Y.lookup(I.of("N"),x).asNumber(),Q}return X.prototype.parseIntoContext=function(){return _(this,void 0,void 0,function(){var V,K,Q,Y,J,G,W,Z;return c(this,function(H){switch(H.label){case 0:if(this.alreadyParsed)throw new Q5("PDFObjectStreamParser","parseIntoContext");this.alreadyParsed=!0,V=this.parseOffsetsAndObjectNumbers(),K=0,Q=V.length,H.label=1;case 1:if(!(K=E.Space&&K<=E.Tilde;if(Q){if(this.matchKeyword(M0.xref)||this.matchKeyword(M0.trailer)||this.matchKeyword(M0.startxref)||this.matchIndirectObjectHeader()){this.bytes.moveTo(V);break}}this.bytes.next()}},X.prototype.skipBinaryHeaderComment=function(){this.skipWhitespaceAndComments();try{var V=this.bytes.offset();this.parseIndirectObjectHeader(),this.bytes.moveTo(V)}catch(K){this.bytes.next(),this.skipWhitespaceAndComments()}},X.forBytesWithOptions=function(V,K,Q,Y){return new X(V,K,Q,Y)},X}(U8),Bq=uZ;var n2=function(q){return 1<0)K[K.length]=+Q;V[V.length]={cmd:X,args:K},K=[],Q="",Y=!1}X=Z}else if([" ",","].includes(Z)||Z==="-"&&Q.length>0&&Q[Q.length-1]!=="e"||Z==="."&&Y){if(Q.length===0)continue;if(K.length===J){if(V[V.length]={cmd:X,args:K},K=[+Q],X==="M")X="L";if(X==="m")X="l"}else K[K.length]=+Q;Y=Z===".",Q=["-","."].includes(Z)?Z:""}else if(Q+=Z,Z===".")Y=!0}if(Q.length>0)if(K.length===J){if(V[V.length]={cmd:X,args:K},K=[+Q],X==="M")X="L";if(X==="m")X="l"}else K[K.length]=+Q;return V[V.length]={cmd:X,args:K},V},oZ=function(q){d=n=Z0=W0=v1=R1=0;var X=[];for(var V=0;V1)z=Math.sqrt(z),V*=z,K*=z;var k=U/V,M=H/V,j=-H/K,B=U/K,L=k*G+M*W,O=j*G+B*W,N=k*q+M*X,R=j*q+B*X,v=(N-L)*(N-L)+(R-O)*(R-O),w=1/v-0.25;if(w<0)w=0;var $=Math.sqrt(w);if(Y===Q)$=-$;var S=0.5*(L+N)-$*(R-O),h=0.5*(O+R)+$*(N-L),b=Math.atan2(O-h,L-S),C=Math.atan2(R-h,N-S),D=C-b;if(D<0&&Y===1)D+=2*Math.PI;else if(D>0&&Y===0)D-=2*Math.PI;var l=Math.ceil(Math.abs(D/(Math.PI*0.5+0.001))),u=[];for(var q0=0;q0q.length)return Q-1;var B=X.heightAtSize(Q),L=B+B*0.2,O=L*Y;if(O>Math.abs(V.height))return Q-1;Q+=1}return Q},K3=function(q,X,V,K){var Q=V.width/K,Y=V.height,J=mK,G=J4(q);while(JQ*0.75;if(U)return J-1}var z=X.heightAtSize(J,{descender:!1});if(z>Y)return J-1;J+=1}return J},Q3=function(q){for(var X=q.length;X>0;X--)if(/\s/.test(q[X]))return X;return},Y3=function(q,X,V,K){var Q,Y=q.length;while(Y>0){var J=q.substring(0,Y),G=V.encodeText(J),W=V.widthOfTextAtSize(J,K);if(Wz)z=$+v;if(M+G>k)k=M+G;Z.push({text:N,encoded:R,width:v,height:G,x:$,y:M}),L=w===null||w===void 0?void 0:w.trim()}}return{fontSize:K,lineHeight:W,lines:Z,bounds:{x:H,y:U,width:z-H,height:k-U}}},KX=function(q,X){var{fontSize:V,font:K,bounds:Q,cellCount:Y}=X,J=F1(k6(q));if(J.length>Y)throw new qX(J.length,Y);if(V===void 0||V===0)V=K3(J,K,Q,Y);var G=Q.width/Y,W=K.heightAtSize(V,{descender:!1}),Z=Q.y+(Q.height/2-W/2),H=[],U=Q.x,z=Q.y,k=Q.x+Q.width,M=Q.y+Q.height,j=0,B=0;while(jk)k=$+v;if(Z+W>M)M=Z+W;H.push({text:J,encoded:R,width:v,height:W,x:$,y:Z}),j+=1,B+=N}return{fontSize:V,cells:H,bounds:{x:U,y:z,width:k-U,height:M-z}}},v8=function(q,X){var{alignment:V,fontSize:K,font:Q,bounds:Y}=X,J=F1(k6(q));if(K===void 0||K===0)K=lK([J],Q,Y);var G=Q.encodeText(J),W=Q.widthOfTextAtSize(J,K),Z=Q.heightAtSize(K,{descender:!1}),H=V===v0.Left?Y.x:V===v0.Center?Y.x+Y.width/2-W/2:V===v0.Right?Y.x+Y.width-W:Y.x,U=Y.y+(Y.height/2-Z/2);return{fontSize:K,line:{text:J,encoded:G,width:W,height:Z,x:H,y:U},bounds:{x:H,y:U,width:W,height:Z}}};var G2=function(q){if("normal"in q)return q;return{normal:q}},J3=/\/([^\0\t\n\f\r\ ]+)[\0\t\n\f\r\ ]+(\d*\.\d+|\d+)[\0\t\n\f\r\ ]+Tf/,m6=function(q){var X,V,K=(X=q.getDefaultAppearance())!==null&&X!==void 0?X:"",Q=(V=F5(K,J3).match)!==null&&V!==void 0?V:[],Y=Number(Q[2]);return isFinite(Y)?Y:void 0},G3=/(\d*\.\d+|\d+)[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]*(\d*\.\d+|\d+)?[\0\t\n\f\r\ ]+(g|rg|k)/,L2=function(q){var X,V=(X=q.getDefaultAppearance())!==null&&X!==void 0?X:"",K=F5(V,G3).match,Q=K!==null&&K!==void 0?K:[],Y=Q[1],J=Q[2],G=Q[3],W=Q[4],Z=Q[5];if(Z==="g"&&Y)return Sq(Number(Y));if(Z==="rg"&&Y&&J&&G)return Y0(Number(Y),Number(J),Number(G));if(Z==="k"&&Y&&J&&G&&W)return yq(Number(Y),Number(J),Number(G),Number(W));return},B2=function(q,X,V,K){var Q;if(K===void 0)K=0;var Y=[E2(X).toString(),T5((Q=V===null||V===void 0?void 0:V.name)!==null&&Q!==void 0?Q:"dummy__noop",K).toString()].join(` +`);q.setDefaultAppearance(Y)},QX=function(q,X){var V,K,Q,Y=L2(X),J=L2(q.acroField),G=X.getRectangle(),W=X.getAppearanceCharacteristics(),Z=X.getBorderStyle(),H=(V=Z===null||Z===void 0?void 0:Z.getWidth())!==null&&V!==void 0?V:0,U=I2(W===null||W===void 0?void 0:W.getRotation()),z=r2(G,U),k=z.width,M=z.height,j=j2(o(o({},G),{rotation:U})),B=Y0(0,0,0),L=(K=l0(W===null||W===void 0?void 0:W.getBorderColor()))!==null&&K!==void 0?K:B,O=l0(W===null||W===void 0?void 0:W.getBackgroundColor()),N=l0(W===null||W===void 0?void 0:W.getBackgroundColor(),0.8),R=(Q=Y!==null&&Y!==void 0?Y:J)!==null&&Q!==void 0?Q:B;if(Y)B2(X,R);else B2(q.acroField,R);var v={x:0+H/2,y:0+H/2,width:k-H,height:M-H,thickness:1.5,borderWidth:H,borderColor:L,markColor:R};return{normal:{on:Q0(j,B8(o(o({},v),{color:O,filled:!0}))),off:Q0(j,B8(o(o({},v),{color:O,filled:!1})))},down:{on:Q0(j,B8(o(o({},v),{color:N,filled:!0}))),off:Q0(j,B8(o(o({},v),{color:N,filled:!1})))}}},YX=function(q,X){var V,K,Q,Y=L2(X),J=L2(q.acroField),G=X.getRectangle(),W=X.getAppearanceCharacteristics(),Z=X.getBorderStyle(),H=(V=Z===null||Z===void 0?void 0:Z.getWidth())!==null&&V!==void 0?V:0,U=I2(W===null||W===void 0?void 0:W.getRotation()),z=r2(G,U),k=z.width,M=z.height,j=j2(o(o({},G),{rotation:U})),B=Y0(0,0,0),L=(K=l0(W===null||W===void 0?void 0:W.getBorderColor()))!==null&&K!==void 0?K:B,O=l0(W===null||W===void 0?void 0:W.getBackgroundColor()),N=l0(W===null||W===void 0?void 0:W.getBackgroundColor(),0.8),R=(Q=Y!==null&&Y!==void 0?Y:J)!==null&&Q!==void 0?Q:B;if(Y)B2(X,R);else B2(q.acroField,R);var v={x:k/2,y:M/2,width:k-H,height:M-H,borderWidth:H,borderColor:L,dotColor:R};return{normal:{on:Q0(j,T8(o(o({},v),{color:O,filled:!0}))),off:Q0(j,T8(o(o({},v),{color:O,filled:!1})))},down:{on:Q0(j,T8(o(o({},v),{color:N,filled:!0}))),off:Q0(j,T8(o(o({},v),{color:N,filled:!1})))}}},JX=function(q,X,V){var K,Q,Y,J,G,W=L2(X),Z=L2(q.acroField),H=m6(X),U=m6(q.acroField),z=X.getRectangle(),k=X.getAppearanceCharacteristics(),M=X.getBorderStyle(),j=k===null||k===void 0?void 0:k.getCaptions(),B=(K=j===null||j===void 0?void 0:j.normal)!==null&&K!==void 0?K:"",L=(Y=(Q=j===null||j===void 0?void 0:j.down)!==null&&Q!==void 0?Q:B)!==null&&Y!==void 0?Y:"",O=(J=M===null||M===void 0?void 0:M.getWidth())!==null&&J!==void 0?J:0,N=I2(k===null||k===void 0?void 0:k.getRotation()),R=r2(z,N),v=R.width,w=R.height,$=j2(o(o({},z),{rotation:N})),S=Y0(0,0,0),h=l0(k===null||k===void 0?void 0:k.getBorderColor()),b=l0(k===null||k===void 0?void 0:k.getBackgroundColor()),C=l0(k===null||k===void 0?void 0:k.getBackgroundColor(),0.8),D={x:O,y:O,width:v-O*2,height:w-O*2},l=v8(B,{alignment:v0.Center,fontSize:H!==null&&H!==void 0?H:U,font:V,bounds:D}),u=v8(L,{alignment:v0.Center,fontSize:H!==null&&H!==void 0?H:U,font:V,bounds:D}),q0=Math.min(l.fontSize,u.fontSize),J0=(G=W!==null&&W!==void 0?W:Z)!==null&&G!==void 0?G:S;if(W||H!==void 0)B2(X,J0,V,q0);else B2(q.acroField,J0,V,q0);var r={x:0+O/2,y:0+O/2,width:v-O,height:w-O,borderWidth:O,borderColor:h,textColor:J0,font:V.name,fontSize:q0};return{normal:Q0($,hq(o(o({},r),{color:b,textLines:[l.line]}))),down:Q0($,hq(o(o({},r),{color:C,textLines:[u.line]})))}},GX=function(q,X,V){var K,Q,Y,J,G=L2(X),W=L2(q.acroField),Z=m6(X),H=m6(q.acroField),U=X.getRectangle(),z=X.getAppearanceCharacteristics(),k=X.getBorderStyle(),M=(K=q.getText())!==null&&K!==void 0?K:"",j=(Q=k===null||k===void 0?void 0:k.getWidth())!==null&&Q!==void 0?Q:0,B=I2(z===null||z===void 0?void 0:z.getRotation()),L=r2(U,B),O=L.width,N=L.height,R=j2(o(o({},U),{rotation:B})),v=Y0(0,0,0),w=l0(z===null||z===void 0?void 0:z.getBorderColor()),$=l0(z===null||z===void 0?void 0:z.getBackgroundColor()),S,h,b=q.isCombed()?0:1,C={x:j+b,y:j+b,width:O-(j+b)*2,height:N-(j+b)*2};if(q.isMultiline()){var D=uq(M,{alignment:q.getAlignment(),fontSize:Z!==null&&Z!==void 0?Z:H,font:V,bounds:C});S=D.lines,h=D.fontSize}else if(q.isCombed()){var D=KX(M,{fontSize:Z!==null&&Z!==void 0?Z:H,font:V,bounds:C,cellCount:(Y=q.getMaxLength())!==null&&Y!==void 0?Y:0});S=D.cells,h=D.fontSize}else{var D=v8(M,{alignment:q.getAlignment(),fontSize:Z!==null&&Z!==void 0?Z:H,font:V,bounds:C});S=[D.line],h=D.fontSize}var l=(J=G!==null&&G!==void 0?G:W)!==null&&J!==void 0?J:v;if(G||Z!==void 0)B2(X,l,V,h);else B2(q.acroField,l,V,h);var u={x:0+j/2,y:0+j/2,width:O-j,height:N-j,borderWidth:j!==null&&j!==void 0?j:0,borderColor:w,textColor:l,font:V.name,fontSize:h,color:$,textLines:S,padding:b};return Q0(R,Pq(u))},ZX=function(q,X,V){var K,Q,Y,J=L2(X),G=L2(q.acroField),W=m6(X),Z=m6(q.acroField),H=X.getRectangle(),U=X.getAppearanceCharacteristics(),z=X.getBorderStyle(),k=(K=q.getSelected()[0])!==null&&K!==void 0?K:"",M=(Q=z===null||z===void 0?void 0:z.getWidth())!==null&&Q!==void 0?Q:0,j=I2(U===null||U===void 0?void 0:U.getRotation()),B=r2(H,j),L=B.width,O=B.height,N=j2(o(o({},H),{rotation:j})),R=Y0(0,0,0),v=l0(U===null||U===void 0?void 0:U.getBorderColor()),w=l0(U===null||U===void 0?void 0:U.getBackgroundColor()),$=1,S={x:M+$,y:M+$,width:L-(M+$)*2,height:O-(M+$)*2},h=v8(k,{alignment:v0.Left,fontSize:W!==null&&W!==void 0?W:Z,font:V,bounds:S}),b=h.line,C=h.fontSize,D=(Y=J!==null&&J!==void 0?J:G)!==null&&Y!==void 0?Y:R;if(J||W!==void 0)B2(X,D,V,C);else B2(q.acroField,D,V,C);var l={x:0+M/2,y:0+M/2,width:L-M,height:O-M,borderWidth:M!==null&&M!==void 0?M:0,borderColor:v,textColor:D,font:V.name,fontSize:C,color:w,textLines:[b],padding:$};return Q0(N,Pq(l))},WX=function(q,X,V){var K,Q,Y=L2(X),J=L2(q.acroField),G=m6(X),W=m6(q.acroField),Z=X.getRectangle(),H=X.getAppearanceCharacteristics(),U=X.getBorderStyle(),z=(K=U===null||U===void 0?void 0:U.getWidth())!==null&&K!==void 0?K:0,k=I2(H===null||H===void 0?void 0:H.getRotation()),M=r2(Z,k),j=M.width,B=M.height,L=j2(o(o({},Z),{rotation:k})),O=Y0(0,0,0),N=l0(H===null||H===void 0?void 0:H.getBorderColor()),R=l0(H===null||H===void 0?void 0:H.getBackgroundColor()),v=q.getOptions(),w=q.getSelected();if(q.isSorted())v.sort();var $="";for(var S=0,h=v.length;S1||Q.length===1&&K)this.enableMultiselect();var G=Array(Q.length);for(var W=0,Z=Q.length;W1||Q.length===1&&K)this.enableMultiselect();var J=Array(Q.length);for(var G=0,W=Q.length;GK)throw new XX(V.length,K,this.getName());if(this.markAsDirty(),this.disableRichFormatting(),V)this.acroField.setValue(g.fromText(V));else this.acroField.removeValue()},X.prototype.getAlignment=function(){var V=this.acroField.getQuadding();return V===0?v0.Left:V===1?v0.Center:V===2?v0.Right:v0.Left},X.prototype.setAlignment=function(V){M2(V,"alignment",v0),this.markAsDirty(),this.acroField.setQuadding(V)},X.prototype.getMaxLength=function(){return this.acroField.getMaxLength()},X.prototype.setMaxLength=function(V){if(X2(V,"maxLength",0,Number.MAX_SAFE_INTEGER),this.markAsDirty(),V===void 0)this.acroField.removeMaxLength();else{var K=this.getText();if(K&&K.length>V)throw new VX(K.length,V,this.getName());this.acroField.setMaxLength(V)}},X.prototype.removeMaxLength=function(){this.markAsDirty(),this.acroField.removeMaxLength()},X.prototype.setImage=function(V){var K=this.getAlignment(),Q=K===v0.Center?T2.Center:K===v0.Right?T2.Right:T2.Left,Y=this.acroField.getWidgets();for(var J=0,G=Y.length;J"u")globalThis.Buffer=y;if(typeof globalThis.process>"u")globalThis.process=N3;globalThis.__bundles=globalThis.__bundles||{};globalThis.__bundles["pdf-lib"]=UX;})(); diff --git a/apps/sim/lib/execution/sandbox/bundles/pptxgenjs.cjs b/apps/sim/lib/execution/sandbox/bundles/pptxgenjs.cjs index 45578fb257e..ec626780fb6 100644 --- a/apps/sim/lib/execution/sandbox/bundles/pptxgenjs.cjs +++ b/apps/sim/lib/execution/sandbox/bundles/pptxgenjs.cjs @@ -1,36 +1,35 @@ // sandbox bundle: pptxgenjs // generated by apps/sim/lib/execution/sandbox/bundles/build.ts // do not edit by hand. run `bun run build:sandbox-bundles` to regenerate. -(()=>{var PJ=Object.create;var{getPrototypeOf:TJ,defineProperty:r6,getOwnPropertyNames:C9,getOwnPropertyDescriptor:EJ}=Object,j9=Object.prototype.hasOwnProperty;var E8=(Q,$,q)=>{q=Q!=null?PJ(TJ(Q)):{};let K=$||!Q||!Q.__esModule?r6(q,"default",{value:Q,enumerable:!0}):q;for(let J of C9(Q))if(!j9.call(K,J))r6(K,J,{get:()=>Q[J],enumerable:!0});return K},R9=new WeakMap,y0=(Q)=>{var $=R9.get(Q),q;if($)return $;if($=r6({},"__esModule",{value:!0}),Q&&typeof Q==="object"||typeof Q==="function")C9(Q).map((K)=>!j9.call($,K)&&r6($,K,{get:()=>Q[K],enumerable:!(q=EJ(Q,K))||q.enumerable}));return R9.set(Q,$),$},N0=(Q,$)=>()=>($||Q(($={exports:{}}).exports,$),$.exports);var h2=(Q,$)=>{for(var q in $)r6(Q,q,{get:$[q],enumerable:!0,configurable:!0,set:(K)=>$[q]=()=>K})};var x2=(Q,$)=>()=>(Q&&($=Q(Q=0)),$);var f9=((Q)=>typeof require!=="undefined"?require:typeof Proxy!=="undefined"?new Proxy(Q,{get:($,q)=>(typeof require!=="undefined"?require:$)[q]}):Q)(function(Q){if(typeof require!=="undefined")return require.apply(this,arguments);throw Error('Dynamic require of "'+Q+'" is not supported')});var s0={};h2(s0,{transcode:()=>IU,resolveObjectURL:()=>HU,kStringMaxLength:()=>T9,kMaxLength:()=>s6,isUtf8:()=>kU,isAscii:()=>vU,default:()=>RU,constants:()=>lJ,btoa:()=>mJ,atob:()=>nJ,INSPECT_MAX_BYTES:()=>dJ,File:()=>pJ,Buffer:()=>J0,Blob:()=>iJ});function SJ(Q){var $=Q.length;if($%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var q=Q.indexOf("=");if(q===-1)q=$;var K=q===$?0:4-q%4;return[q,K]}function uJ(Q,$){return(Q+$)*3/4-$}function _J(Q){var $,q=SJ(Q),K=q[0],J=q[1],Z=new Uint8Array(uJ(K,J)),G=0,B=J>0?K-4:K,W;for(W=0;W>16&255,Z[G++]=$>>8&255,Z[G++]=$&255;if(J===2)$=v1[Q.charCodeAt(W)]<<2|v1[Q.charCodeAt(W+1)]>>4,Z[G++]=$&255;if(J===1)$=v1[Q.charCodeAt(W)]<<10|v1[Q.charCodeAt(W+1)]<<4|v1[Q.charCodeAt(W+2)]>>2,Z[G++]=$>>8&255,Z[G++]=$&255;return Z}function cJ(Q){return O1[Q>>18&63]+O1[Q>>12&63]+O1[Q>>6&63]+O1[Q&63]}function bJ(Q,$,q){var K,J=[];for(var Z=$;ZB?B:G+Z));if(K===1)$=Q[q-1],J.push(O1[$>>2]+O1[$<<4&63]+"==");else if(K===2)$=(Q[q-2]<<8)+Q[q-1],J.push(O1[$>>10]+O1[$>>4&63]+O1[$<<2&63]+"=");return J.join("")}function S8(Q,$,q,K,J){var Z,G,B=J*8-K-1,W=(1<>1,V=-7,N=q?J-1:0,F=q?-1:1,M=Q[$+N];N+=F,Z=M&(1<<-V)-1,M>>=-V,V+=B;for(;V>0;Z=Z*256+Q[$+N],N+=F,V-=8);G=Z&(1<<-V)-1,Z>>=-V,V+=K;for(;V>0;G=G*256+Q[$+N],N+=F,V-=8);if(Z===0)Z=1-U;else if(Z===W)return G?NaN:(M?-1:1)*(1/0);else G=G+Math.pow(2,K),Z=Z-U;return(M?-1:1)*G*Math.pow(2,Z-K)}function P9(Q,$,q,K,J,Z){var G,B,W,U=Z*8-J-1,V=(1<>1,F=J===23?Math.pow(2,-24)-Math.pow(2,-77):0,M=K?0:Z-1,v=K?1:-1,x=$<0||$===0&&1/$<0?1:0;if($=Math.abs($),isNaN($)||$===1/0)B=isNaN($)?1:0,G=V;else{if(G=Math.floor(Math.log($)/Math.LN2),$*(W=Math.pow(2,-G))<1)G--,W*=2;if(G+N>=1)$+=F/W;else $+=F*Math.pow(2,1-N);if($*W>=2)G++,W/=2;if(G+N>=V)B=0,G=V;else if(G+N>=1)B=($*W-1)*Math.pow(2,J),G=G+N;else B=$*Math.pow(2,N-1)*Math.pow(2,J),G=0}for(;J>=8;Q[q+M]=B&255,M+=v,B/=256,J-=8);G=G<0;Q[q+M]=G&255,M+=v,G/=256,U-=8);Q[q+M-v]|=x*128}function p1(Q){if(Q>s6)throw new RangeError('The value "'+Q+'" is invalid for option "size"');let $=new Uint8Array(Q);return Object.setPrototypeOf($,J0.prototype),$}function Z4(Q,$,q){return class K extends q{constructor(){super();Object.defineProperty(this,"message",{value:$.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${Q}]`,this.stack,delete this.name}get code(){return Q}set code(J){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:J,writable:!0})}toString(){return`${this.name} [${Q}]: ${this.message}`}}}function J0(Q,$,q){if(typeof Q==="number"){if(typeof $==="string")throw new TypeError('The "string" argument must be of type string. Received type number');return G4(Q)}return E9(Q,$,q)}function E9(Q,$,q){if(typeof Q==="string")return sJ(Q,$);if(ArrayBuffer.isView(Q))return tJ(Q);if(Q==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof Q);if(P1(Q,ArrayBuffer)||Q&&P1(Q.buffer,ArrayBuffer))return U4(Q,$,q);if(typeof SharedArrayBuffer!=="undefined"&&(P1(Q,SharedArrayBuffer)||Q&&P1(Q.buffer,SharedArrayBuffer)))return U4(Q,$,q);if(typeof Q==="number")throw new TypeError('The "value" argument must not be of type number. Received type number');let K=Q.valueOf&&Q.valueOf();if(K!=null&&K!==Q)return J0.from(K,$,q);let J=eJ(Q);if(J)return J;if(typeof Symbol!=="undefined"&&Symbol.toPrimitive!=null&&typeof Q[Symbol.toPrimitive]==="function")return J0.from(Q[Symbol.toPrimitive]("string"),$,q);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof Q)}function S9(Q){if(typeof Q!=="number")throw new TypeError('"size" argument must be of type number');else if(Q<0)throw new RangeError('The value "'+Q+'" is invalid for option "size"')}function rJ(Q,$,q){if(S9(Q),Q<=0)return p1(Q);if($!==void 0)return typeof q==="string"?p1(Q).fill($,q):p1(Q).fill($);return p1(Q)}function G4(Q){return S9(Q),p1(Q<0?0:B4(Q)|0)}function sJ(Q,$){if(typeof $!=="string"||$==="")$="utf8";if(!J0.isEncoding($))throw new TypeError("Unknown encoding: "+$);let q=u9(Q,$)|0,K=p1(q),J=K.write(Q,$);if(J!==q)K=K.slice(0,J);return K}function J4(Q){let $=Q.length<0?0:B4(Q.length)|0,q=p1($);for(let K=0;K<$;K+=1)q[K]=Q[K]&255;return q}function tJ(Q){if(P1(Q,Uint8Array)){let $=new Uint8Array(Q);return U4($.buffer,$.byteOffset,$.byteLength)}return J4(Q)}function U4(Q,$,q){if($<0||Q.byteLength<$)throw new RangeError('"offset" is outside of buffer bounds');if(Q.byteLength<$+(q||0))throw new RangeError('"length" is outside of buffer bounds');let K;if($===void 0&&q===void 0)K=new Uint8Array(Q);else if(q===void 0)K=new Uint8Array(Q,$);else K=new Uint8Array(Q,$,q);return Object.setPrototypeOf(K,J0.prototype),K}function eJ(Q){if(J0.isBuffer(Q)){let $=B4(Q.length)|0,q=p1($);if(q.length===0)return q;return Q.copy(q,0,0,$),q}if(Q.length!==void 0){if(typeof Q.length!=="number"||numberIsNaN(Q.length))return p1(0);return J4(Q)}if(Q.type==="Buffer"&&Array.isArray(Q.data))return J4(Q.data)}function B4(Q){if(Q>=s6)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s6.toString(16)+" bytes");return Q|0}function u9(Q,$){if(J0.isBuffer(Q))return Q.length;if(ArrayBuffer.isView(Q)||P1(Q,ArrayBuffer))return Q.byteLength;if(typeof Q!=="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof Q);let q=Q.length,K=arguments.length>2&&arguments[2]===!0;if(!K&&q===0)return 0;let J=!1;for(;;)switch($){case"ascii":case"latin1":case"binary":return q;case"utf8":case"utf-8":return V4(Q).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return q*2;case"hex":return q>>>1;case"base64":return l9(Q).length;default:if(J)return K?-1:V4(Q).length;$=(""+$).toLowerCase(),J=!0}}function QU(Q,$,q){let K=!1;if($===void 0||$<0)$=0;if($>this.length)return"";if(q===void 0||q>this.length)q=this.length;if(q<=0)return"";if(q>>>=0,$>>>=0,q<=$)return"";if(!Q)Q="utf8";while(!0)switch(Q){case"hex":return WU(this,$,q);case"utf8":case"utf-8":return c9(this,$,q);case"ascii":return GU(this,$,q);case"latin1":case"binary":return BU(this,$,q);case"base64":return VU(this,$,q);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return zU(this,$,q);default:if(K)throw new TypeError("Unknown encoding: "+Q);Q=(Q+"").toLowerCase(),K=!0}}function P2(Q,$,q){let K=Q[$];Q[$]=Q[q],Q[q]=K}function _9(Q,$,q,K,J){if(Q.length===0)return-1;if(typeof q==="string")K=q,q=0;else if(q>2147483647)q=2147483647;else if(q<-2147483648)q=-2147483648;if(q=+q,Number.isNaN(q))q=J?0:Q.length-1;if(q<0)q=Q.length+q;if(q>=Q.length)if(J)return-1;else q=Q.length-1;else if(q<0)if(J)q=0;else return-1;if(typeof $==="string")$=J0.from($,K);if(J0.isBuffer($)){if($.length===0)return-1;return h9(Q,$,q,K,J)}else if(typeof $==="number"){if($=$&255,typeof Uint8Array.prototype.indexOf==="function")if(J)return Uint8Array.prototype.indexOf.call(Q,$,q);else return Uint8Array.prototype.lastIndexOf.call(Q,$,q);return h9(Q,[$],q,K,J)}throw new TypeError("val must be string, number or Buffer")}function h9(Q,$,q,K,J){let Z=1,G=Q.length,B=$.length;if(K!==void 0){if(K=String(K).toLowerCase(),K==="ucs2"||K==="ucs-2"||K==="utf16le"||K==="utf-16le"){if(Q.length<2||$.length<2)return-1;Z=2,G/=2,B/=2,q/=2}}function W(V,N){if(Z===1)return V[N];else return V.readUInt16BE(N*Z)}let U;if(J){let V=-1;for(U=q;UG)q=G-B;for(U=q;U>=0;U--){let V=!0;for(let N=0;NJ)K=J;let Z=$.length;if(K>Z/2)K=Z/2;let G;for(G=0;G239?4:Z>223?3:Z>191?2:1;if(J+B<=q){let W,U,V,N;switch(B){case 1:if(Z<128)G=Z;break;case 2:if(W=Q[J+1],(W&192)===128){if(N=(Z&31)<<6|W&63,N>127)G=N}break;case 3:if(W=Q[J+1],U=Q[J+2],(W&192)===128&&(U&192)===128){if(N=(Z&15)<<12|(W&63)<<6|U&63,N>2047&&(N<55296||N>57343))G=N}break;case 4:if(W=Q[J+1],U=Q[J+2],V=Q[J+3],(W&192)===128&&(U&192)===128&&(V&192)===128){if(N=(Z&15)<<18|(W&63)<<12|(U&63)<<6|V&63,N>65535&&N<1114112)G=N}}}if(G===null)G=65533,B=1;else if(G>65535)G-=65536,K.push(G>>>10&1023|55296),G=56320|G&1023;K.push(G),J+=B}return ZU(K)}function ZU(Q){let $=Q.length;if($<=x9)return String.fromCharCode.apply(String,Q);let q="",K=0;while(K<$)q+=String.fromCharCode.apply(String,Q.slice(K,K+=x9));return q}function GU(Q,$,q){let K="";q=Math.min(Q.length,q);for(let J=$;JK)q=K;let J="";for(let Z=$;Zq)throw new RangeError("Trying to access beyond buffer length")}function Z1(Q,$,q,K,J,Z){if(!J0.isBuffer(Q))throw new TypeError('"buffer" argument must be a Buffer instance');if($>J||$Q.length)throw new RangeError("Index out of range")}function b9(Q,$,q,K,J){i9($,K,J,Q,q,7);let Z=Number($&BigInt(4294967295));Q[q++]=Z,Z=Z>>8,Q[q++]=Z,Z=Z>>8,Q[q++]=Z,Z=Z>>8,Q[q++]=Z;let G=Number($>>BigInt(32)&BigInt(4294967295));return Q[q++]=G,G=G>>8,Q[q++]=G,G=G>>8,Q[q++]=G,G=G>>8,Q[q++]=G,q}function d9(Q,$,q,K,J){i9($,K,J,Q,q,7);let Z=Number($&BigInt(4294967295));Q[q+7]=Z,Z=Z>>8,Q[q+6]=Z,Z=Z>>8,Q[q+5]=Z,Z=Z>>8,Q[q+4]=Z;let G=Number($>>BigInt(32)&BigInt(4294967295));return Q[q+3]=G,G=G>>8,Q[q+2]=G,G=G>>8,Q[q+1]=G,G=G>>8,Q[q]=G,q+8}function m9(Q,$,q,K,J,Z){if(q+K>Q.length)throw new RangeError("Index out of range");if(q<0)throw new RangeError("Index out of range")}function n9(Q,$,q,K,J){if($=+$,q=q>>>0,!J)m9(Q,$,q,4,340282346638528860000000000000000000000,-340282346638528860000000000000000000000);return P9(Q,$,q,K,23,4),q+4}function p9(Q,$,q,K,J){if($=+$,q=q>>>0,!J)m9(Q,$,q,8,179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,-179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);return P9(Q,$,q,K,52,8),q+8}function O9(Q){let $="",q=Q.length,K=Q[0]==="-"?1:0;for(;q>=K+4;q-=3)$=`_${Q.slice(q-3,q)}${$}`;return`${Q.slice(0,q)}${$}`}function FU(Q,$,q){if(J6($,"offset"),Q[$]===void 0||Q[$+q]===void 0)t6($,Q.length-(q+1))}function i9(Q,$,q,K,J,Z){if(Q>q||Q<$){let G=typeof $==="bigint"?"n":"",B;if(Z>3)if($===0||$===BigInt(0))B=`>= 0${G} and < 2${G} ** ${(Z+1)*8}${G}`;else B=`>= -(2${G} ** ${(Z+1)*8-1}${G}) and < 2 ** ${(Z+1)*8-1}${G}`;else B=`>= ${$}${G} and <= ${q}${G}`;throw new K4("value",B,Q)}FU(K,J,Z)}function J6(Q,$){if(typeof Q!=="number")throw new aJ($,"number",Q)}function t6(Q,$,q){if(Math.floor(Q)!==Q)throw J6(Q,q),new K4(q||"offset","an integer",Q);if($<0)throw new oJ;throw new K4(q||"offset",`>= ${q?1:0} and <= ${$}`,Q)}function wU(Q){if(Q=Q.split("=")[0],Q=Q.trim().replace(MU,""),Q.length<2)return"";while(Q.length%4!==0)Q=Q+"=";return Q}function V4(Q,$){$=$||1/0;let q,K=Q.length,J=null,Z=[];for(let G=0;G55295&&q<57344){if(!J){if(q>56319){if(($-=3)>-1)Z.push(239,191,189);continue}else if(G+1===K){if(($-=3)>-1)Z.push(239,191,189);continue}J=q;continue}if(q<56320){if(($-=3)>-1)Z.push(239,191,189);J=q;continue}q=(J-55296<<10|q-56320)+65536}else if(J){if(($-=3)>-1)Z.push(239,191,189)}if(J=null,q<128){if(($-=1)<0)break;Z.push(q)}else if(q<2048){if(($-=2)<0)break;Z.push(q>>6|192,q&63|128)}else if(q<65536){if(($-=3)<0)break;Z.push(q>>12|224,q>>6&63|128,q&63|128)}else if(q<1114112){if(($-=4)<0)break;Z.push(q>>18|240,q>>12&63|128,q>>6&63|128,q&63|128)}else throw new Error("Invalid code point")}return Z}function NU(Q){let $=[];for(let q=0;q>8,J=q%256,Z.push(J),Z.push(K)}return Z}function l9(Q){return _J(wU(Q))}function u8(Q,$,q,K){let J;for(J=0;J=$.length||J>=Q.length)break;$[J+q]=Q[J]}return J}function P1(Q,$){return Q instanceof $||Q!=null&&Q.constructor!=null&&Q.constructor.name!=null&&Q.constructor.name===$.name}function B2(Q){return typeof BigInt==="undefined"?DU:Q}function DU(){throw new Error("BigInt not supported")}function W4(Q){return()=>{throw new Error(Q+" is not implemented for node:buffer browser polyfill")}}var O1,v1,$4="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",O2,g9,y9,dJ=50,s6=2147483647,T9=536870888,mJ,nJ,pJ,iJ,lJ,oJ,aJ,K4,x9=4096,MU,LU,HU,kU,vU=(Q)=>{for(let $ of Q)if($.charCodeAt(0)>127)return!1;return!0},IU,RU;var a0=x2(()=>{O1=[],v1=[];for(O2=0,g9=$4.length;O24294967296)J=O9(String(q));else if(typeof q==="bigint"){if(J=String(q),q>BigInt(2)**BigInt(32)||q<-(BigInt(2)**BigInt(32)))J=O9(J);J+="n"}return K+=` It must be ${$}. Received ${J}`,K},RangeError);Object.defineProperty(J0.prototype,"parent",{enumerable:!0,get:function(){if(!J0.isBuffer(this))return;return this.buffer}});Object.defineProperty(J0.prototype,"offset",{enumerable:!0,get:function(){if(!J0.isBuffer(this))return;return this.byteOffset}});J0.poolSize=8192;J0.from=function(Q,$,q){return E9(Q,$,q)};Object.setPrototypeOf(J0.prototype,Uint8Array.prototype);Object.setPrototypeOf(J0,Uint8Array);J0.alloc=function(Q,$,q){return rJ(Q,$,q)};J0.allocUnsafe=function(Q){return G4(Q)};J0.allocUnsafeSlow=function(Q){return G4(Q)};J0.isBuffer=function Q($){return $!=null&&$._isBuffer===!0&&$!==J0.prototype};J0.compare=function Q($,q){if(P1($,Uint8Array))$=J0.from($,$.offset,$.byteLength);if(P1(q,Uint8Array))q=J0.from(q,q.offset,q.byteLength);if(!J0.isBuffer($)||!J0.isBuffer(q))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if($===q)return 0;let K=$.length,J=q.length;for(let Z=0,G=Math.min(K,J);ZJ.length){if(!J0.isBuffer(G))G=J0.from(G);G.copy(J,Z)}else Uint8Array.prototype.set.call(J,G,Z);else if(!J0.isBuffer(G))throw new TypeError('"list" argument must be an Array of Buffers');else G.copy(J,Z);Z+=G.length}return J};J0.byteLength=u9;J0.prototype._isBuffer=!0;J0.prototype.swap16=function Q(){let $=this.length;if($%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let q=0;q<$;q+=2)P2(this,q,q+1);return this};J0.prototype.swap32=function Q(){let $=this.length;if($%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let q=0;q<$;q+=4)P2(this,q,q+3),P2(this,q+1,q+2);return this};J0.prototype.swap64=function Q(){let $=this.length;if($%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(let q=0;q<$;q+=8)P2(this,q,q+7),P2(this,q+1,q+6),P2(this,q+2,q+5),P2(this,q+3,q+4);return this};J0.prototype.toString=function Q(){let $=this.length;if($===0)return"";if(arguments.length===0)return c9(this,0,$);return QU.apply(this,arguments)};J0.prototype.toLocaleString=J0.prototype.toString;J0.prototype.equals=function Q($){if(!J0.isBuffer($))throw new TypeError("Argument must be a Buffer");if(this===$)return!0;return J0.compare(this,$)===0};J0.prototype.inspect=function Q(){let $="",q=exports_buffer.INSPECT_MAX_BYTES;if($=this.toString("hex",0,q).replace(/(.{2})/g,"$1 ").trim(),this.length>q)$+=" ... ";return""};if(y9)J0.prototype[y9]=J0.prototype.inspect;J0.prototype.compare=function Q($,q,K,J,Z){if(P1($,Uint8Array))$=J0.from($,$.offset,$.byteLength);if(!J0.isBuffer($))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof $);if(q===void 0)q=0;if(K===void 0)K=$?$.length:0;if(J===void 0)J=0;if(Z===void 0)Z=this.length;if(q<0||K>$.length||J<0||Z>this.length)throw new RangeError("out of range index");if(J>=Z&&q>=K)return 0;if(J>=Z)return-1;if(q>=K)return 1;if(q>>>=0,K>>>=0,J>>>=0,Z>>>=0,this===$)return 0;let G=Z-J,B=K-q,W=Math.min(G,B),U=this.slice(J,Z),V=$.slice(q,K);for(let N=0;N>>0,isFinite(K)){if(K=K>>>0,J===void 0)J="utf8"}else J=K,K=void 0;else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");let Z=this.length-q;if(K===void 0||K>Z)K=Z;if($.length>0&&(K<0||q<0)||q>this.length)throw new RangeError("Attempt to write outside buffer bounds");if(!J)J="utf8";let G=!1;for(;;)switch(J){case"hex":return qU(this,$,q,K);case"utf8":case"utf-8":return $U(this,$,q,K);case"ascii":case"latin1":case"binary":return KU(this,$,q,K);case"base64":return JU(this,$,q,K);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return UU(this,$,q,K);default:if(G)throw new TypeError("Unknown encoding: "+J);J=(""+J).toLowerCase(),G=!0}};J0.prototype.toJSON=function Q(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};J0.prototype.slice=function Q($,q){let K=this.length;if($=~~$,q=q===void 0?K:~~q,$<0){if($+=K,$<0)$=0}else if($>K)$=K;if(q<0){if(q+=K,q<0)q=0}else if(q>K)q=K;if(q<$)q=$;let J=this.subarray($,q);return Object.setPrototypeOf(J,J0.prototype),J};J0.prototype.readUintLE=J0.prototype.readUIntLE=function Q($,q,K){if($=$>>>0,q=q>>>0,!K)o0($,q,this.length);let J=this[$],Z=1,G=0;while(++G>>0,q=q>>>0,!K)o0($,q,this.length);let J=this[$+--q],Z=1;while(q>0&&(Z*=256))J+=this[$+--q]*Z;return J};J0.prototype.readUint8=J0.prototype.readUInt8=function Q($,q){if($=$>>>0,!q)o0($,1,this.length);return this[$]};J0.prototype.readUint16LE=J0.prototype.readUInt16LE=function Q($,q){if($=$>>>0,!q)o0($,2,this.length);return this[$]|this[$+1]<<8};J0.prototype.readUint16BE=J0.prototype.readUInt16BE=function Q($,q){if($=$>>>0,!q)o0($,2,this.length);return this[$]<<8|this[$+1]};J0.prototype.readUint32LE=J0.prototype.readUInt32LE=function Q($,q){if($=$>>>0,!q)o0($,4,this.length);return(this[$]|this[$+1]<<8|this[$+2]<<16)+this[$+3]*16777216};J0.prototype.readUint32BE=J0.prototype.readUInt32BE=function Q($,q){if($=$>>>0,!q)o0($,4,this.length);return this[$]*16777216+(this[$+1]<<16|this[$+2]<<8|this[$+3])};J0.prototype.readBigUInt64LE=B2(function Q($){$=$>>>0,J6($,"offset");let q=this[$],K=this[$+7];if(q===void 0||K===void 0)t6($,this.length-8);let J=q+this[++$]*256+this[++$]*65536+this[++$]*16777216,Z=this[++$]+this[++$]*256+this[++$]*65536+K*16777216;return BigInt(J)+(BigInt(Z)<>>0,J6($,"offset");let q=this[$],K=this[$+7];if(q===void 0||K===void 0)t6($,this.length-8);let J=q*16777216+this[++$]*65536+this[++$]*256+this[++$],Z=this[++$]*16777216+this[++$]*65536+this[++$]*256+K;return(BigInt(J)<>>0,q=q>>>0,!K)o0($,q,this.length);let J=this[$],Z=1,G=0;while(++G=Z)J-=Math.pow(2,8*q);return J};J0.prototype.readIntBE=function Q($,q,K){if($=$>>>0,q=q>>>0,!K)o0($,q,this.length);let J=q,Z=1,G=this[$+--J];while(J>0&&(Z*=256))G+=this[$+--J]*Z;if(Z*=128,G>=Z)G-=Math.pow(2,8*q);return G};J0.prototype.readInt8=function Q($,q){if($=$>>>0,!q)o0($,1,this.length);if(!(this[$]&128))return this[$];return(255-this[$]+1)*-1};J0.prototype.readInt16LE=function Q($,q){if($=$>>>0,!q)o0($,2,this.length);let K=this[$]|this[$+1]<<8;return K&32768?K|4294901760:K};J0.prototype.readInt16BE=function Q($,q){if($=$>>>0,!q)o0($,2,this.length);let K=this[$+1]|this[$]<<8;return K&32768?K|4294901760:K};J0.prototype.readInt32LE=function Q($,q){if($=$>>>0,!q)o0($,4,this.length);return this[$]|this[$+1]<<8|this[$+2]<<16|this[$+3]<<24};J0.prototype.readInt32BE=function Q($,q){if($=$>>>0,!q)o0($,4,this.length);return this[$]<<24|this[$+1]<<16|this[$+2]<<8|this[$+3]};J0.prototype.readBigInt64LE=B2(function Q($){$=$>>>0,J6($,"offset");let q=this[$],K=this[$+7];if(q===void 0||K===void 0)t6($,this.length-8);let J=this[$+4]+this[$+5]*256+this[$+6]*65536+(K<<24);return(BigInt(J)<>>0,J6($,"offset");let q=this[$],K=this[$+7];if(q===void 0||K===void 0)t6($,this.length-8);let J=(q<<24)+this[++$]*65536+this[++$]*256+this[++$];return(BigInt(J)<>>0,!q)o0($,4,this.length);return S8(this,$,!0,23,4)};J0.prototype.readFloatBE=function Q($,q){if($=$>>>0,!q)o0($,4,this.length);return S8(this,$,!1,23,4)};J0.prototype.readDoubleLE=function Q($,q){if($=$>>>0,!q)o0($,8,this.length);return S8(this,$,!0,52,8)};J0.prototype.readDoubleBE=function Q($,q){if($=$>>>0,!q)o0($,8,this.length);return S8(this,$,!1,52,8)};J0.prototype.writeUintLE=J0.prototype.writeUIntLE=function Q($,q,K,J){if($=+$,q=q>>>0,K=K>>>0,!J){let B=Math.pow(2,8*K)-1;Z1(this,$,q,K,B,0)}let Z=1,G=0;this[q]=$&255;while(++G>>0,K=K>>>0,!J){let B=Math.pow(2,8*K)-1;Z1(this,$,q,K,B,0)}let Z=K-1,G=1;this[q+Z]=$&255;while(--Z>=0&&(G*=256))this[q+Z]=$/G&255;return q+K};J0.prototype.writeUint8=J0.prototype.writeUInt8=function Q($,q,K){if($=+$,q=q>>>0,!K)Z1(this,$,q,1,255,0);return this[q]=$&255,q+1};J0.prototype.writeUint16LE=J0.prototype.writeUInt16LE=function Q($,q,K){if($=+$,q=q>>>0,!K)Z1(this,$,q,2,65535,0);return this[q]=$&255,this[q+1]=$>>>8,q+2};J0.prototype.writeUint16BE=J0.prototype.writeUInt16BE=function Q($,q,K){if($=+$,q=q>>>0,!K)Z1(this,$,q,2,65535,0);return this[q]=$>>>8,this[q+1]=$&255,q+2};J0.prototype.writeUint32LE=J0.prototype.writeUInt32LE=function Q($,q,K){if($=+$,q=q>>>0,!K)Z1(this,$,q,4,4294967295,0);return this[q+3]=$>>>24,this[q+2]=$>>>16,this[q+1]=$>>>8,this[q]=$&255,q+4};J0.prototype.writeUint32BE=J0.prototype.writeUInt32BE=function Q($,q,K){if($=+$,q=q>>>0,!K)Z1(this,$,q,4,4294967295,0);return this[q]=$>>>24,this[q+1]=$>>>16,this[q+2]=$>>>8,this[q+3]=$&255,q+4};J0.prototype.writeBigUInt64LE=B2(function Q($,q=0){return b9(this,$,q,BigInt(0),BigInt("0xffffffffffffffff"))});J0.prototype.writeBigUInt64BE=B2(function Q($,q=0){return d9(this,$,q,BigInt(0),BigInt("0xffffffffffffffff"))});J0.prototype.writeIntLE=function Q($,q,K,J){if($=+$,q=q>>>0,!J){let W=Math.pow(2,8*K-1);Z1(this,$,q,K,W-1,-W)}let Z=0,G=1,B=0;this[q]=$&255;while(++Z>0)-B&255}return q+K};J0.prototype.writeIntBE=function Q($,q,K,J){if($=+$,q=q>>>0,!J){let W=Math.pow(2,8*K-1);Z1(this,$,q,K,W-1,-W)}let Z=K-1,G=1,B=0;this[q+Z]=$&255;while(--Z>=0&&(G*=256)){if($<0&&B===0&&this[q+Z+1]!==0)B=1;this[q+Z]=($/G>>0)-B&255}return q+K};J0.prototype.writeInt8=function Q($,q,K){if($=+$,q=q>>>0,!K)Z1(this,$,q,1,127,-128);if($<0)$=255+$+1;return this[q]=$&255,q+1};J0.prototype.writeInt16LE=function Q($,q,K){if($=+$,q=q>>>0,!K)Z1(this,$,q,2,32767,-32768);return this[q]=$&255,this[q+1]=$>>>8,q+2};J0.prototype.writeInt16BE=function Q($,q,K){if($=+$,q=q>>>0,!K)Z1(this,$,q,2,32767,-32768);return this[q]=$>>>8,this[q+1]=$&255,q+2};J0.prototype.writeInt32LE=function Q($,q,K){if($=+$,q=q>>>0,!K)Z1(this,$,q,4,2147483647,-2147483648);return this[q]=$&255,this[q+1]=$>>>8,this[q+2]=$>>>16,this[q+3]=$>>>24,q+4};J0.prototype.writeInt32BE=function Q($,q,K){if($=+$,q=q>>>0,!K)Z1(this,$,q,4,2147483647,-2147483648);if($<0)$=4294967295+$+1;return this[q]=$>>>24,this[q+1]=$>>>16,this[q+2]=$>>>8,this[q+3]=$&255,q+4};J0.prototype.writeBigInt64LE=B2(function Q($,q=0){return b9(this,$,q,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});J0.prototype.writeBigInt64BE=B2(function Q($,q=0){return d9(this,$,q,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});J0.prototype.writeFloatLE=function Q($,q,K){return n9(this,$,q,!0,K)};J0.prototype.writeFloatBE=function Q($,q,K){return n9(this,$,q,!1,K)};J0.prototype.writeDoubleLE=function Q($,q,K){return p9(this,$,q,!0,K)};J0.prototype.writeDoubleBE=function Q($,q,K){return p9(this,$,q,!1,K)};J0.prototype.copy=function Q($,q,K,J){if(!J0.isBuffer($))throw new TypeError("argument should be a Buffer");if(!K)K=0;if(!J&&J!==0)J=this.length;if(q>=$.length)q=$.length;if(!q)q=0;if(J>0&&J=this.length)throw new RangeError("Index out of range");if(J<0)throw new RangeError("sourceEnd out of bounds");if(J>this.length)J=this.length;if($.length-q>>0,K=K===void 0?this.length:K>>>0,!$)$=0;let Z;if(typeof $==="number")for(Z=q;Z{var m0=s9.exports={},T1,E1;function z4(){throw new Error("setTimeout has not been defined")}function F4(){throw new Error("clearTimeout has not been defined")}(function(){try{if(typeof setTimeout==="function")T1=setTimeout;else T1=z4}catch(Q){T1=z4}try{if(typeof clearTimeout==="function")E1=clearTimeout;else E1=F4}catch(Q){E1=F4}})();function o9(Q){if(T1===setTimeout)return setTimeout(Q,0);if((T1===z4||!T1)&&setTimeout)return T1=setTimeout,setTimeout(Q,0);try{return T1(Q,0)}catch($){try{return T1.call(null,Q,0)}catch(q){return T1.call(this,Q,0)}}}function CU(Q){if(E1===clearTimeout)return clearTimeout(Q);if((E1===F4||!E1)&&clearTimeout)return E1=clearTimeout,clearTimeout(Q);try{return E1(Q)}catch($){try{return E1.call(null,Q)}catch(q){return E1.call(this,Q)}}}var i1=[],U6=!1,T2,_8=-1;function jU(){if(!U6||!T2)return;if(U6=!1,T2.length)i1=T2.concat(i1);else _8=-1;if(i1.length)a9()}function a9(){if(U6)return;var Q=o9(jU);U6=!0;var $=i1.length;while($){T2=i1,i1=[];while(++_8<$)if(T2)T2[_8].run();_8=-1,$=i1.length}T2=null,U6=!1,CU(Q)}m0.nextTick=function(Q){var $=new Array(arguments.length-1);if(arguments.length>1)for(var q=1;qBQ,once:()=>ZQ,listenerCount:()=>WQ,init:()=>W2,getMaxListeners:()=>FQ,getEventListeners:()=>GQ,default:()=>PU,captureRejectionSymbol:()=>KQ,addAbortListener:()=>MQ,EventEmitter:()=>W2});function JQ(Q,$){var{_events:q}=Q;if($[0]??=new Error("Unhandled error."),!q)throw $[0];var K=q[$Q];if(K)for(var J of QQ.call(K))J.apply(Q,$);var Z=q.error;if(!Z)throw $[0];for(var J of QQ.call(Z))J.apply(Q,$);return!0}function gU(Q,$,q,K){$.then(void 0,function(J){queueMicrotask(()=>XU(Q,J,q,K))})}function XU(Q,$,q,K){if(typeof Q[e9]==="function")Q[e9]($,q,...K);else try{Q[E2]=!1,Q.emit("error",$)}finally{Q[E2]=!0}}function UQ(Q,$,q){q.warned=!0;let K=new Error(`Possible EventEmitter memory leak detected. ${q.length} ${String($)} listeners added to [${Q.constructor.name}]. Use emitter.setMaxListeners() to increase limit`);K.name="MaxListenersExceededWarning",K.emitter=Q,K.type=$,K.count=q.length,console.warn(K)}function VQ(Q,$,...q){this.removeListener(Q,$),$.apply(this,q)}function ZQ(Q,$,q){var K=q?.signal;if(zQ(K,"options.signal"),K?.aborted)throw new M4(void 0,{cause:K?.reason});let{resolve:J,reject:Z,promise:G}=$newPromiseCapability(Promise),B=(V)=>{if(Q.removeListener($,W),K!=null)c8(K,"abort",U);Z(V)},W=(...V)=>{if(typeof Q.removeListener==="function")Q.removeListener("error",B);if(K!=null)c8(K,"abort",U);J(V)};if(qQ(Q,$,W,{once:!0}),$!=="error"&&typeof Q.once==="function")Q.once("error",B);function U(){c8(Q,$,W),c8(Q,"error",B),Z(new M4(void 0,{cause:K?.reason}))}if(K!=null)qQ(K,"abort",U,{once:!0});return G}function GQ(Q,$){return Q.listeners($)}function BQ(Q,...$){N4(Q,"setMaxListeners",0);var q;if($&&(q=$.length))for(let K=0;KK||(q!=null||K!=null)&&Number.isNaN(Q))throw xU($,`${q!=null?`>= ${q}`:""}${q!=null&&K!=null?" && ":""}${K!=null?`<= ${K}`:""}`,Q)}function e6(Q){if(typeof Q!=="function")throw new TypeError("The listener must be a function")}function OU(Q,$){if(typeof Q!=="boolean")throw V6($,"boolean",Q)}function FQ(Q){return Q?._maxListeners??S2}function MQ(Q,$){if(Q===void 0)throw V6("signal","AbortSignal",Q);if(zQ(Q,"signal"),typeof $!=="function")throw V6("listener","function",$);let q;if(Q.aborted)queueMicrotask(()=>$());else Q.addEventListener("abort",$,{__proto__:null,once:!0}),q=()=>{Q.removeEventListener("abort",$)};return{__proto__:null,[Symbol.dispose](){q?.()}}}var w4,E2,$Q,fU,AU,e9,KQ,QQ,S2=10,W2=function Q($){if(this._events===void 0||this._events===this.__proto__._events)this._events={__proto__:null},this._eventsCount=0;if(this._maxListeners??=void 0,this[E2]=$?.captureRejections?Boolean($?.captureRejections):S0[E2])this.emit=hU},S0,yU=function Q($,...q){if($==="error")return JQ(this,q);var{_events:K}=this;if(K===void 0)return!1;var J=K[$];if(J===void 0)return!1;let Z=J.length>1?J.slice():J;for(let G=0,{length:B}=Z;G1?J.slice():J;for(let G=0,{length:B}=Z;G{w4=Symbol.for,E2=Symbol("kCapture"),$Q=w4("events.errorMonitor"),fU=Symbol("events.maxEventTargetListeners"),AU=Symbol("events.maxEventTargetListenersWarned"),e9=w4("nodejs.rejection"),KQ=w4("nodejs.rejection"),QQ=Array.prototype.slice,S0=W2.prototype={};S0._events=void 0;S0._eventsCount=0;S0._maxListeners=void 0;S0.setMaxListeners=function Q($){return N4($,"setMaxListeners",0),this._maxListeners=$,this};S0.constructor=W2;S0.getMaxListeners=function Q(){return this?._maxListeners??S2};S0.emit=yU;S0.addListener=function Q($,q){e6(q);var K=this._events;if(!K)K=this._events={__proto__:null},this._eventsCount=0;else if(K.newListener)this.emit("newListener",$,q.listener??q);var J=K[$];if(!J)K[$]=[q],this._eventsCount++;else{J.push(q);var Z=this._maxListeners??S2;if(Z>0&&J.length>Z&&!J.warned)UQ(this,$,J)}return this};S0.on=S0.addListener;S0.prependListener=function Q($,q){e6(q);var K=this._events;if(!K)K=this._events={__proto__:null},this._eventsCount=0;else if(K.newListener)this.emit("newListener",$,q.listener??q);var J=K[$];if(!J)K[$]=[q],this._eventsCount++;else{J.unshift(q);var Z=this._maxListeners??S2;if(Z>0&&J.length>Z&&!J.warned)UQ(this,$,J)}return this};S0.once=function Q($,q){e6(q);let K=VQ.bind(this,$,q);return K.listener=q,this.addListener($,K),this};S0.prependOnceListener=function Q($,q){e6(q);let K=VQ.bind(this,$,q);return K.listener=q,this.prependListener($,K),this};S0.removeListener=function Q($,q){e6(q);var{_events:K}=this;if(!K)return this;var J=K[$];if(!J)return this;var Z=J.length;let G=-1;for(let B=Z-1;B>=0;B--)if(J[B]===q||J[B].listener===q){G=B;break}if(G<0)return this;if(G===0)J.shift();else J.splice(G,1);if(J.length===0)delete K[$],this._eventsCount--;return this};S0.off=S0.removeListener;S0.removeAllListeners=function Q($){var{_events:q}=this;if($&&q){if(q[$])delete q[$],this._eventsCount--}else this._events={__proto__:null};return this};S0.listeners=function Q($){var{_events:q}=this;if(!q)return[];var K=q[$];if(!K)return[];return K.map((J)=>J.listener??J)};S0.rawListeners=function Q($){var{_events:q}=this;if(!q)return[];var K=q[$];if(!K)return[];return K.slice()};S0.listenerCount=function Q($){var{_events:q}=this;if(!q)return 0;return q[$]?.length??0};S0.eventNames=function Q(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};S0[E2]=!1;M4=class M4 extends Error{constructor(Q="The operation was aborted",$=void 0){if($!==void 0&&typeof $!=="object")throw V6("options","Object",$);super(Q,$);this.code="ABORT_ERR",this.name="AbortError"}};Object.defineProperties(W2,{captureRejections:{get(){return S0[E2]},set(Q){OU(Q,"EventEmitter.captureRejections"),S0[E2]=Q},enumerable:!0},defaultMaxListeners:{enumerable:!0,get:()=>{return S2},set:(Q)=>{N4(Q,"defaultMaxListeners",0),S2=Q}},kMaxEventTargetListeners:{value:fU,enumerable:!1,configurable:!1,writable:!1},kMaxEventTargetListenersWarned:{value:AU,enumerable:!1,configurable:!1,writable:!1}});Object.assign(W2,{once:ZQ,getEventListeners:GQ,getMaxListeners:FQ,setMaxListeners:BQ,EventEmitter:W2,usingDomains:!1,captureRejectionSymbol:KQ,errorMonitor:$Q,addAbortListener:MQ,init:W2,listenerCount:WQ});PU=W2});var Y4={};h2(Y4,{versions:()=>dU,version:()=>bU,umask:()=>$V,title:()=>SU,removeListener:()=>lU,removeAllListeners:()=>oU,prependOnceListener:()=>sU,prependListener:()=>rU,once:()=>pU,on:()=>mU,off:()=>iU,nextTick:()=>EU,listeners:()=>tU,env:()=>_U,emit:()=>aU,cwd:()=>QV,chdir:()=>qV,browser:()=>uU,binding:()=>eU,argv:()=>cU,addListener:()=>nU});function TU(){if(!Z6||!u2)return;if(Z6=!1,u2.length)r1=u2.concat(r1);else b8=-1;if(r1.length)wQ()}function wQ(){if(Z6)return;var Q=setTimeout(TU,0);Z6=!0;var $=r1.length;while($){u2=r1,r1=[];while(++b8<$)if(u2){var q=u2[b8];q.fun.apply(null,q.array)}b8=-1,$=r1.length}u2=null,Z6=!1,clearTimeout(Q,0)}function EU(Q){var $=new Array(arguments.length-1);if(arguments.length>1)for(var q=1;q{r1=[];_U={},cU=[],dU={};mU=s1,nU=s1,pU=s1,iU=s1,lU=s1,oU=s1,aU=s1,rU=s1,sU=s1});var p8=N0((nz,IQ)=>{var x0=(Q,$)=>()=>($||Q(($={exports:{}}).exports,$),$.exports),_0=x0((Q,$)=>{class q extends Error{constructor(K){if(!Array.isArray(K))throw new TypeError(`Expected input to be an Array, got ${typeof K}`);let J="";for(let Z=0;Z{$.exports={format(q,...K){return q.replace(/%([sdifj])/g,function(...[J,Z]){let G=K.shift();if(Z==="f")return G.toFixed(6);else if(Z==="j")return JSON.stringify(G);else if(Z==="s"&&typeof G==="object")return`${G.constructor!==Object?G.constructor.name:""} {}`.trim();else return G.toString()})},inspect(q){switch(typeof q){case"string":if(q.includes("'")){if(!q.includes('"'))return`"${q}"`;else if(!q.includes("`")&&!q.includes("${"))return`\`${q}\``}return`'${q}'`;case"number":if(isNaN(q))return"NaN";else if(Object.is(q,-0))return String(q);return q;case"bigint":return`${String(q)}n`;case"boolean":case"undefined":return String(q);case"object":return"{}"}}}}),K1=x0((Q,$)=>{var{format:q,inspect:K}=NQ(),{AggregateError:J}=_0(),Z=globalThis.AggregateError||J,G=Symbol("kIsNodeError"),B=["string","function","number","object","Function","Object","boolean","bigint","symbol"],W=/^([A-Z][a-z0-9]*)+$/,U={};function V(D,z){if(!D)throw new U.ERR_INTERNAL_ASSERTION(z)}function N(D){let z="",Y=D.length,H=D[0]==="-"?1:0;for(;Y>=H+4;Y-=3)z=`_${D.slice(Y-3,Y)}${z}`;return`${D.slice(0,Y)}${z}`}function F(D,z,Y){if(typeof z==="function")return V(z.length<=Y.length,`Code: ${D}; The provided arguments length (${Y.length}) does not match the required ones (${z.length}).`),z(...Y);let H=(z.match(/%[dfijoOs]/g)||[]).length;if(V(H===Y.length,`Code: ${D}; The provided arguments length (${Y.length}) does not match the required ones (${H}).`),Y.length===0)return z;return q(z,...Y)}function M(D,z,Y){if(!Y)Y=Error;class H extends Y{constructor(...R){super(F(D,z,R))}toString(){return`${this.name} [${D}]: ${this.message}`}}Object.defineProperties(H.prototype,{name:{value:Y.name,writable:!0,enumerable:!1,configurable:!0},toString:{value(){return`${this.name} [${D}]: ${this.message}`},writable:!0,enumerable:!1,configurable:!0}}),H.prototype.code=D,H.prototype[G]=!0,U[D]=H}function v(D){let z="__node_internal_"+D.name;return Object.defineProperty(D,"name",{value:z}),D}function x(D,z){if(D&&z&&D!==z){if(Array.isArray(z.errors))return z.errors.push(D),z;let Y=new Z([z,D],z.message);return Y.code=z.code,Y}return D||z}class y extends Error{constructor(D="The operation was aborted",z=void 0){if(z!==void 0&&typeof z!=="object")throw new U.ERR_INVALID_ARG_TYPE("options","Object",z);super(D,z);this.code="ABORT_ERR",this.name="AbortError"}}M("ERR_ASSERTION","%s",Error),M("ERR_INVALID_ARG_TYPE",(D,z,Y)=>{if(V(typeof D==="string","'name' must be a string"),!Array.isArray(z))z=[z];let H="The ";if(D.endsWith(" argument"))H+=`${D} `;else H+=`"${D}" ${D.includes(".")?"property":"argument"} `;H+="must be ";let R=[],c=[],m=[];for(let _ of z)if(V(typeof _==="string","All expected entries have to be of type string"),B.includes(_))R.push(_.toLowerCase());else if(W.test(_))c.push(_);else V(_!=="object",'The value "object" should be written as "Object"'),m.push(_);if(c.length>0){let _=R.indexOf("object");if(_!==-1)R.splice(R,_,1),c.push("Object")}if(R.length>0){switch(R.length){case 1:H+=`of type ${R[0]}`;break;case 2:H+=`one of type ${R[0]} or ${R[1]}`;break;default:{let _=R.pop();H+=`one of type ${R.join(", ")}, or ${_}`}}if(c.length>0||m.length>0)H+=" or "}if(c.length>0){switch(c.length){case 1:H+=`an instance of ${c[0]}`;break;case 2:H+=`an instance of ${c[0]} or ${c[1]}`;break;default:{let _=c.pop();H+=`an instance of ${c.join(", ")}, or ${_}`}}if(m.length>0)H+=" or "}switch(m.length){case 0:break;case 1:if(m[0].toLowerCase()!==m[0])H+="an ";H+=`${m[0]}`;break;case 2:H+=`one of ${m[0]} or ${m[1]}`;break;default:{let _=m.pop();H+=`one of ${m.join(", ")}, or ${_}`}}if(Y==null)H+=`. Received ${Y}`;else if(typeof Y==="function"&&Y.name)H+=`. Received function ${Y.name}`;else if(typeof Y==="object"){var $0;if(($0=Y.constructor)!==null&&$0!==void 0&&$0.name)H+=`. Received an instance of ${Y.constructor.name}`;else{let _=K(Y,{depth:-1});H+=`. Received ${_}`}}else{let _=K(Y,{colors:!1});if(_.length>25)_=`${_.slice(0,25)}...`;H+=`. Received type ${typeof Y} (${_})`}return H},TypeError),M("ERR_INVALID_ARG_VALUE",(D,z,Y="is invalid")=>{let H=K(z);if(H.length>128)H=H.slice(0,128)+"...";return`The ${D.includes(".")?"property":"argument"} '${D}' ${Y}. Received ${H}`},TypeError),M("ERR_INVALID_RETURN_VALUE",(D,z,Y)=>{var H;let R=Y!==null&&Y!==void 0&&(H=Y.constructor)!==null&&H!==void 0&&H.name?`instance of ${Y.constructor.name}`:`type ${typeof Y}`;return`Expected ${D} to be returned from the "${z}" function but got ${R}.`},TypeError),M("ERR_MISSING_ARGS",(...D)=>{V(D.length>0,"At least one arg needs to be specified");let z,Y=D.length;switch(D=(Array.isArray(D)?D:[D]).map((H)=>`"${H}"`).join(" or "),Y){case 1:z+=`The ${D[0]} argument`;break;case 2:z+=`The ${D[0]} and ${D[1]} arguments`;break;default:{let H=D.pop();z+=`The ${D.join(", ")}, and ${H} arguments`}break}return`${z} must be specified`},TypeError),M("ERR_OUT_OF_RANGE",(D,z,Y)=>{V(z,'Missing "range" argument');let H;if(Number.isInteger(Y)&&Math.abs(Y)>4294967296)H=N(String(Y));else if(typeof Y==="bigint"){H=String(Y);let R=BigInt(2)**BigInt(32);if(Y>R||Y<-R)H=N(H);H+="n"}else H=K(Y);return`The value of "${D}" is out of range. It must be ${z}. Received ${H}`},RangeError),M("ERR_MULTIPLE_CALLBACK","Callback called multiple times",Error),M("ERR_METHOD_NOT_IMPLEMENTED","The %s method is not implemented",Error),M("ERR_STREAM_ALREADY_FINISHED","Cannot call %s after a stream was finished",Error),M("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable",Error),M("ERR_STREAM_DESTROYED","Cannot call %s after a stream was destroyed",Error),M("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),M("ERR_STREAM_PREMATURE_CLOSE","Premature close",Error),M("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF",Error),M("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event",Error),M("ERR_STREAM_WRITE_AFTER_END","write after end",Error),M("ERR_UNKNOWN_ENCODING","Unknown encoding: %s",TypeError),$.exports={AbortError:y,aggregateTwoErrors:v(x),hideStackFrames:v,codes:U}}),KV=x0((Q,$)=>{Object.defineProperty(Q,"__esModule",{value:!0});var q=new WeakMap,K=new WeakMap;function J(g){let O=q.get(g);return console.assert(O!=null,"'this' is expected an Event object, but got",g),O}function Z(g){if(g.passiveListener!=null){if(typeof console!=="undefined"&&typeof console.error==="function")console.error("Unable to preventDefault inside passive event listener invocation.",g.passiveListener);return}if(!g.event.cancelable)return;if(g.canceled=!0,typeof g.event.preventDefault==="function")g.event.preventDefault()}function G(g,O){q.set(this,{eventTarget:g,event:O,eventPhase:2,currentTarget:g,canceled:!1,stopped:!1,immediateStopped:!1,passiveListener:null,timeStamp:O.timeStamp||Date.now()}),Object.defineProperty(this,"isTrusted",{value:!1,enumerable:!0});let h=Object.keys(O);for(let f=0;f0){let g=new Array(arguments.length);for(let O=0;O{Object.defineProperty(Q,"__esModule",{value:!0});var q=KV();class K extends q.EventTarget{constructor(){super();throw new TypeError("AbortSignal cannot be constructed directly")}get aborted(){let V=G.get(this);if(typeof V!=="boolean")throw new TypeError(`Expected 'this' to be an 'AbortSignal' object, but got ${this===null?"null":typeof this}`);return V}}q.defineEventAttribute(K.prototype,"abort");function J(){let V=Object.create(K.prototype);return q.EventTarget.call(V),G.set(V,!1),V}function Z(V){if(G.get(V)!==!1)return;G.set(V,!0),V.dispatchEvent({type:"abort"})}var G=new WeakMap;if(Object.defineProperties(K.prototype,{aborted:{enumerable:!0}}),typeof Symbol==="function"&&typeof Symbol.toStringTag==="symbol")Object.defineProperty(K.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortSignal"});class B{constructor(){W.set(this,J())}get signal(){return U(this)}abort(){Z(U(this))}}var W=new WeakMap;function U(V){let N=W.get(V);if(N==null)throw new TypeError(`Expected 'this' to be an 'AbortController' object, but got ${V===null?"null":typeof V}`);return N}if(Object.defineProperties(B.prototype,{signal:{enumerable:!0},abort:{enumerable:!0}}),typeof Symbol==="function"&&typeof Symbol.toStringTag==="symbol")Object.defineProperty(B.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortController"});Q.AbortController=B,Q.AbortSignal=K,Q.default=B,$.exports=B,$.exports.AbortController=$.exports.default=B,$.exports.AbortSignal=K}),G1=x0((Q,$)=>{var q=(a0(),y0(s0)),{format:K,inspect:J}=NQ(),{codes:{ERR_INVALID_ARG_TYPE:Z}}=K1(),{kResistStopPropagation:G,AggregateError:B,SymbolDispose:W}=_0(),U=globalThis.AbortSignal||Q8().AbortSignal,V=globalThis.AbortController||Q8().AbortController,N=Object.getPrototypeOf(async function(){}).constructor,F=globalThis.Blob||q.Blob,M=typeof F!=="undefined"?function y(D){return D instanceof F}:function y(D){return!1},v=(y,D)=>{if(y!==void 0&&(y===null||typeof y!=="object"||!("aborted"in y)))throw new Z(D,"AbortSignal",y)},x=(y,D)=>{if(typeof y!=="function")throw new Z(D,"Function",y)};$.exports={AggregateError:B,kEmptyObject:Object.freeze({}),once(y){let D=!1;return function(...z){if(D)return;D=!0,y.apply(this,z)}},createDeferredPromise:function(){let y,D;return{promise:new Promise((z,Y)=>{y=z,D=Y}),resolve:y,reject:D}},promisify(y){return new Promise((D,z)=>{y((Y,...H)=>{if(Y)return z(Y);return D(...H)})})},debuglog(){return function(){}},format:K,inspect:J,types:{isAsyncFunction(y){return y instanceof N},isArrayBufferView(y){return ArrayBuffer.isView(y)}},isBlob:M,deprecate(y,D){return y},addAbortListener:(a1(),y0(o1)).addAbortListener||function y(D,z){if(D===void 0)throw new Z("signal","AbortSignal",D);v(D,"signal"),x(z,"listener");let Y;if(D.aborted)queueMicrotask(()=>z());else D.addEventListener("abort",z,{__proto__:null,once:!0,[G]:!0}),Y=()=>{D.removeEventListener("abort",z)};return{__proto__:null,[W](){var H;(H=Y)===null||H===void 0||H()}}},AbortSignalAny:U.any||function y(D){if(D.length===1)return D[0];let z=new V,Y=()=>z.abort();return D.forEach((H)=>{v(H,"signals"),H.addEventListener("abort",Y,{once:!0})}),z.signal.addEventListener("abort",()=>{D.forEach((H)=>H.removeEventListener("abort",Y))},{once:!0}),z.signal}},$.exports.promisify.custom=Symbol.for("nodejs.util.promisify.custom")}),q8=x0((Q,$)=>{var{ArrayIsArray:q,ArrayPrototypeIncludes:K,ArrayPrototypeJoin:J,ArrayPrototypeMap:Z,NumberIsInteger:G,NumberIsNaN:B,NumberMAX_SAFE_INTEGER:W,NumberMIN_SAFE_INTEGER:U,NumberParseInt:V,ObjectPrototypeHasOwnProperty:N,RegExpPrototypeExec:F,String:M,StringPrototypeToUpperCase:v,StringPrototypeTrim:x}=_0(),{hideStackFrames:y,codes:{ERR_SOCKET_BAD_PORT:D,ERR_INVALID_ARG_TYPE:z,ERR_INVALID_ARG_VALUE:Y,ERR_OUT_OF_RANGE:H,ERR_UNKNOWN_SIGNAL:R}}=K1(),{normalizeEncoding:c}=G1(),{isAsyncFunction:m,isArrayBufferView:$0}=G1().types,_={};function g(j){return j===(j|0)}function O(j){return j===j>>>0}var h=/^[0-7]+$/,f="must be a 32-bit unsigned integer or an octal string";function A(j,d,e){if(typeof j==="undefined")j=e;if(typeof j==="string"){if(F(h,j)===null)throw new Y(d,j,f);j=V(j,8)}return i(j,d),j}var I=y((j,d,e=U,p=W)=>{if(typeof j!=="number")throw new z(d,"number",j);if(!G(j))throw new H(d,"an integer",j);if(jp)throw new H(d,`>= ${e} && <= ${p}`,j)}),n=y((j,d,e=-2147483648,p=2147483647)=>{if(typeof j!=="number")throw new z(d,"number",j);if(!G(j))throw new H(d,"an integer",j);if(jp)throw new H(d,`>= ${e} && <= ${p}`,j)}),i=y((j,d,e=!1)=>{if(typeof j!=="number")throw new z(d,"number",j);if(!G(j))throw new H(d,"an integer",j);let p=e?1:0,G0=4294967295;if(jG0)throw new H(d,`>= ${p} && <= ${G0}`,j)});function K0(j,d){if(typeof j!=="string")throw new z(d,"string",j)}function z0(j,d,e=void 0,p){if(typeof j!=="number")throw new z(d,"number",j);if(e!=null&&jp||(e!=null||p!=null)&&B(j))throw new H(d,`${e!=null?`>= ${e}`:""}${e!=null&&p!=null?" && ":""}${p!=null?`<= ${p}`:""}`,j)}var S=y((j,d,e)=>{if(!K(e,j)){let p="must be one of: "+J(Z(e,(G0)=>typeof G0==="string"?`'${G0}'`:M(G0)),", ");throw new Y(d,j,p)}});function U0(j,d){if(typeof j!=="boolean")throw new z(d,"boolean",j)}function k(j,d,e){return j==null||!N(j,d)?e:j[d]}var u=y((j,d,e=null)=>{let p=k(e,"allowArray",!1),G0=k(e,"allowFunction",!1);if(!k(e,"nullable",!1)&&j===null||!p&&q(j)||typeof j!=="object"&&(!G0||typeof j!=="function"))throw new z(d,"Object",j)}),Q0=y((j,d)=>{if(j!=null&&typeof j!=="object"&&typeof j!=="function")throw new z(d,"a dictionary",j)}),E=y((j,d,e=0)=>{if(!q(j))throw new z(d,"Array",j);if(j.length{if(!$0(j))throw new z(d,["Buffer","TypedArray","DataView"],j)});function T(j,d){let e=c(d),p=j.length;if(e==="hex"&&p%2!==0)throw new Y("encoding",d,`is invalid for data of length ${p}`)}function t(j,d="Port",e=!0){if(typeof j!=="number"&&typeof j!=="string"||typeof j==="string"&&x(j).length===0||+j!==+j>>>0||j>65535||j===0&&!e)throw new D(d,j,e);return j|0}var Z0=y((j,d)=>{if(j!==void 0&&(j===null||typeof j!=="object"||!("aborted"in j)))throw new z(d,"AbortSignal",j)}),W0=y((j,d)=>{if(typeof j!=="function")throw new z(d,"Function",j)}),C=y((j,d)=>{if(typeof j!=="function"||m(j))throw new z(d,"Function",j)}),X=y((j,d)=>{if(j!==void 0)throw new z(d,"undefined",j)});function P(j,d,e){if(!K(e,j))throw new z(d,`('${J(e,"|")}')`,j)}var o=/^(?:<[^>]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/;function r(j,d){if(typeof j==="undefined"||!F(o,j))throw new Y(d,j,'must be an array or string of format "; rel=preload; as=style"')}function l(j){if(typeof j==="string")return r(j,"hints"),j;else if(q(j)){let d=j.length,e="";if(d===0)return e;for(let p=0;p; rel=preload; as=style"')}$.exports={isInt32:g,isUint32:O,parseFileMode:A,validateArray:E,validateStringArray:q0,validateBooleanArray:B0,validateAbortSignalArray:w0,validateBoolean:U0,validateBuffer:b,validateDictionary:Q0,validateEncoding:T,validateFunction:W0,validateInt32:n,validateInteger:I,validateNumber:z0,validateObject:u,validateOneOf:S,validatePlainFunction:C,validatePort:t,validateSignalName:M0,validateString:K0,validateUint32:i,validateUndefined:X,validateUnion:P,validateAbortSignal:Z0,validateLinkHeaderValue:l}}),_2=x0((Q,$)=>{$.exports=(L4(),y0(Y4))}),e1=x0((Q,$)=>{var{SymbolAsyncIterator:q,SymbolIterator:K,SymbolFor:J}=_0(),Z=J("nodejs.stream.destroyed"),G=J("nodejs.stream.errored"),B=J("nodejs.stream.readable"),W=J("nodejs.stream.writable"),U=J("nodejs.stream.disturbed"),V=J("nodejs.webstream.isClosedPromise"),N=J("nodejs.webstream.controllerErrorFunction");function F(k,u=!1){var Q0;return!!(k&&typeof k.pipe==="function"&&typeof k.on==="function"&&(!u||typeof k.pause==="function"&&typeof k.resume==="function")&&(!k._writableState||((Q0=k._readableState)===null||Q0===void 0?void 0:Q0.readable)!==!1)&&(!k._writableState||k._readableState))}function M(k){var u;return!!(k&&typeof k.write==="function"&&typeof k.on==="function"&&(!k._readableState||((u=k._writableState)===null||u===void 0?void 0:u.writable)!==!1))}function v(k){return!!(k&&typeof k.pipe==="function"&&k._readableState&&typeof k.on==="function"&&typeof k.write==="function")}function x(k){return k&&(k._readableState||k._writableState||typeof k.write==="function"&&typeof k.on==="function"||typeof k.pipe==="function"&&typeof k.on==="function")}function y(k){return!!(k&&!x(k)&&typeof k.pipeThrough==="function"&&typeof k.getReader==="function"&&typeof k.cancel==="function")}function D(k){return!!(k&&!x(k)&&typeof k.getWriter==="function"&&typeof k.abort==="function")}function z(k){return!!(k&&!x(k)&&typeof k.readable==="object"&&typeof k.writable==="object")}function Y(k){return y(k)||D(k)||z(k)}function H(k,u){if(k==null)return!1;if(u===!0)return typeof k[q]==="function";if(u===!1)return typeof k[K]==="function";return typeof k[q]==="function"||typeof k[K]==="function"}function R(k){if(!x(k))return null;let{_writableState:u,_readableState:Q0}=k,E=u||Q0;return!!(k.destroyed||k[Z]||E!==null&&E!==void 0&&E.destroyed)}function c(k){if(!M(k))return null;if(k.writableEnded===!0)return!0;let u=k._writableState;if(u!==null&&u!==void 0&&u.errored)return!1;if(typeof(u===null||u===void 0?void 0:u.ended)!=="boolean")return null;return u.ended}function m(k,u){if(!M(k))return null;if(k.writableFinished===!0)return!0;let Q0=k._writableState;if(Q0!==null&&Q0!==void 0&&Q0.errored)return!1;if(typeof(Q0===null||Q0===void 0?void 0:Q0.finished)!=="boolean")return null;return!!(Q0.finished||u===!1&&Q0.ended===!0&&Q0.length===0)}function $0(k){if(!F(k))return null;if(k.readableEnded===!0)return!0;let u=k._readableState;if(!u||u.errored)return!1;if(typeof(u===null||u===void 0?void 0:u.ended)!=="boolean")return null;return u.ended}function _(k,u){if(!F(k))return null;let Q0=k._readableState;if(Q0!==null&&Q0!==void 0&&Q0.errored)return!1;if(typeof(Q0===null||Q0===void 0?void 0:Q0.endEmitted)!=="boolean")return null;return!!(Q0.endEmitted||u===!1&&Q0.ended===!0&&Q0.length===0)}function g(k){if(k&&k[B]!=null)return k[B];if(typeof(k===null||k===void 0?void 0:k.readable)!=="boolean")return null;if(R(k))return!1;return F(k)&&k.readable&&!_(k)}function O(k){if(k&&k[W]!=null)return k[W];if(typeof(k===null||k===void 0?void 0:k.writable)!=="boolean")return null;if(R(k))return!1;return M(k)&&k.writable&&!c(k)}function h(k,u){if(!x(k))return null;if(R(k))return!0;if((u===null||u===void 0?void 0:u.readable)!==!1&&g(k))return!1;if((u===null||u===void 0?void 0:u.writable)!==!1&&O(k))return!1;return!0}function f(k){var u,Q0;if(!x(k))return null;if(k.writableErrored)return k.writableErrored;return(u=(Q0=k._writableState)===null||Q0===void 0?void 0:Q0.errored)!==null&&u!==void 0?u:null}function A(k){var u,Q0;if(!x(k))return null;if(k.readableErrored)return k.readableErrored;return(u=(Q0=k._readableState)===null||Q0===void 0?void 0:Q0.errored)!==null&&u!==void 0?u:null}function I(k){if(!x(k))return null;if(typeof k.closed==="boolean")return k.closed;let{_writableState:u,_readableState:Q0}=k;if(typeof(u===null||u===void 0?void 0:u.closed)==="boolean"||typeof(Q0===null||Q0===void 0?void 0:Q0.closed)==="boolean")return(u===null||u===void 0?void 0:u.closed)||(Q0===null||Q0===void 0?void 0:Q0.closed);if(typeof k._closed==="boolean"&&n(k))return k._closed;return null}function n(k){return typeof k._closed==="boolean"&&typeof k._defaultKeepAlive==="boolean"&&typeof k._removedConnection==="boolean"&&typeof k._removedContLen==="boolean"}function i(k){return typeof k._sent100==="boolean"&&n(k)}function K0(k){var u;return typeof k._consuming==="boolean"&&typeof k._dumped==="boolean"&&((u=k.req)===null||u===void 0?void 0:u.upgradeOrConnect)===void 0}function z0(k){if(!x(k))return null;let{_writableState:u,_readableState:Q0}=k,E=u||Q0;return!E&&i(k)||!!(E&&E.autoDestroy&&E.emitClose&&E.closed===!1)}function S(k){var u;return!!(k&&((u=k[U])!==null&&u!==void 0?u:k.readableDidRead||k.readableAborted))}function U0(k){var u,Q0,E,q0,B0,w0,M0,b,T,t;return!!(k&&((u=(Q0=(E=(q0=(B0=(w0=k[G])!==null&&w0!==void 0?w0:k.readableErrored)!==null&&B0!==void 0?B0:k.writableErrored)!==null&&q0!==void 0?q0:(M0=k._readableState)===null||M0===void 0?void 0:M0.errorEmitted)!==null&&E!==void 0?E:(b=k._writableState)===null||b===void 0?void 0:b.errorEmitted)!==null&&Q0!==void 0?Q0:(T=k._readableState)===null||T===void 0?void 0:T.errored)!==null&&u!==void 0?u:(t=k._writableState)===null||t===void 0?void 0:t.errored))}$.exports={isDestroyed:R,kIsDestroyed:Z,isDisturbed:S,kIsDisturbed:U,isErrored:U0,kIsErrored:G,isReadable:g,kIsReadable:B,kIsClosedPromise:V,kControllerErrorFunction:N,kIsWritable:W,isClosed:I,isDuplexNodeStream:v,isFinished:h,isIterable:H,isReadableNodeStream:F,isReadableStream:y,isReadableEnded:$0,isReadableFinished:_,isReadableErrored:A,isNodeStream:x,isWebStream:Y,isWritable:O,isWritableNodeStream:M,isWritableStream:D,isWritableEnded:c,isWritableFinished:m,isWritableErrored:f,isServerRequest:K0,isServerResponse:i,willEmitClose:z0,isTransformStream:z}}),z2=x0((Q,$)=>{var q=_2(),{AbortError:K,codes:J}=K1(),{ERR_INVALID_ARG_TYPE:Z,ERR_STREAM_PREMATURE_CLOSE:G}=J,{kEmptyObject:B,once:W}=G1(),{validateAbortSignal:U,validateFunction:V,validateObject:N,validateBoolean:F}=q8(),{Promise:M,PromisePrototypeThen:v,SymbolDispose:x}=_0(),{isClosed:y,isReadable:D,isReadableNodeStream:z,isReadableStream:Y,isReadableFinished:H,isReadableErrored:R,isWritable:c,isWritableNodeStream:m,isWritableStream:$0,isWritableFinished:_,isWritableErrored:g,isNodeStream:O,willEmitClose:h,kIsClosedPromise:f}=e1(),A;function I(S){return S.setHeader&&typeof S.abort==="function"}var n=()=>{};function i(S,U0,k){var u,Q0;if(arguments.length===2)k=U0,U0=B;else if(U0==null)U0=B;else N(U0,"options");if(V(k,"callback"),U(U0.signal,"options.signal"),k=W(k),Y(S)||$0(S))return K0(S,U0,k);if(!O(S))throw new Z("stream",["ReadableStream","WritableStream","Stream"],S);let E=(u=U0.readable)!==null&&u!==void 0?u:z(S),q0=(Q0=U0.writable)!==null&&Q0!==void 0?Q0:m(S),B0=S._writableState,w0=S._readableState,M0=()=>{if(!S.writable)t()},b=h(S)&&z(S)===E&&m(S)===q0,T=_(S,!1),t=()=>{if(T=!0,S.destroyed)b=!1;if(b&&(!S.readable||E))return;if(!E||Z0)k.call(S)},Z0=H(S,!1),W0=()=>{if(Z0=!0,S.destroyed)b=!1;if(b&&(!S.writable||q0))return;if(!q0||T)k.call(S)},C=(j)=>{k.call(S,j)},X=y(S),P=()=>{X=!0;let j=g(S)||R(S);if(j&&typeof j!=="boolean")return k.call(S,j);if(E&&!Z0&&z(S,!0)){if(!H(S,!1))return k.call(S,new G)}if(q0&&!T){if(!_(S,!1))return k.call(S,new G)}k.call(S)},o=()=>{X=!0;let j=g(S)||R(S);if(j&&typeof j!=="boolean")return k.call(S,j);k.call(S)},r=()=>{S.req.on("finish",t)};if(I(S)){if(S.on("complete",t),!b)S.on("abort",P);if(S.req)r();else S.on("request",r)}else if(q0&&!B0)S.on("end",M0),S.on("close",M0);if(!b&&typeof S.aborted==="boolean")S.on("aborted",P);if(S.on("end",W0),S.on("finish",t),U0.error!==!1)S.on("error",C);if(S.on("close",P),X)q.nextTick(P);else if(B0!==null&&B0!==void 0&&B0.errorEmitted||w0!==null&&w0!==void 0&&w0.errorEmitted){if(!b)q.nextTick(o)}else if(!E&&(!b||D(S))&&(T||c(S)===!1))q.nextTick(o);else if(!q0&&(!b||c(S))&&(Z0||D(S)===!1))q.nextTick(o);else if(w0&&S.req&&S.aborted)q.nextTick(o);let l=()=>{if(k=n,S.removeListener("aborted",P),S.removeListener("complete",t),S.removeListener("abort",P),S.removeListener("request",r),S.req)S.req.removeListener("finish",t);S.removeListener("end",M0),S.removeListener("close",M0),S.removeListener("finish",t),S.removeListener("end",W0),S.removeListener("error",C),S.removeListener("close",P)};if(U0.signal&&!X){let j=()=>{let d=k;l(),d.call(S,new K(void 0,{cause:U0.signal.reason}))};if(U0.signal.aborted)q.nextTick(j);else{A=A||G1().addAbortListener;let d=A(U0.signal,j),e=k;k=W((...p)=>{d[x](),e.apply(S,p)})}}return l}function K0(S,U0,k){let u=!1,Q0=n;if(U0.signal)if(Q0=()=>{u=!0,k.call(S,new K(void 0,{cause:U0.signal.reason}))},U0.signal.aborted)q.nextTick(Q0);else{A=A||G1().addAbortListener;let q0=A(U0.signal,Q0),B0=k;k=W((...w0)=>{q0[x](),B0.apply(S,w0)})}let E=(...q0)=>{if(!u)q.nextTick(()=>k.apply(S,q0))};return v(S[f].promise,E,E),n}function z0(S,U0){var k;let u=!1;if(U0===null)U0=B;if((k=U0)!==null&&k!==void 0&&k.cleanup)F(U0.cleanup,"cleanup"),u=U0.cleanup;return new M((Q0,E)=>{let q0=i(S,U0,(B0)=>{if(u)q0();if(B0)E(B0);else Q0()})})}$.exports=i,$.exports.finished=z0}),G6=x0((Q,$)=>{var q=_2(),{aggregateTwoErrors:K,codes:{ERR_MULTIPLE_CALLBACK:J},AbortError:Z}=K1(),{Symbol:G}=_0(),{kIsDestroyed:B,isDestroyed:W,isFinished:U,isServerRequest:V}=e1(),N=G("kDestroy"),F=G("kConstruct");function M(h,f,A){if(h){if(h.stack,f&&!f.errored)f.errored=h;if(A&&!A.errored)A.errored=h}}function v(h,f){let A=this._readableState,I=this._writableState,n=I||A;if(I!==null&&I!==void 0&&I.destroyed||A!==null&&A!==void 0&&A.destroyed){if(typeof f==="function")f();return this}if(M(h,I,A),I)I.destroyed=!0;if(A)A.destroyed=!0;if(!n.constructed)this.once(N,function(i){x(this,K(i,h),f)});else x(this,h,f);return this}function x(h,f,A){let I=!1;function n(i){if(I)return;I=!0;let{_readableState:K0,_writableState:z0}=h;if(M(i,z0,K0),z0)z0.closed=!0;if(K0)K0.closed=!0;if(typeof A==="function")A(i);if(i)q.nextTick(y,h,i);else q.nextTick(D,h)}try{h._destroy(f||null,n)}catch(i){n(i)}}function y(h,f){z(h,f),D(h)}function D(h){let{_readableState:f,_writableState:A}=h;if(A)A.closeEmitted=!0;if(f)f.closeEmitted=!0;if(A!==null&&A!==void 0&&A.emitClose||f!==null&&f!==void 0&&f.emitClose)h.emit("close")}function z(h,f){let{_readableState:A,_writableState:I}=h;if(I!==null&&I!==void 0&&I.errorEmitted||A!==null&&A!==void 0&&A.errorEmitted)return;if(I)I.errorEmitted=!0;if(A)A.errorEmitted=!0;h.emit("error",f)}function Y(){let h=this._readableState,f=this._writableState;if(h)h.constructed=!0,h.closed=!1,h.closeEmitted=!1,h.destroyed=!1,h.errored=null,h.errorEmitted=!1,h.reading=!1,h.ended=h.readable===!1,h.endEmitted=h.readable===!1;if(f)f.constructed=!0,f.destroyed=!1,f.closed=!1,f.closeEmitted=!1,f.errored=null,f.errorEmitted=!1,f.finalCalled=!1,f.prefinished=!1,f.ended=f.writable===!1,f.ending=f.writable===!1,f.finished=f.writable===!1}function H(h,f,A){let{_readableState:I,_writableState:n}=h;if(n!==null&&n!==void 0&&n.destroyed||I!==null&&I!==void 0&&I.destroyed)return this;if(I!==null&&I!==void 0&&I.autoDestroy||n!==null&&n!==void 0&&n.autoDestroy)h.destroy(f);else if(f){if(f.stack,n&&!n.errored)n.errored=f;if(I&&!I.errored)I.errored=f;if(A)q.nextTick(z,h,f);else z(h,f)}}function R(h,f){if(typeof h._construct!=="function")return;let{_readableState:A,_writableState:I}=h;if(A)A.constructed=!1;if(I)I.constructed=!1;if(h.once(F,f),h.listenerCount(F)>1)return;q.nextTick(c,h)}function c(h){let f=!1;function A(I){if(f){H(h,I!==null&&I!==void 0?I:new J);return}f=!0;let{_readableState:n,_writableState:i}=h,K0=i||n;if(n)n.constructed=!0;if(i)i.constructed=!0;if(K0.destroyed)h.emit(N,I);else if(I)H(h,I,!0);else q.nextTick(m,h)}try{h._construct((I)=>{q.nextTick(A,I)})}catch(I){q.nextTick(A,I)}}function m(h){h.emit(F)}function $0(h){return(h===null||h===void 0?void 0:h.setHeader)&&typeof h.abort==="function"}function _(h){h.emit("close")}function g(h,f){h.emit("error",f),q.nextTick(_,h)}function O(h,f){if(!h||W(h))return;if(!f&&!U(h))f=new Z;if(V(h))h.socket=null,h.destroy(f);else if($0(h))h.abort();else if($0(h.req))h.req.abort();else if(typeof h.destroy==="function")h.destroy(f);else if(typeof h.close==="function")h.close();else if(f)q.nextTick(g,h,f);else q.nextTick(_,h);if(!h.destroyed)h[B]=!0}$.exports={construct:R,destroyer:O,destroy:v,undestroy:Y,errorOrDestroy:H}}),D4=x0((Q,$)=>{var{ArrayIsArray:q,ObjectSetPrototypeOf:K}=_0(),{EventEmitter:J}=(a1(),y0(o1));function Z(B){J.call(this,B)}K(Z.prototype,J.prototype),K(Z,J),Z.prototype.pipe=function(B,W){let U=this;function V(D){if(B.writable&&B.write(D)===!1&&U.pause)U.pause()}U.on("data",V);function N(){if(U.readable&&U.resume)U.resume()}if(B.on("drain",N),!B._isStdio&&(!W||W.end!==!1))U.on("end",M),U.on("close",v);let F=!1;function M(){if(F)return;F=!0,B.end()}function v(){if(F)return;if(F=!0,typeof B.destroy==="function")B.destroy()}function x(D){if(y(),J.listenerCount(this,"error")===0)this.emit("error",D)}G(U,"error",x),G(B,"error",x);function y(){U.removeListener("data",V),B.removeListener("drain",N),U.removeListener("end",M),U.removeListener("close",v),U.removeListener("error",x),B.removeListener("error",x),U.removeListener("end",y),U.removeListener("close",y),B.removeListener("close",y)}return U.on("end",y),U.on("close",y),B.on("close",y),B.emit("pipe",U),B};function G(B,W,U){if(typeof B.prependListener==="function")return B.prependListener(W,U);if(!B._events||!B._events[W])B.on(W,U);else if(q(B._events[W]))B._events[W].unshift(U);else B._events[W]=[U,B._events[W]]}$.exports={Stream:Z,prependListener:G}}),d8=x0((Q,$)=>{var{SymbolDispose:q}=_0(),{AbortError:K,codes:J}=K1(),{isNodeStream:Z,isWebStream:G,kControllerErrorFunction:B}=e1(),W=z2(),{ERR_INVALID_ARG_TYPE:U}=J,V,N=(F,M)=>{if(typeof F!=="object"||!("aborted"in F))throw new U(M,"AbortSignal",F)};$.exports.addAbortSignal=function F(M,v){if(N(M,"signal"),!Z(v)&&!G(v))throw new U("stream",["ReadableStream","WritableStream","Stream"],v);return $.exports.addAbortSignalNoValidate(M,v)},$.exports.addAbortSignalNoValidate=function(F,M){if(typeof F!=="object"||!("aborted"in F))return M;let v=Z(M)?()=>{M.destroy(new K(void 0,{cause:F.reason}))}:()=>{M[B](new K(void 0,{cause:F.reason}))};if(F.aborted)v();else{V=V||G1().addAbortListener;let x=V(F,v);W(M,x[q])}return M}}),JV=x0((Q,$)=>{var{StringPrototypeSlice:q,SymbolIterator:K,TypedArrayPrototypeSet:J,Uint8Array:Z}=_0(),{Buffer:G}=(a0(),y0(s0)),{inspect:B}=G1();$.exports=class W{constructor(){this.head=null,this.tail=null,this.length=0}push(U){let V={data:U,next:null};if(this.length>0)this.tail.next=V;else this.head=V;this.tail=V,++this.length}unshift(U){let V={data:U,next:this.head};if(this.length===0)this.tail=V;this.head=V,++this.length}shift(){if(this.length===0)return;let U=this.head.data;if(this.length===1)this.head=this.tail=null;else this.head=this.head.next;return--this.length,U}clear(){this.head=this.tail=null,this.length=0}join(U){if(this.length===0)return"";let V=this.head,N=""+V.data;while((V=V.next)!==null)N+=U+V.data;return N}concat(U){if(this.length===0)return G.alloc(0);let V=G.allocUnsafe(U>>>0),N=this.head,F=0;while(N)J(V,N.data,F),F+=N.data.length,N=N.next;return V}consume(U,V){let N=this.head.data;if(UM.length)V+=M,U-=M.length;else{if(U===M.length)if(V+=M,++F,N.next)this.head=N.next;else this.head=this.tail=null;else V+=q(M,0,U),this.head=N,N.data=q(M,U);break}++F}while((N=N.next)!==null);return this.length-=F,V}_getBuffer(U){let V=G.allocUnsafe(U),N=U,F=this.head,M=0;do{let v=F.data;if(U>v.length)J(V,v,N-U),U-=v.length;else{if(U===v.length)if(J(V,v,N-U),++M,F.next)this.head=F.next;else this.head=this.tail=null;else J(V,new Z(v.buffer,v.byteOffset,U),N-U),this.head=F,F.data=v.slice(U);break}++M}while((F=F.next)!==null);return this.length-=M,V}[Symbol.for("nodejs.util.inspect.custom")](U,V){return B(this,{...V,depth:0,customInspect:!1})}}}),m8=x0((Q,$)=>{var{MathFloor:q,NumberIsInteger:K}=_0(),{validateInteger:J}=q8(),{ERR_INVALID_ARG_VALUE:Z}=K1().codes,G=16384,B=16;function W(F,M,v){return F.highWaterMark!=null?F.highWaterMark:M?F[v]:null}function U(F){return F?B:G}function V(F,M){if(J(M,"value",0),F)B=M;else G=M}function N(F,M,v,x){let y=W(M,x,v);if(y!=null){if(!K(y)||y<0){let D=x?`options.${v}`:"options.highWaterMark";throw new Z(D,y)}return q(y)}return U(F.objectMode)}$.exports={getHighWaterMark:N,getDefaultHighWaterMark:U,setDefaultHighWaterMark:V}}),UV=x0((Q,$)=>{/*! safe-buffer. MIT License. Feross Aboukhadijeh */var q=(a0(),y0(s0)),K=q.Buffer;function J(G,B){for(var W in G)B[W]=G[W]}if(K.from&&K.alloc&&K.allocUnsafe&&K.allocUnsafeSlow)$.exports=q;else J(q,Q),Q.Buffer=Z;function Z(G,B,W){return K(G,B,W)}Z.prototype=Object.create(K.prototype),J(K,Z),Z.from=function(G,B,W){if(typeof G==="number")throw new TypeError("Argument must not be a number");return K(G,B,W)},Z.alloc=function(G,B,W){if(typeof G!=="number")throw new TypeError("Argument must be a number");var U=K(G);if(B!==void 0)if(typeof W==="string")U.fill(B,W);else U.fill(B);else U.fill(0);return U},Z.allocUnsafe=function(G){if(typeof G!=="number")throw new TypeError("Argument must be a number");return K(G)},Z.allocUnsafeSlow=function(G){if(typeof G!=="number")throw new TypeError("Argument must be a number");return q.SlowBuffer(G)}}),VV=x0((Q)=>{var $=UV().Buffer,q=$.isEncoding||function(z){switch(z=""+z,z&&z.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function K(z){if(!z)return"utf8";var Y;while(!0)switch(z){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return z;default:if(Y)return;z=(""+z).toLowerCase(),Y=!0}}function J(z){var Y=K(z);if(typeof Y!=="string"&&($.isEncoding===q||!q(z)))throw new Error("Unknown encoding: "+z);return Y||z}Q.StringDecoder=Z;function Z(z){this.encoding=J(z);var Y;switch(this.encoding){case"utf16le":this.text=F,this.end=M,Y=4;break;case"utf8":this.fillLast=U,Y=4;break;case"base64":this.text=v,this.end=x,Y=3;break;default:this.write=y,this.end=D;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=$.allocUnsafe(Y)}Z.prototype.write=function(z){if(z.length===0)return"";var Y,H;if(this.lastNeed){if(Y=this.fillLast(z),Y===void 0)return"";H=this.lastNeed,this.lastNeed=0}else H=0;if(H>5===6)return 2;else if(z>>4===14)return 3;else if(z>>3===30)return 4;return z>>6===2?-1:-2}function B(z,Y,H){var R=Y.length-1;if(R=0){if(c>0)z.lastNeed=c-1;return c}if(--R=0){if(c>0)z.lastNeed=c-2;return c}if(--R=0){if(c>0)if(c===2)c=0;else z.lastNeed=c-3;return c}return 0}function W(z,Y,H){if((Y[0]&192)!==128)return z.lastNeed=0,"�";if(z.lastNeed>1&&Y.length>1){if((Y[1]&192)!==128)return z.lastNeed=1,"�";if(z.lastNeed>2&&Y.length>2){if((Y[2]&192)!==128)return z.lastNeed=2,"�"}}}function U(z){var Y=this.lastTotal-this.lastNeed,H=W(this,z,Y);if(H!==void 0)return H;if(this.lastNeed<=z.length)return z.copy(this.lastChar,Y,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);z.copy(this.lastChar,Y,0,z.length),this.lastNeed-=z.length}function V(z,Y){var H=B(this,z,Y);if(!this.lastNeed)return z.toString("utf8",Y);this.lastTotal=H;var R=z.length-(H-this.lastNeed);return z.copy(this.lastChar,0,R),z.toString("utf8",Y,R)}function N(z){var Y=z&&z.length?this.write(z):"";if(this.lastNeed)return Y+"�";return Y}function F(z,Y){if((z.length-Y)%2===0){var H=z.toString("utf16le",Y);if(H){var R=H.charCodeAt(H.length-1);if(R>=55296&&R<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=z[z.length-2],this.lastChar[1]=z[z.length-1],H.slice(0,-1)}return H}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=z[z.length-1],z.toString("utf16le",Y,z.length-1)}function M(z){var Y=z&&z.length?this.write(z):"";if(this.lastNeed){var H=this.lastTotal-this.lastNeed;return Y+this.lastChar.toString("utf16le",0,H)}return Y}function v(z,Y){var H=(z.length-Y)%3;if(H===0)return z.toString("base64",Y);if(this.lastNeed=3-H,this.lastTotal=3,H===1)this.lastChar[0]=z[z.length-1];else this.lastChar[0]=z[z.length-2],this.lastChar[1]=z[z.length-1];return z.toString("base64",Y,z.length-H)}function x(z){var Y=z&&z.length?this.write(z):"";if(this.lastNeed)return Y+this.lastChar.toString("base64",0,3-this.lastNeed);return Y}function y(z){return z.toString(this.encoding)}function D(z){return z&&z.length?this.write(z):""}}),YQ=x0((Q,$)=>{var q=_2(),{PromisePrototypeThen:K,SymbolAsyncIterator:J,SymbolIterator:Z}=_0(),{Buffer:G}=(a0(),y0(s0)),{ERR_INVALID_ARG_TYPE:B,ERR_STREAM_NULL_VALUES:W}=K1().codes;function U(V,N,F){let M;if(typeof N==="string"||N instanceof G)return new V({objectMode:!0,...F,read(){this.push(N),this.push(null)}});let v;if(N&&N[J])v=!0,M=N[J]();else if(N&&N[Z])v=!1,M=N[Z]();else throw new B("iterable",["Iterable"],N);let x=new V({objectMode:!0,highWaterMark:1,...F}),y=!1;x._read=function(){if(!y)y=!0,z()},x._destroy=function(Y,H){K(D(Y),()=>q.nextTick(H,Y),(R)=>q.nextTick(H,R||Y))};async function D(Y){let H=Y!==void 0&&Y!==null,R=typeof M.throw==="function";if(H&&R){let{value:c,done:m}=await M.throw(Y);if(await c,m)return}if(typeof M.return==="function"){let{value:c}=await M.return();await c}}async function z(){for(;;){try{let{value:Y,done:H}=v?await M.next():M.next();if(H)x.push(null);else{let R=Y&&typeof Y.then==="function"?await Y:Y;if(R===null)throw y=!1,new W;else if(x.push(R))continue;else y=!1}}catch(Y){x.destroy(Y)}break}}return x}$.exports=U}),n8=x0((Q,$)=>{var q=_2(),{ArrayPrototypeIndexOf:K,NumberIsInteger:J,NumberIsNaN:Z,NumberParseInt:G,ObjectDefineProperties:B,ObjectKeys:W,ObjectSetPrototypeOf:U,Promise:V,SafeSet:N,SymbolAsyncDispose:F,SymbolAsyncIterator:M,Symbol:v}=_0();$.exports=p,p.ReadableState=e;var{EventEmitter:x}=(a1(),y0(o1)),{Stream:y,prependListener:D}=D4(),{Buffer:z}=(a0(),y0(s0)),{addAbortSignal:Y}=d8(),H=z2(),R=G1().debuglog("stream",(w)=>{R=w}),c=JV(),m=G6(),{getHighWaterMark:$0,getDefaultHighWaterMark:_}=m8(),{aggregateTwoErrors:g,codes:{ERR_INVALID_ARG_TYPE:O,ERR_METHOD_NOT_IMPLEMENTED:h,ERR_OUT_OF_RANGE:f,ERR_STREAM_PUSH_AFTER_EOF:A,ERR_STREAM_UNSHIFT_AFTER_END_EVENT:I},AbortError:n}=K1(),{validateObject:i}=q8(),K0=v("kPaused"),{StringDecoder:z0}=VV(),S=YQ();U(p.prototype,y.prototype),U(p,y);var U0=()=>{},{errorOrDestroy:k}=m,u=1,Q0=2,E=4,q0=8,B0=16,w0=32,M0=64,b=128,T=256,t=512,Z0=1024,W0=2048,C=4096,X=8192,P=16384,o=32768,r=65536,l=131072,j=262144;function d(w){return{enumerable:!1,get(){return(this.state&w)!==0},set(L){if(L)this.state|=w;else this.state&=~w}}}B(e.prototype,{objectMode:d(u),ended:d(Q0),endEmitted:d(E),reading:d(q0),constructed:d(B0),sync:d(w0),needReadable:d(M0),emittedReadable:d(b),readableListening:d(T),resumeScheduled:d(t),errorEmitted:d(Z0),emitClose:d(W0),autoDestroy:d(C),destroyed:d(X),closed:d(P),closeEmitted:d(o),multiAwaitDrain:d(r),readingMore:d(l),dataEmitted:d(j)});function e(w,L,a){if(typeof a!=="boolean")a=L instanceof t1();if(this.state=W0|C|B0|w0,w&&w.objectMode)this.state|=u;if(a&&w&&w.readableObjectMode)this.state|=u;if(this.highWaterMark=w?$0(this,w,"readableHighWaterMark",a):_(!1),this.buffer=new c,this.length=0,this.pipes=[],this.flowing=null,this[K0]=null,w&&w.emitClose===!1)this.state&=~W0;if(w&&w.autoDestroy===!1)this.state&=~C;if(this.errored=null,this.defaultEncoding=w&&w.defaultEncoding||"utf8",this.awaitDrainWriters=null,this.decoder=null,this.encoding=null,w&&w.encoding)this.decoder=new z0(w.encoding),this.encoding=w.encoding}function p(w){if(!(this instanceof p))return new p(w);let L=this instanceof t1();if(this._readableState=new e(w,this,L),w){if(typeof w.read==="function")this._read=w.read;if(typeof w.destroy==="function")this._destroy=w.destroy;if(typeof w.construct==="function")this._construct=w.construct;if(w.signal&&!L)Y(w.signal,this)}y.call(this,w),m.construct(this,()=>{if(this._readableState.needReadable)M1(this,this._readableState)})}p.prototype.destroy=m.destroy,p.prototype._undestroy=m.undestroy,p.prototype._destroy=function(w,L){L(w)},p.prototype[x.captureRejectionSymbol]=function(w){this.destroy(w)},p.prototype[F]=function(){let w;if(!this.destroyed)w=this.readableEnded?null:new n,this.destroy(w);return new V((L,a)=>H(this,(s)=>s&&s!==w?a(s):L(null)))},p.prototype.push=function(w,L){return G0(this,w,L,!1)},p.prototype.unshift=function(w,L){return G0(this,w,L,!0)};function G0(w,L,a,s){R("readableAddChunk",L);let V0=w._readableState,g0;if((V0.state&u)===0){if(typeof L==="string"){if(a=a||V0.defaultEncoding,V0.encoding!==a)if(s&&V0.encoding)L=z.from(L,a).toString(V0.encoding);else L=z.from(L,a),a=""}else if(L instanceof z)a="";else if(y._isUint8Array(L))L=y._uint8ArrayToBuffer(L),a="";else if(L!=null)g0=new O("chunk",["string","Buffer","Uint8Array"],L)}if(g0)k(w,g0);else if(L===null)V0.state&=~q0,A0(w,V0);else if((V0.state&u)!==0||L&&L.length>0)if(s)if((V0.state&E)!==0)k(w,new I);else if(V0.destroyed||V0.errored)return!1;else P0(w,V0,L,!0);else if(V0.ended)k(w,new A);else if(V0.destroyed||V0.errored)return!1;else if(V0.state&=~q0,V0.decoder&&!a)if(L=V0.decoder.write(L),V0.objectMode||L.length!==0)P0(w,V0,L,!1);else M1(w,V0);else P0(w,V0,L,!1);else if(!s)V0.state&=~q0,M1(w,V0);return!V0.ended&&(V0.length0){if((L.state&r)!==0)L.awaitDrainWriters.clear();else L.awaitDrainWriters=null;L.dataEmitted=!0,w.emit("data",a)}else{if(L.length+=L.objectMode?1:a.length,s)L.buffer.unshift(a);else L.buffer.push(a);if((L.state&M0)!==0)O0(w)}M1(w,L)}p.prototype.isPaused=function(){let w=this._readableState;return w[K0]===!0||w.flowing===!1},p.prototype.setEncoding=function(w){let L=new z0(w);this._readableState.decoder=L,this._readableState.encoding=this._readableState.decoder.encoding;let a=this._readableState.buffer,s="";for(let V0 of a)s+=L.write(V0);if(a.clear(),s!=="")a.push(s);return this._readableState.length=s.length,this};var k0=1073741824;function I0(w){if(w>k0)throw new f("size","<= 1GiB",w);else w--,w|=w>>>1,w|=w>>>2,w|=w>>>4,w|=w>>>8,w|=w>>>16,w++;return w}function Q1(w,L){if(w<=0||L.length===0&&L.ended)return 0;if((L.state&u)!==0)return 1;if(Z(w)){if(L.flowing&&L.length)return L.buffer.first().length;return L.length}if(w<=L.length)return w;return L.ended?L.length:0}p.prototype.read=function(w){if(R("read",w),w===void 0)w=NaN;else if(!J(w))w=G(w,10);let L=this._readableState,a=w;if(w>L.highWaterMark)L.highWaterMark=I0(w);if(w!==0)L.state&=~b;if(w===0&&L.needReadable&&((L.highWaterMark!==0?L.length>=L.highWaterMark:L.length>0)||L.ended)){if(R("read: emitReadable",L.length,L.ended),L.length===0&&L.ended)f2(this);else O0(this);return null}if(w=Q1(w,L),w===0&&L.ended){if(L.length===0)f2(this);return null}let s=(L.state&M0)!==0;if(R("need readable",s),L.length===0||L.length-w0)V0=p6(w,L);else V0=null;if(V0===null)L.needReadable=L.length<=L.highWaterMark,w=0;else if(L.length-=w,L.multiAwaitDrain)L.awaitDrainWriters.clear();else L.awaitDrainWriters=null;if(L.length===0){if(!L.ended)L.needReadable=!0;if(a!==w&&L.ended)f2(this)}if(V0!==null&&!L.errorEmitted&&!L.closeEmitted)L.dataEmitted=!0,this.emit("data",V0);return V0};function A0(w,L){if(R("onEofChunk"),L.ended)return;if(L.decoder){let a=L.decoder.end();if(a&&a.length)L.buffer.push(a),L.length+=L.objectMode?1:a.length}if(L.ended=!0,L.sync)O0(w);else L.needReadable=!1,L.emittedReadable=!0,F1(w)}function O0(w){let L=w._readableState;if(R("emitReadable",L.needReadable,L.emittedReadable),L.needReadable=!1,!L.emittedReadable)R("emitReadable",L.flowing),L.emittedReadable=!0,q.nextTick(F1,w)}function F1(w){let L=w._readableState;if(R("emitReadable_",L.destroyed,L.length,L.ended),!L.destroyed&&!L.errored&&(L.length||L.ended))w.emit("readable"),L.emittedReadable=!1;L.needReadable=!L.flowing&&!L.ended&&L.length<=L.highWaterMark,m6(w)}function M1(w,L){if(!L.readingMore&&L.constructed)L.readingMore=!0,q.nextTick(d0,w,L)}function d0(w,L){while(!L.reading&&!L.ended&&(L.length1&&s.pipes.includes(w))R("false write response, pause",s.awaitDrainWriters.size),s.awaitDrainWriters.add(w);a.pause()}if(!q1)q1=o5(a,w),w.on("drain",q1)}a.on("data",a6);function a6($1){R("ondata");let i0=w.write($1);if(R("dest.write",i0),i0===!1)o6()}function g2($1){if(R("onerror",$1),A1(),w.removeListener("error",g2),w.listenerCount("error")===0){let i0=w._writableState||w._readableState;if(i0&&!i0.errorEmitted)k(w,$1);else w.emit("error",$1)}}D(w,"error",g2);function X2(){w.removeListener("finish",y2),A1()}w.once("close",X2);function y2(){R("onfinish"),w.removeListener("close",X2),A1()}w.once("finish",y2);function A1(){R("unpipe"),a.unpipe(w)}if(w.emit("pipe",a),w.writableNeedDrain===!0)o6();else if(!s.flowing)R("pipe resume"),a.resume();return w};function o5(w,L){return function a(){let s=w._readableState;if(s.awaitDrainWriters===L)R("pipeOnDrain",1),s.awaitDrainWriters=null;else if(s.multiAwaitDrain)R("pipeOnDrain",s.awaitDrainWriters.size),s.awaitDrainWriters.delete(L);if((!s.awaitDrainWriters||s.awaitDrainWriters.size===0)&&w.listenerCount("data"))w.resume()}}p.prototype.unpipe=function(w){let L=this._readableState,a={hasUnpiped:!1};if(L.pipes.length===0)return this;if(!w){let V0=L.pipes;L.pipes=[],this.pause();for(let g0=0;g00,s.flowing!==!1)this.resume()}else if(w==="readable"){if(!s.endEmitted&&!s.readableListening){if(s.readableListening=s.needReadable=!0,s.flowing=!1,s.emittedReadable=!1,R("on readable",s.length,s.reading),s.length)O0(this);else if(!s.reading)q.nextTick(a5,this)}}return a},p.prototype.addListener=p.prototype.on,p.prototype.removeListener=function(w,L){let a=y.prototype.removeListener.call(this,w,L);if(w==="readable")q.nextTick(d6,this);return a},p.prototype.off=p.prototype.removeListener,p.prototype.removeAllListeners=function(w){let L=y.prototype.removeAllListeners.apply(this,arguments);if(w==="readable"||w===void 0)q.nextTick(d6,this);return L};function d6(w){let L=w._readableState;if(L.readableListening=w.listenerCount("readable")>0,L.resumeScheduled&&L[K0]===!1)L.flowing=!0;else if(w.listenerCount("data")>0)w.resume();else if(!L.readableListening)L.flowing=null}function a5(w){R("readable nexttick read 0"),w.read(0)}p.prototype.resume=function(){let w=this._readableState;if(!w.flowing)R("resume"),w.flowing=!w.readableListening,r5(this,w);return w[K0]=!1,this};function r5(w,L){if(!L.resumeScheduled)L.resumeScheduled=!0,q.nextTick(s5,w,L)}function s5(w,L){if(R("resume",L.reading),!L.reading)w.read(0);if(L.resumeScheduled=!1,w.emit("resume"),m6(w),L.flowing&&!L.reading)w.read(0)}p.prototype.pause=function(){if(R("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1)R("pause"),this._readableState.flowing=!1,this.emit("pause");return this._readableState[K0]=!0,this};function m6(w){let L=w._readableState;R("flow",L.flowing);while(L.flowing&&w.read()!==null);}p.prototype.wrap=function(w){let L=!1;w.on("data",(s)=>{if(!this.push(s)&&w.pause)L=!0,w.pause()}),w.on("end",()=>{this.push(null)}),w.on("error",(s)=>{k(this,s)}),w.on("close",()=>{this.destroy()}),w.on("destroy",()=>{this.destroy()}),this._read=()=>{if(L&&w.resume)L=!1,w.resume()};let a=W(w);for(let s=1;s{V0=E0?g(V0,E0):null,a(),a=U0});try{while(!0){let E0=w.destroyed?null:w.read();if(E0!==null)yield E0;else if(V0)throw V0;else if(V0===null)return;else await new V(s)}}catch(E0){throw V0=g(V0,E0),V0}finally{if((V0||(L===null||L===void 0?void 0:L.destroyOnReturn)!==!1)&&(V0===void 0||w._readableState.autoDestroy))m.destroyer(w,null);else w.off("readable",s),g0()}}B(p.prototype,{readable:{__proto__:null,get(){let w=this._readableState;return!!w&&w.readable!==!1&&!w.destroyed&&!w.errorEmitted&&!w.endEmitted},set(w){if(this._readableState)this._readableState.readable=!!w}},readableDidRead:{__proto__:null,enumerable:!1,get:function(){return this._readableState.dataEmitted}},readableAborted:{__proto__:null,enumerable:!1,get:function(){return!!(this._readableState.readable!==!1&&(this._readableState.destroyed||this._readableState.errored)&&!this._readableState.endEmitted)}},readableHighWaterMark:{__proto__:null,enumerable:!1,get:function(){return this._readableState.highWaterMark}},readableBuffer:{__proto__:null,enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}},readableFlowing:{__proto__:null,enumerable:!1,get:function(){return this._readableState.flowing},set:function(w){if(this._readableState)this._readableState.flowing=w}},readableLength:{__proto__:null,enumerable:!1,get(){return this._readableState.length}},readableObjectMode:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.objectMode:!1}},readableEncoding:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.encoding:null}},errored:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.errored:null}},closed:{__proto__:null,get(){return this._readableState?this._readableState.closed:!1}},destroyed:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.destroyed:!1},set(w){if(!this._readableState)return;this._readableState.destroyed=w}},readableEnded:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.endEmitted:!1}}}),B(e.prototype,{pipesCount:{__proto__:null,get(){return this.pipes.length}},paused:{__proto__:null,get(){return this[K0]!==!1},set(w){this[K0]=!!w}}}),p._fromList=p6;function p6(w,L){if(L.length===0)return null;let a;if(L.objectMode)a=L.buffer.shift();else if(!w||w>=L.length){if(L.decoder)a=L.buffer.join("");else if(L.buffer.length===1)a=L.buffer.first();else a=L.buffer.concat(L.length);L.buffer.clear()}else a=L.buffer.consume(w,L.decoder);return a}function f2(w){let L=w._readableState;if(R("endReadable",L.endEmitted),!L.endEmitted)L.ended=!0,q.nextTick(e5,L,w)}function e5(w,L){if(R("endReadableNT",w.endEmitted,w.length),!w.errored&&!w.closeEmitted&&!w.endEmitted&&w.length===0){if(w.endEmitted=!0,L.emit("end"),L.writable&&L.allowHalfOpen===!1)q.nextTick(Q4,L);else if(w.autoDestroy){let a=L._writableState;if(!a||a.autoDestroy&&(a.finished||a.writable===!1))L.destroy()}}}function Q4(w){if(w.writable&&!w.writableEnded&&!w.destroyed)w.end()}p.from=function(w,L){return S(p,w,L)};var A2;function i6(){if(A2===void 0)A2={};return A2}p.fromWeb=function(w,L){return i6().newStreamReadableFromReadableStream(w,L)},p.toWeb=function(w,L){return i6().newReadableStreamFromStreamReadable(w,L)},p.wrap=function(w,L){var a,s;return new p({objectMode:(a=(s=w.readableObjectMode)!==null&&s!==void 0?s:w.objectMode)!==null&&a!==void 0?a:!0,...L,destroy(V0,g0){m.destroyer(w,V0),g0(V0)}}).wrap(w)}}),H4=x0((Q,$)=>{var q=_2(),{ArrayPrototypeSlice:K,Error:J,FunctionPrototypeSymbolHasInstance:Z,ObjectDefineProperty:G,ObjectDefineProperties:B,ObjectSetPrototypeOf:W,StringPrototypeToLowerCase:U,Symbol:V,SymbolHasInstance:N}=_0();$.exports=i,i.WritableState=I;var{EventEmitter:F}=(a1(),y0(o1)),M=D4().Stream,{Buffer:v}=(a0(),y0(s0)),x=G6(),{addAbortSignal:y}=d8(),{getHighWaterMark:D,getDefaultHighWaterMark:z}=m8(),{ERR_INVALID_ARG_TYPE:Y,ERR_METHOD_NOT_IMPLEMENTED:H,ERR_MULTIPLE_CALLBACK:R,ERR_STREAM_CANNOT_PIPE:c,ERR_STREAM_DESTROYED:m,ERR_STREAM_ALREADY_FINISHED:$0,ERR_STREAM_NULL_VALUES:_,ERR_STREAM_WRITE_AFTER_END:g,ERR_UNKNOWN_ENCODING:O}=K1().codes,{errorOrDestroy:h}=x;W(i.prototype,M.prototype),W(i,M);function f(){}var A=V("kOnFinished");function I(C,X,P){if(typeof P!=="boolean")P=X instanceof t1();if(this.objectMode=!!(C&&C.objectMode),P)this.objectMode=this.objectMode||!!(C&&C.writableObjectMode);this.highWaterMark=C?D(this,C,"writableHighWaterMark",P):z(!1),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;let o=!!(C&&C.decodeStrings===!1);this.decodeStrings=!o,this.defaultEncoding=C&&C.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=k.bind(void 0,X),this.writecb=null,this.writelen=0,this.afterWriteTickInfo=null,n(this),this.pendingcb=0,this.constructed=!0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=!C||C.emitClose!==!1,this.autoDestroy=!C||C.autoDestroy!==!1,this.errored=null,this.closed=!1,this.closeEmitted=!1,this[A]=[]}function n(C){C.buffered=[],C.bufferedIndex=0,C.allBuffers=!0,C.allNoop=!0}I.prototype.getBuffer=function C(){return K(this.buffered,this.bufferedIndex)},G(I.prototype,"bufferedRequestCount",{__proto__:null,get(){return this.buffered.length-this.bufferedIndex}});function i(C){let X=this instanceof t1();if(!X&&!Z(i,this))return new i(C);if(this._writableState=new I(C,this,X),C){if(typeof C.write==="function")this._write=C.write;if(typeof C.writev==="function")this._writev=C.writev;if(typeof C.destroy==="function")this._destroy=C.destroy;if(typeof C.final==="function")this._final=C.final;if(typeof C.construct==="function")this._construct=C.construct;if(C.signal)y(C.signal,this)}M.call(this,C),x.construct(this,()=>{let P=this._writableState;if(!P.writing)q0(this,P);b(this,P)})}G(i,N,{__proto__:null,value:function(C){if(Z(this,C))return!0;if(this!==i)return!1;return C&&C._writableState instanceof I}}),i.prototype.pipe=function(){h(this,new c)};function K0(C,X,P,o){let r=C._writableState;if(typeof P==="function")o=P,P=r.defaultEncoding;else{if(!P)P=r.defaultEncoding;else if(P!=="buffer"&&!v.isEncoding(P))throw new O(P);if(typeof o!=="function")o=f}if(X===null)throw new _;else if(!r.objectMode)if(typeof X==="string"){if(r.decodeStrings!==!1)X=v.from(X,P),P="buffer"}else if(X instanceof v)P="buffer";else if(M._isUint8Array(X))X=M._uint8ArrayToBuffer(X),P="buffer";else throw new Y("chunk",["string","Buffer","Uint8Array"],X);let l;if(r.ending)l=new g;else if(r.destroyed)l=new m("write");if(l)return q.nextTick(o,l),h(C,l,!0),l;return r.pendingcb++,z0(C,r,X,P,o)}i.prototype.write=function(C,X,P){return K0(this,C,X,P)===!0},i.prototype.cork=function(){this._writableState.corked++},i.prototype.uncork=function(){let C=this._writableState;if(C.corked){if(C.corked--,!C.writing)q0(this,C)}},i.prototype.setDefaultEncoding=function C(X){if(typeof X==="string")X=U(X);if(!v.isEncoding(X))throw new O(X);return this._writableState.defaultEncoding=X,this};function z0(C,X,P,o,r){let l=X.objectMode?1:P.length;X.length+=l;let j=X.lengthP.bufferedIndex)q0(C,P);if(o)if(P.afterWriteTickInfo!==null&&P.afterWriteTickInfo.cb===r)P.afterWriteTickInfo.count++;else P.afterWriteTickInfo={count:1,cb:r,stream:C,state:P},q.nextTick(u,P.afterWriteTickInfo);else Q0(C,P,1,r)}}function u({stream:C,state:X,count:P,cb:o}){return X.afterWriteTickInfo=null,Q0(C,X,P,o)}function Q0(C,X,P,o){if(!X.ending&&!C.destroyed&&X.length===0&&X.needDrain)X.needDrain=!1,C.emit("drain");while(P-- >0)X.pendingcb--,o();if(X.destroyed)E(X);b(C,X)}function E(C){if(C.writing)return;for(let r=C.bufferedIndex;r1&&C._writev){X.pendingcb-=l-1;let d=X.allNoop?f:(p)=>{for(let G0=j;G0256)P.splice(0,j),X.bufferedIndex=0;else X.bufferedIndex=j}X.bufferProcessing=!1}i.prototype._write=function(C,X,P){if(this._writev)this._writev([{chunk:C,encoding:X}],P);else throw new H("_write()")},i.prototype._writev=null,i.prototype.end=function(C,X,P){let o=this._writableState;if(typeof C==="function")P=C,C=null,X=null;else if(typeof X==="function")P=X,X=null;let r;if(C!==null&&C!==void 0){let l=K0(this,C,X);if(l instanceof J)r=l}if(o.corked)o.corked=1,this.uncork();if(r);else if(!o.errored&&!o.ending)o.ending=!0,b(this,o,!0),o.ended=!0;else if(o.finished)r=new $0("end");else if(o.destroyed)r=new m("end");if(typeof P==="function")if(r||o.finished)q.nextTick(P,r);else o[A].push(P);return this};function B0(C){return C.ending&&!C.destroyed&&C.constructed&&C.length===0&&!C.errored&&C.buffered.length===0&&!C.finished&&!C.writing&&!C.errorEmitted&&!C.closeEmitted}function w0(C,X){let P=!1;function o(r){if(P){h(C,r!==null&&r!==void 0?r:R());return}if(P=!0,X.pendingcb--,r){let l=X[A].splice(0);for(let j=0;j{if(B0(r))T(o,r);else r.pendingcb--},C,X);else if(B0(X))X.pendingcb++,T(C,X)}}}function T(C,X){X.pendingcb--,X.finished=!0;let P=X[A].splice(0);for(let o=0;o{var q=_2(),K=(a0(),y0(s0)),{isReadable:J,isWritable:Z,isIterable:G,isNodeStream:B,isReadableNodeStream:W,isWritableNodeStream:U,isDuplexNodeStream:V,isReadableStream:N,isWritableStream:F}=e1(),M=z2(),{AbortError:v,codes:{ERR_INVALID_ARG_TYPE:x,ERR_INVALID_RETURN_VALUE:y}}=K1(),{destroyer:D}=G6(),z=t1(),Y=n8(),H=H4(),{createDeferredPromise:R}=G1(),c=YQ(),m=globalThis.Blob||K.Blob,$0=typeof m!=="undefined"?function A(I){return I instanceof m}:function A(I){return!1},_=globalThis.AbortController||Q8().AbortController,{FunctionPrototypeCall:g}=_0();class O extends z{constructor(A){super(A);if((A===null||A===void 0?void 0:A.readable)===!1)this._readableState.readable=!1,this._readableState.ended=!0,this._readableState.endEmitted=!0;if((A===null||A===void 0?void 0:A.writable)===!1)this._writableState.writable=!1,this._writableState.ending=!0,this._writableState.ended=!0,this._writableState.finished=!0}}$.exports=function A(I,n){if(V(I))return I;if(W(I))return f({readable:I});if(U(I))return f({writable:I});if(B(I))return f({writable:!1,readable:!1});if(N(I))return f({readable:Y.fromWeb(I)});if(F(I))return f({writable:H.fromWeb(I)});if(typeof I==="function"){let{value:K0,write:z0,final:S,destroy:U0}=h(I);if(G(K0))return c(O,K0,{objectMode:!0,write:z0,final:S,destroy:U0});let k=K0===null||K0===void 0?void 0:K0.then;if(typeof k==="function"){let u,Q0=g(k,K0,(E)=>{if(E!=null)throw new y("nully","body",E)},(E)=>{D(u,E)});return u=new O({objectMode:!0,readable:!1,write:z0,final(E){S(async()=>{try{await Q0,q.nextTick(E,null)}catch(q0){q.nextTick(E,q0)}})},destroy:U0})}throw new y("Iterable, AsyncIterable or AsyncFunction",n,K0)}if($0(I))return A(I.arrayBuffer());if(G(I))return c(O,I,{objectMode:!0,writable:!1});if(N(I===null||I===void 0?void 0:I.readable)&&F(I===null||I===void 0?void 0:I.writable))return O.fromWeb(I);if(typeof(I===null||I===void 0?void 0:I.writable)==="object"||typeof(I===null||I===void 0?void 0:I.readable)==="object"){let K0=I!==null&&I!==void 0&&I.readable?W(I===null||I===void 0?void 0:I.readable)?I===null||I===void 0?void 0:I.readable:A(I.readable):void 0,z0=I!==null&&I!==void 0&&I.writable?U(I===null||I===void 0?void 0:I.writable)?I===null||I===void 0?void 0:I.writable:A(I.writable):void 0;return f({readable:K0,writable:z0})}let i=I===null||I===void 0?void 0:I.then;if(typeof i==="function"){let K0;return g(i,I,(z0)=>{if(z0!=null)K0.push(z0);K0.push(null)},(z0)=>{D(K0,z0)}),K0=new O({objectMode:!0,writable:!1,read(){}})}throw new x(n,["Blob","ReadableStream","WritableStream","Stream","Iterable","AsyncIterable","Function","{ readable, writable } pair","Promise"],I)};function h(A){let{promise:I,resolve:n}=R(),i=new _,K0=i.signal;return{value:A(async function*(){while(!0){let z0=I;I=null;let{chunk:S,done:U0,cb:k}=await z0;if(q.nextTick(k),U0)return;if(K0.aborted)throw new v(void 0,{cause:K0.reason});({promise:I,resolve:n}=R()),yield S}}(),{signal:K0}),write(z0,S,U0){let k=n;n=null,k({chunk:z0,done:!1,cb:U0})},final(z0){let S=n;n=null,S({done:!0,cb:z0})},destroy(z0,S){i.abort(),S(z0)}}}function f(A){let I=A.readable&&typeof A.readable.read!=="function"?Y.wrap(A.readable):A.readable,n=A.writable,i=!!J(I),K0=!!Z(n),z0,S,U0,k,u;function Q0(E){let q0=k;if(k=null,q0)q0(E);else if(E)u.destroy(E)}if(u=new O({readableObjectMode:!!(I!==null&&I!==void 0&&I.readableObjectMode),writableObjectMode:!!(n!==null&&n!==void 0&&n.writableObjectMode),readable:i,writable:K0}),K0)M(n,(E)=>{if(K0=!1,E)D(I,E);Q0(E)}),u._write=function(E,q0,B0){if(n.write(E,q0))B0();else z0=B0},u._final=function(E){n.end(),S=E},n.on("drain",function(){if(z0){let E=z0;z0=null,E()}}),n.on("finish",function(){if(S){let E=S;S=null,E()}});if(i)M(I,(E)=>{if(i=!1,E)D(I,E);Q0(E)}),I.on("readable",function(){if(U0){let E=U0;U0=null,E()}}),I.on("end",function(){u.push(null)}),u._read=function(){while(!0){let E=I.read();if(E===null){U0=u._read;return}if(!u.push(E))return}};return u._destroy=function(E,q0){if(!E&&k!==null)E=new v;if(U0=null,z0=null,S=null,k===null)q0(E);else k=q0,D(n,E),D(I,E)},u}}),t1=x0((Q,$)=>{var{ObjectDefineProperties:q,ObjectGetOwnPropertyDescriptor:K,ObjectKeys:J,ObjectSetPrototypeOf:Z}=_0();$.exports=W;var G=n8(),B=H4();Z(W.prototype,G.prototype),Z(W,G);{let F=J(B.prototype);for(let M=0;M{var{ObjectSetPrototypeOf:q,Symbol:K}=_0();$.exports=W;var{ERR_METHOD_NOT_IMPLEMENTED:J}=K1().codes,Z=t1(),{getHighWaterMark:G}=m8();q(W.prototype,Z.prototype),q(W,Z);var B=K("kCallback");function W(N){if(!(this instanceof W))return new W(N);let F=N?G(this,N,"readableHighWaterMark",!0):null;if(F===0)N={...N,highWaterMark:null,readableHighWaterMark:F,writableHighWaterMark:N.writableHighWaterMark||0};if(Z.call(this,N),this._readableState.sync=!1,this[B]=null,N){if(typeof N.transform==="function")this._transform=N.transform;if(typeof N.flush==="function")this._flush=N.flush}this.on("prefinish",V)}function U(N){if(typeof this._flush==="function"&&!this.destroyed)this._flush((F,M)=>{if(F){if(N)N(F);else this.destroy(F);return}if(M!=null)this.push(M);if(this.push(null),N)N()});else if(this.push(null),N)N()}function V(){if(this._final!==U)U.call(this)}W.prototype._final=U,W.prototype._transform=function(N,F,M){throw new J("_transform()")},W.prototype._write=function(N,F,M){let v=this._readableState,x=this._writableState,y=v.length;this._transform(N,F,(D,z)=>{if(D){M(D);return}if(z!=null)this.push(z);if(x.ended||y===v.length||v.length{var{ObjectSetPrototypeOf:q}=_0();$.exports=J;var K=LQ();q(J.prototype,K.prototype),q(J,K);function J(Z){if(!(this instanceof J))return new J(Z);K.call(this,Z)}J.prototype._transform=function(Z,G,B){B(null,Z)}}),k4=x0((Q,$)=>{var q=_2(),{ArrayIsArray:K,Promise:J,SymbolAsyncIterator:Z,SymbolDispose:G}=_0(),B=z2(),{once:W}=G1(),U=G6(),V=t1(),{aggregateTwoErrors:N,codes:{ERR_INVALID_ARG_TYPE:F,ERR_INVALID_RETURN_VALUE:M,ERR_MISSING_ARGS:v,ERR_STREAM_DESTROYED:x,ERR_STREAM_PREMATURE_CLOSE:y},AbortError:D}=K1(),{validateFunction:z,validateAbortSignal:Y}=q8(),{isIterable:H,isReadable:R,isReadableNodeStream:c,isNodeStream:m,isTransformStream:$0,isWebStream:_,isReadableStream:g,isReadableFinished:O}=e1(),h=globalThis.AbortController||Q8().AbortController,f,A,I;function n(E,q0,B0){let w0=!1;E.on("close",()=>{w0=!0});let M0=B(E,{readable:q0,writable:B0},(b)=>{w0=!b});return{destroy:(b)=>{if(w0)return;w0=!0,U.destroyer(E,b||new x("pipe"))},cleanup:M0}}function i(E){return z(E[E.length-1],"streams[stream.length - 1]"),E.pop()}function K0(E){if(H(E))return E;else if(c(E))return z0(E);throw new F("val",["Readable","Iterable","AsyncIterable"],E)}async function*z0(E){if(!A)A=n8();yield*A.prototype[Z].call(E)}async function S(E,q0,B0,{end:w0}){let M0,b=null,T=(W0)=>{if(W0)M0=W0;if(b){let C=b;b=null,C()}},t=()=>new J((W0,C)=>{if(M0)C(M0);else b=()=>{if(M0)C(M0);else W0()}});q0.on("drain",T);let Z0=B(q0,{readable:!1},T);try{if(q0.writableNeedDrain)await t();for await(let W0 of E)if(!q0.write(W0))await t();if(w0)q0.end(),await t();B0()}catch(W0){B0(M0!==W0?N(M0,W0):W0)}finally{Z0(),q0.off("drain",T)}}async function U0(E,q0,B0,{end:w0}){if($0(q0))q0=q0.writable;let M0=q0.getWriter();try{for await(let b of E)await M0.ready,M0.write(b).catch(()=>{});if(await M0.ready,w0)await M0.close();B0()}catch(b){try{await M0.abort(b),B0(b)}catch(T){B0(T)}}}function k(...E){return u(E,W(i(E)))}function u(E,q0,B0){if(E.length===1&&K(E[0]))E=E[0];if(E.length<2)throw new v("streams");let w0=new h,M0=w0.signal,b=B0===null||B0===void 0?void 0:B0.signal,T=[];Y(b,"options.signal");function t(){r(new D)}I=I||G1().addAbortListener;let Z0;if(b)Z0=I(b,t);let W0,C,X=[],P=0;function o(p){r(p,--P===0)}function r(p,G0){var P0;if(p&&(!W0||W0.code==="ERR_STREAM_PREMATURE_CLOSE"))W0=p;if(!W0&&!G0)return;while(X.length)X.shift()(W0);if((P0=Z0)===null||P0===void 0||P0[G](),w0.abort(),G0){if(!W0)T.forEach((k0)=>k0());q.nextTick(q0,W0,C)}}let l;for(let p=0;p0,I0=P0||(B0===null||B0===void 0?void 0:B0.end)!==!1,Q1=p===E.length-1;if(m(G0)){let A0=function(O0){if(O0&&O0.name!=="AbortError"&&O0.code!=="ERR_STREAM_PREMATURE_CLOSE")o(O0)};var j=A0;if(I0){let{destroy:O0,cleanup:F1}=n(G0,P0,k0);if(X.push(O0),R(G0)&&Q1)T.push(F1)}if(G0.on("error",A0),R(G0)&&Q1)T.push(()=>{G0.removeListener("error",A0)})}if(p===0)if(typeof G0==="function"){if(l=G0({signal:M0}),!H(l))throw new M("Iterable, AsyncIterable or Stream","source",l)}else if(H(G0)||c(G0)||$0(G0))l=G0;else l=V.from(G0);else if(typeof G0==="function"){if($0(l)){var d;l=K0((d=l)===null||d===void 0?void 0:d.readable)}else l=K0(l);if(l=G0(l,{signal:M0}),P0){if(!H(l,!0))throw new M("AsyncIterable",`transform[${p-1}]`,l)}else{var e;if(!f)f=DQ();let A0=new f({objectMode:!0}),O0=(e=l)===null||e===void 0?void 0:e.then;if(typeof O0==="function")P++,O0.call(l,(d0)=>{if(C=d0,d0!=null)A0.write(d0);if(I0)A0.end();q.nextTick(o)},(d0)=>{A0.destroy(d0),q.nextTick(o,d0)});else if(H(l,!0))P++,S(l,A0,o,{end:I0});else if(g(l)||$0(l)){let d0=l.readable||l;P++,S(d0,A0,o,{end:I0})}else throw new M("AsyncIterable or Promise","destination",l);l=A0;let{destroy:F1,cleanup:M1}=n(l,!1,!0);if(X.push(F1),Q1)T.push(M1)}}else if(m(G0)){if(c(l)){P+=2;let A0=Q0(l,G0,o,{end:I0});if(R(G0)&&Q1)T.push(A0)}else if($0(l)||g(l)){let A0=l.readable||l;P++,S(A0,G0,o,{end:I0})}else if(H(l))P++,S(l,G0,o,{end:I0});else throw new F("val",["Readable","Iterable","AsyncIterable","ReadableStream","TransformStream"],l);l=G0}else if(_(G0)){if(c(l))P++,U0(K0(l),G0,o,{end:I0});else if(g(l)||H(l))P++,U0(l,G0,o,{end:I0});else if($0(l))P++,U0(l.readable,G0,o,{end:I0});else throw new F("val",["Readable","Iterable","AsyncIterable","ReadableStream","TransformStream"],l);l=G0}else l=V.from(G0)}if(M0!==null&&M0!==void 0&&M0.aborted||b!==null&&b!==void 0&&b.aborted)q.nextTick(t);return l}function Q0(E,q0,B0,{end:w0}){let M0=!1;if(q0.on("close",()=>{if(!M0)B0(new y)}),E.pipe(q0,{end:!1}),w0){let T=function(){M0=!0,q0.end()};var b=T;if(O(E))q.nextTick(T);else E.once("end",T)}else B0();return B(E,{readable:!0,writable:!1},(T)=>{let t=E._readableState;if(T&&T.code==="ERR_STREAM_PREMATURE_CLOSE"&&t&&t.ended&&!t.errored&&!t.errorEmitted)E.once("end",B0).once("error",B0);else B0(T)}),B(q0,{readable:!1,writable:!0},B0)}$.exports={pipelineImpl:u,pipeline:k}}),HQ=x0((Q,$)=>{var{pipeline:q}=k4(),K=t1(),{destroyer:J}=G6(),{isNodeStream:Z,isReadable:G,isWritable:B,isWebStream:W,isTransformStream:U,isWritableStream:V,isReadableStream:N}=e1(),{AbortError:F,codes:{ERR_INVALID_ARG_VALUE:M,ERR_MISSING_ARGS:v}}=K1(),x=z2();$.exports=function y(...D){if(D.length===0)throw new v("streams");if(D.length===1)return K.from(D[0]);let z=[...D];if(typeof D[0]==="function")D[0]=K.from(D[0]);if(typeof D[D.length-1]==="function"){let f=D.length-1;D[f]=K.from(D[f])}for(let f=0;f0&&!(B(D[f])||V(D[f])||U(D[f])))throw new M(`streams[${f}]`,z[f],"must be writable")}let Y,H,R,c,m;function $0(f){let A=c;if(c=null,A)A(f);else if(f)m.destroy(f);else if(!h&&!O)m.destroy()}let _=D[0],g=q(D,$0),O=!!(B(_)||V(_)||U(_)),h=!!(G(g)||N(g)||U(g));if(m=new K({writableObjectMode:!!(_!==null&&_!==void 0&&_.writableObjectMode),readableObjectMode:!!(g!==null&&g!==void 0&&g.readableObjectMode),writable:O,readable:h}),O){if(Z(_))m._write=function(A,I,n){if(_.write(A,I))n();else Y=n},m._final=function(A){_.end(),H=A},_.on("drain",function(){if(Y){let A=Y;Y=null,A()}});else if(W(_)){let A=(U(_)?_.writable:_).getWriter();m._write=async function(I,n,i){try{await A.ready,A.write(I).catch(()=>{}),i()}catch(K0){i(K0)}},m._final=async function(I){try{await A.ready,A.close().catch(()=>{}),H=I}catch(n){I(n)}}}let f=U(g)?g.readable:g;x(f,()=>{if(H){let A=H;H=null,A()}})}if(h){if(Z(g))g.on("readable",function(){if(R){let f=R;R=null,f()}}),g.on("end",function(){m.push(null)}),m._read=function(){while(!0){let f=g.read();if(f===null){R=m._read;return}if(!m.push(f))return}};else if(W(g)){let f=(U(g)?g.readable:g).getReader();m._read=async function(){while(!0)try{let{value:A,done:I}=await f.read();if(!m.push(A))return;if(I){m.push(null);return}}catch{return}}}}return m._destroy=function(f,A){if(!f&&c!==null)f=new F;if(R=null,Y=null,H=null,c===null)A(f);else if(c=A,Z(g))J(g,f)},m}}),GV=x0((Q,$)=>{var q=globalThis.AbortController||Q8().AbortController,{codes:{ERR_INVALID_ARG_VALUE:K,ERR_INVALID_ARG_TYPE:J,ERR_MISSING_ARGS:Z,ERR_OUT_OF_RANGE:G},AbortError:B}=K1(),{validateAbortSignal:W,validateInteger:U,validateObject:V}=q8(),N=_0().Symbol("kWeak"),F=_0().Symbol("kResistStopPropagation"),{finished:M}=z2(),v=HQ(),{addAbortSignalNoValidate:x}=d8(),{isWritable:y,isNodeStream:D}=e1(),{deprecate:z}=G1(),{ArrayPrototypePush:Y,Boolean:H,MathFloor:R,Number:c,NumberIsNaN:m,Promise:$0,PromiseReject:_,PromiseResolve:g,PromisePrototypeThen:O,Symbol:h}=_0(),f=h("kEmpty"),A=h("kEof");function I(b,T){if(T!=null)V(T,"options");if((T===null||T===void 0?void 0:T.signal)!=null)W(T.signal,"options.signal");if(D(b)&&!y(b))throw new K("stream",b,"must be writable");let t=v(this,b);if(T!==null&&T!==void 0&&T.signal)x(T.signal,t);return t}function n(b,T){if(typeof b!=="function")throw new J("fn",["Function","AsyncFunction"],b);if(T!=null)V(T,"options");if((T===null||T===void 0?void 0:T.signal)!=null)W(T.signal,"options.signal");let t=1;if((T===null||T===void 0?void 0:T.concurrency)!=null)t=R(T.concurrency);let Z0=t-1;if((T===null||T===void 0?void 0:T.highWaterMark)!=null)Z0=R(T.highWaterMark);return U(t,"options.concurrency",1),U(Z0,"options.highWaterMark",0),Z0+=t,async function*W0(){let C=G1().AbortSignalAny([T===null||T===void 0?void 0:T.signal].filter(H)),X=this,P=[],o={signal:C},r,l,j=!1,d=0;function e(){j=!0,p()}function p(){d-=1,G0()}function G0(){if(l&&!j&&d=Z0||d>=t))await new $0((I0)=>{l=I0})}P.push(A)}catch(k0){let I0=_(k0);O(I0,p,e),P.push(I0)}finally{if(j=!0,r)r(),r=null}}P0();try{while(!0){while(P.length>0){let k0=await P[0];if(k0===A)return;if(C.aborted)throw new B;if(k0!==f)yield k0;P.shift(),G0()}await new $0((k0)=>{r=k0})}}finally{if(j=!0,l)l(),l=null}}.call(this)}function i(b=void 0){if(b!=null)V(b,"options");if((b===null||b===void 0?void 0:b.signal)!=null)W(b.signal,"options.signal");return async function*T(){let t=0;for await(let W0 of this){var Z0;if(b!==null&&b!==void 0&&(Z0=b.signal)!==null&&Z0!==void 0&&Z0.aborted)throw new B({cause:b.signal.reason});yield[t++,W0]}}.call(this)}async function K0(b,T=void 0){for await(let t of k.call(this,b,T))return!0;return!1}async function z0(b,T=void 0){if(typeof b!=="function")throw new J("fn",["Function","AsyncFunction"],b);return!await K0.call(this,async(...t)=>{return!await b(...t)},T)}async function S(b,T){for await(let t of k.call(this,b,T))return t;return}async function U0(b,T){if(typeof b!=="function")throw new J("fn",["Function","AsyncFunction"],b);async function t(Z0,W0){return await b(Z0,W0),f}for await(let Z0 of n.call(this,t,T));}function k(b,T){if(typeof b!=="function")throw new J("fn",["Function","AsyncFunction"],b);async function t(Z0,W0){if(await b(Z0,W0))return Z0;return f}return n.call(this,t,T)}class u extends Z{constructor(){super("reduce");this.message="Reduce of an empty stream requires an initial value"}}async function Q0(b,T,t){var Z0;if(typeof b!=="function")throw new J("reducer",["Function","AsyncFunction"],b);if(t!=null)V(t,"options");if((t===null||t===void 0?void 0:t.signal)!=null)W(t.signal,"options.signal");let W0=arguments.length>1;if(t!==null&&t!==void 0&&(Z0=t.signal)!==null&&Z0!==void 0&&Z0.aborted){let r=new B(void 0,{cause:t.signal.reason});throw this.once("error",()=>{}),await M(this.destroy(r)),r}let C=new q,X=C.signal;if(t!==null&&t!==void 0&&t.signal){let r={once:!0,[N]:this,[F]:!0};t.signal.addEventListener("abort",()=>C.abort(),r)}let P=!1;try{for await(let r of this){var o;if(P=!0,t!==null&&t!==void 0&&(o=t.signal)!==null&&o!==void 0&&o.aborted)throw new B;if(!W0)T=r,W0=!0;else T=await b(T,r,{signal:X})}if(!P&&!W0)throw new u}finally{C.abort()}return T}async function E(b){if(b!=null)V(b,"options");if((b===null||b===void 0?void 0:b.signal)!=null)W(b.signal,"options.signal");let T=[];for await(let Z0 of this){var t;if(b!==null&&b!==void 0&&(t=b.signal)!==null&&t!==void 0&&t.aborted)throw new B(void 0,{cause:b.signal.reason});Y(T,Z0)}return T}function q0(b,T){let t=n.call(this,b,T);return async function*Z0(){for await(let W0 of t)yield*W0}.call(this)}function B0(b){if(b=c(b),m(b))return 0;if(b<0)throw new G("number",">= 0",b);return b}function w0(b,T=void 0){if(T!=null)V(T,"options");if((T===null||T===void 0?void 0:T.signal)!=null)W(T.signal,"options.signal");return b=B0(b),async function*t(){var Z0;if(T!==null&&T!==void 0&&(Z0=T.signal)!==null&&Z0!==void 0&&Z0.aborted)throw new B;for await(let C of this){var W0;if(T!==null&&T!==void 0&&(W0=T.signal)!==null&&W0!==void 0&&W0.aborted)throw new B;if(b--<=0)yield C}}.call(this)}function M0(b,T=void 0){if(T!=null)V(T,"options");if((T===null||T===void 0?void 0:T.signal)!=null)W(T.signal,"options.signal");return b=B0(b),async function*t(){var Z0;if(T!==null&&T!==void 0&&(Z0=T.signal)!==null&&Z0!==void 0&&Z0.aborted)throw new B;for await(let C of this){var W0;if(T!==null&&T!==void 0&&(W0=T.signal)!==null&&W0!==void 0&&W0.aborted)throw new B;if(b-- >0)yield C;if(b<=0)return}}.call(this)}$.exports.streamReturningOperators={asIndexedPairs:z(i,"readable.asIndexedPairs will be removed in a future version."),drop:w0,filter:k,flatMap:q0,map:n,take:M0,compose:I},$.exports.promiseReturningOperators={every:z0,forEach:U0,reduce:Q0,toArray:E,some:K0,find:S}}),kQ=x0((Q,$)=>{var{ArrayPrototypePop:q,Promise:K}=_0(),{isIterable:J,isNodeStream:Z,isWebStream:G}=e1(),{pipelineImpl:B}=k4(),{finished:W}=z2();vQ();function U(...V){return new K((N,F)=>{let M,v,x=V[V.length-1];if(x&&typeof x==="object"&&!Z(x)&&!J(x)&&!G(x)){let y=q(V);M=y.signal,v=y.end}B(V,(y,D)=>{if(y)F(y);else N(D)},{signal:M,end:v})})}$.exports={finished:W,pipeline:U}}),vQ=x0((Q,$)=>{var{Buffer:q}=(a0(),y0(s0)),{ObjectDefineProperty:K,ObjectKeys:J,ReflectApply:Z}=_0(),{promisify:{custom:G}}=G1(),{streamReturningOperators:B,promiseReturningOperators:W}=GV(),{codes:{ERR_ILLEGAL_CONSTRUCTOR:U}}=K1(),V=HQ(),{setDefaultHighWaterMark:N,getDefaultHighWaterMark:F}=m8(),{pipeline:M}=k4(),{destroyer:v}=G6(),x=z2(),y=kQ(),D=e1(),z=$.exports=D4().Stream;z.isDestroyed=D.isDestroyed,z.isDisturbed=D.isDisturbed,z.isErrored=D.isErrored,z.isReadable=D.isReadable,z.isWritable=D.isWritable,z.Readable=n8();for(let H of J(B)){let R=function(...m){if(new.target)throw U();return z.Readable.from(Z(c,this,m))},c=B[H];K(R,"name",{__proto__:null,value:c.name}),K(R,"length",{__proto__:null,value:c.length}),K(z.Readable.prototype,H,{__proto__:null,value:R,enumerable:!1,configurable:!0,writable:!0})}for(let H of J(W)){let R=function(...m){if(new.target)throw U();return Z(c,this,m)},c=W[H];K(R,"name",{__proto__:null,value:c.name}),K(R,"length",{__proto__:null,value:c.length}),K(z.Readable.prototype,H,{__proto__:null,value:R,enumerable:!1,configurable:!0,writable:!0})}z.Writable=H4(),z.Duplex=t1(),z.Transform=LQ(),z.PassThrough=DQ(),z.pipeline=M;var{addAbortSignal:Y}=d8();z.addAbortSignal=Y,z.finished=x,z.destroy=v,z.compose=V,z.setDefaultHighWaterMark=N,z.getDefaultHighWaterMark=F,K(z,"promises",{__proto__:null,configurable:!0,enumerable:!0,get(){return y}}),K(M,G,{__proto__:null,enumerable:!0,get(){return y.pipeline}}),K(x,G,{__proto__:null,enumerable:!0,get(){return y.finished}}),z.Stream=z,z._isUint8Array=function H(R){return R instanceof Uint8Array},z._uint8ArrayToBuffer=function H(R){return q.from(R.buffer,R.byteOffset,R.byteLength)}}),BV=x0((Q,$)=>{var q=p8();if(q&&process.env.READABLE_STREAM==="disable"){let K=q.promises;$.exports._uint8ArrayToBuffer=q._uint8ArrayToBuffer,$.exports._isUint8Array=q._isUint8Array,$.exports.isDisturbed=q.isDisturbed,$.exports.isErrored=q.isErrored,$.exports.isReadable=q.isReadable,$.exports.Readable=q.Readable,$.exports.Writable=q.Writable,$.exports.Duplex=q.Duplex,$.exports.Transform=q.Transform,$.exports.PassThrough=q.PassThrough,$.exports.addAbortSignal=q.addAbortSignal,$.exports.finished=q.finished,$.exports.destroy=q.destroy,$.exports.pipeline=q.pipeline,$.exports.compose=q.compose,Object.defineProperty(q,"promises",{configurable:!0,enumerable:!0,get(){return K}}),$.exports.Stream=q.Stream}else{let K=vQ(),J=kQ(),Z=K.Readable.destroy;$.exports=K.Readable,$.exports._uint8ArrayToBuffer=K._uint8ArrayToBuffer,$.exports._isUint8Array=K._isUint8Array,$.exports.isDisturbed=K.isDisturbed,$.exports.isErrored=K.isErrored,$.exports.isReadable=K.isReadable,$.exports.Readable=K.Readable,$.exports.Writable=K.Writable,$.exports.Duplex=K.Duplex,$.exports.Transform=K.Transform,$.exports.PassThrough=K.PassThrough,$.exports.addAbortSignal=K.addAbortSignal,$.exports.finished=K.finished,$.exports.destroy=K.destroy,$.exports.destroy=Z,$.exports.pipeline=K.pipeline,$.exports.compose=K.compose,Object.defineProperty(K,"promises",{configurable:!0,enumerable:!0,get(){return J}}),$.exports.Stream=K.Stream}$.exports.default=$.exports});IQ.exports=BV()});var v4=N0((pz,RQ)=>{RQ.exports=p8()});var Q2=N0((w1)=>{w1.base64=!0;w1.array=!0;w1.string=!0;w1.arraybuffer=typeof ArrayBuffer!=="undefined"&&typeof Uint8Array!=="undefined";w1.nodebuffer=typeof Buffer!=="undefined";w1.uint8array=typeof Uint8Array!=="undefined";if(typeof ArrayBuffer==="undefined")w1.blob=!1;else{i8=new ArrayBuffer(0);try{w1.blob=new Blob([i8],{type:"application/zip"}).size===0}catch(Q){try{I4=self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder,l8=new I4,l8.append(i8),w1.blob=l8.getBlob("application/zip").size===0}catch($){w1.blob=!1}}}var i8,I4,l8;try{w1.nodestream=!!v4().Readable}catch(Q){w1.nodestream=!1}});var C4=N0((R4)=>{var WV=c0(),zV=Q2(),S1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";R4.encode=function(Q){var $=[],q,K,J,Z,G,B,W,U=0,V=Q.length,N=V,F=WV.getTypeOf(Q)!=="string";while(U>2,G=(q&3)<<4|K>>4,B=N>1?(K&15)<<2|J>>6:64,W=N>2?J&63:64,$.push(S1.charAt(Z)+S1.charAt(G)+S1.charAt(B)+S1.charAt(W))}return $.join("")};R4.decode=function(Q){var $,q,K,J,Z,G,B,W=0,U=0,V="data:";if(Q.substr(0,V.length)===V)throw new Error("Invalid base64 input, it looks like a data url.");Q=Q.replace(/[^A-Za-z0-9+/=]/g,"");var N=Q.length*3/4;if(Q.charAt(Q.length-1)===S1.charAt(64))N--;if(Q.charAt(Q.length-2)===S1.charAt(64))N--;if(N%1!==0)throw new Error("Invalid base64 input, bad content length.");var F;if(zV.uint8array)F=new Uint8Array(N|0);else F=new Array(N|0);while(W>4,q=(Z&15)<<4|G>>2,K=(G&3)<<6|B,F[U++]=$,G!==64)F[U++]=q;if(B!==64)F[U++]=K}return F}});var $8=N0((oz,CQ)=>{CQ.exports={isNode:typeof Buffer!=="undefined",newBufferFrom:function(Q,$){if(Buffer.from&&Buffer.from!==Uint8Array.from)return Buffer.from(Q,$);else{if(typeof Q==="number")throw new Error('The "data" argument must not be a number');return new Buffer(Q,$)}},allocBuffer:function(Q){if(Buffer.alloc)return Buffer.alloc(Q);else{var $=new Buffer(Q);return $.fill(0),$}},isBuffer:function(Q){return Buffer.isBuffer(Q)},isStream:function(Q){return Q&&typeof Q.on==="function"&&typeof Q.pause==="function"&&typeof Q.resume==="function"}}});var AQ=N0((az,fQ)=>{var jQ=global.MutationObserver||global.WebKitMutationObserver,K8;if(jQ)a8=0,j4=new jQ(o8),r8=global.document.createTextNode(""),j4.observe(r8,{characterData:!0}),K8=function(){r8.data=a8=++a8%2};else if(!global.setImmediate&&typeof global.MessageChannel!=="undefined")s8=new global.MessageChannel,s8.port1.onmessage=o8,K8=function(){s8.port2.postMessage(0)};else if("document"in global&&"onreadystatechange"in global.document.createElement("script"))K8=function(){var Q=global.document.createElement("script");Q.onreadystatechange=function(){o8(),Q.onreadystatechange=null,Q.parentNode.removeChild(Q),Q=null},global.document.documentElement.appendChild(Q)};else K8=function(){setTimeout(o8,0)};var a8,j4,r8,s8,f4,J8=[];function o8(){f4=!0;var Q,$,q=J8.length;while(q){$=J8,J8=[],Q=-1;while(++Q{var MV=AQ();function B6(){}var e0={},gQ=["REJECTED"],A4=["FULFILLED"],XQ=["PENDING"];xQ.exports=F2;function F2(Q){if(typeof Q!=="function")throw new TypeError("resolver must be a function");if(this.state=XQ,this.queue=[],this.outcome=void 0,Q!==B6)yQ(this,Q)}F2.prototype.finally=function(Q){if(typeof Q!=="function")return this;var $=this.constructor;return this.then(q,K);function q(J){function Z(){return J}return $.resolve(Q()).then(Z)}function K(J){function Z(){throw J}return $.resolve(Q()).then(Z)}};F2.prototype.catch=function(Q){return this.then(null,Q)};F2.prototype.then=function(Q,$){if(typeof Q!=="function"&&this.state===A4||typeof $!=="function"&&this.state===gQ)return this;var q=new this.constructor(B6);if(this.state!==XQ){var K=this.state===A4?Q:$;g4(q,K,this.outcome)}else this.queue.push(new U8(q,Q,$));return q};function U8(Q,$,q){if(this.promise=Q,typeof $==="function")this.onFulfilled=$,this.callFulfilled=this.otherCallFulfilled;if(typeof q==="function")this.onRejected=q,this.callRejected=this.otherCallRejected}U8.prototype.callFulfilled=function(Q){e0.resolve(this.promise,Q)};U8.prototype.otherCallFulfilled=function(Q){g4(this.promise,this.onFulfilled,Q)};U8.prototype.callRejected=function(Q){e0.reject(this.promise,Q)};U8.prototype.otherCallRejected=function(Q){g4(this.promise,this.onRejected,Q)};function g4(Q,$,q){MV(function(){var K;try{K=$(q)}catch(J){return e0.reject(Q,J)}if(K===Q)e0.reject(Q,new TypeError("Cannot resolve promise with itself"));else e0.resolve(Q,K)})}e0.resolve=function(Q,$){var q=hQ(wV,$);if(q.status==="error")return e0.reject(Q,q.value);var K=q.value;if(K)yQ(Q,K);else{Q.state=A4,Q.outcome=$;var J=-1,Z=Q.queue.length;while(++J{var X4=null;if(typeof Promise!=="undefined")X4=Promise;else X4=OQ();PQ.exports={Promise:X4}});var EQ=N0((TQ)=>{(function(Q,$){if(Q.setImmediate)return;var q=1,K={},J=!1,Z=Q.document,G;function B(z){if(typeof z!=="function")z=new Function(""+z);var Y=new Array(arguments.length-1);for(var H=0;H{var M2=Q2(),HV=C4(),z6=$8(),y4=W6();EQ();function kV(Q){var $=null;if(M2.uint8array)$=new Uint8Array(Q.length);else $=new Array(Q.length);return e8(Q,$)}p0.newBlob=function(Q,$){p0.checkSupport("blob");try{return new Blob([Q],{type:$})}catch(J){try{var q=self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder,K=new q;return K.append(Q),K.getBlob($)}catch(Z){throw new Error("Bug : can't construct the Blob.")}}};function V8(Q){return Q}function e8(Q,$){for(var q=0;q1)try{return t8.stringifyByChunk(Q,q,$)}catch(J){$=Math.floor($/2)}return t8.stringifyByChar(Q)}p0.applyFromCharCode=Z8;function Q5(Q,$){for(var q=0;q{function SQ(Q){this.name=Q||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}SQ.prototype={push:function(Q){this.emit("data",Q)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(Q){this.emit("error",Q)}return!0},error:function(Q){if(this.isFinished)return!1;if(this.isPaused)this.generatedError=Q;else{if(this.isFinished=!0,this.emit("error",Q),this.previous)this.previous.error(Q);this.cleanUp()}return!0},on:function(Q,$){return this._listeners[Q].push($),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(Q,$){if(this._listeners[Q])for(var q=0;q "+Q;else return Q}};uQ.exports=SQ});var M6=N0((N2)=>{var F6=c0(),c2=Q2(),vV=$8(),q5=N1(),G8=new Array(256);for(u1=0;u1<256;u1++)G8[u1]=u1>=252?6:u1>=248?5:u1>=240?4:u1>=224?3:u1>=192?2:1;var u1;G8[254]=G8[254]=1;var IV=function(Q){var $,q,K,J,Z,G=Q.length,B=0;for(J=0;J>>6,$[Z++]=128|q&63;else if(q<65536)$[Z++]=224|q>>>12,$[Z++]=128|q>>>6&63,$[Z++]=128|q&63;else $[Z++]=240|q>>>18,$[Z++]=128|q>>>12&63,$[Z++]=128|q>>>6&63,$[Z++]=128|q&63}return $},RV=function(Q,$){var q;if($=$||Q.length,$>Q.length)$=Q.length;q=$-1;while(q>=0&&(Q[q]&192)===128)q--;if(q<0)return $;if(q===0)return $;return q+G8[Q[q]]>$?q:$},CV=function(Q){var $,q,K,J,Z=Q.length,G=new Array(Z*2);for(q=0,$=0;$4){G[q++]=65533,$+=J-1;continue}K&=J===2?31:J===3?15:7;while(J>1&&$1){G[q++]=65533;continue}if(K<65536)G[q++]=K;else K-=65536,G[q++]=55296|K>>10&1023,G[q++]=56320|K&1023}if(G.length!==q)if(G.subarray)G=G.subarray(0,q);else G.length=q;return F6.applyFromCharCode(G)};N2.utf8encode=function Q($){if(c2.nodebuffer)return vV.newBufferFrom($,"utf-8");return IV($)};N2.utf8decode=function Q($){if(c2.nodebuffer)return F6.transformTo("nodebuffer",$).toString("utf-8");return $=F6.transformTo(c2.uint8array?"uint8array":"array",$),CV($)};function $5(){q5.call(this,"utf-8 decode"),this.leftOver=null}F6.inherits($5,q5);$5.prototype.processChunk=function(Q){var $=F6.transformTo(c2.uint8array?"uint8array":"array",Q.data);if(this.leftOver&&this.leftOver.length){if(c2.uint8array){var q=$;$=new Uint8Array(q.length+this.leftOver.length),$.set(this.leftOver,0),$.set(q,this.leftOver.length)}else $=this.leftOver.concat($);this.leftOver=null}var K=RV($),J=$;if(K!==$.length)if(c2.uint8array)J=$.subarray(0,K),this.leftOver=$.subarray(K,$.length);else J=$.slice(0,K),this.leftOver=$.slice(K,$.length);this.push({data:N2.utf8decode(J),meta:Q.meta})};$5.prototype.flush=function(){if(this.leftOver&&this.leftOver.length)this.push({data:N2.utf8decode(this.leftOver),meta:{}}),this.leftOver=null};N2.Utf8DecodeWorker=$5;function h4(){q5.call(this,"utf-8 encode")}F6.inherits(h4,q5);h4.prototype.processChunk=function(Q){this.push({data:N2.utf8encode(Q.data),meta:Q.meta})};N2.Utf8EncodeWorker=h4});var dQ=N0(($3,bQ)=>{var _Q=N1(),cQ=c0();function x4(Q){_Q.call(this,"ConvertWorker to "+Q),this.destType=Q}cQ.inherits(x4,_Q);x4.prototype.processChunk=function(Q){this.push({data:cQ.transformTo(this.destType,Q.data),meta:Q.meta})};bQ.exports=x4});var pQ=N0((K3,nQ)=>{var mQ=v4().Readable,jV=c0();jV.inherits(O4,mQ);function O4(Q,$,q){mQ.call(this,$),this._helper=Q;var K=this;Q.on("data",function(J,Z){if(!K.push(J))K._helper.pause();if(q)q(Z)}).on("error",function(J){K.emit("error",J)}).on("end",function(){K.push(null)})}O4.prototype._read=function(){this._helper.resume()};nQ.exports=O4});var P4=N0((J3,oQ)=>{var b2=c0(),fV=dQ(),AV=N1(),gV=C4(),XV=Q2(),yV=W6(),iQ=null;if(XV.nodestream)try{iQ=pQ()}catch(Q){}function hV(Q,$,q){switch(Q){case"blob":return b2.newBlob(b2.transformTo("arraybuffer",$),q);case"base64":return gV.encode($);default:return b2.transformTo(Q,$)}}function xV(Q,$){var q,K=0,J=null,Z=0;for(q=0;q<$.length;q++)Z+=$[q].length;switch(Q){case"string":return $.join("");case"array":return Array.prototype.concat.apply([],$);case"uint8array":J=new Uint8Array(Z);for(q=0;q<$.length;q++)J.set($[q],K),K+=$[q].length;return J;case"nodebuffer":return Buffer.concat($);default:throw new Error("concat : unsupported type '"+Q+"'")}}function OV(Q,$){return new yV.Promise(function(q,K){var J=[],Z=Q._internalType,G=Q._outputType,B=Q._mimeType;Q.on("data",function(W,U){if(J.push(W),$)$(U)}).on("error",function(W){J=[],K(W)}).on("end",function(){try{var W=hV(G,xV(Z,J),B);q(W)}catch(U){K(U)}J=[]}).resume()})}function lQ(Q,$,q){var K=$;switch($){case"blob":case"arraybuffer":K="uint8array";break;case"base64":K="string";break}try{this._internalType=K,this._outputType=$,this._mimeType=q,b2.checkSupport(K),this._worker=Q.pipe(new fV(K)),Q.lock()}catch(J){this._worker=new AV("error"),this._worker.error(J)}}lQ.prototype={accumulate:function(Q){return OV(this,Q)},on:function(Q,$){var q=this;if(Q==="data")this._worker.on(Q,function(K){$.call(q,K.data,K.meta)});else this._worker.on(Q,function(){b2.delay($,arguments,q)});return this},resume:function(){return b2.delay(this._worker.resume,[],this._worker),this},pause:function(){return this._worker.pause(),this},toNodejsStream:function(Q){if(b2.checkSupport("nodestream"),this._outputType!=="nodebuffer")throw new Error(this._outputType+" is not supported by this method");return new iQ(this,{objectMode:this._outputType!=="nodebuffer"},Q)}};oQ.exports=lQ});var T4=N0((g1)=>{g1.base64=!1;g1.binary=!1;g1.dir=!1;g1.createFolders=!0;g1.date=null;g1.compression=null;g1.compressionOptions=null;g1.comment=null;g1.unixPermissions=null;g1.dosPermissions=null});var E4=N0((V3,aQ)=>{var K5=c0(),J5=N1(),PV=16384;function w6(Q){J5.call(this,"DataWorker");var $=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,Q.then(function(q){if($.dataIsReady=!0,$.data=q,$.max=q&&q.length||0,$.type=K5.getTypeOf(q),!$.isPaused)$._tickAndRepeat()},function(q){$.error(q)})}K5.inherits(w6,J5);w6.prototype.cleanUp=function(){J5.prototype.cleanUp.call(this),this.data=null};w6.prototype.resume=function(){if(!J5.prototype.resume.call(this))return!1;if(!this._tickScheduled&&this.dataIsReady)this._tickScheduled=!0,K5.delay(this._tickAndRepeat,[],this);return!0};w6.prototype._tickAndRepeat=function(){if(this._tickScheduled=!1,this.isPaused||this.isFinished)return;if(this._tick(),!this.isFinished)K5.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0};w6.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var Q=PV,$=null,q=Math.min(this.max,this.index+Q);if(this.index>=this.max)return this.end();else{switch(this.type){case"string":$=this.data.substring(this.index,q);break;case"uint8array":$=this.data.subarray(this.index,q);break;case"array":case"nodebuffer":$=this.data.slice(this.index,q);break}return this.index=q,this.push({data:$,meta:{percent:this.max?this.index/this.max*100:0}})}};aQ.exports=w6});var U5=N0((Z3,sQ)=>{var TV=c0();function EV(){var Q,$=[];for(var q=0;q<256;q++){Q=q;for(var K=0;K<8;K++)Q=Q&1?3988292384^Q>>>1:Q>>>1;$[q]=Q}return $}var rQ=EV();function SV(Q,$,q,K){var J=rQ,Z=K+q;Q=Q^-1;for(var G=K;G>>8^J[(Q^$[G])&255];return Q^-1}function uV(Q,$,q,K){var J=rQ,Z=K+q;Q=Q^-1;for(var G=K;G>>8^J[(Q^$.charCodeAt(G))&255];return Q^-1}sQ.exports=function Q($,q){if(typeof $==="undefined"||!$.length)return 0;var K=TV.getTypeOf($)!=="string";if(K)return SV(q|0,$,$.length,0);else return uV(q|0,$,$.length,0)}});var u4=N0((G3,eQ)=>{var tQ=N1(),_V=U5(),cV=c0();function S4(){tQ.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}cV.inherits(S4,tQ);S4.prototype.processChunk=function(Q){this.streamInfo.crc32=_V(Q.data,this.streamInfo.crc32||0),this.push(Q)};eQ.exports=S4});var qq=N0((B3,Qq)=>{var bV=c0(),_4=N1();function c4(Q){_4.call(this,"DataLengthProbe for "+Q),this.propName=Q,this.withStreamInfo(Q,0)}bV.inherits(c4,_4);c4.prototype.processChunk=function(Q){if(Q){var $=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=$+Q.data.length}_4.prototype.processChunk.call(this,Q)};Qq.exports=c4});var V5=N0((W3,Jq)=>{var $q=W6(),Kq=E4(),dV=u4(),b4=qq();function d4(Q,$,q,K,J){this.compressedSize=Q,this.uncompressedSize=$,this.crc32=q,this.compression=K,this.compressedContent=J}d4.prototype={getContentWorker:function(){var Q=new Kq($q.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new b4("data_length")),$=this;return Q.on("end",function(){if(this.streamInfo.data_length!==$.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),Q},getCompressedWorker:function(){return new Kq($q.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}};d4.createWorkerFrom=function(Q,$,q){return Q.pipe(new dV).pipe(new b4("uncompressedSize")).pipe($.compressWorker(q)).pipe(new b4("compressedSize")).withStreamInfo("compression",$)};Jq.exports=d4});var Gq=N0((z3,Zq)=>{var mV=P4(),nV=E4(),m4=M6(),n4=V5(),Uq=N1(),p4=function(Q,$,q){this.name=Q,this.dir=q.dir,this.date=q.date,this.comment=q.comment,this.unixPermissions=q.unixPermissions,this.dosPermissions=q.dosPermissions,this._data=$,this._dataBinary=q.binary,this.options={compression:q.compression,compressionOptions:q.compressionOptions}};p4.prototype={internalStream:function(Q){var $=null,q="string";try{if(!Q)throw new Error("No output type specified.");q=Q.toLowerCase();var K=q==="string"||q==="text";if(q==="binarystring"||q==="text")q="string";$=this._decompressWorker();var J=!this._dataBinary;if(J&&!K)$=$.pipe(new m4.Utf8EncodeWorker);if(!J&&K)$=$.pipe(new m4.Utf8DecodeWorker)}catch(Z){$=new Uq("error"),$.error(Z)}return new mV($,q,"")},async:function(Q,$){return this.internalStream(Q).accumulate($)},nodeStream:function(Q,$){return this.internalStream(Q||"nodebuffer").toNodejsStream($)},_compressWorker:function(Q,$){if(this._data instanceof n4&&this._data.compression.magic===Q.magic)return this._data.getCompressedWorker();else{var q=this._decompressWorker();if(!this._dataBinary)q=q.pipe(new m4.Utf8EncodeWorker);return n4.createWorkerFrom(q,Q,$)}},_decompressWorker:function(){if(this._data instanceof n4)return this._data.getContentWorker();else if(this._data instanceof Uq)return this._data;else return new nV(this._data)}};var Vq=["asText","asBinary","asNodeBuffer","asUint8Array","asArrayBuffer"],pV=function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")};for(B8=0;B8{var iV=typeof Uint8Array!=="undefined"&&typeof Uint16Array!=="undefined"&&typeof Int32Array!=="undefined";function lV(Q,$){return Object.prototype.hasOwnProperty.call(Q,$)}J1.assign=function(Q){var $=Array.prototype.slice.call(arguments,1);while($.length){var q=$.shift();if(!q)continue;if(typeof q!=="object")throw new TypeError(q+"must be non-object");for(var K in q)if(lV(q,K))Q[K]=q[K]}return Q};J1.shrinkBuf=function(Q,$){if(Q.length===$)return Q;if(Q.subarray)return Q.subarray(0,$);return Q.length=$,Q};var oV={arraySet:function(Q,$,q,K,J){if($.subarray&&Q.subarray){Q.set($.subarray(q,q+K),J);return}for(var Z=0;Z{var rV=q2(),sV=4,Bq=0,Wq=1,tV=2;function Y6(Q){var $=Q.length;while(--$>=0)Q[$]=0}var eV=0,Yq=1,QZ=2,qZ=3,$Z=258,t4=29,N8=256,z8=N8+1+t4,N6=30,e4=19,Lq=2*z8+1,d2=15,i4=16,KZ=7,Q7=256,Dq=16,Hq=17,kq=18,r4=[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],Z5=[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],JZ=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],vq=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],UZ=512,$2=new Array((z8+2)*2);Y6($2);var W8=new Array(N6*2);Y6(W8);var F8=new Array(UZ);Y6(F8);var M8=new Array($Z-qZ+1);Y6(M8);var q7=new Array(t4);Y6(q7);var G5=new Array(N6);Y6(G5);function l4(Q,$,q,K,J){this.static_tree=Q,this.extra_bits=$,this.extra_base=q,this.elems=K,this.max_length=J,this.has_stree=Q&&Q.length}var Iq,Rq,Cq;function o4(Q,$){this.dyn_tree=Q,this.max_code=0,this.stat_desc=$}function jq(Q){return Q<256?F8[Q]:F8[256+(Q>>>7)]}function w8(Q,$){Q.pending_buf[Q.pending++]=$&255,Q.pending_buf[Q.pending++]=$>>>8&255}function B1(Q,$,q){if(Q.bi_valid>i4-q)Q.bi_buf|=$<>i4-Q.bi_valid,Q.bi_valid+=q-i4;else Q.bi_buf|=$<>>=1,q<<=1;while(--$>0);return q>>>1}function VZ(Q){if(Q.bi_valid===16)w8(Q,Q.bi_buf),Q.bi_buf=0,Q.bi_valid=0;else if(Q.bi_valid>=8)Q.pending_buf[Q.pending++]=Q.bi_buf&255,Q.bi_buf>>=8,Q.bi_valid-=8}function ZZ(Q,$){var{dyn_tree:q,max_code:K}=$,J=$.stat_desc.static_tree,Z=$.stat_desc.has_stree,G=$.stat_desc.extra_bits,B=$.stat_desc.extra_base,W=$.stat_desc.max_length,U,V,N,F,M,v,x=0;for(F=0;F<=d2;F++)Q.bl_count[F]=0;q[Q.heap[Q.heap_max]*2+1]=0;for(U=Q.heap_max+1;UW)F=W,x++;if(q[V*2+1]=F,V>K)continue;if(Q.bl_count[F]++,M=0,V>=B)M=G[V-B];if(v=q[V*2],Q.opt_len+=v*(F+M),Z)Q.static_len+=v*(J[V*2+1]+M)}if(x===0)return;do{F=W-1;while(Q.bl_count[F]===0)F--;Q.bl_count[F]--,Q.bl_count[F+1]+=2,Q.bl_count[W]--,x-=2}while(x>0);for(F=W;F!==0;F--){V=Q.bl_count[F];while(V!==0){if(N=Q.heap[--U],N>K)continue;if(q[N*2+1]!==F)Q.opt_len+=(F-q[N*2+1])*q[N*2],q[N*2+1]=F;V--}}}function Aq(Q,$,q){var K=new Array(d2+1),J=0,Z,G;for(Z=1;Z<=d2;Z++)K[Z]=J=J+q[Z-1]<<1;for(G=0;G<=$;G++){var B=Q[G*2+1];if(B===0)continue;Q[G*2]=fq(K[B]++,B)}}function GZ(){var Q,$,q,K,J,Z=new Array(d2+1);q=0;for(K=0;K>=7;for(;K8)w8(Q,Q.bi_buf);else if(Q.bi_valid>0)Q.pending_buf[Q.pending++]=Q.bi_buf;Q.bi_buf=0,Q.bi_valid=0}function BZ(Q,$,q,K){if(Xq(Q),K)w8(Q,q),w8(Q,~q);rV.arraySet(Q.pending_buf,Q.window,$,q,Q.pending),Q.pending+=q}function zq(Q,$,q,K){var J=$*2,Z=q*2;return Q[J]>1;G>=1;G--)a4(Q,q,G);U=Z;do G=Q.heap[1],Q.heap[1]=Q.heap[Q.heap_len--],a4(Q,q,1),B=Q.heap[1],Q.heap[--Q.heap_max]=G,Q.heap[--Q.heap_max]=B,q[U*2]=q[G*2]+q[B*2],Q.depth[U]=(Q.depth[G]>=Q.depth[B]?Q.depth[G]:Q.depth[B])+1,q[G*2+1]=q[B*2+1]=U,Q.heap[1]=U++,a4(Q,q,1);while(Q.heap_len>=2);Q.heap[--Q.heap_max]=Q.heap[1],ZZ(Q,$),Aq(q,W,Q.bl_count)}function Mq(Q,$,q){var K,J=-1,Z,G=$[1],B=0,W=7,U=4;if(G===0)W=138,U=3;$[(q+1)*2+1]=65535;for(K=0;K<=q;K++){if(Z=G,G=$[(K+1)*2+1],++B=3;$--)if(Q.bl_tree[vq[$]*2+1]!==0)break;return Q.opt_len+=3*($+1)+5+5+4,$}function zZ(Q,$,q,K){var J;B1(Q,$-257,5),B1(Q,q-1,5),B1(Q,K-4,4);for(J=0;J>>=1)if($&1&&Q.dyn_ltree[q*2]!==0)return Bq;if(Q.dyn_ltree[18]!==0||Q.dyn_ltree[20]!==0||Q.dyn_ltree[26]!==0)return Wq;for(q=32;q0){if(Q.strm.data_type===tV)Q.strm.data_type=FZ(Q);if(s4(Q,Q.l_desc),s4(Q,Q.d_desc),G=WZ(Q),J=Q.opt_len+3+7>>>3,Z=Q.static_len+3+7>>>3,Z<=J)J=Z}else J=Z=q+5;if(q+4<=J&&$!==-1)yq(Q,$,q,K);else if(Q.strategy===sV||Z===J)B1(Q,(Yq<<1)+(K?1:0),3),Fq(Q,$2,W8);else B1(Q,(QZ<<1)+(K?1:0),3),zZ(Q,Q.l_desc.max_code+1,Q.d_desc.max_code+1,G+1),Fq(Q,Q.dyn_ltree,Q.dyn_dtree);if(gq(Q),K)Xq(Q)}function YZ(Q,$,q){if(Q.pending_buf[Q.d_buf+Q.last_lit*2]=$>>>8&255,Q.pending_buf[Q.d_buf+Q.last_lit*2+1]=$&255,Q.pending_buf[Q.l_buf+Q.last_lit]=q&255,Q.last_lit++,$===0)Q.dyn_ltree[q*2]++;else Q.matches++,$--,Q.dyn_ltree[(M8[q]+N8+1)*2]++,Q.dyn_dtree[jq($)*2]++;return Q.last_lit===Q.lit_bufsize-1}L6._tr_init=MZ;L6._tr_stored_block=yq;L6._tr_flush_block=NZ;L6._tr_tally=YZ;L6._tr_align=wZ});var $7=N0((w3,xq)=>{function LZ(Q,$,q,K){var J=Q&65535|0,Z=Q>>>16&65535|0,G=0;while(q!==0){G=q>2000?2000:q,q-=G;do J=J+$[K++]|0,Z=Z+J|0;while(--G);J%=65521,Z%=65521}return J|Z<<16|0}xq.exports=LZ});var K7=N0((N3,Oq)=>{function DZ(){var Q,$=[];for(var q=0;q<256;q++){Q=q;for(var K=0;K<8;K++)Q=Q&1?3988292384^Q>>>1:Q>>>1;$[q]=Q}return $}var HZ=DZ();function kZ(Q,$,q,K){var J=HZ,Z=K+q;Q^=-1;for(var G=K;G>>8^J[(Q^$[G])&255];return Q^-1}Oq.exports=kZ});var B5=N0((Y3,Pq)=>{Pq.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}});var mq=N0((d1)=>{var U1=q2(),I1=hq(),uq=$7(),Y2=K7(),vZ=B5(),i2=0,IZ=1,RZ=3,v2=4,Tq=5,b1=0,Eq=1,R1=-2,CZ=-3,J7=-5,jZ=-1,fZ=1,W5=2,AZ=3,gZ=4,XZ=0,yZ=2,w5=8,hZ=9,xZ=15,OZ=8,PZ=29,TZ=256,V7=TZ+1+PZ,EZ=30,SZ=19,uZ=2*V7+1,_Z=15,j0=3,H2=258,X1=H2+j0+1,cZ=32,N5=42,Z7=69,z5=73,F5=91,M5=103,m2=113,L8=666,l0=1,D8=2,n2=3,k6=4,bZ=3;function k2(Q,$){return Q.msg=vZ[$],$}function Sq(Q){return(Q<<1)-(Q>4?9:0)}function D2(Q){var $=Q.length;while(--$>=0)Q[$]=0}function L2(Q){var $=Q.state,q=$.pending;if(q>Q.avail_out)q=Q.avail_out;if(q===0)return;if(U1.arraySet(Q.output,$.pending_buf,$.pending_out,q,Q.next_out),Q.next_out+=q,$.pending_out+=q,Q.total_out+=q,Q.avail_out-=q,$.pending-=q,$.pending===0)$.pending_out=0}function t0(Q,$){I1._tr_flush_block(Q,Q.block_start>=0?Q.block_start:-1,Q.strstart-Q.block_start,$),Q.block_start=Q.strstart,L2(Q.strm)}function X0(Q,$){Q.pending_buf[Q.pending++]=$}function Y8(Q,$){Q.pending_buf[Q.pending++]=$>>>8&255,Q.pending_buf[Q.pending++]=$&255}function dZ(Q,$,q,K){var J=Q.avail_in;if(J>K)J=K;if(J===0)return 0;if(Q.avail_in-=J,U1.arraySet($,Q.input,Q.next_in,J,q),Q.state.wrap===1)Q.adler=uq(Q.adler,$,J,q);else if(Q.state.wrap===2)Q.adler=Y2(Q.adler,$,J,q);return Q.next_in+=J,Q.total_in+=J,J}function _q(Q,$){var{max_chain_length:q,strstart:K}=Q,J,Z,G=Q.prev_length,B=Q.nice_match,W=Q.strstart>Q.w_size-X1?Q.strstart-(Q.w_size-X1):0,U=Q.window,V=Q.w_mask,N=Q.prev,F=Q.strstart+H2,M=U[K+G-1],v=U[K+G];if(Q.prev_length>=Q.good_match)q>>=2;if(B>Q.lookahead)B=Q.lookahead;do{if(J=$,U[J+G]!==v||U[J+G-1]!==M||U[J]!==U[K]||U[++J]!==U[K+1])continue;K+=2,J++;do;while(U[++K]===U[++J]&&U[++K]===U[++J]&&U[++K]===U[++J]&&U[++K]===U[++J]&&U[++K]===U[++J]&&U[++K]===U[++J]&&U[++K]===U[++J]&&U[++K]===U[++J]&&KG){if(Q.match_start=$,G=Z,Z>=B)break;M=U[K+G-1],v=U[K+G]}}while(($=N[$&V])>W&&--q!==0);if(G<=Q.lookahead)return G;return Q.lookahead}function p2(Q){var $=Q.w_size,q,K,J,Z,G;do{if(Z=Q.window_size-Q.lookahead-Q.strstart,Q.strstart>=$+($-X1)){U1.arraySet(Q.window,Q.window,$,$,0),Q.match_start-=$,Q.strstart-=$,Q.block_start-=$,K=Q.hash_size,q=K;do J=Q.head[--q],Q.head[q]=J>=$?J-$:0;while(--K);K=$,q=K;do J=Q.prev[--q],Q.prev[q]=J>=$?J-$:0;while(--K);Z+=$}if(Q.strm.avail_in===0)break;if(K=dZ(Q.strm,Q.window,Q.strstart+Q.lookahead,Z),Q.lookahead+=K,Q.lookahead+Q.insert>=j0){G=Q.strstart-Q.insert,Q.ins_h=Q.window[G],Q.ins_h=(Q.ins_h<Q.pending_buf_size-5)q=Q.pending_buf_size-5;for(;;){if(Q.lookahead<=1){if(p2(Q),Q.lookahead===0&&$===i2)return l0;if(Q.lookahead===0)break}Q.strstart+=Q.lookahead,Q.lookahead=0;var K=Q.block_start+q;if(Q.strstart===0||Q.strstart>=K){if(Q.lookahead=Q.strstart-K,Q.strstart=K,t0(Q,!1),Q.strm.avail_out===0)return l0}if(Q.strstart-Q.block_start>=Q.w_size-X1){if(t0(Q,!1),Q.strm.avail_out===0)return l0}}if(Q.insert=0,$===v2){if(t0(Q,!0),Q.strm.avail_out===0)return n2;return k6}if(Q.strstart>Q.block_start){if(t0(Q,!1),Q.strm.avail_out===0)return l0}return l0}function U7(Q,$){var q,K;for(;;){if(Q.lookahead=j0)Q.ins_h=(Q.ins_h<=j0)if(K=I1._tr_tally(Q,Q.strstart-Q.match_start,Q.match_length-j0),Q.lookahead-=Q.match_length,Q.match_length<=Q.max_lazy_match&&Q.lookahead>=j0){Q.match_length--;do Q.strstart++,Q.ins_h=(Q.ins_h<=j0)Q.ins_h=(Q.ins_h<4096))Q.match_length=j0-1}if(Q.prev_length>=j0&&Q.match_length<=Q.prev_length){J=Q.strstart+Q.lookahead-j0,K=I1._tr_tally(Q,Q.strstart-1-Q.prev_match,Q.prev_length-j0),Q.lookahead-=Q.prev_length-1,Q.prev_length-=2;do if(++Q.strstart<=J)Q.ins_h=(Q.ins_h<=j0&&Q.strstart>0){if(J=Q.strstart-1,K=G[J],K===G[++J]&&K===G[++J]&&K===G[++J]){Z=Q.strstart+H2;do;while(K===G[++J]&&K===G[++J]&&K===G[++J]&&K===G[++J]&&K===G[++J]&&K===G[++J]&&K===G[++J]&&K===G[++J]&&JQ.lookahead)Q.match_length=Q.lookahead}}if(Q.match_length>=j0)q=I1._tr_tally(Q,1,Q.match_length-j0),Q.lookahead-=Q.match_length,Q.strstart+=Q.match_length,Q.match_length=0;else q=I1._tr_tally(Q,0,Q.window[Q.strstart]),Q.lookahead--,Q.strstart++;if(q){if(t0(Q,!1),Q.strm.avail_out===0)return l0}}if(Q.insert=0,$===v2){if(t0(Q,!0),Q.strm.avail_out===0)return n2;return k6}if(Q.last_lit){if(t0(Q,!1),Q.strm.avail_out===0)return l0}return D8}function pZ(Q,$){var q;for(;;){if(Q.lookahead===0){if(p2(Q),Q.lookahead===0){if($===i2)return l0;break}}if(Q.match_length=0,q=I1._tr_tally(Q,0,Q.window[Q.strstart]),Q.lookahead--,Q.strstart++,q){if(t0(Q,!1),Q.strm.avail_out===0)return l0}}if(Q.insert=0,$===v2){if(t0(Q,!0),Q.strm.avail_out===0)return n2;return k6}if(Q.last_lit){if(t0(Q,!1),Q.strm.avail_out===0)return l0}return D8}function c1(Q,$,q,K,J){this.good_length=Q,this.max_lazy=$,this.nice_length=q,this.max_chain=K,this.func=J}var H6;H6=[new c1(0,0,0,0,mZ),new c1(4,4,8,4,U7),new c1(4,5,16,8,U7),new c1(4,6,32,32,U7),new c1(4,4,16,16,D6),new c1(8,16,32,32,D6),new c1(8,16,128,128,D6),new c1(8,32,128,256,D6),new c1(32,128,258,1024,D6),new c1(32,258,258,4096,D6)];function iZ(Q){Q.window_size=2*Q.w_size,D2(Q.head),Q.max_lazy_match=H6[Q.level].max_lazy,Q.good_match=H6[Q.level].good_length,Q.nice_match=H6[Q.level].nice_length,Q.max_chain_length=H6[Q.level].max_chain,Q.strstart=0,Q.block_start=0,Q.lookahead=0,Q.insert=0,Q.match_length=Q.prev_length=j0-1,Q.match_available=0,Q.ins_h=0}function lZ(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=w5,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new U1.Buf16(uZ*2),this.dyn_dtree=new U1.Buf16((2*EZ+1)*2),this.bl_tree=new U1.Buf16((2*SZ+1)*2),D2(this.dyn_ltree),D2(this.dyn_dtree),D2(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new U1.Buf16(_Z+1),this.heap=new U1.Buf16(2*V7+1),D2(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new U1.Buf16(2*V7+1),D2(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function cq(Q){var $;if(!Q||!Q.state)return k2(Q,R1);if(Q.total_in=Q.total_out=0,Q.data_type=yZ,$=Q.state,$.pending=0,$.pending_out=0,$.wrap<0)$.wrap=-$.wrap;return $.status=$.wrap?N5:m2,Q.adler=$.wrap===2?0:1,$.last_flush=i2,I1._tr_init($),b1}function bq(Q){var $=cq(Q);if($===b1)iZ(Q.state);return $}function oZ(Q,$){if(!Q||!Q.state)return R1;if(Q.state.wrap!==2)return R1;return Q.state.gzhead=$,b1}function dq(Q,$,q,K,J,Z){if(!Q)return R1;var G=1;if($===jZ)$=6;if(K<0)G=0,K=-K;else if(K>15)G=2,K-=16;if(J<1||J>hZ||q!==w5||K<8||K>15||$<0||$>9||Z<0||Z>gZ)return k2(Q,R1);if(K===8)K=9;var B=new lZ;return Q.state=B,B.strm=Q,B.wrap=G,B.gzhead=null,B.w_bits=K,B.w_size=1<Tq||$<0)return Q?k2(Q,R1):R1;if(K=Q.state,!Q.output||!Q.input&&Q.avail_in!==0||K.status===L8&&$!==v2)return k2(Q,Q.avail_out===0?J7:R1);if(K.strm=Q,q=K.last_flush,K.last_flush=$,K.status===N5)if(K.wrap===2)if(Q.adler=0,X0(K,31),X0(K,139),X0(K,8),!K.gzhead)X0(K,0),X0(K,0),X0(K,0),X0(K,0),X0(K,0),X0(K,K.level===9?2:K.strategy>=W5||K.level<2?4:0),X0(K,bZ),K.status=m2;else{if(X0(K,(K.gzhead.text?1:0)+(K.gzhead.hcrc?2:0)+(!K.gzhead.extra?0:4)+(!K.gzhead.name?0:8)+(!K.gzhead.comment?0:16)),X0(K,K.gzhead.time&255),X0(K,K.gzhead.time>>8&255),X0(K,K.gzhead.time>>16&255),X0(K,K.gzhead.time>>24&255),X0(K,K.level===9?2:K.strategy>=W5||K.level<2?4:0),X0(K,K.gzhead.os&255),K.gzhead.extra&&K.gzhead.extra.length)X0(K,K.gzhead.extra.length&255),X0(K,K.gzhead.extra.length>>8&255);if(K.gzhead.hcrc)Q.adler=Y2(Q.adler,K.pending_buf,K.pending,0);K.gzindex=0,K.status=Z7}else{var G=w5+(K.w_bits-8<<4)<<8,B=-1;if(K.strategy>=W5||K.level<2)B=0;else if(K.level<6)B=1;else if(K.level===6)B=2;else B=3;if(G|=B<<6,K.strstart!==0)G|=cZ;if(G+=31-G%31,K.status=m2,Y8(K,G),K.strstart!==0)Y8(K,Q.adler>>>16),Y8(K,Q.adler&65535);Q.adler=1}if(K.status===Z7)if(K.gzhead.extra){J=K.pending;while(K.gzindex<(K.gzhead.extra.length&65535)){if(K.pending===K.pending_buf_size){if(K.gzhead.hcrc&&K.pending>J)Q.adler=Y2(Q.adler,K.pending_buf,K.pending-J,J);if(L2(Q),J=K.pending,K.pending===K.pending_buf_size)break}X0(K,K.gzhead.extra[K.gzindex]&255),K.gzindex++}if(K.gzhead.hcrc&&K.pending>J)Q.adler=Y2(Q.adler,K.pending_buf,K.pending-J,J);if(K.gzindex===K.gzhead.extra.length)K.gzindex=0,K.status=z5}else K.status=z5;if(K.status===z5)if(K.gzhead.name){J=K.pending;do{if(K.pending===K.pending_buf_size){if(K.gzhead.hcrc&&K.pending>J)Q.adler=Y2(Q.adler,K.pending_buf,K.pending-J,J);if(L2(Q),J=K.pending,K.pending===K.pending_buf_size){Z=1;break}}if(K.gzindexJ)Q.adler=Y2(Q.adler,K.pending_buf,K.pending-J,J);if(Z===0)K.gzindex=0,K.status=F5}else K.status=F5;if(K.status===F5)if(K.gzhead.comment){J=K.pending;do{if(K.pending===K.pending_buf_size){if(K.gzhead.hcrc&&K.pending>J)Q.adler=Y2(Q.adler,K.pending_buf,K.pending-J,J);if(L2(Q),J=K.pending,K.pending===K.pending_buf_size){Z=1;break}}if(K.gzindexJ)Q.adler=Y2(Q.adler,K.pending_buf,K.pending-J,J);if(Z===0)K.status=M5}else K.status=M5;if(K.status===M5)if(K.gzhead.hcrc){if(K.pending+2>K.pending_buf_size)L2(Q);if(K.pending+2<=K.pending_buf_size)X0(K,Q.adler&255),X0(K,Q.adler>>8&255),Q.adler=0,K.status=m2}else K.status=m2;if(K.pending!==0){if(L2(Q),Q.avail_out===0)return K.last_flush=-1,b1}else if(Q.avail_in===0&&Sq($)<=Sq(q)&&$!==v2)return k2(Q,J7);if(K.status===L8&&Q.avail_in!==0)return k2(Q,J7);if(Q.avail_in!==0||K.lookahead!==0||$!==i2&&K.status!==L8){var W=K.strategy===W5?pZ(K,$):K.strategy===AZ?nZ(K,$):H6[K.level].func(K,$);if(W===n2||W===k6)K.status=L8;if(W===l0||W===n2){if(Q.avail_out===0)K.last_flush=-1;return b1}if(W===D8){if($===IZ)I1._tr_align(K);else if($!==Tq){if(I1._tr_stored_block(K,0,0,!1),$===RZ){if(D2(K.head),K.lookahead===0)K.strstart=0,K.block_start=0,K.insert=0}}if(L2(Q),Q.avail_out===0)return K.last_flush=-1,b1}}if($!==v2)return b1;if(K.wrap<=0)return Eq;if(K.wrap===2)X0(K,Q.adler&255),X0(K,Q.adler>>8&255),X0(K,Q.adler>>16&255),X0(K,Q.adler>>24&255),X0(K,Q.total_in&255),X0(K,Q.total_in>>8&255),X0(K,Q.total_in>>16&255),X0(K,Q.total_in>>24&255);else Y8(K,Q.adler>>>16),Y8(K,Q.adler&65535);if(L2(Q),K.wrap>0)K.wrap=-K.wrap;return K.pending!==0?b1:Eq}function sZ(Q){var $;if(!Q||!Q.state)return R1;if($=Q.state.status,$!==N5&&$!==Z7&&$!==z5&&$!==F5&&$!==M5&&$!==m2&&$!==L8)return k2(Q,R1);return Q.state=null,$===m2?k2(Q,CZ):b1}function tZ(Q,$){var q=$.length,K,J,Z,G,B,W,U,V;if(!Q||!Q.state)return R1;if(K=Q.state,G=K.wrap,G===2||G===1&&K.status!==N5||K.lookahead)return R1;if(G===1)Q.adler=uq(Q.adler,$,q,0);if(K.wrap=0,q>=K.w_size){if(G===0)D2(K.head),K.strstart=0,K.block_start=0,K.insert=0;V=new U1.Buf8(K.w_size),U1.arraySet(V,$,q-K.w_size,K.w_size,0),$=V,q=K.w_size}B=Q.avail_in,W=Q.next_in,U=Q.input,Q.avail_in=q,Q.next_in=0,Q.input=$,p2(K);while(K.lookahead>=j0){J=K.strstart,Z=K.lookahead-(j0-1);do K.ins_h=(K.ins_h<{var Y5=q2(),nq=!0,pq=!0;try{String.fromCharCode.apply(null,[0])}catch(Q){nq=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(Q){pq=!1}var H8=new Y5.Buf8(256);for(m1=0;m1<256;m1++)H8[m1]=m1>=252?6:m1>=248?5:m1>=240?4:m1>=224?3:m1>=192?2:1;var m1;H8[254]=H8[254]=1;v6.string2buf=function(Q){var $,q,K,J,Z,G=Q.length,B=0;for(J=0;J>>6,$[Z++]=128|q&63;else if(q<65536)$[Z++]=224|q>>>12,$[Z++]=128|q>>>6&63,$[Z++]=128|q&63;else $[Z++]=240|q>>>18,$[Z++]=128|q>>>12&63,$[Z++]=128|q>>>6&63,$[Z++]=128|q&63}return $};function iq(Q,$){if($<65534){if(Q.subarray&&pq||!Q.subarray&&nq)return String.fromCharCode.apply(null,Y5.shrinkBuf(Q,$))}var q="";for(var K=0;K<$;K++)q+=String.fromCharCode(Q[K]);return q}v6.buf2binstring=function(Q){return iq(Q,Q.length)};v6.binstring2buf=function(Q){var $=new Y5.Buf8(Q.length);for(var q=0,K=$.length;q4){B[K++]=65533,q+=Z-1;continue}J&=Z===2?31:Z===3?15:7;while(Z>1&&q1){B[K++]=65533;continue}if(J<65536)B[K++]=J;else J-=65536,B[K++]=55296|J>>10&1023,B[K++]=56320|J&1023}return iq(B,K)};v6.utf8border=function(Q,$){var q;if($=$||Q.length,$>Q.length)$=Q.length;q=$-1;while(q>=0&&(Q[q]&192)===128)q--;if(q<0)return $;if(q===0)return $;return q+H8[Q[q]]>$?q:$}});var B7=N0((H3,lq)=>{function eZ(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}lq.exports=eZ});var sq=N0((I8)=>{var k8=mq(),v8=q2(),z7=G7(),F7=B5(),QG=B7(),rq=Object.prototype.toString,qG=0,W7=4,I6=0,oq=1,aq=2,$G=-1,KG=0,JG=8;function l2(Q){if(!(this instanceof l2))return new l2(Q);this.options=v8.assign({level:$G,method:JG,chunkSize:16384,windowBits:15,memLevel:8,strategy:KG,to:""},Q||{});var $=this.options;if($.raw&&$.windowBits>0)$.windowBits=-$.windowBits;else if($.gzip&&$.windowBits>0&&$.windowBits<16)$.windowBits+=16;this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new QG,this.strm.avail_out=0;var q=k8.deflateInit2(this.strm,$.level,$.method,$.windowBits,$.memLevel,$.strategy);if(q!==I6)throw new Error(F7[q]);if($.header)k8.deflateSetHeader(this.strm,$.header);if($.dictionary){var K;if(typeof $.dictionary==="string")K=z7.string2buf($.dictionary);else if(rq.call($.dictionary)==="[object ArrayBuffer]")K=new Uint8Array($.dictionary);else K=$.dictionary;if(q=k8.deflateSetDictionary(this.strm,K),q!==I6)throw new Error(F7[q]);this._dict_set=!0}}l2.prototype.push=function(Q,$){var q=this.strm,K=this.options.chunkSize,J,Z;if(this.ended)return!1;if(Z=$===~~$?$:$===!0?W7:qG,typeof Q==="string")q.input=z7.string2buf(Q);else if(rq.call(Q)==="[object ArrayBuffer]")q.input=new Uint8Array(Q);else q.input=Q;q.next_in=0,q.avail_in=q.input.length;do{if(q.avail_out===0)q.output=new v8.Buf8(K),q.next_out=0,q.avail_out=K;if(J=k8.deflate(q,Z),J!==oq&&J!==I6)return this.onEnd(J),this.ended=!0,!1;if(q.avail_out===0||q.avail_in===0&&(Z===W7||Z===aq))if(this.options.to==="string")this.onData(z7.buf2binstring(v8.shrinkBuf(q.output,q.next_out)));else this.onData(v8.shrinkBuf(q.output,q.next_out))}while((q.avail_in>0||q.avail_out===0)&&J!==oq);if(Z===W7)return J=k8.deflateEnd(this.strm),this.onEnd(J),this.ended=!0,J===I6;if(Z===aq)return this.onEnd(I6),q.avail_out=0,!0;return!0};l2.prototype.onData=function(Q){this.chunks.push(Q)};l2.prototype.onEnd=function(Q){if(Q===I6)if(this.options.to==="string")this.result=this.chunks.join("");else this.result=v8.flattenChunks(this.chunks);this.chunks=[],this.err=Q,this.msg=this.strm.msg};function M7(Q,$){var q=new l2($);if(q.push(Q,!0),q.err)throw q.msg||F7[q.err];return q.result}function UG(Q,$){return $=$||{},$.raw=!0,M7(Q,$)}function VG(Q,$){return $=$||{},$.gzip=!0,M7(Q,$)}I8.Deflate=l2;I8.deflate=M7;I8.deflateRaw=UG;I8.gzip=VG});var eq=N0((v3,tq)=>{var L5=30,ZG=12;tq.exports=function Q($,q){var K,J,Z,G,B,W,U,V,N,F,M,v,x,y,D,z,Y,H,R,c,m,$0,_,g,O;K=$.state,J=$.next_in,g=$.input,Z=J+($.avail_in-5),G=$.next_out,O=$.output,B=G-(q-$.avail_out),W=G+($.avail_out-257),U=K.dmax,V=K.wsize,N=K.whave,F=K.wnext,M=K.window,v=K.hold,x=K.bits,y=K.lencode,D=K.distcode,z=(1<>>24,v>>>=R,x-=R,R=H>>>16&255,R===0)O[G++]=H&65535;else if(R&16){if(c=H&65535,R&=15,R){if(x>>=R,x-=R}if(x<15)v+=g[J++]<>>24,v>>>=R,x-=R,R=H>>>16&255,R&16){if(m=H&65535,R&=15,xU){$.msg="invalid distance too far back",K.mode=L5;break Q}if(v>>>=R,x-=R,R=G-B,m>R){if(R=m-R,R>N){if(K.sane){$.msg="invalid distance too far back",K.mode=L5;break Q}}if($0=0,_=M,F===0){if($0+=V-R,R2)O[G++]=_[$0++],O[G++]=_[$0++],O[G++]=_[$0++],c-=3;if(c){if(O[G++]=_[$0++],c>1)O[G++]=_[$0++]}}else{$0=G-m;do O[G++]=O[$0++],O[G++]=O[$0++],O[G++]=O[$0++],c-=3;while(c>2);if(c){if(O[G++]=O[$0++],c>1)O[G++]=O[$0++]}}}else if((R&64)===0){H=D[(H&65535)+(v&(1<>3,J-=c,x-=c<<3,v&=(1<{var Q$=q2(),R6=15,q$=852,$$=592,K$=0,w7=1,J$=2,GG=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],BG=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],WG=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],zG=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];U$.exports=function Q($,q,K,J,Z,G,B,W){var U=W.bits,V=0,N=0,F=0,M=0,v=0,x=0,y=0,D=0,z=0,Y=0,H,R,c,m,$0,_=null,g=0,O,h=new Q$.Buf16(R6+1),f=new Q$.Buf16(R6+1),A=null,I=0,n,i,K0;for(V=0;V<=R6;V++)h[V]=0;for(N=0;N=1;M--)if(h[M]!==0)break;if(v>M)v=M;if(M===0)return Z[G++]=20971520,Z[G++]=20971520,W.bits=1,0;for(F=1;F0&&($===K$||M!==1))return-1;f[1]=0;for(V=1;Vq$||$===J$&&z>$$)return 1;for(;;){if(n=V-y,B[N]O)i=A[I+B[N]],K0=_[g+B[N]];else i=96,K0=0;H=1<>y)+R]=n<<24|i<<16|K0|0;while(R!==0);H=1<>=1;if(H!==0)Y&=H-1,Y+=H;else Y=0;if(N++,--h[V]===0){if(V===M)break;V=q[K+B[N]]}if(V>v&&(Y&m)!==c){if(y===0)y=v;$0+=F,x=V-y,D=1<q$||$===J$&&z>$$)return 1;c=Y&m,Z[c]=v<<24|x<<16|$0-G|0}}if(Y!==0)Z[$0+Y]=V-y<<24|4194304|0;return W.bits=v,0}});var b$=N0((y1)=>{var Y1=q2(),k7=$7(),n1=K7(),FG=eq(),R8=V$(),MG=0,x$=1,O$=2,Z$=4,wG=5,D5=6,o2=0,NG=1,YG=2,C1=-2,P$=-3,v7=-4,LG=-5,G$=8,T$=1,B$=2,W$=3,z$=4,F$=5,M$=6,w$=7,N$=8,Y$=9,L$=10,v5=11,K2=12,N7=13,D$=14,Y7=15,H$=16,k$=17,v$=18,I$=19,H5=20,k5=21,R$=22,C$=23,j$=24,f$=25,A$=26,L7=27,g$=28,X$=29,u0=30,I7=31,DG=32,HG=852,kG=592,vG=15,IG=vG;function y$(Q){return(Q>>>24&255)+(Q>>>8&65280)+((Q&65280)<<8)+((Q&255)<<24)}function RG(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Y1.Buf16(320),this.work=new Y1.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function E$(Q){var $;if(!Q||!Q.state)return C1;if($=Q.state,Q.total_in=Q.total_out=$.total=0,Q.msg="",$.wrap)Q.adler=$.wrap&1;return $.mode=T$,$.last=0,$.havedict=0,$.dmax=32768,$.head=null,$.hold=0,$.bits=0,$.lencode=$.lendyn=new Y1.Buf32(HG),$.distcode=$.distdyn=new Y1.Buf32(kG),$.sane=1,$.back=-1,o2}function S$(Q){var $;if(!Q||!Q.state)return C1;return $=Q.state,$.wsize=0,$.whave=0,$.wnext=0,E$(Q)}function u$(Q,$){var q,K;if(!Q||!Q.state)return C1;if(K=Q.state,$<0)q=0,$=-$;else if(q=($>>4)+1,$<48)$&=15;if($&&($<8||$>15))return C1;if(K.window!==null&&K.wbits!==$)K.window=null;return K.wrap=q,K.wbits=$,S$(Q)}function _$(Q,$){var q,K;if(!Q)return C1;if(K=new RG,Q.state=K,K.window=null,q=u$(Q,$),q!==o2)Q.state=null;return q}function CG(Q){return _$(Q,IG)}var h$=!0,D7,H7;function jG(Q){if(h$){var $;D7=new Y1.Buf32(512),H7=new Y1.Buf32(32),$=0;while($<144)Q.lens[$++]=8;while($<256)Q.lens[$++]=9;while($<280)Q.lens[$++]=7;while($<288)Q.lens[$++]=8;R8(x$,Q.lens,0,288,D7,0,Q.work,{bits:9}),$=0;while($<32)Q.lens[$++]=5;R8(O$,Q.lens,0,32,H7,0,Q.work,{bits:5}),h$=!1}Q.lencode=D7,Q.lenbits=9,Q.distcode=H7,Q.distbits=5}function c$(Q,$,q,K){var J,Z=Q.state;if(Z.window===null)Z.wsize=1<=Z.wsize)Y1.arraySet(Z.window,$,q-Z.wsize,Z.wsize,0),Z.wnext=0,Z.whave=Z.wsize;else{if(J=Z.wsize-Z.wnext,J>K)J=K;if(Y1.arraySet(Z.window,$,q-K,J,Z.wnext),K-=J,K)Y1.arraySet(Z.window,$,q-K,K,0),Z.wnext=K,Z.whave=Z.wsize;else{if(Z.wnext+=J,Z.wnext===Z.wsize)Z.wnext=0;if(Z.whave>>8&255,q.check=n1(q.check,_,2,0),U=0,V=0,q.mode=B$;break}if(q.flags=0,q.head)q.head.done=!1;if(!(q.wrap&1)||(((U&255)<<8)+(U>>8))%31){Q.msg="incorrect header check",q.mode=u0;break}if((U&15)!==G$){Q.msg="unknown compression method",q.mode=u0;break}if(U>>>=4,V-=4,m=(U&15)+8,q.wbits===0)q.wbits=m;else if(m>q.wbits){Q.msg="invalid window size",q.mode=u0;break}q.dmax=1<>8&1;if(q.flags&512)_[0]=U&255,_[1]=U>>>8&255,q.check=n1(q.check,_,2,0);U=0,V=0,q.mode=W$;case W$:while(V<32){if(B===0)break Q;B--,U+=K[Z++]<>>8&255,_[2]=U>>>16&255,_[3]=U>>>24&255,q.check=n1(q.check,_,4,0);U=0,V=0,q.mode=z$;case z$:while(V<16){if(B===0)break Q;B--,U+=K[Z++]<>8;if(q.flags&512)_[0]=U&255,_[1]=U>>>8&255,q.check=n1(q.check,_,2,0);U=0,V=0,q.mode=F$;case F$:if(q.flags&1024){while(V<16){if(B===0)break Q;B--,U+=K[Z++]<>>8&255,q.check=n1(q.check,_,2,0);U=0,V=0}else if(q.head)q.head.extra=null;q.mode=M$;case M$:if(q.flags&1024){if(M=q.length,M>B)M=B;if(M){if(q.head){if(m=q.head.extra_len-q.length,!q.head.extra)q.head.extra=new Array(q.head.extra_len);Y1.arraySet(q.head.extra,K,Z,M,m)}if(q.flags&512)q.check=n1(q.check,K,M,Z);B-=M,Z+=M,q.length-=M}if(q.length)break Q}q.length=0,q.mode=w$;case w$:if(q.flags&2048){if(B===0)break Q;M=0;do if(m=K[Z+M++],q.head&&m&&q.length<65536)q.head.name+=String.fromCharCode(m);while(m&&M>9&1,q.head.done=!0;Q.adler=q.check=0,q.mode=K2;break;case L$:while(V<32){if(B===0)break Q;B--,U+=K[Z++]<>>=V&7,V-=V&7,q.mode=L7;break}while(V<3){if(B===0)break Q;B--,U+=K[Z++]<>>=1,V-=1,U&3){case 0:q.mode=D$;break;case 1:if(jG(q),q.mode=H5,$===D5){U>>>=2,V-=2;break Q}break;case 2:q.mode=k$;break;case 3:Q.msg="invalid block type",q.mode=u0}U>>>=2,V-=2;break;case D$:U>>>=V&7,V-=V&7;while(V<32){if(B===0)break Q;B--,U+=K[Z++]<>>16^65535)){Q.msg="invalid stored block lengths",q.mode=u0;break}if(q.length=U&65535,U=0,V=0,q.mode=Y7,$===D5)break Q;case Y7:q.mode=H$;case H$:if(M=q.length,M){if(M>B)M=B;if(M>W)M=W;if(M===0)break Q;Y1.arraySet(J,K,Z,M,G),B-=M,Z+=M,W-=M,G+=M,q.length-=M;break}q.mode=K2;break;case k$:while(V<14){if(B===0)break Q;B--,U+=K[Z++]<>>=5,V-=5,q.ndist=(U&31)+1,U>>>=5,V-=5,q.ncode=(U&15)+4,U>>>=4,V-=4,q.nlen>286||q.ndist>30){Q.msg="too many length or distance symbols",q.mode=u0;break}q.have=0,q.mode=v$;case v$:while(q.have>>=3,V-=3}while(q.have<19)q.lens[h[q.have++]]=0;if(q.lencode=q.lendyn,q.lenbits=7,g={bits:q.lenbits},$0=R8(MG,q.lens,0,19,q.lencode,0,q.work,g),q.lenbits=g.bits,$0){Q.msg="invalid code lengths set",q.mode=u0;break}q.have=0,q.mode=I$;case I$:while(q.have>>24,z=y>>>16&255,Y=y&65535,D<=V)break;if(B===0)break Q;B--,U+=K[Z++]<>>=D,V-=D,q.lens[q.have++]=Y;else{if(Y===16){O=D+2;while(V>>=D,V-=D,q.have===0){Q.msg="invalid bit length repeat",q.mode=u0;break}m=q.lens[q.have-1],M=3+(U&3),U>>>=2,V-=2}else if(Y===17){O=D+3;while(V>>=D,V-=D,m=0,M=3+(U&7),U>>>=3,V-=3}else{O=D+7;while(V>>=D,V-=D,m=0,M=11+(U&127),U>>>=7,V-=7}if(q.have+M>q.nlen+q.ndist){Q.msg="invalid bit length repeat",q.mode=u0;break}while(M--)q.lens[q.have++]=m}}if(q.mode===u0)break;if(q.lens[256]===0){Q.msg="invalid code -- missing end-of-block",q.mode=u0;break}if(q.lenbits=9,g={bits:q.lenbits},$0=R8(x$,q.lens,0,q.nlen,q.lencode,0,q.work,g),q.lenbits=g.bits,$0){Q.msg="invalid literal/lengths set",q.mode=u0;break}if(q.distbits=6,q.distcode=q.distdyn,g={bits:q.distbits},$0=R8(O$,q.lens,q.nlen,q.ndist,q.distcode,0,q.work,g),q.distbits=g.bits,$0){Q.msg="invalid distances set",q.mode=u0;break}if(q.mode=H5,$===D5)break Q;case H5:q.mode=k5;case k5:if(B>=6&&W>=258){if(Q.next_out=G,Q.avail_out=W,Q.next_in=Z,Q.avail_in=B,q.hold=U,q.bits=V,FG(Q,F),G=Q.next_out,J=Q.output,W=Q.avail_out,Z=Q.next_in,K=Q.input,B=Q.avail_in,U=q.hold,V=q.bits,q.mode===K2)q.back=-1;break}q.back=0;for(;;){if(y=q.lencode[U&(1<>>24,z=y>>>16&255,Y=y&65535,D<=V)break;if(B===0)break Q;B--,U+=K[Z++]<>H)],D=y>>>24,z=y>>>16&255,Y=y&65535,H+D<=V)break;if(B===0)break Q;B--,U+=K[Z++]<>>=H,V-=H,q.back+=H}if(U>>>=D,V-=D,q.back+=D,q.length=Y,z===0){q.mode=A$;break}if(z&32){q.back=-1,q.mode=K2;break}if(z&64){Q.msg="invalid literal/length code",q.mode=u0;break}q.extra=z&15,q.mode=R$;case R$:if(q.extra){O=q.extra;while(V>>=q.extra,V-=q.extra,q.back+=q.extra}q.was=q.length,q.mode=C$;case C$:for(;;){if(y=q.distcode[U&(1<>>24,z=y>>>16&255,Y=y&65535,D<=V)break;if(B===0)break Q;B--,U+=K[Z++]<>H)],D=y>>>24,z=y>>>16&255,Y=y&65535,H+D<=V)break;if(B===0)break Q;B--,U+=K[Z++]<>>=H,V-=H,q.back+=H}if(U>>>=D,V-=D,q.back+=D,z&64){Q.msg="invalid distance code",q.mode=u0;break}q.offset=Y,q.extra=z&15,q.mode=j$;case j$:if(q.extra){O=q.extra;while(V>>=q.extra,V-=q.extra,q.back+=q.extra}if(q.offset>q.dmax){Q.msg="invalid distance too far back",q.mode=u0;break}q.mode=f$;case f$:if(W===0)break Q;if(M=F-W,q.offset>M){if(M=q.offset-M,M>q.whave){if(q.sane){Q.msg="invalid distance too far back",q.mode=u0;break}}if(M>q.wnext)M-=q.wnext,v=q.wsize-M;else v=q.wnext-M;if(M>q.length)M=q.length;x=q.window}else x=J,v=G-q.offset,M=q.length;if(M>W)M=W;W-=M,q.length-=M;do J[G++]=x[v++];while(--M);if(q.length===0)q.mode=k5;break;case A$:if(W===0)break Q;J[G++]=q.length,W--,q.mode=k5;break;case L7:if(q.wrap){while(V<32){if(B===0)break Q;B--,U|=K[Z++]<{d$.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}});var n$=N0((j3,m$)=>{function yG(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}m$.exports=yG});var i$=N0((j8)=>{var C6=b$(),C8=q2(),I5=G7(),n0=R7(),C7=B5(),hG=B7(),xG=n$(),p$=Object.prototype.toString;function a2(Q){if(!(this instanceof a2))return new a2(Q);this.options=C8.assign({chunkSize:16384,windowBits:0,to:""},Q||{});var $=this.options;if($.raw&&$.windowBits>=0&&$.windowBits<16){if($.windowBits=-$.windowBits,$.windowBits===0)$.windowBits=-15}if($.windowBits>=0&&$.windowBits<16&&!(Q&&Q.windowBits))$.windowBits+=32;if($.windowBits>15&&$.windowBits<48){if(($.windowBits&15)===0)$.windowBits|=15}this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new hG,this.strm.avail_out=0;var q=C6.inflateInit2(this.strm,$.windowBits);if(q!==n0.Z_OK)throw new Error(C7[q]);if(this.header=new xG,C6.inflateGetHeader(this.strm,this.header),$.dictionary){if(typeof $.dictionary==="string")$.dictionary=I5.string2buf($.dictionary);else if(p$.call($.dictionary)==="[object ArrayBuffer]")$.dictionary=new Uint8Array($.dictionary);if($.raw){if(q=C6.inflateSetDictionary(this.strm,$.dictionary),q!==n0.Z_OK)throw new Error(C7[q])}}}a2.prototype.push=function(Q,$){var q=this.strm,K=this.options.chunkSize,J=this.options.dictionary,Z,G,B,W,U,V=!1;if(this.ended)return!1;if(G=$===~~$?$:$===!0?n0.Z_FINISH:n0.Z_NO_FLUSH,typeof Q==="string")q.input=I5.binstring2buf(Q);else if(p$.call(Q)==="[object ArrayBuffer]")q.input=new Uint8Array(Q);else q.input=Q;q.next_in=0,q.avail_in=q.input.length;do{if(q.avail_out===0)q.output=new C8.Buf8(K),q.next_out=0,q.avail_out=K;if(Z=C6.inflate(q,n0.Z_NO_FLUSH),Z===n0.Z_NEED_DICT&&J)Z=C6.inflateSetDictionary(this.strm,J);if(Z===n0.Z_BUF_ERROR&&V===!0)Z=n0.Z_OK,V=!1;if(Z!==n0.Z_STREAM_END&&Z!==n0.Z_OK)return this.onEnd(Z),this.ended=!0,!1;if(q.next_out){if(q.avail_out===0||Z===n0.Z_STREAM_END||q.avail_in===0&&(G===n0.Z_FINISH||G===n0.Z_SYNC_FLUSH))if(this.options.to==="string"){if(B=I5.utf8border(q.output,q.next_out),W=q.next_out-B,U=I5.buf2string(q.output,B),q.next_out=W,q.avail_out=K-W,W)C8.arraySet(q.output,q.output,B,W,0);this.onData(U)}else this.onData(C8.shrinkBuf(q.output,q.next_out))}if(q.avail_in===0&&q.avail_out===0)V=!0}while((q.avail_in>0||q.avail_out===0)&&Z!==n0.Z_STREAM_END);if(Z===n0.Z_STREAM_END)G=n0.Z_FINISH;if(G===n0.Z_FINISH)return Z=C6.inflateEnd(this.strm),this.onEnd(Z),this.ended=!0,Z===n0.Z_OK;if(G===n0.Z_SYNC_FLUSH)return this.onEnd(n0.Z_OK),q.avail_out=0,!0;return!0};a2.prototype.onData=function(Q){this.chunks.push(Q)};a2.prototype.onEnd=function(Q){if(Q===n0.Z_OK)if(this.options.to==="string")this.result=this.chunks.join("");else this.result=C8.flattenChunks(this.chunks);this.chunks=[],this.err=Q,this.msg=this.strm.msg};function j7(Q,$){var q=new a2($);if(q.push(Q,!0),q.err)throw q.msg||C7[q.err];return q.result}function OG(Q,$){return $=$||{},$.raw=!0,j7(Q,$)}j8.Inflate=a2;j8.inflate=j7;j8.inflateRaw=OG;j8.ungzip=j7});var a$=N0((A3,o$)=>{var PG=q2().assign,TG=sq(),EG=i$(),SG=R7(),l$={};PG(l$,TG,EG,SG);o$.exports=l$});var s$=N0((C5)=>{var uG=typeof Uint8Array!=="undefined"&&typeof Uint16Array!=="undefined"&&typeof Uint32Array!=="undefined",_G=a$(),r$=c0(),R5=N1(),cG=uG?"uint8array":"array";C5.magic="\b\x00";function r2(Q,$){R5.call(this,"FlateWorker/"+Q),this._pako=null,this._pakoAction=Q,this._pakoOptions=$,this.meta={}}r$.inherits(r2,R5);r2.prototype.processChunk=function(Q){if(this.meta=Q.meta,this._pako===null)this._createPako();this._pako.push(r$.transformTo(cG,Q.data),!1)};r2.prototype.flush=function(){if(R5.prototype.flush.call(this),this._pako===null)this._createPako();this._pako.push([],!0)};r2.prototype.cleanUp=function(){R5.prototype.cleanUp.call(this),this._pako=null};r2.prototype._createPako=function(){this._pako=new _G[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var Q=this;this._pako.onData=function($){Q.push({data:$,meta:Q.meta})}};C5.compressWorker=function(Q){return new r2("Deflate",Q)};C5.uncompressWorker=function(){return new r2("Inflate",{})}});var A7=N0((f7)=>{var t$=N1();f7.STORE={magic:"\x00\x00",compressWorker:function(){return new t$("STORE compression")},uncompressWorker:function(){return new t$("STORE decompression")}};f7.DEFLATE=s$()});var g7=N0((s2)=>{s2.LOCAL_FILE_HEADER="PK\x03\x04";s2.CENTRAL_FILE_HEADER="PK\x01\x02";s2.CENTRAL_DIRECTORY_END="PK\x05\x06";s2.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK\x06\x07";s2.ZIP64_CENTRAL_DIRECTORY_END="PK\x06\x06";s2.DATA_DESCRIPTOR="PK\x07\b"});var $K=N0((h3,qK)=>{var j6=c0(),f6=N1(),X7=M6(),e$=U5(),j5=g7(),T0=function(Q,$){var q="",K;for(K=0;K<$;K++)q+=String.fromCharCode(Q&255),Q=Q>>>8;return q},bG=function(Q,$){var q=Q;if(!Q)q=$?16893:33204;return(q&65535)<<16},dG=function(Q){return(Q||0)&63},QK=function(Q,$,q,K,J,Z){var{file:G,compression:B}=Q,W=Z!==X7.utf8encode,U=j6.transformTo("string",Z(G.name)),V=j6.transformTo("string",X7.utf8encode(G.name)),N=G.comment,F=j6.transformTo("string",Z(N)),M=j6.transformTo("string",X7.utf8encode(N)),v=V.length!==G.name.length,x=M.length!==N.length,y,D,z="",Y="",H="",R=G.dir,c=G.date,m={crc32:0,compressedSize:0,uncompressedSize:0};if(!$||q)m.crc32=Q.crc32,m.compressedSize=Q.compressedSize,m.uncompressedSize=Q.uncompressedSize;var $0=0;if($)$0|=8;if(!W&&(v||x))$0|=2048;var _=0,g=0;if(R)_|=16;if(J==="UNIX")g=798,_|=bG(G.unixPermissions,R);else g=20,_|=dG(G.dosPermissions,R);if(y=c.getUTCHours(),y=y<<6,y=y|c.getUTCMinutes(),y=y<<5,y=y|c.getUTCSeconds()/2,D=c.getUTCFullYear()-1980,D=D<<4,D=D|c.getUTCMonth()+1,D=D<<5,D=D|c.getUTCDate(),v)Y=T0(1,1)+T0(e$(U),4)+V,z+="up"+T0(Y.length,2)+Y;if(x)H=T0(1,1)+T0(e$(F),4)+M,z+="uc"+T0(H.length,2)+H;var O="";O+=` -\x00`,O+=T0($0,2),O+=B.magic,O+=T0(y,2),O+=T0(D,2),O+=T0(m.crc32,4),O+=T0(m.compressedSize,4),O+=T0(m.uncompressedSize,4),O+=T0(U.length,2),O+=T0(z.length,2);var h=j5.LOCAL_FILE_HEADER+O+U+z,f=j5.CENTRAL_FILE_HEADER+T0(g,2)+O+T0(F.length,2)+"\x00\x00\x00\x00"+T0(_,4)+T0(K,4)+U+z+F;return{fileRecord:h,dirRecord:f}},mG=function(Q,$,q,K,J){var Z="",G=j6.transformTo("string",J(K));return Z=j5.CENTRAL_DIRECTORY_END+"\x00\x00\x00\x00"+T0(Q,2)+T0(Q,2)+T0($,4)+T0(q,4)+T0(G.length,2)+G,Z},nG=function(Q){var $="";return $=j5.DATA_DESCRIPTOR+T0(Q.crc32,4)+T0(Q.compressedSize,4)+T0(Q.uncompressedSize,4),$};function h1(Q,$,q,K){f6.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=$,this.zipPlatform=q,this.encodeFileName=K,this.streamFiles=Q,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}j6.inherits(h1,f6);h1.prototype.push=function(Q){var $=Q.meta.percent||0,q=this.entriesCount,K=this._sources.length;if(this.accumulate)this.contentBuffer.push(Q);else this.bytesWritten+=Q.data.length,f6.prototype.push.call(this,{data:Q.data,meta:{currentFile:this.currentFile,percent:q?($+100*(q-K-1))/q:100}})};h1.prototype.openedSource=function(Q){this.currentSourceOffset=this.bytesWritten,this.currentFile=Q.file.name;var $=this.streamFiles&&!Q.file.dir;if($){var q=QK(Q,$,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:q.fileRecord,meta:{percent:0}})}else this.accumulate=!0};h1.prototype.closedSource=function(Q){this.accumulate=!1;var $=this.streamFiles&&!Q.file.dir,q=QK(Q,$,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(q.dirRecord),$)this.push({data:nG(Q),meta:{percent:100}});else{this.push({data:q.fileRecord,meta:{percent:0}});while(this.contentBuffer.length)this.push(this.contentBuffer.shift())}this.currentFile=null};h1.prototype.flush=function(){var Q=this.bytesWritten;for(var $=0;${var pG=A7(),iG=$K(),lG=function(Q,$){var q=Q||$,K=pG[q];if(!K)throw new Error(q+" is not a valid compression method !");return K};KK.generateWorker=function(Q,$,q){var K=new iG($.streamFiles,q,$.platform,$.encodeFileName),J=0;try{Q.forEach(function(Z,G){J++;var B=lG(G.options.compression,$.compression),W=G.options.compressionOptions||$.compressionOptions||{},U=G.dir,V=G.date;G._compressWorker(B,W).withStreamInfo("file",{name:Z,dir:U,date:V,comment:G.comment||"",unixPermissions:G.unixPermissions,dosPermissions:G.dosPermissions}).pipe(K)}),K.entriesCount=J}catch(Z){K.error(Z)}return K}});var VK=N0((O3,UK)=>{var oG=c0(),f5=N1();function f8(Q,$){f5.call(this,"Nodejs stream input adapter for "+Q),this._upstreamEnded=!1,this._bindStream($)}oG.inherits(f8,f5);f8.prototype._bindStream=function(Q){var $=this;this._stream=Q,Q.pause(),Q.on("data",function(q){$.push({data:q,meta:{percent:0}})}).on("error",function(q){if($.isPaused)this.generatedError=q;else $.error(q)}).on("end",function(){if($.isPaused)$._upstreamEnded=!0;else $.end()})};f8.prototype.pause=function(){if(!f5.prototype.pause.call(this))return!1;return this._stream.pause(),!0};f8.prototype.resume=function(){if(!f5.prototype.resume.call(this))return!1;if(this._upstreamEnded)this.end();else this._stream.resume();return!0};UK.exports=f8});var YK=N0((P3,NK)=>{var aG=M6(),A8=c0(),WK=N1(),rG=P4(),zK=T4(),ZK=V5(),sG=Gq(),tG=JK(),GK=$8(),eG=VK(),FK=function(Q,$,q){var K=A8.getTypeOf($),J,Z=A8.extend(q||{},zK);if(Z.date=Z.date||new Date,Z.compression!==null)Z.compression=Z.compression.toUpperCase();if(typeof Z.unixPermissions==="string")Z.unixPermissions=parseInt(Z.unixPermissions,8);if(Z.unixPermissions&&Z.unixPermissions&16384)Z.dir=!0;if(Z.dosPermissions&&Z.dosPermissions&16)Z.dir=!0;if(Z.dir)Q=MK(Q);if(Z.createFolders&&(J=QB(Q)))wK.call(this,J,!0);var G=K==="string"&&Z.binary===!1&&Z.base64===!1;if(!q||typeof q.binary==="undefined")Z.binary=!G;var B=$ instanceof ZK&&$.uncompressedSize===0;if(B||Z.dir||!$||$.length===0)Z.base64=!1,Z.binary=!0,$="",Z.compression="STORE",K="string";var W=null;if($ instanceof ZK||$ instanceof WK)W=$;else if(GK.isNode&&GK.isStream($))W=new eG(Q,$);else W=A8.prepareContent(Q,$,Z.binary,Z.optimizedBinaryString,Z.base64);var U=new sG(Q,W,Z);this.files[Q]=U},QB=function(Q){if(Q.slice(-1)==="/")Q=Q.substring(0,Q.length-1);var $=Q.lastIndexOf("/");return $>0?Q.substring(0,$):""},MK=function(Q){if(Q.slice(-1)!=="/")Q+="/";return Q},wK=function(Q,$){if($=typeof $!=="undefined"?$:zK.createFolders,Q=MK(Q),!this.files[Q])FK.call(this,Q,null,{dir:!0,createFolders:$});return this.files[Q]};function BK(Q){return Object.prototype.toString.call(Q)==="[object RegExp]"}var qB={load:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function(Q){var $,q,K;for($ in this.files)if(K=this.files[$],q=$.slice(this.root.length,$.length),q&&$.slice(0,this.root.length)===this.root)Q(q,K)},filter:function(Q){var $=[];return this.forEach(function(q,K){if(Q(q,K))$.push(K)}),$},file:function(Q,$,q){if(arguments.length===1)if(BK(Q)){var K=Q;return this.filter(function(Z,G){return!G.dir&&K.test(Z)})}else{var J=this.files[this.root+Q];if(J&&!J.dir)return J;else return null}else Q=this.root+Q,FK.call(this,Q,$,q);return this},folder:function(Q){if(!Q)return this;if(BK(Q))return this.filter(function(J,Z){return Z.dir&&Q.test(J)});var $=this.root+Q,q=wK.call(this,$),K=this.clone();return K.root=q.name,K},remove:function(Q){Q=this.root+Q;var $=this.files[Q];if(!$){if(Q.slice(-1)!=="/")Q+="/";$=this.files[Q]}if($&&!$.dir)delete this.files[Q];else{var q=this.filter(function(J,Z){return Z.name.slice(0,Q.length)===Q});for(var K=0;K{var $B=c0();function LK(Q){this.data=Q,this.length=Q.length,this.index=0,this.zero=0}LK.prototype={checkOffset:function(Q){this.checkIndex(this.index+Q)},checkIndex:function(Q){if(this.length=this.index;q--)$=($<<8)+this.byteAt(q);return this.index+=Q,$},readString:function(Q){return $B.transformTo("string",this.readData(Q))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var Q=this.readInt(4);return new Date(Date.UTC((Q>>25&127)+1980,(Q>>21&15)-1,Q>>16&31,Q>>11&31,Q>>5&63,(Q&31)<<1))}};DK.exports=LK});var h7=N0((E3,kK)=>{var HK=y7(),KB=c0();function A6(Q){HK.call(this,Q);for(var $=0;$=0;--Z)if(this.data[Z]===$&&this.data[Z+1]===q&&this.data[Z+2]===K&&this.data[Z+3]===J)return Z-this.zero;return-1};A6.prototype.readAndCheckSignature=function(Q){var $=Q.charCodeAt(0),q=Q.charCodeAt(1),K=Q.charCodeAt(2),J=Q.charCodeAt(3),Z=this.readData(4);return $===Z[0]&&q===Z[1]&&K===Z[2]&&J===Z[3]};A6.prototype.readData=function(Q){if(this.checkOffset(Q),Q===0)return[];var $=this.data.slice(this.zero+this.index,this.zero+this.index+Q);return this.index+=Q,$};kK.exports=A6});var RK=N0((S3,IK)=>{var vK=y7(),JB=c0();function g6(Q){vK.call(this,Q)}JB.inherits(g6,vK);g6.prototype.byteAt=function(Q){return this.data.charCodeAt(this.zero+Q)};g6.prototype.lastIndexOfSignature=function(Q){return this.data.lastIndexOf(Q)-this.zero};g6.prototype.readAndCheckSignature=function(Q){var $=this.readData(4);return Q===$};g6.prototype.readData=function(Q){this.checkOffset(Q);var $=this.data.slice(this.zero+this.index,this.zero+this.index+Q);return this.index+=Q,$};IK.exports=g6});var O7=N0((u3,jK)=>{var CK=h7(),UB=c0();function x7(Q){CK.call(this,Q)}UB.inherits(x7,CK);x7.prototype.readData=function(Q){if(this.checkOffset(Q),Q===0)return new Uint8Array(0);var $=this.data.subarray(this.zero+this.index,this.zero+this.index+Q);return this.index+=Q,$};jK.exports=x7});var gK=N0((_3,AK)=>{var fK=O7(),VB=c0();function P7(Q){fK.call(this,Q)}VB.inherits(P7,fK);P7.prototype.readData=function(Q){this.checkOffset(Q);var $=this.data.slice(this.zero+this.index,this.zero+this.index+Q);return this.index+=Q,$};AK.exports=P7});var T7=N0((c3,yK)=>{var A5=c0(),XK=Q2(),ZB=h7(),GB=RK(),BB=gK(),WB=O7();yK.exports=function(Q){var $=A5.getTypeOf(Q);if(A5.checkSupport($),$==="string"&&!XK.uint8array)return new GB(Q);if($==="nodebuffer")return new BB(Q);if(XK.uint8array)return new WB(A5.transformTo("uint8array",Q));return new ZB(A5.transformTo("array",Q))}});var PK=N0((b3,OK)=>{var E7=T7(),I2=c0(),zB=V5(),hK=U5(),g5=M6(),X5=A7(),FB=Q2(),MB=0,wB=3,NB=function(Q){for(var $ in X5){if(!Object.prototype.hasOwnProperty.call(X5,$))continue;if(X5[$].magic===Q)return X5[$]}return null};function xK(Q,$){this.options=Q,this.loadOptions=$}xK.prototype={isEncrypted:function(){return(this.bitFlag&1)===1},useUTF8:function(){return(this.bitFlag&2048)===2048},readLocalPart:function(Q){var $,q;if(Q.skip(22),this.fileNameLength=Q.readInt(2),q=Q.readInt(2),this.fileName=Q.readData(this.fileNameLength),Q.skip(q),this.compressedSize===-1||this.uncompressedSize===-1)throw new Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");if($=NB(this.compressionMethod),$===null)throw new Error("Corrupted zip : compression "+I2.pretty(this.compressionMethod)+" unknown (inner file : "+I2.transformTo("string",this.fileName)+")");this.decompressed=new zB(this.compressedSize,this.uncompressedSize,this.crc32,$,Q.readData(this.compressedSize))},readCentralPart:function(Q){this.versionMadeBy=Q.readInt(2),Q.skip(2),this.bitFlag=Q.readInt(2),this.compressionMethod=Q.readString(2),this.date=Q.readDate(),this.crc32=Q.readInt(4),this.compressedSize=Q.readInt(4),this.uncompressedSize=Q.readInt(4);var $=Q.readInt(2);if(this.extraFieldsLength=Q.readInt(2),this.fileCommentLength=Q.readInt(2),this.diskNumberStart=Q.readInt(2),this.internalFileAttributes=Q.readInt(2),this.externalFileAttributes=Q.readInt(4),this.localHeaderOffset=Q.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");Q.skip($),this.readExtraFields(Q),this.parseZIP64ExtraField(Q),this.fileComment=Q.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var Q=this.versionMadeBy>>8;if(this.dir=this.externalFileAttributes&16?!0:!1,Q===MB)this.dosPermissions=this.externalFileAttributes&63;if(Q===wB)this.unixPermissions=this.externalFileAttributes>>16&65535;if(!this.dir&&this.fileNameStr.slice(-1)==="/")this.dir=!0},parseZIP64ExtraField:function(){if(!this.extraFields[1])return;var Q=E7(this.extraFields[1].value);if(this.uncompressedSize===I2.MAX_VALUE_32BITS)this.uncompressedSize=Q.readInt(8);if(this.compressedSize===I2.MAX_VALUE_32BITS)this.compressedSize=Q.readInt(8);if(this.localHeaderOffset===I2.MAX_VALUE_32BITS)this.localHeaderOffset=Q.readInt(8);if(this.diskNumberStart===I2.MAX_VALUE_32BITS)this.diskNumberStart=Q.readInt(4)},readExtraFields:function(Q){var $=Q.index+this.extraFieldsLength,q,K,J;if(!this.extraFields)this.extraFields={};while(Q.index+4<$)q=Q.readInt(2),K=Q.readInt(2),J=Q.readData(K),this.extraFields[q]={id:q,length:K,value:J};Q.setIndex($)},handleUTF8:function(){var Q=FB.uint8array?"uint8array":"array";if(this.useUTF8())this.fileNameStr=g5.utf8decode(this.fileName),this.fileCommentStr=g5.utf8decode(this.fileComment);else{var $=this.findExtraFieldUnicodePath();if($!==null)this.fileNameStr=$;else{var q=I2.transformTo(Q,this.fileName);this.fileNameStr=this.loadOptions.decodeFileName(q)}var K=this.findExtraFieldUnicodeComment();if(K!==null)this.fileCommentStr=K;else{var J=I2.transformTo(Q,this.fileComment);this.fileCommentStr=this.loadOptions.decodeFileName(J)}}},findExtraFieldUnicodePath:function(){var Q=this.extraFields[28789];if(Q){var $=E7(Q.value);if($.readInt(1)!==1)return null;if(hK(this.fileName)!==$.readInt(4))return null;return g5.utf8decode($.readData(Q.length-5))}return null},findExtraFieldUnicodeComment:function(){var Q=this.extraFields[25461];if(Q){var $=E7(Q.value);if($.readInt(1)!==1)return null;if(hK(this.fileComment)!==$.readInt(4))return null;return g5.utf8decode($.readData(Q.length-5))}return null}};OK.exports=xK});var SK=N0((d3,EK)=>{var YB=T7(),J2=c0(),x1=g7(),LB=PK(),DB=Q2();function TK(Q){this.files=[],this.loadOptions=Q}TK.prototype={checkSignature:function(Q){if(!this.reader.readAndCheckSignature(Q)){this.reader.index-=4;var $=this.reader.readString(4);throw new Error("Corrupted zip or bug: unexpected signature ("+J2.pretty($)+", expected "+J2.pretty(Q)+")")}},isSignature:function(Q,$){var q=this.reader.index;this.reader.setIndex(Q);var K=this.reader.readString(4),J=K===$;return this.reader.setIndex(q),J},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2);var Q=this.reader.readData(this.zipCommentLength),$=DB.uint8array?"uint8array":"array",q=J2.transformTo($,Q);this.zipComment=this.loadOptions.decodeFileName(q)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.reader.skip(4),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};var Q=this.zip64EndOfCentralSize-44,$=0,q,K,J;while($1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var Q,$;for(Q=0;Q0)if(this.isSignature(q,x1.CENTRAL_FILE_HEADER));else this.reader.zero=J;else if(J<0)throw new Error("Corrupted zip: missing "+Math.abs(J)+" bytes.")},prepareReader:function(Q){this.reader=YB(Q)},load:function(Q){this.prepareReader(Q),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}};EK.exports=TK});var cK=N0((m3,_K)=>{var S7=c0(),y5=W6(),HB=M6(),kB=SK(),vB=u4(),uK=$8();function IB(Q){return new y5.Promise(function($,q){var K=Q.decompressed.getContentWorker().pipe(new vB);K.on("error",function(J){q(J)}).on("end",function(){if(K.streamInfo.crc32!==Q.decompressed.crc32)q(new Error("Corrupted zip : CRC32 mismatch"));else $()}).resume()})}_K.exports=function(Q,$){var q=this;if($=S7.extend($||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:HB.utf8decode}),uK.isNode&&uK.isStream(Q))return y5.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file."));return S7.prepareContent("the loaded zip file",Q,!0,$.optimizedBinaryString,$.base64).then(function(K){var J=new kB($);return J.load(K),J}).then(function K(J){var Z=[y5.Promise.resolve(J)],G=J.files;if($.checkCRC32)for(var B=0;B{function j1(){if(!(this instanceof j1))return new j1;if(arguments.length)throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");this.files=Object.create(null),this.comment=null,this.root="",this.clone=function(){var Q=new j1;for(var $ in this)if(typeof this[$]!=="function")Q[$]=this[$];return Q}}j1.prototype=YK();j1.prototype.loadAsync=cK();j1.support=Q2();j1.defaults=T4();j1.version="3.10.1";j1.loadAsync=function(Q,$){return new j1().loadAsync(Q,$)};j1.external=W6();bK.exports=j1});var oK={};h2(oK,{types:()=>xB,promisify:()=>bB,log:()=>_B,isUndefined:()=>X6,isSymbol:()=>PB,isString:()=>E5,isRegExp:()=>h5,isPrimitive:()=>TB,isObject:()=>y6,isNumber:()=>nK,isNullOrUndefined:()=>OB,isNull:()=>T5,isFunction:()=>O5,isError:()=>x5,isDate:()=>b7,isBuffer:()=>EB,isBoolean:()=>m7,isArray:()=>mK,inspect:()=>t2,inherits:()=>cB,format:()=>d7,deprecate:()=>CB,debuglog:()=>jB,callbackifyOnRejected:()=>lK,callbackify:()=>dB,_extend:()=>pK,TextEncoder:()=>mB,TextDecoder:()=>nB});function d7(Q,...$){if(!E5(Q)){var q=[Q];for(var K=0;K<$.length;K++)q.push(t2($[K]));return q.join(" ")}var K=0,J=$.length,Z=String(Q).replace(RB,function(B){if(B==="%%")return"%";if(K>=J)return B;switch(B){case"%s":return String($[K++]);case"%d":return Number($[K++]);case"%j":try{return JSON.stringify($[K++])}catch(W){return"[Circular]"}default:return B}});for(var G=$[K];K=0||Z.indexOf("description")>=0))return u7($);if(Z.length===0){if(O5($)){var B=$.name?": "+$.name:"";return Q.stylize("[Function"+B+"]","special")}if(h5($))return Q.stylize(RegExp.prototype.toString.call($),"regexp");if(b7($))return Q.stylize(Date.prototype.toString.call($),"date");if(x5($))return u7($)}var W="",U=!1,V=["{","}"];if(mK($))U=!0,V=["[","]"];if(O5($)){var N=$.name?": "+$.name:"";W=" [Function"+N+"]"}if(h5($))W=" "+RegExp.prototype.toString.call($);if(b7($))W=" "+Date.prototype.toUTCString.call($);if(x5($))W=" "+u7($);if(Z.length===0&&(!U||$.length==0))return V[0]+W+V[1];if(q<0)if(h5($))return Q.stylize(RegExp.prototype.toString.call($),"regexp");else return Q.stylize("[Object]","special");Q.seen.push($);var F;if(U)F=yB(Q,$,q,G,Z);else F=Z.map(function(M){return c7(Q,$,q,G,M,U)});return Q.seen.pop(),hB(F,W,V)}function XB(Q,$){if(X6($))return Q.stylize("undefined","undefined");if(E5($)){var q="'"+JSON.stringify($).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return Q.stylize(q,"string")}if(nK($))return Q.stylize(""+$,"number");if(m7($))return Q.stylize(""+$,"boolean");if(T5($))return Q.stylize("null","null")}function u7(Q){return"["+Error.prototype.toString.call(Q)+"]"}function yB(Q,$,q,K,J){var Z=[];for(var G=0,B=$.length;G-1)if(Z)B=B.split(` -`).map(function(U){return" "+U}).join(` -`).slice(2);else B=` -`+B.split(` -`).map(function(U){return" "+U}).join(` -`)}else B=Q.stylize("[Circular]","special");if(X6(G)){if(Z&&J.match(/^\d+$/))return B;if(G=JSON.stringify(""+J),G.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/))G=G.slice(1,-1),G=Q.stylize(G,"name");else G=G.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),G=Q.stylize(G,"string")}return G+": "+B}function hB(Q,$,q){var K=0,J=Q.reduce(function(Z,G){if(K++,G.indexOf(` -`)>=0)K++;return Z+G.replace(/\u001b\[\d\d?m/g,"").length+1},0);if(J>60)return q[0]+($===""?"":$+` - `)+" "+Q.join(`, - `)+" "+q[1];return q[0]+$+" "+Q.join(", ")+" "+q[1]}function mK(Q){return Array.isArray(Q)}function m7(Q){return typeof Q==="boolean"}function T5(Q){return Q===null}function OB(Q){return Q==null}function nK(Q){return typeof Q==="number"}function E5(Q){return typeof Q==="string"}function PB(Q){return typeof Q==="symbol"}function X6(Q){return Q===void 0}function h5(Q){return y6(Q)&&n7(Q)==="[object RegExp]"}function y6(Q){return typeof Q==="object"&&Q!==null}function b7(Q){return y6(Q)&&n7(Q)==="[object Date]"}function x5(Q){return y6(Q)&&(n7(Q)==="[object Error]"||Q instanceof Error)}function O5(Q){return typeof Q==="function"}function TB(Q){return Q===null||typeof Q==="boolean"||typeof Q==="number"||typeof Q==="string"||typeof Q==="symbol"||typeof Q==="undefined"}function EB(Q){return Q instanceof Buffer}function n7(Q){return Object.prototype.toString.call(Q)}function _7(Q){return Q<10?"0"+Q.toString(10):Q.toString(10)}function uB(){var Q=new Date,$=[_7(Q.getHours()),_7(Q.getMinutes()),_7(Q.getSeconds())].join(":");return[Q.getDate(),SB[Q.getMonth()],$].join(" ")}function _B(...Q){console.log("%s - %s",uB(),d7.apply(null,Q))}function cB(Q,$){if($)Q.super_=$,Q.prototype=Object.create($.prototype,{constructor:{value:Q,enumerable:!1,writable:!0,configurable:!0}})}function pK(Q,$){if(!$||!y6($))return Q;var q=Object.keys($),K=q.length;while(K--)Q[q[K]]=$[q[K]];return Q}function iK(Q,$){return Object.prototype.hasOwnProperty.call(Q,$)}function lK(Q,$){if(!Q){var q=new Error("Promise was rejected with a falsy value");q.reason=Q,Q=q}return $(Q)}function dB(Q){if(typeof Q!=="function")throw new TypeError('The "original" argument must be of type Function');function $(...q){var K=q.pop();if(typeof K!=="function")throw new TypeError("The last argument must be of type Function");var J=this,Z=function(...G){return K.apply(J,...G)};Q.apply(this,q).then(function(G){process.nextTick(Z.bind(null,null,G))},function(G){process.nextTick(lK.bind(null,G,Z))})}return Object.setPrototypeOf($,Object.getPrototypeOf(Q)),Object.defineProperties($,Object.getOwnPropertyDescriptors(Q)),$}var RB,jB,t2,xB=()=>{},SB,bB,mB,nB;var aK=x2(()=>{RB=/%[sdj%]/g;jB=((Q={},$={},q)=>((q=typeof process!=="undefined"&&process.env.NODE_DEBUG)&&(q=q.replace(/[|\\{}()[\]^$+?.]/g,"\\$&").replace(/\*/g,".*").replace(/,/g,"$|^").toUpperCase()),$=new RegExp("^"+q+"$","i"),(K)=>{if(K=K.toUpperCase(),!Q[K])if($.test(K))Q[K]=function(...J){console.error("%s: %s",K,pid,d7.apply(null,...J))};else Q[K]=function(){};return Q[K]}))(),t2=((Q)=>(Q.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},Q.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},Q.custom=Symbol.for("nodejs.util.inspect.custom"),Q))(function Q($,q,...K){var J={seen:[],stylize:AB};if(K.length>=1)J.depth=K[0];if(K.length>=2)J.colors=K[1];if(m7(q))J.showHidden=q;else if(q)pK(J,q);if(X6(J.showHidden))J.showHidden=!1;if(X6(J.depth))J.depth=2;if(X6(J.colors))J.colors=!1;if(J.colors)J.stylize=fB;return P5(J,$,J.depth)});SB=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];bB=((Q)=>(Q.custom=Symbol.for("nodejs.util.promisify.custom"),Q))(function Q($){if(typeof $!=="function")throw new TypeError('The "original" argument must be of type Function');if(kCustomPromisifiedSymbol&&$[kCustomPromisifiedSymbol]){var q=$[kCustomPromisifiedSymbol];if(typeof q!=="function")throw new TypeError('The "nodejs.util.promisify.custom" argument must be of type Function');return Object.defineProperty(q,kCustomPromisifiedSymbol,{value:q,enumerable:!1,writable:!1,configurable:!0}),q}function q(...K){var J,Z,G=new Promise(function(B,W){J=B,Z=W});K.push(function(B,W){if(B)Z(B);else J(W)});try{$.apply(this,K)}catch(B){Z(B)}return G}if(Object.setPrototypeOf(q,Object.getPrototypeOf($)),kCustomPromisifiedSymbol)Object.defineProperty(q,kCustomPromisifiedSymbol,{value:q,enumerable:!1,writable:!1,configurable:!0});return Object.defineProperties(q,Object.getOwnPropertyDescriptors($))});({TextEncoder:mB,TextDecoder:nB}=globalThis)});var r7={};h2(r7,{resolveObject:()=>KJ,resolve:()=>$J,parse:()=>x6,format:()=>qJ,default:()=>QW,Url:()=>L1,URLSearchParams:()=>eK,URL:()=>o7});function a7(Q){return typeof Q==="string"}function QJ(Q){return typeof Q==="object"&&Q!==null}function S5(Q){return Q===null}function pB(Q){return Q==null}function L1(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function x6(Q,$,q){if(Q&&QJ(Q)&&Q instanceof L1)return Q;var K=new L1;return K.parse(Q,$,q),K}function qJ(Q){if(a7(Q))Q=x6(Q);if(!(Q instanceof L1))return L1.prototype.format.call(Q);return Q.format()}function $J(Q,$){return x6(Q,!1,!0).resolve($)}function KJ(Q,$){if(!Q)return $;return x6(Q,!1,!0).resolveObject($)}var o7,eK,iB,lB,oB,aB,rB,p7,rK,sK,sB=255,tK,tB,eB,i7,h6,l7,QW;var s7=x2(()=>{({URL:o7,URLSearchParams:eK}=globalThis);iB=/^([a-z0-9.+-]+:)/i,lB=/:[0-9]*$/,oB=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,aB=["<",">",'"',"`"," ","\r",` -`,"\t"],rB=["{","}","|","\\","^","`"].concat(aB),p7=["'"].concat(rB),rK=["%","/","?",";","#"].concat(p7),sK=["/","?","#"],tK=/^[+a-z0-9A-Z_-]{0,63}$/,tB=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,eB={javascript:!0,"javascript:":!0},i7={javascript:!0,"javascript:":!0},h6={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},l7={parse(Q){var $=decodeURIComponent;return(Q+"").replace(/\+/g," ").split("&").filter(Boolean).reduce(function(q,K,J){var Z=K.split("="),G=$(Z[0]||""),B=$(Z[1]||""),W=q[G];return q[G]=W===void 0?B:[].concat(W,B),q},{})},stringify(Q){var $=encodeURIComponent;return Object.keys(Q||{}).reduce(function(q,K){return[].concat(Q[K]).forEach(function(J){q.push($(K)+"="+$(J))}),q},[]).join("&").replace(/\s/g,"+")}};L1.prototype.parse=function(Q,$,q){if(!a7(Q))throw new TypeError("Parameter 'url' must be a string, not "+typeof Q);var K=Q.indexOf("?"),J=K!==-1&&K127)R+="x";else R+=H[c];if(!R.match(tK)){var $0=z.slice(0,M),_=z.slice(M+1),g=H.match(tB);if(g)$0.push(g[1]),_.unshift(g[2]);if(_.length)B="/"+_.join(".")+B;this.hostname=$0.join(".");break}}}}if(this.hostname.length>sB)this.hostname="";else this.hostname=this.hostname.toLowerCase();if(!D)this.hostname=new o7(`https://${this.hostname}`).hostname;var O=this.port?":"+this.port:"",h=this.hostname||"";if(this.host=h+O,this.href+=this.host,D){if(this.hostname=this.hostname.substr(1,this.hostname.length-2),B[0]!=="/")B="/"+B}}if(!eB[V])for(var M=0,Y=p7.length;M0?q.host.split("@"):!1;if(R)q.auth=R.shift(),q.host=q.hostname=R.shift()}if(q.search=Q.search,q.query=Q.query,!S5(q.pathname)||!S5(q.search))q.path=(q.pathname?q.pathname:"")+(q.search?q.search:"");return q.href=q.format(),q}if(!z.length){if(q.pathname=null,q.search)q.path="/"+q.search;else q.path=null;return q.href=q.format(),q}var c=z.slice(-1)[0],m=(q.host||Q.host||z.length>1)&&(c==="."||c==="..")||c==="",$0=0;for(var _=z.length;_>=0;_--)if(c=z[_],c===".")z.splice(_,1);else if(c==="..")z.splice(_,1),$0++;else if($0)z.splice(_,1),$0--;if(!y&&!D)for(;$0--;$0)z.unshift("..");if(y&&z[0]!==""&&(!z[0]||z[0].charAt(0)!=="/"))z.unshift("");if(m&&z.join("/").substr(-1)!=="/")z.push("");var g=z[0]===""||z[0]&&z[0].charAt(0)==="/";if(H){q.hostname=q.host=g?"":z.length?z.shift():"";var R=q.host&&q.host.indexOf("@")>0?q.host.split("@"):!1;if(R)q.auth=R.shift(),q.host=q.hostname=R.shift()}if(y=y||q.host&&z.length,y&&!g)z.unshift("");if(!z.length)q.pathname=null,q.path=null;else q.pathname=z.join("/");if(!S5(q.pathname)||!S5(q.search))q.path=(q.pathname?q.pathname:"")+(q.search?q.search:"");return q.auth=Q.auth||q.auth,q.slashes=q.slashes||Q.slashes,q.href=q.format(),q};L1.prototype.parseHost=function(){var Q=this.host,$=lB.exec(Q);if($){if($=$[0],$!==":")this.port=$.substr(1);Q=Q.substr(0,Q.length-$.length)}if(Q)this.hostname=Q};QW={parse:x6,resolve:$J,resolveObject:KJ,format:qJ,Url:L1,URL:o7,URLSearchParams:eK}});var q9={};h2(q9,{request:()=>DW,globalAgent:()=>RW,get:()=>HW,STATUS_CODES:()=>CW,METHODS:()=>jW,IncomingMessage:()=>vW,ClientRequest:()=>kW,Agent:()=>IW});var qW,$W,JJ,KW,JW,UW=(Q,$,q)=>{q=Q!=null?qW($W(Q)):{};let K=$||!Q||!Q.__esModule?JJ(q,"default",{value:Q,enumerable:!0}):q;for(let J of KW(Q))if(!JW.call(K,J))JJ(K,J,{get:()=>Q[J],enumerable:!0});return K},R0=(Q,$)=>()=>($||Q(($={exports:{}}).exports,$),$.exports),UJ,VW,VJ,b0,ZJ,V1,ZW,g8,W1,X8,e2,V2,R2,O6,t7,u5,GW,_5,BW,WW,GJ,c5,e7,zW,U2,BJ,WJ,Q9,zJ,FW,FJ,MJ,wJ,NJ,MW,wW,NW,YW,LW,DW,HW,kW,vW,IW,RW,CW,jW;var $9=x2(()=>{qW=Object.create,{getPrototypeOf:$W,defineProperty:JJ,getOwnPropertyNames:KW}=Object,JW=Object.prototype.hasOwnProperty,UJ=R0((Q)=>{Q.fetch=J(global.fetch)&&J(global.ReadableStream),Q.writableStream=J(global.WritableStream),Q.abortController=J(global.AbortController);var $;function q(){if($!==void 0)return $;if(global.XMLHttpRequest){$=new global.XMLHttpRequest;try{$.open("GET",global.XDomainRequest?"/":"https://example.com")}catch(Z){$=null}}else $=null;return $}function K(Z){var G=q();if(!G)return!1;try{return G.responseType=Z,G.responseType===Z}catch(B){}return!1}Q.arraybuffer=Q.fetch||K("arraybuffer"),Q.msstream=!Q.fetch&&K("ms-stream"),Q.mozchunkedarraybuffer=!Q.fetch&&K("moz-chunked-arraybuffer"),Q.overrideMimeType=Q.fetch||(q()?J(q().overrideMimeType):!1);function J(Z){return typeof Z==="function"}$=null}),VW=R0((Q,$)=>{if(typeof Object.create==="function")$.exports=function q(K,J){if(J)K.super_=J,K.prototype=Object.create(J.prototype,{constructor:{value:K,enumerable:!1,writable:!0,configurable:!0}})};else $.exports=function q(K,J){if(J){K.super_=J;var Z=function(){};Z.prototype=J.prototype,K.prototype=new Z,K.prototype.constructor=K}}}),VJ=R0((Q,$)=>{try{if(q=(aK(),y0(oK)),typeof q.inherits!=="function")throw"";$.exports=q.inherits}catch(K){$.exports=VW()}var q}),b0=R0((Q,$)=>{class q extends Error{constructor(K){if(!Array.isArray(K))throw new TypeError(`Expected input to be an Array, got ${typeof K}`);let J="";for(let Z=0;Z{$.exports={format(q,...K){return q.replace(/%([sdifj])/g,function(...[J,Z]){let G=K.shift();if(Z==="f")return G.toFixed(6);else if(Z==="j")return JSON.stringify(G);else if(Z==="s"&&typeof G==="object")return`${G.constructor!==Object?G.constructor.name:""} {}`.trim();else return G.toString()})},inspect(q){switch(typeof q){case"string":if(q.includes("'")){if(!q.includes('"'))return`"${q}"`;else if(!q.includes("`")&&!q.includes("${"))return`\`${q}\``}return`'${q}'`;case"number":if(isNaN(q))return"NaN";else if(Object.is(q,-0))return String(q);return q;case"bigint":return`${String(q)}n`;case"boolean":case"undefined":return String(q);case"object":return"{}"}}}}),V1=R0((Q,$)=>{var{format:q,inspect:K}=ZJ(),{AggregateError:J}=b0(),Z=globalThis.AggregateError||J,G=Symbol("kIsNodeError"),B=["string","function","number","object","Function","Object","boolean","bigint","symbol"],W=/^([A-Z][a-z0-9]*)+$/,U={};function V(D,z){if(!D)throw new U.ERR_INTERNAL_ASSERTION(z)}function N(D){let z="",Y=D.length,H=D[0]==="-"?1:0;for(;Y>=H+4;Y-=3)z=`_${D.slice(Y-3,Y)}${z}`;return`${D.slice(0,Y)}${z}`}function F(D,z,Y){if(typeof z==="function")return V(z.length<=Y.length,`Code: ${D}; The provided arguments length (${Y.length}) does not match the required ones (${z.length}).`),z(...Y);let H=(z.match(/%[dfijoOs]/g)||[]).length;if(V(H===Y.length,`Code: ${D}; The provided arguments length (${Y.length}) does not match the required ones (${H}).`),Y.length===0)return z;return q(z,...Y)}function M(D,z,Y){if(!Y)Y=Error;class H extends Y{constructor(...R){super(F(D,z,R))}toString(){return`${this.name} [${D}]: ${this.message}`}}Object.defineProperties(H.prototype,{name:{value:Y.name,writable:!0,enumerable:!1,configurable:!0},toString:{value(){return`${this.name} [${D}]: ${this.message}`},writable:!0,enumerable:!1,configurable:!0}}),H.prototype.code=D,H.prototype[G]=!0,U[D]=H}function v(D){let z="__node_internal_"+D.name;return Object.defineProperty(D,"name",{value:z}),D}function x(D,z){if(D&&z&&D!==z){if(Array.isArray(z.errors))return z.errors.push(D),z;let Y=new Z([z,D],z.message);return Y.code=z.code,Y}return D||z}class y extends Error{constructor(D="The operation was aborted",z=void 0){if(z!==void 0&&typeof z!=="object")throw new U.ERR_INVALID_ARG_TYPE("options","Object",z);super(D,z);this.code="ABORT_ERR",this.name="AbortError"}}M("ERR_ASSERTION","%s",Error),M("ERR_INVALID_ARG_TYPE",(D,z,Y)=>{if(V(typeof D==="string","'name' must be a string"),!Array.isArray(z))z=[z];let H="The ";if(D.endsWith(" argument"))H+=`${D} `;else H+=`"${D}" ${D.includes(".")?"property":"argument"} `;H+="must be ";let R=[],c=[],m=[];for(let _ of z)if(V(typeof _==="string","All expected entries have to be of type string"),B.includes(_))R.push(_.toLowerCase());else if(W.test(_))c.push(_);else V(_!=="object",'The value "object" should be written as "Object"'),m.push(_);if(c.length>0){let _=R.indexOf("object");if(_!==-1)R.splice(R,_,1),c.push("Object")}if(R.length>0){switch(R.length){case 1:H+=`of type ${R[0]}`;break;case 2:H+=`one of type ${R[0]} or ${R[1]}`;break;default:{let _=R.pop();H+=`one of type ${R.join(", ")}, or ${_}`}}if(c.length>0||m.length>0)H+=" or "}if(c.length>0){switch(c.length){case 1:H+=`an instance of ${c[0]}`;break;case 2:H+=`an instance of ${c[0]} or ${c[1]}`;break;default:{let _=c.pop();H+=`an instance of ${c.join(", ")}, or ${_}`}}if(m.length>0)H+=" or "}switch(m.length){case 0:break;case 1:if(m[0].toLowerCase()!==m[0])H+="an ";H+=`${m[0]}`;break;case 2:H+=`one of ${m[0]} or ${m[1]}`;break;default:{let _=m.pop();H+=`one of ${m.join(", ")}, or ${_}`}}if(Y==null)H+=`. Received ${Y}`;else if(typeof Y==="function"&&Y.name)H+=`. Received function ${Y.name}`;else if(typeof Y==="object"){var $0;if(($0=Y.constructor)!==null&&$0!==void 0&&$0.name)H+=`. Received an instance of ${Y.constructor.name}`;else{let _=K(Y,{depth:-1});H+=`. Received ${_}`}}else{let _=K(Y,{colors:!1});if(_.length>25)_=`${_.slice(0,25)}...`;H+=`. Received type ${typeof Y} (${_})`}return H},TypeError),M("ERR_INVALID_ARG_VALUE",(D,z,Y="is invalid")=>{let H=K(z);if(H.length>128)H=H.slice(0,128)+"...";return`The ${D.includes(".")?"property":"argument"} '${D}' ${Y}. Received ${H}`},TypeError),M("ERR_INVALID_RETURN_VALUE",(D,z,Y)=>{var H;let R=Y!==null&&Y!==void 0&&(H=Y.constructor)!==null&&H!==void 0&&H.name?`instance of ${Y.constructor.name}`:`type ${typeof Y}`;return`Expected ${D} to be returned from the "${z}" function but got ${R}.`},TypeError),M("ERR_MISSING_ARGS",(...D)=>{V(D.length>0,"At least one arg needs to be specified");let z,Y=D.length;switch(D=(Array.isArray(D)?D:[D]).map((H)=>`"${H}"`).join(" or "),Y){case 1:z+=`The ${D[0]} argument`;break;case 2:z+=`The ${D[0]} and ${D[1]} arguments`;break;default:{let H=D.pop();z+=`The ${D.join(", ")}, and ${H} arguments`}break}return`${z} must be specified`},TypeError),M("ERR_OUT_OF_RANGE",(D,z,Y)=>{V(z,'Missing "range" argument');let H;if(Number.isInteger(Y)&&Math.abs(Y)>4294967296)H=N(String(Y));else if(typeof Y==="bigint"){H=String(Y);let R=BigInt(2)**BigInt(32);if(Y>R||Y<-R)H=N(H);H+="n"}else H=K(Y);return`The value of "${D}" is out of range. It must be ${z}. Received ${H}`},RangeError),M("ERR_MULTIPLE_CALLBACK","Callback called multiple times",Error),M("ERR_METHOD_NOT_IMPLEMENTED","The %s method is not implemented",Error),M("ERR_STREAM_ALREADY_FINISHED","Cannot call %s after a stream was finished",Error),M("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable",Error),M("ERR_STREAM_DESTROYED","Cannot call %s after a stream was destroyed",Error),M("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),M("ERR_STREAM_PREMATURE_CLOSE","Premature close",Error),M("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF",Error),M("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event",Error),M("ERR_STREAM_WRITE_AFTER_END","write after end",Error),M("ERR_UNKNOWN_ENCODING","Unknown encoding: %s",TypeError),$.exports={AbortError:y,aggregateTwoErrors:v(x),hideStackFrames:v,codes:U}}),ZW=R0((Q,$)=>{Object.defineProperty(Q,"__esModule",{value:!0});var q=new WeakMap,K=new WeakMap;function J(g){let O=q.get(g);return console.assert(O!=null,"'this' is expected an Event object, but got",g),O}function Z(g){if(g.passiveListener!=null){if(typeof console!=="undefined"&&typeof console.error==="function")console.error("Unable to preventDefault inside passive event listener invocation.",g.passiveListener);return}if(!g.event.cancelable)return;if(g.canceled=!0,typeof g.event.preventDefault==="function")g.event.preventDefault()}function G(g,O){q.set(this,{eventTarget:g,event:O,eventPhase:2,currentTarget:g,canceled:!1,stopped:!1,immediateStopped:!1,passiveListener:null,timeStamp:O.timeStamp||Date.now()}),Object.defineProperty(this,"isTrusted",{value:!1,enumerable:!0});let h=Object.keys(O);for(let f=0;f0){let g=new Array(arguments.length);for(let O=0;O{Object.defineProperty(Q,"__esModule",{value:!0});var q=ZW();class K extends q.EventTarget{constructor(){super();throw new TypeError("AbortSignal cannot be constructed directly")}get aborted(){let V=G.get(this);if(typeof V!=="boolean")throw new TypeError(`Expected 'this' to be an 'AbortSignal' object, but got ${this===null?"null":typeof this}`);return V}}q.defineEventAttribute(K.prototype,"abort");function J(){let V=Object.create(K.prototype);return q.EventTarget.call(V),G.set(V,!1),V}function Z(V){if(G.get(V)!==!1)return;G.set(V,!0),V.dispatchEvent({type:"abort"})}var G=new WeakMap;if(Object.defineProperties(K.prototype,{aborted:{enumerable:!0}}),typeof Symbol==="function"&&typeof Symbol.toStringTag==="symbol")Object.defineProperty(K.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortSignal"});class B{constructor(){W.set(this,J())}get signal(){return U(this)}abort(){Z(U(this))}}var W=new WeakMap;function U(V){let N=W.get(V);if(N==null)throw new TypeError(`Expected 'this' to be an 'AbortController' object, but got ${V===null?"null":typeof V}`);return N}if(Object.defineProperties(B.prototype,{signal:{enumerable:!0},abort:{enumerable:!0}}),typeof Symbol==="function"&&typeof Symbol.toStringTag==="symbol")Object.defineProperty(B.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortController"});Q.AbortController=B,Q.AbortSignal=K,Q.default=B,$.exports=B,$.exports.AbortController=$.exports.default=B,$.exports.AbortSignal=K}),W1=R0((Q,$)=>{var q=(a0(),y0(s0)),{format:K,inspect:J}=ZJ(),{codes:{ERR_INVALID_ARG_TYPE:Z}}=V1(),{kResistStopPropagation:G,AggregateError:B,SymbolDispose:W}=b0(),U=globalThis.AbortSignal||g8().AbortSignal,V=globalThis.AbortController||g8().AbortController,N=Object.getPrototypeOf(async function(){}).constructor,F=globalThis.Blob||q.Blob,M=typeof F!=="undefined"?function y(D){return D instanceof F}:function y(D){return!1},v=(y,D)=>{if(y!==void 0&&(y===null||typeof y!=="object"||!("aborted"in y)))throw new Z(D,"AbortSignal",y)},x=(y,D)=>{if(typeof y!=="function")throw new Z(D,"Function",y)};$.exports={AggregateError:B,kEmptyObject:Object.freeze({}),once(y){let D=!1;return function(...z){if(D)return;D=!0,y.apply(this,z)}},createDeferredPromise:function(){let y,D;return{promise:new Promise((z,Y)=>{y=z,D=Y}),resolve:y,reject:D}},promisify(y){return new Promise((D,z)=>{y((Y,...H)=>{if(Y)return z(Y);return D(...H)})})},debuglog(){return function(){}},format:K,inspect:J,types:{isAsyncFunction(y){return y instanceof N},isArrayBufferView(y){return ArrayBuffer.isView(y)}},isBlob:M,deprecate(y,D){return y},addAbortListener:(a1(),y0(o1)).addAbortListener||function y(D,z){if(D===void 0)throw new Z("signal","AbortSignal",D);v(D,"signal"),x(z,"listener");let Y;if(D.aborted)queueMicrotask(()=>z());else D.addEventListener("abort",z,{__proto__:null,once:!0,[G]:!0}),Y=()=>{D.removeEventListener("abort",z)};return{__proto__:null,[W](){var H;(H=Y)===null||H===void 0||H()}}},AbortSignalAny:U.any||function y(D){if(D.length===1)return D[0];let z=new V,Y=()=>z.abort();return D.forEach((H)=>{v(H,"signals"),H.addEventListener("abort",Y,{once:!0})}),z.signal.addEventListener("abort",()=>{D.forEach((H)=>H.removeEventListener("abort",Y))},{once:!0}),z.signal}},$.exports.promisify.custom=Symbol.for("nodejs.util.promisify.custom")}),X8=R0((Q,$)=>{var{ArrayIsArray:q,ArrayPrototypeIncludes:K,ArrayPrototypeJoin:J,ArrayPrototypeMap:Z,NumberIsInteger:G,NumberIsNaN:B,NumberMAX_SAFE_INTEGER:W,NumberMIN_SAFE_INTEGER:U,NumberParseInt:V,ObjectPrototypeHasOwnProperty:N,RegExpPrototypeExec:F,String:M,StringPrototypeToUpperCase:v,StringPrototypeTrim:x}=b0(),{hideStackFrames:y,codes:{ERR_SOCKET_BAD_PORT:D,ERR_INVALID_ARG_TYPE:z,ERR_INVALID_ARG_VALUE:Y,ERR_OUT_OF_RANGE:H,ERR_UNKNOWN_SIGNAL:R}}=V1(),{normalizeEncoding:c}=W1(),{isAsyncFunction:m,isArrayBufferView:$0}=W1().types,_={};function g(j){return j===(j|0)}function O(j){return j===j>>>0}var h=/^[0-7]+$/,f="must be a 32-bit unsigned integer or an octal string";function A(j,d,e){if(typeof j==="undefined")j=e;if(typeof j==="string"){if(F(h,j)===null)throw new Y(d,j,f);j=V(j,8)}return i(j,d),j}var I=y((j,d,e=U,p=W)=>{if(typeof j!=="number")throw new z(d,"number",j);if(!G(j))throw new H(d,"an integer",j);if(jp)throw new H(d,`>= ${e} && <= ${p}`,j)}),n=y((j,d,e=-2147483648,p=2147483647)=>{if(typeof j!=="number")throw new z(d,"number",j);if(!G(j))throw new H(d,"an integer",j);if(jp)throw new H(d,`>= ${e} && <= ${p}`,j)}),i=y((j,d,e=!1)=>{if(typeof j!=="number")throw new z(d,"number",j);if(!G(j))throw new H(d,"an integer",j);let p=e?1:0,G0=4294967295;if(jG0)throw new H(d,`>= ${p} && <= ${G0}`,j)});function K0(j,d){if(typeof j!=="string")throw new z(d,"string",j)}function z0(j,d,e=void 0,p){if(typeof j!=="number")throw new z(d,"number",j);if(e!=null&&jp||(e!=null||p!=null)&&B(j))throw new H(d,`${e!=null?`>= ${e}`:""}${e!=null&&p!=null?" && ":""}${p!=null?`<= ${p}`:""}`,j)}var S=y((j,d,e)=>{if(!K(e,j)){let p="must be one of: "+J(Z(e,(G0)=>typeof G0==="string"?`'${G0}'`:M(G0)),", ");throw new Y(d,j,p)}});function U0(j,d){if(typeof j!=="boolean")throw new z(d,"boolean",j)}function k(j,d,e){return j==null||!N(j,d)?e:j[d]}var u=y((j,d,e=null)=>{let p=k(e,"allowArray",!1),G0=k(e,"allowFunction",!1);if(!k(e,"nullable",!1)&&j===null||!p&&q(j)||typeof j!=="object"&&(!G0||typeof j!=="function"))throw new z(d,"Object",j)}),Q0=y((j,d)=>{if(j!=null&&typeof j!=="object"&&typeof j!=="function")throw new z(d,"a dictionary",j)}),E=y((j,d,e=0)=>{if(!q(j))throw new z(d,"Array",j);if(j.length{if(!$0(j))throw new z(d,["Buffer","TypedArray","DataView"],j)});function T(j,d){let e=c(d),p=j.length;if(e==="hex"&&p%2!==0)throw new Y("encoding",d,`is invalid for data of length ${p}`)}function t(j,d="Port",e=!0){if(typeof j!=="number"&&typeof j!=="string"||typeof j==="string"&&x(j).length===0||+j!==+j>>>0||j>65535||j===0&&!e)throw new D(d,j,e);return j|0}var Z0=y((j,d)=>{if(j!==void 0&&(j===null||typeof j!=="object"||!("aborted"in j)))throw new z(d,"AbortSignal",j)}),W0=y((j,d)=>{if(typeof j!=="function")throw new z(d,"Function",j)}),C=y((j,d)=>{if(typeof j!=="function"||m(j))throw new z(d,"Function",j)}),X=y((j,d)=>{if(j!==void 0)throw new z(d,"undefined",j)});function P(j,d,e){if(!K(e,j))throw new z(d,`('${J(e,"|")}')`,j)}var o=/^(?:<[^>]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/;function r(j,d){if(typeof j==="undefined"||!F(o,j))throw new Y(d,j,'must be an array or string of format "; rel=preload; as=style"')}function l(j){if(typeof j==="string")return r(j,"hints"),j;else if(q(j)){let d=j.length,e="";if(d===0)return e;for(let p=0;p; rel=preload; as=style"')}$.exports={isInt32:g,isUint32:O,parseFileMode:A,validateArray:E,validateStringArray:q0,validateBooleanArray:B0,validateAbortSignalArray:w0,validateBoolean:U0,validateBuffer:b,validateDictionary:Q0,validateEncoding:T,validateFunction:W0,validateInt32:n,validateInteger:I,validateNumber:z0,validateObject:u,validateOneOf:S,validatePlainFunction:C,validatePort:t,validateSignalName:M0,validateString:K0,validateUint32:i,validateUndefined:X,validateUnion:P,validateAbortSignal:Z0,validateLinkHeaderValue:l}}),e2=R0((Q,$)=>{$.exports=(L4(),y0(Y4))}),V2=R0((Q,$)=>{var{SymbolAsyncIterator:q,SymbolIterator:K,SymbolFor:J}=b0(),Z=J("nodejs.stream.destroyed"),G=J("nodejs.stream.errored"),B=J("nodejs.stream.readable"),W=J("nodejs.stream.writable"),U=J("nodejs.stream.disturbed"),V=J("nodejs.webstream.isClosedPromise"),N=J("nodejs.webstream.controllerErrorFunction");function F(k,u=!1){var Q0;return!!(k&&typeof k.pipe==="function"&&typeof k.on==="function"&&(!u||typeof k.pause==="function"&&typeof k.resume==="function")&&(!k._writableState||((Q0=k._readableState)===null||Q0===void 0?void 0:Q0.readable)!==!1)&&(!k._writableState||k._readableState))}function M(k){var u;return!!(k&&typeof k.write==="function"&&typeof k.on==="function"&&(!k._readableState||((u=k._writableState)===null||u===void 0?void 0:u.writable)!==!1))}function v(k){return!!(k&&typeof k.pipe==="function"&&k._readableState&&typeof k.on==="function"&&typeof k.write==="function")}function x(k){return k&&(k._readableState||k._writableState||typeof k.write==="function"&&typeof k.on==="function"||typeof k.pipe==="function"&&typeof k.on==="function")}function y(k){return!!(k&&!x(k)&&typeof k.pipeThrough==="function"&&typeof k.getReader==="function"&&typeof k.cancel==="function")}function D(k){return!!(k&&!x(k)&&typeof k.getWriter==="function"&&typeof k.abort==="function")}function z(k){return!!(k&&!x(k)&&typeof k.readable==="object"&&typeof k.writable==="object")}function Y(k){return y(k)||D(k)||z(k)}function H(k,u){if(k==null)return!1;if(u===!0)return typeof k[q]==="function";if(u===!1)return typeof k[K]==="function";return typeof k[q]==="function"||typeof k[K]==="function"}function R(k){if(!x(k))return null;let{_writableState:u,_readableState:Q0}=k,E=u||Q0;return!!(k.destroyed||k[Z]||E!==null&&E!==void 0&&E.destroyed)}function c(k){if(!M(k))return null;if(k.writableEnded===!0)return!0;let u=k._writableState;if(u!==null&&u!==void 0&&u.errored)return!1;if(typeof(u===null||u===void 0?void 0:u.ended)!=="boolean")return null;return u.ended}function m(k,u){if(!M(k))return null;if(k.writableFinished===!0)return!0;let Q0=k._writableState;if(Q0!==null&&Q0!==void 0&&Q0.errored)return!1;if(typeof(Q0===null||Q0===void 0?void 0:Q0.finished)!=="boolean")return null;return!!(Q0.finished||u===!1&&Q0.ended===!0&&Q0.length===0)}function $0(k){if(!F(k))return null;if(k.readableEnded===!0)return!0;let u=k._readableState;if(!u||u.errored)return!1;if(typeof(u===null||u===void 0?void 0:u.ended)!=="boolean")return null;return u.ended}function _(k,u){if(!F(k))return null;let Q0=k._readableState;if(Q0!==null&&Q0!==void 0&&Q0.errored)return!1;if(typeof(Q0===null||Q0===void 0?void 0:Q0.endEmitted)!=="boolean")return null;return!!(Q0.endEmitted||u===!1&&Q0.ended===!0&&Q0.length===0)}function g(k){if(k&&k[B]!=null)return k[B];if(typeof(k===null||k===void 0?void 0:k.readable)!=="boolean")return null;if(R(k))return!1;return F(k)&&k.readable&&!_(k)}function O(k){if(k&&k[W]!=null)return k[W];if(typeof(k===null||k===void 0?void 0:k.writable)!=="boolean")return null;if(R(k))return!1;return M(k)&&k.writable&&!c(k)}function h(k,u){if(!x(k))return null;if(R(k))return!0;if((u===null||u===void 0?void 0:u.readable)!==!1&&g(k))return!1;if((u===null||u===void 0?void 0:u.writable)!==!1&&O(k))return!1;return!0}function f(k){var u,Q0;if(!x(k))return null;if(k.writableErrored)return k.writableErrored;return(u=(Q0=k._writableState)===null||Q0===void 0?void 0:Q0.errored)!==null&&u!==void 0?u:null}function A(k){var u,Q0;if(!x(k))return null;if(k.readableErrored)return k.readableErrored;return(u=(Q0=k._readableState)===null||Q0===void 0?void 0:Q0.errored)!==null&&u!==void 0?u:null}function I(k){if(!x(k))return null;if(typeof k.closed==="boolean")return k.closed;let{_writableState:u,_readableState:Q0}=k;if(typeof(u===null||u===void 0?void 0:u.closed)==="boolean"||typeof(Q0===null||Q0===void 0?void 0:Q0.closed)==="boolean")return(u===null||u===void 0?void 0:u.closed)||(Q0===null||Q0===void 0?void 0:Q0.closed);if(typeof k._closed==="boolean"&&n(k))return k._closed;return null}function n(k){return typeof k._closed==="boolean"&&typeof k._defaultKeepAlive==="boolean"&&typeof k._removedConnection==="boolean"&&typeof k._removedContLen==="boolean"}function i(k){return typeof k._sent100==="boolean"&&n(k)}function K0(k){var u;return typeof k._consuming==="boolean"&&typeof k._dumped==="boolean"&&((u=k.req)===null||u===void 0?void 0:u.upgradeOrConnect)===void 0}function z0(k){if(!x(k))return null;let{_writableState:u,_readableState:Q0}=k,E=u||Q0;return!E&&i(k)||!!(E&&E.autoDestroy&&E.emitClose&&E.closed===!1)}function S(k){var u;return!!(k&&((u=k[U])!==null&&u!==void 0?u:k.readableDidRead||k.readableAborted))}function U0(k){var u,Q0,E,q0,B0,w0,M0,b,T,t;return!!(k&&((u=(Q0=(E=(q0=(B0=(w0=k[G])!==null&&w0!==void 0?w0:k.readableErrored)!==null&&B0!==void 0?B0:k.writableErrored)!==null&&q0!==void 0?q0:(M0=k._readableState)===null||M0===void 0?void 0:M0.errorEmitted)!==null&&E!==void 0?E:(b=k._writableState)===null||b===void 0?void 0:b.errorEmitted)!==null&&Q0!==void 0?Q0:(T=k._readableState)===null||T===void 0?void 0:T.errored)!==null&&u!==void 0?u:(t=k._writableState)===null||t===void 0?void 0:t.errored))}$.exports={isDestroyed:R,kIsDestroyed:Z,isDisturbed:S,kIsDisturbed:U,isErrored:U0,kIsErrored:G,isReadable:g,kIsReadable:B,kIsClosedPromise:V,kControllerErrorFunction:N,kIsWritable:W,isClosed:I,isDuplexNodeStream:v,isFinished:h,isIterable:H,isReadableNodeStream:F,isReadableStream:y,isReadableEnded:$0,isReadableFinished:_,isReadableErrored:A,isNodeStream:x,isWebStream:Y,isWritable:O,isWritableNodeStream:M,isWritableStream:D,isWritableEnded:c,isWritableFinished:m,isWritableErrored:f,isServerRequest:K0,isServerResponse:i,willEmitClose:z0,isTransformStream:z}}),R2=R0((Q,$)=>{var q=e2(),{AbortError:K,codes:J}=V1(),{ERR_INVALID_ARG_TYPE:Z,ERR_STREAM_PREMATURE_CLOSE:G}=J,{kEmptyObject:B,once:W}=W1(),{validateAbortSignal:U,validateFunction:V,validateObject:N,validateBoolean:F}=X8(),{Promise:M,PromisePrototypeThen:v,SymbolDispose:x}=b0(),{isClosed:y,isReadable:D,isReadableNodeStream:z,isReadableStream:Y,isReadableFinished:H,isReadableErrored:R,isWritable:c,isWritableNodeStream:m,isWritableStream:$0,isWritableFinished:_,isWritableErrored:g,isNodeStream:O,willEmitClose:h,kIsClosedPromise:f}=V2(),A;function I(S){return S.setHeader&&typeof S.abort==="function"}var n=()=>{};function i(S,U0,k){var u,Q0;if(arguments.length===2)k=U0,U0=B;else if(U0==null)U0=B;else N(U0,"options");if(V(k,"callback"),U(U0.signal,"options.signal"),k=W(k),Y(S)||$0(S))return K0(S,U0,k);if(!O(S))throw new Z("stream",["ReadableStream","WritableStream","Stream"],S);let E=(u=U0.readable)!==null&&u!==void 0?u:z(S),q0=(Q0=U0.writable)!==null&&Q0!==void 0?Q0:m(S),B0=S._writableState,w0=S._readableState,M0=()=>{if(!S.writable)t()},b=h(S)&&z(S)===E&&m(S)===q0,T=_(S,!1),t=()=>{if(T=!0,S.destroyed)b=!1;if(b&&(!S.readable||E))return;if(!E||Z0)k.call(S)},Z0=H(S,!1),W0=()=>{if(Z0=!0,S.destroyed)b=!1;if(b&&(!S.writable||q0))return;if(!q0||T)k.call(S)},C=(j)=>{k.call(S,j)},X=y(S),P=()=>{X=!0;let j=g(S)||R(S);if(j&&typeof j!=="boolean")return k.call(S,j);if(E&&!Z0&&z(S,!0)){if(!H(S,!1))return k.call(S,new G)}if(q0&&!T){if(!_(S,!1))return k.call(S,new G)}k.call(S)},o=()=>{X=!0;let j=g(S)||R(S);if(j&&typeof j!=="boolean")return k.call(S,j);k.call(S)},r=()=>{S.req.on("finish",t)};if(I(S)){if(S.on("complete",t),!b)S.on("abort",P);if(S.req)r();else S.on("request",r)}else if(q0&&!B0)S.on("end",M0),S.on("close",M0);if(!b&&typeof S.aborted==="boolean")S.on("aborted",P);if(S.on("end",W0),S.on("finish",t),U0.error!==!1)S.on("error",C);if(S.on("close",P),X)q.nextTick(P);else if(B0!==null&&B0!==void 0&&B0.errorEmitted||w0!==null&&w0!==void 0&&w0.errorEmitted){if(!b)q.nextTick(o)}else if(!E&&(!b||D(S))&&(T||c(S)===!1))q.nextTick(o);else if(!q0&&(!b||c(S))&&(Z0||D(S)===!1))q.nextTick(o);else if(w0&&S.req&&S.aborted)q.nextTick(o);let l=()=>{if(k=n,S.removeListener("aborted",P),S.removeListener("complete",t),S.removeListener("abort",P),S.removeListener("request",r),S.req)S.req.removeListener("finish",t);S.removeListener("end",M0),S.removeListener("close",M0),S.removeListener("finish",t),S.removeListener("end",W0),S.removeListener("error",C),S.removeListener("close",P)};if(U0.signal&&!X){let j=()=>{let d=k;l(),d.call(S,new K(void 0,{cause:U0.signal.reason}))};if(U0.signal.aborted)q.nextTick(j);else{A=A||W1().addAbortListener;let d=A(U0.signal,j),e=k;k=W((...p)=>{d[x](),e.apply(S,p)})}}return l}function K0(S,U0,k){let u=!1,Q0=n;if(U0.signal)if(Q0=()=>{u=!0,k.call(S,new K(void 0,{cause:U0.signal.reason}))},U0.signal.aborted)q.nextTick(Q0);else{A=A||W1().addAbortListener;let q0=A(U0.signal,Q0),B0=k;k=W((...w0)=>{q0[x](),B0.apply(S,w0)})}let E=(...q0)=>{if(!u)q.nextTick(()=>k.apply(S,q0))};return v(S[f].promise,E,E),n}function z0(S,U0){var k;let u=!1;if(U0===null)U0=B;if((k=U0)!==null&&k!==void 0&&k.cleanup)F(U0.cleanup,"cleanup"),u=U0.cleanup;return new M((Q0,E)=>{let q0=i(S,U0,(B0)=>{if(u)q0();if(B0)E(B0);else Q0()})})}$.exports=i,$.exports.finished=z0}),O6=R0((Q,$)=>{var q=e2(),{aggregateTwoErrors:K,codes:{ERR_MULTIPLE_CALLBACK:J},AbortError:Z}=V1(),{Symbol:G}=b0(),{kIsDestroyed:B,isDestroyed:W,isFinished:U,isServerRequest:V}=V2(),N=G("kDestroy"),F=G("kConstruct");function M(h,f,A){if(h){if(h.stack,f&&!f.errored)f.errored=h;if(A&&!A.errored)A.errored=h}}function v(h,f){let A=this._readableState,I=this._writableState,n=I||A;if(I!==null&&I!==void 0&&I.destroyed||A!==null&&A!==void 0&&A.destroyed){if(typeof f==="function")f();return this}if(M(h,I,A),I)I.destroyed=!0;if(A)A.destroyed=!0;if(!n.constructed)this.once(N,function(i){x(this,K(i,h),f)});else x(this,h,f);return this}function x(h,f,A){let I=!1;function n(i){if(I)return;I=!0;let{_readableState:K0,_writableState:z0}=h;if(M(i,z0,K0),z0)z0.closed=!0;if(K0)K0.closed=!0;if(typeof A==="function")A(i);if(i)q.nextTick(y,h,i);else q.nextTick(D,h)}try{h._destroy(f||null,n)}catch(i){n(i)}}function y(h,f){z(h,f),D(h)}function D(h){let{_readableState:f,_writableState:A}=h;if(A)A.closeEmitted=!0;if(f)f.closeEmitted=!0;if(A!==null&&A!==void 0&&A.emitClose||f!==null&&f!==void 0&&f.emitClose)h.emit("close")}function z(h,f){let{_readableState:A,_writableState:I}=h;if(I!==null&&I!==void 0&&I.errorEmitted||A!==null&&A!==void 0&&A.errorEmitted)return;if(I)I.errorEmitted=!0;if(A)A.errorEmitted=!0;h.emit("error",f)}function Y(){let h=this._readableState,f=this._writableState;if(h)h.constructed=!0,h.closed=!1,h.closeEmitted=!1,h.destroyed=!1,h.errored=null,h.errorEmitted=!1,h.reading=!1,h.ended=h.readable===!1,h.endEmitted=h.readable===!1;if(f)f.constructed=!0,f.destroyed=!1,f.closed=!1,f.closeEmitted=!1,f.errored=null,f.errorEmitted=!1,f.finalCalled=!1,f.prefinished=!1,f.ended=f.writable===!1,f.ending=f.writable===!1,f.finished=f.writable===!1}function H(h,f,A){let{_readableState:I,_writableState:n}=h;if(n!==null&&n!==void 0&&n.destroyed||I!==null&&I!==void 0&&I.destroyed)return this;if(I!==null&&I!==void 0&&I.autoDestroy||n!==null&&n!==void 0&&n.autoDestroy)h.destroy(f);else if(f){if(f.stack,n&&!n.errored)n.errored=f;if(I&&!I.errored)I.errored=f;if(A)q.nextTick(z,h,f);else z(h,f)}}function R(h,f){if(typeof h._construct!=="function")return;let{_readableState:A,_writableState:I}=h;if(A)A.constructed=!1;if(I)I.constructed=!1;if(h.once(F,f),h.listenerCount(F)>1)return;q.nextTick(c,h)}function c(h){let f=!1;function A(I){if(f){H(h,I!==null&&I!==void 0?I:new J);return}f=!0;let{_readableState:n,_writableState:i}=h,K0=i||n;if(n)n.constructed=!0;if(i)i.constructed=!0;if(K0.destroyed)h.emit(N,I);else if(I)H(h,I,!0);else q.nextTick(m,h)}try{h._construct((I)=>{q.nextTick(A,I)})}catch(I){q.nextTick(A,I)}}function m(h){h.emit(F)}function $0(h){return(h===null||h===void 0?void 0:h.setHeader)&&typeof h.abort==="function"}function _(h){h.emit("close")}function g(h,f){h.emit("error",f),q.nextTick(_,h)}function O(h,f){if(!h||W(h))return;if(!f&&!U(h))f=new Z;if(V(h))h.socket=null,h.destroy(f);else if($0(h))h.abort();else if($0(h.req))h.req.abort();else if(typeof h.destroy==="function")h.destroy(f);else if(typeof h.close==="function")h.close();else if(f)q.nextTick(g,h,f);else q.nextTick(_,h);if(!h.destroyed)h[B]=!0}$.exports={construct:R,destroyer:O,destroy:v,undestroy:Y,errorOrDestroy:H}}),t7=R0((Q,$)=>{var{ArrayIsArray:q,ObjectSetPrototypeOf:K}=b0(),{EventEmitter:J}=(a1(),y0(o1));function Z(B){J.call(this,B)}K(Z.prototype,J.prototype),K(Z,J),Z.prototype.pipe=function(B,W){let U=this;function V(D){if(B.writable&&B.write(D)===!1&&U.pause)U.pause()}U.on("data",V);function N(){if(U.readable&&U.resume)U.resume()}if(B.on("drain",N),!B._isStdio&&(!W||W.end!==!1))U.on("end",M),U.on("close",v);let F=!1;function M(){if(F)return;F=!0,B.end()}function v(){if(F)return;if(F=!0,typeof B.destroy==="function")B.destroy()}function x(D){if(y(),J.listenerCount(this,"error")===0)this.emit("error",D)}G(U,"error",x),G(B,"error",x);function y(){U.removeListener("data",V),B.removeListener("drain",N),U.removeListener("end",M),U.removeListener("close",v),U.removeListener("error",x),B.removeListener("error",x),U.removeListener("end",y),U.removeListener("close",y),B.removeListener("close",y)}return U.on("end",y),U.on("close",y),B.on("close",y),B.emit("pipe",U),B};function G(B,W,U){if(typeof B.prependListener==="function")return B.prependListener(W,U);if(!B._events||!B._events[W])B.on(W,U);else if(q(B._events[W]))B._events[W].unshift(U);else B._events[W]=[U,B._events[W]]}$.exports={Stream:Z,prependListener:G}}),u5=R0((Q,$)=>{var{SymbolDispose:q}=b0(),{AbortError:K,codes:J}=V1(),{isNodeStream:Z,isWebStream:G,kControllerErrorFunction:B}=V2(),W=R2(),{ERR_INVALID_ARG_TYPE:U}=J,V,N=(F,M)=>{if(typeof F!=="object"||!("aborted"in F))throw new U(M,"AbortSignal",F)};Q.addAbortSignal=function F(M,v){if(N(M,"signal"),!Z(v)&&!G(v))throw new U("stream",["ReadableStream","WritableStream","Stream"],v);return Q.addAbortSignalNoValidate(M,v)},Q.addAbortSignalNoValidate=function(F,M){if(typeof F!=="object"||!("aborted"in F))return M;let v=Z(M)?()=>{M.destroy(new K(void 0,{cause:F.reason}))}:()=>{M[B](new K(void 0,{cause:F.reason}))};if(F.aborted)v();else{V=V||W1().addAbortListener;let x=V(F,v);W(M,x[q])}return M}}),GW=R0((Q,$)=>{var{StringPrototypeSlice:q,SymbolIterator:K,TypedArrayPrototypeSet:J,Uint8Array:Z}=b0(),{Buffer:G}=(a0(),y0(s0)),{inspect:B}=W1();$.exports=class W{constructor(){this.head=null,this.tail=null,this.length=0}push(U){let V={data:U,next:null};if(this.length>0)this.tail.next=V;else this.head=V;this.tail=V,++this.length}unshift(U){let V={data:U,next:this.head};if(this.length===0)this.tail=V;this.head=V,++this.length}shift(){if(this.length===0)return;let U=this.head.data;if(this.length===1)this.head=this.tail=null;else this.head=this.head.next;return--this.length,U}clear(){this.head=this.tail=null,this.length=0}join(U){if(this.length===0)return"";let V=this.head,N=""+V.data;while((V=V.next)!==null)N+=U+V.data;return N}concat(U){if(this.length===0)return G.alloc(0);let V=G.allocUnsafe(U>>>0),N=this.head,F=0;while(N)J(V,N.data,F),F+=N.data.length,N=N.next;return V}consume(U,V){let N=this.head.data;if(UM.length)V+=M,U-=M.length;else{if(U===M.length)if(V+=M,++F,N.next)this.head=N.next;else this.head=this.tail=null;else V+=q(M,0,U),this.head=N,N.data=q(M,U);break}++F}while((N=N.next)!==null);return this.length-=F,V}_getBuffer(U){let V=G.allocUnsafe(U),N=U,F=this.head,M=0;do{let v=F.data;if(U>v.length)J(V,v,N-U),U-=v.length;else{if(U===v.length)if(J(V,v,N-U),++M,F.next)this.head=F.next;else this.head=this.tail=null;else J(V,new Z(v.buffer,v.byteOffset,U),N-U),this.head=F,F.data=v.slice(U);break}++M}while((F=F.next)!==null);return this.length-=M,V}[Symbol.for("nodejs.util.inspect.custom")](U,V){return B(this,{...V,depth:0,customInspect:!1})}}}),_5=R0((Q,$)=>{var{MathFloor:q,NumberIsInteger:K}=b0(),{validateInteger:J}=X8(),{ERR_INVALID_ARG_VALUE:Z}=V1().codes,G=16384,B=16;function W(F,M,v){return F.highWaterMark!=null?F.highWaterMark:M?F[v]:null}function U(F){return F?B:G}function V(F,M){if(J(M,"value",0),F)B=M;else G=M}function N(F,M,v,x){let y=W(M,x,v);if(y!=null){if(!K(y)||y<0){let D=x?`options.${v}`:"options.highWaterMark";throw new Z(D,y)}return q(y)}return U(F.objectMode)}$.exports={getHighWaterMark:N,getDefaultHighWaterMark:U,setDefaultHighWaterMark:V}}),BW=R0((Q,$)=>{/*! safe-buffer. MIT License. Feross Aboukhadijeh */var q=(a0(),y0(s0)),K=q.Buffer;function J(G,B){for(var W in G)B[W]=G[W]}if(K.from&&K.alloc&&K.allocUnsafe&&K.allocUnsafeSlow)$.exports=q;else J(q,Q),Q.Buffer=Z;function Z(G,B,W){return K(G,B,W)}Z.prototype=Object.create(K.prototype),J(K,Z),Z.from=function(G,B,W){if(typeof G==="number")throw new TypeError("Argument must not be a number");return K(G,B,W)},Z.alloc=function(G,B,W){if(typeof G!=="number")throw new TypeError("Argument must be a number");var U=K(G);if(B!==void 0)if(typeof W==="string")U.fill(B,W);else U.fill(B);else U.fill(0);return U},Z.allocUnsafe=function(G){if(typeof G!=="number")throw new TypeError("Argument must be a number");return K(G)},Z.allocUnsafeSlow=function(G){if(typeof G!=="number")throw new TypeError("Argument must be a number");return q.SlowBuffer(G)}}),WW=R0((Q)=>{var $=BW().Buffer,q=$.isEncoding||function(z){switch(z=""+z,z&&z.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function K(z){if(!z)return"utf8";var Y;while(!0)switch(z){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return z;default:if(Y)return;z=(""+z).toLowerCase(),Y=!0}}function J(z){var Y=K(z);if(typeof Y!=="string"&&($.isEncoding===q||!q(z)))throw new Error("Unknown encoding: "+z);return Y||z}Q.StringDecoder=Z;function Z(z){this.encoding=J(z);var Y;switch(this.encoding){case"utf16le":this.text=F,this.end=M,Y=4;break;case"utf8":this.fillLast=U,Y=4;break;case"base64":this.text=v,this.end=x,Y=3;break;default:this.write=y,this.end=D;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=$.allocUnsafe(Y)}Z.prototype.write=function(z){if(z.length===0)return"";var Y,H;if(this.lastNeed){if(Y=this.fillLast(z),Y===void 0)return"";H=this.lastNeed,this.lastNeed=0}else H=0;if(H>5===6)return 2;else if(z>>4===14)return 3;else if(z>>3===30)return 4;return z>>6===2?-1:-2}function B(z,Y,H){var R=Y.length-1;if(R=0){if(c>0)z.lastNeed=c-1;return c}if(--R=0){if(c>0)z.lastNeed=c-2;return c}if(--R=0){if(c>0)if(c===2)c=0;else z.lastNeed=c-3;return c}return 0}function W(z,Y,H){if((Y[0]&192)!==128)return z.lastNeed=0,"�";if(z.lastNeed>1&&Y.length>1){if((Y[1]&192)!==128)return z.lastNeed=1,"�";if(z.lastNeed>2&&Y.length>2){if((Y[2]&192)!==128)return z.lastNeed=2,"�"}}}function U(z){var Y=this.lastTotal-this.lastNeed,H=W(this,z,Y);if(H!==void 0)return H;if(this.lastNeed<=z.length)return z.copy(this.lastChar,Y,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);z.copy(this.lastChar,Y,0,z.length),this.lastNeed-=z.length}function V(z,Y){var H=B(this,z,Y);if(!this.lastNeed)return z.toString("utf8",Y);this.lastTotal=H;var R=z.length-(H-this.lastNeed);return z.copy(this.lastChar,0,R),z.toString("utf8",Y,R)}function N(z){var Y=z&&z.length?this.write(z):"";if(this.lastNeed)return Y+"�";return Y}function F(z,Y){if((z.length-Y)%2===0){var H=z.toString("utf16le",Y);if(H){var R=H.charCodeAt(H.length-1);if(R>=55296&&R<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=z[z.length-2],this.lastChar[1]=z[z.length-1],H.slice(0,-1)}return H}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=z[z.length-1],z.toString("utf16le",Y,z.length-1)}function M(z){var Y=z&&z.length?this.write(z):"";if(this.lastNeed){var H=this.lastTotal-this.lastNeed;return Y+this.lastChar.toString("utf16le",0,H)}return Y}function v(z,Y){var H=(z.length-Y)%3;if(H===0)return z.toString("base64",Y);if(this.lastNeed=3-H,this.lastTotal=3,H===1)this.lastChar[0]=z[z.length-1];else this.lastChar[0]=z[z.length-2],this.lastChar[1]=z[z.length-1];return z.toString("base64",Y,z.length-H)}function x(z){var Y=z&&z.length?this.write(z):"";if(this.lastNeed)return Y+this.lastChar.toString("base64",0,3-this.lastNeed);return Y}function y(z){return z.toString(this.encoding)}function D(z){return z&&z.length?this.write(z):""}}),GJ=R0((Q,$)=>{var q=e2(),{PromisePrototypeThen:K,SymbolAsyncIterator:J,SymbolIterator:Z}=b0(),{Buffer:G}=(a0(),y0(s0)),{ERR_INVALID_ARG_TYPE:B,ERR_STREAM_NULL_VALUES:W}=V1().codes;function U(V,N,F){let M;if(typeof N==="string"||N instanceof G)return new V({objectMode:!0,...F,read(){this.push(N),this.push(null)}});let v;if(N&&N[J])v=!0,M=N[J]();else if(N&&N[Z])v=!1,M=N[Z]();else throw new B("iterable",["Iterable"],N);let x=new V({objectMode:!0,highWaterMark:1,...F}),y=!1;x._read=function(){if(!y)y=!0,z()},x._destroy=function(Y,H){K(D(Y),()=>q.nextTick(H,Y),(R)=>q.nextTick(H,R||Y))};async function D(Y){let H=Y!==void 0&&Y!==null,R=typeof M.throw==="function";if(H&&R){let{value:c,done:m}=await M.throw(Y);if(await c,m)return}if(typeof M.return==="function"){let{value:c}=await M.return();await c}}async function z(){for(;;){try{let{value:Y,done:H}=v?await M.next():M.next();if(H)x.push(null);else{let R=Y&&typeof Y.then==="function"?await Y:Y;if(R===null)throw y=!1,new W;else if(x.push(R))continue;else y=!1}}catch(Y){x.destroy(Y)}break}}return x}$.exports=U}),c5=R0((Q,$)=>{var q=e2(),{ArrayPrototypeIndexOf:K,NumberIsInteger:J,NumberIsNaN:Z,NumberParseInt:G,ObjectDefineProperties:B,ObjectKeys:W,ObjectSetPrototypeOf:U,Promise:V,SafeSet:N,SymbolAsyncDispose:F,SymbolAsyncIterator:M,Symbol:v}=b0();$.exports=p,p.ReadableState=e;var{EventEmitter:x}=(a1(),y0(o1)),{Stream:y,prependListener:D}=t7(),{Buffer:z}=(a0(),y0(s0)),{addAbortSignal:Y}=u5(),H=R2(),R=W1().debuglog("stream",(w)=>{R=w}),c=GW(),m=O6(),{getHighWaterMark:$0,getDefaultHighWaterMark:_}=_5(),{aggregateTwoErrors:g,codes:{ERR_INVALID_ARG_TYPE:O,ERR_METHOD_NOT_IMPLEMENTED:h,ERR_OUT_OF_RANGE:f,ERR_STREAM_PUSH_AFTER_EOF:A,ERR_STREAM_UNSHIFT_AFTER_END_EVENT:I},AbortError:n}=V1(),{validateObject:i}=X8(),K0=v("kPaused"),{StringDecoder:z0}=WW(),S=GJ();U(p.prototype,y.prototype),U(p,y);var U0=()=>{},{errorOrDestroy:k}=m,u=1,Q0=2,E=4,q0=8,B0=16,w0=32,M0=64,b=128,T=256,t=512,Z0=1024,W0=2048,C=4096,X=8192,P=16384,o=32768,r=65536,l=131072,j=262144;function d(w){return{enumerable:!1,get(){return(this.state&w)!==0},set(L){if(L)this.state|=w;else this.state&=~w}}}B(e.prototype,{objectMode:d(u),ended:d(Q0),endEmitted:d(E),reading:d(q0),constructed:d(B0),sync:d(w0),needReadable:d(M0),emittedReadable:d(b),readableListening:d(T),resumeScheduled:d(t),errorEmitted:d(Z0),emitClose:d(W0),autoDestroy:d(C),destroyed:d(X),closed:d(P),closeEmitted:d(o),multiAwaitDrain:d(r),readingMore:d(l),dataEmitted:d(j)});function e(w,L,a){if(typeof a!=="boolean")a=L instanceof U2();if(this.state=W0|C|B0|w0,w&&w.objectMode)this.state|=u;if(a&&w&&w.readableObjectMode)this.state|=u;if(this.highWaterMark=w?$0(this,w,"readableHighWaterMark",a):_(!1),this.buffer=new c,this.length=0,this.pipes=[],this.flowing=null,this[K0]=null,w&&w.emitClose===!1)this.state&=~W0;if(w&&w.autoDestroy===!1)this.state&=~C;if(this.errored=null,this.defaultEncoding=w&&w.defaultEncoding||"utf8",this.awaitDrainWriters=null,this.decoder=null,this.encoding=null,w&&w.encoding)this.decoder=new z0(w.encoding),this.encoding=w.encoding}function p(w){if(!(this instanceof p))return new p(w);let L=this instanceof U2();if(this._readableState=new e(w,this,L),w){if(typeof w.read==="function")this._read=w.read;if(typeof w.destroy==="function")this._destroy=w.destroy;if(typeof w.construct==="function")this._construct=w.construct;if(w.signal&&!L)Y(w.signal,this)}y.call(this,w),m.construct(this,()=>{if(this._readableState.needReadable)M1(this,this._readableState)})}p.prototype.destroy=m.destroy,p.prototype._undestroy=m.undestroy,p.prototype._destroy=function(w,L){L(w)},p.prototype[x.captureRejectionSymbol]=function(w){this.destroy(w)},p.prototype[F]=function(){let w;if(!this.destroyed)w=this.readableEnded?null:new n,this.destroy(w);return new V((L,a)=>H(this,(s)=>s&&s!==w?a(s):L(null)))},p.prototype.push=function(w,L){return G0(this,w,L,!1)},p.prototype.unshift=function(w,L){return G0(this,w,L,!0)};function G0(w,L,a,s){R("readableAddChunk",L);let V0=w._readableState,g0;if((V0.state&u)===0){if(typeof L==="string"){if(a=a||V0.defaultEncoding,V0.encoding!==a)if(s&&V0.encoding)L=z.from(L,a).toString(V0.encoding);else L=z.from(L,a),a=""}else if(L instanceof z)a="";else if(y._isUint8Array(L))L=y._uint8ArrayToBuffer(L),a="";else if(L!=null)g0=new O("chunk",["string","Buffer","Uint8Array"],L)}if(g0)k(w,g0);else if(L===null)V0.state&=~q0,A0(w,V0);else if((V0.state&u)!==0||L&&L.length>0)if(s)if((V0.state&E)!==0)k(w,new I);else if(V0.destroyed||V0.errored)return!1;else P0(w,V0,L,!0);else if(V0.ended)k(w,new A);else if(V0.destroyed||V0.errored)return!1;else if(V0.state&=~q0,V0.decoder&&!a)if(L=V0.decoder.write(L),V0.objectMode||L.length!==0)P0(w,V0,L,!1);else M1(w,V0);else P0(w,V0,L,!1);else if(!s)V0.state&=~q0,M1(w,V0);return!V0.ended&&(V0.length0){if((L.state&r)!==0)L.awaitDrainWriters.clear();else L.awaitDrainWriters=null;L.dataEmitted=!0,w.emit("data",a)}else{if(L.length+=L.objectMode?1:a.length,s)L.buffer.unshift(a);else L.buffer.push(a);if((L.state&M0)!==0)O0(w)}M1(w,L)}p.prototype.isPaused=function(){let w=this._readableState;return w[K0]===!0||w.flowing===!1},p.prototype.setEncoding=function(w){let L=new z0(w);this._readableState.decoder=L,this._readableState.encoding=this._readableState.decoder.encoding;let a=this._readableState.buffer,s="";for(let V0 of a)s+=L.write(V0);if(a.clear(),s!=="")a.push(s);return this._readableState.length=s.length,this};var k0=1073741824;function I0(w){if(w>k0)throw new f("size","<= 1GiB",w);else w--,w|=w>>>1,w|=w>>>2,w|=w>>>4,w|=w>>>8,w|=w>>>16,w++;return w}function Q1(w,L){if(w<=0||L.length===0&&L.ended)return 0;if((L.state&u)!==0)return 1;if(Z(w)){if(L.flowing&&L.length)return L.buffer.first().length;return L.length}if(w<=L.length)return w;return L.ended?L.length:0}p.prototype.read=function(w){if(R("read",w),w===void 0)w=NaN;else if(!J(w))w=G(w,10);let L=this._readableState,a=w;if(w>L.highWaterMark)L.highWaterMark=I0(w);if(w!==0)L.state&=~b;if(w===0&&L.needReadable&&((L.highWaterMark!==0?L.length>=L.highWaterMark:L.length>0)||L.ended)){if(R("read: emitReadable",L.length,L.ended),L.length===0&&L.ended)f2(this);else O0(this);return null}if(w=Q1(w,L),w===0&&L.ended){if(L.length===0)f2(this);return null}let s=(L.state&M0)!==0;if(R("need readable",s),L.length===0||L.length-w0)V0=p6(w,L);else V0=null;if(V0===null)L.needReadable=L.length<=L.highWaterMark,w=0;else if(L.length-=w,L.multiAwaitDrain)L.awaitDrainWriters.clear();else L.awaitDrainWriters=null;if(L.length===0){if(!L.ended)L.needReadable=!0;if(a!==w&&L.ended)f2(this)}if(V0!==null&&!L.errorEmitted&&!L.closeEmitted)L.dataEmitted=!0,this.emit("data",V0);return V0};function A0(w,L){if(R("onEofChunk"),L.ended)return;if(L.decoder){let a=L.decoder.end();if(a&&a.length)L.buffer.push(a),L.length+=L.objectMode?1:a.length}if(L.ended=!0,L.sync)O0(w);else L.needReadable=!1,L.emittedReadable=!0,F1(w)}function O0(w){let L=w._readableState;if(R("emitReadable",L.needReadable,L.emittedReadable),L.needReadable=!1,!L.emittedReadable)R("emitReadable",L.flowing),L.emittedReadable=!0,q.nextTick(F1,w)}function F1(w){let L=w._readableState;if(R("emitReadable_",L.destroyed,L.length,L.ended),!L.destroyed&&!L.errored&&(L.length||L.ended))w.emit("readable"),L.emittedReadable=!1;L.needReadable=!L.flowing&&!L.ended&&L.length<=L.highWaterMark,m6(w)}function M1(w,L){if(!L.readingMore&&L.constructed)L.readingMore=!0,q.nextTick(d0,w,L)}function d0(w,L){while(!L.reading&&!L.ended&&(L.length1&&s.pipes.includes(w))R("false write response, pause",s.awaitDrainWriters.size),s.awaitDrainWriters.add(w);a.pause()}if(!q1)q1=o5(a,w),w.on("drain",q1)}a.on("data",a6);function a6($1){R("ondata");let i0=w.write($1);if(R("dest.write",i0),i0===!1)o6()}function g2($1){if(R("onerror",$1),A1(),w.removeListener("error",g2),w.listenerCount("error")===0){let i0=w._writableState||w._readableState;if(i0&&!i0.errorEmitted)k(w,$1);else w.emit("error",$1)}}D(w,"error",g2);function X2(){w.removeListener("finish",y2),A1()}w.once("close",X2);function y2(){R("onfinish"),w.removeListener("close",X2),A1()}w.once("finish",y2);function A1(){R("unpipe"),a.unpipe(w)}if(w.emit("pipe",a),w.writableNeedDrain===!0)o6();else if(!s.flowing)R("pipe resume"),a.resume();return w};function o5(w,L){return function a(){let s=w._readableState;if(s.awaitDrainWriters===L)R("pipeOnDrain",1),s.awaitDrainWriters=null;else if(s.multiAwaitDrain)R("pipeOnDrain",s.awaitDrainWriters.size),s.awaitDrainWriters.delete(L);if((!s.awaitDrainWriters||s.awaitDrainWriters.size===0)&&w.listenerCount("data"))w.resume()}}p.prototype.unpipe=function(w){let L=this._readableState,a={hasUnpiped:!1};if(L.pipes.length===0)return this;if(!w){let V0=L.pipes;L.pipes=[],this.pause();for(let g0=0;g00,s.flowing!==!1)this.resume()}else if(w==="readable"){if(!s.endEmitted&&!s.readableListening){if(s.readableListening=s.needReadable=!0,s.flowing=!1,s.emittedReadable=!1,R("on readable",s.length,s.reading),s.length)O0(this);else if(!s.reading)q.nextTick(a5,this)}}return a},p.prototype.addListener=p.prototype.on,p.prototype.removeListener=function(w,L){let a=y.prototype.removeListener.call(this,w,L);if(w==="readable")q.nextTick(d6,this);return a},p.prototype.off=p.prototype.removeListener,p.prototype.removeAllListeners=function(w){let L=y.prototype.removeAllListeners.apply(this,arguments);if(w==="readable"||w===void 0)q.nextTick(d6,this);return L};function d6(w){let L=w._readableState;if(L.readableListening=w.listenerCount("readable")>0,L.resumeScheduled&&L[K0]===!1)L.flowing=!0;else if(w.listenerCount("data")>0)w.resume();else if(!L.readableListening)L.flowing=null}function a5(w){R("readable nexttick read 0"),w.read(0)}p.prototype.resume=function(){let w=this._readableState;if(!w.flowing)R("resume"),w.flowing=!w.readableListening,r5(this,w);return w[K0]=!1,this};function r5(w,L){if(!L.resumeScheduled)L.resumeScheduled=!0,q.nextTick(s5,w,L)}function s5(w,L){if(R("resume",L.reading),!L.reading)w.read(0);if(L.resumeScheduled=!1,w.emit("resume"),m6(w),L.flowing&&!L.reading)w.read(0)}p.prototype.pause=function(){if(R("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1)R("pause"),this._readableState.flowing=!1,this.emit("pause");return this._readableState[K0]=!0,this};function m6(w){let L=w._readableState;R("flow",L.flowing);while(L.flowing&&w.read()!==null);}p.prototype.wrap=function(w){let L=!1;w.on("data",(s)=>{if(!this.push(s)&&w.pause)L=!0,w.pause()}),w.on("end",()=>{this.push(null)}),w.on("error",(s)=>{k(this,s)}),w.on("close",()=>{this.destroy()}),w.on("destroy",()=>{this.destroy()}),this._read=()=>{if(L&&w.resume)L=!1,w.resume()};let a=W(w);for(let s=1;s{V0=E0?g(V0,E0):null,a(),a=U0});try{while(!0){let E0=w.destroyed?null:w.read();if(E0!==null)yield E0;else if(V0)throw V0;else if(V0===null)return;else await new V(s)}}catch(E0){throw V0=g(V0,E0),V0}finally{if((V0||(L===null||L===void 0?void 0:L.destroyOnReturn)!==!1)&&(V0===void 0||w._readableState.autoDestroy))m.destroyer(w,null);else w.off("readable",s),g0()}}B(p.prototype,{readable:{__proto__:null,get(){let w=this._readableState;return!!w&&w.readable!==!1&&!w.destroyed&&!w.errorEmitted&&!w.endEmitted},set(w){if(this._readableState)this._readableState.readable=!!w}},readableDidRead:{__proto__:null,enumerable:!1,get:function(){return this._readableState.dataEmitted}},readableAborted:{__proto__:null,enumerable:!1,get:function(){return!!(this._readableState.readable!==!1&&(this._readableState.destroyed||this._readableState.errored)&&!this._readableState.endEmitted)}},readableHighWaterMark:{__proto__:null,enumerable:!1,get:function(){return this._readableState.highWaterMark}},readableBuffer:{__proto__:null,enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}},readableFlowing:{__proto__:null,enumerable:!1,get:function(){return this._readableState.flowing},set:function(w){if(this._readableState)this._readableState.flowing=w}},readableLength:{__proto__:null,enumerable:!1,get(){return this._readableState.length}},readableObjectMode:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.objectMode:!1}},readableEncoding:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.encoding:null}},errored:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.errored:null}},closed:{__proto__:null,get(){return this._readableState?this._readableState.closed:!1}},destroyed:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.destroyed:!1},set(w){if(!this._readableState)return;this._readableState.destroyed=w}},readableEnded:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.endEmitted:!1}}}),B(e.prototype,{pipesCount:{__proto__:null,get(){return this.pipes.length}},paused:{__proto__:null,get(){return this[K0]!==!1},set(w){this[K0]=!!w}}}),p._fromList=p6;function p6(w,L){if(L.length===0)return null;let a;if(L.objectMode)a=L.buffer.shift();else if(!w||w>=L.length){if(L.decoder)a=L.buffer.join("");else if(L.buffer.length===1)a=L.buffer.first();else a=L.buffer.concat(L.length);L.buffer.clear()}else a=L.buffer.consume(w,L.decoder);return a}function f2(w){let L=w._readableState;if(R("endReadable",L.endEmitted),!L.endEmitted)L.ended=!0,q.nextTick(e5,L,w)}function e5(w,L){if(R("endReadableNT",w.endEmitted,w.length),!w.errored&&!w.closeEmitted&&!w.endEmitted&&w.length===0){if(w.endEmitted=!0,L.emit("end"),L.writable&&L.allowHalfOpen===!1)q.nextTick(Q4,L);else if(w.autoDestroy){let a=L._writableState;if(!a||a.autoDestroy&&(a.finished||a.writable===!1))L.destroy()}}}function Q4(w){if(w.writable&&!w.writableEnded&&!w.destroyed)w.end()}p.from=function(w,L){return S(p,w,L)};var A2;function i6(){if(A2===void 0)A2={};return A2}p.fromWeb=function(w,L){return i6().newStreamReadableFromReadableStream(w,L)},p.toWeb=function(w,L){return i6().newReadableStreamFromStreamReadable(w,L)},p.wrap=function(w,L){var a,s;return new p({objectMode:(a=(s=w.readableObjectMode)!==null&&s!==void 0?s:w.objectMode)!==null&&a!==void 0?a:!0,...L,destroy(V0,g0){m.destroyer(w,V0),g0(V0)}}).wrap(w)}}),e7=R0((Q,$)=>{var q=e2(),{ArrayPrototypeSlice:K,Error:J,FunctionPrototypeSymbolHasInstance:Z,ObjectDefineProperty:G,ObjectDefineProperties:B,ObjectSetPrototypeOf:W,StringPrototypeToLowerCase:U,Symbol:V,SymbolHasInstance:N}=b0();$.exports=i,i.WritableState=I;var{EventEmitter:F}=(a1(),y0(o1)),M=t7().Stream,{Buffer:v}=(a0(),y0(s0)),x=O6(),{addAbortSignal:y}=u5(),{getHighWaterMark:D,getDefaultHighWaterMark:z}=_5(),{ERR_INVALID_ARG_TYPE:Y,ERR_METHOD_NOT_IMPLEMENTED:H,ERR_MULTIPLE_CALLBACK:R,ERR_STREAM_CANNOT_PIPE:c,ERR_STREAM_DESTROYED:m,ERR_STREAM_ALREADY_FINISHED:$0,ERR_STREAM_NULL_VALUES:_,ERR_STREAM_WRITE_AFTER_END:g,ERR_UNKNOWN_ENCODING:O}=V1().codes,{errorOrDestroy:h}=x;W(i.prototype,M.prototype),W(i,M);function f(){}var A=V("kOnFinished");function I(C,X,P){if(typeof P!=="boolean")P=X instanceof U2();if(this.objectMode=!!(C&&C.objectMode),P)this.objectMode=this.objectMode||!!(C&&C.writableObjectMode);this.highWaterMark=C?D(this,C,"writableHighWaterMark",P):z(!1),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;let o=!!(C&&C.decodeStrings===!1);this.decodeStrings=!o,this.defaultEncoding=C&&C.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=k.bind(void 0,X),this.writecb=null,this.writelen=0,this.afterWriteTickInfo=null,n(this),this.pendingcb=0,this.constructed=!0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=!C||C.emitClose!==!1,this.autoDestroy=!C||C.autoDestroy!==!1,this.errored=null,this.closed=!1,this.closeEmitted=!1,this[A]=[]}function n(C){C.buffered=[],C.bufferedIndex=0,C.allBuffers=!0,C.allNoop=!0}I.prototype.getBuffer=function C(){return K(this.buffered,this.bufferedIndex)},G(I.prototype,"bufferedRequestCount",{__proto__:null,get(){return this.buffered.length-this.bufferedIndex}});function i(C){let X=this instanceof U2();if(!X&&!Z(i,this))return new i(C);if(this._writableState=new I(C,this,X),C){if(typeof C.write==="function")this._write=C.write;if(typeof C.writev==="function")this._writev=C.writev;if(typeof C.destroy==="function")this._destroy=C.destroy;if(typeof C.final==="function")this._final=C.final;if(typeof C.construct==="function")this._construct=C.construct;if(C.signal)y(C.signal,this)}M.call(this,C),x.construct(this,()=>{let P=this._writableState;if(!P.writing)q0(this,P);b(this,P)})}G(i,N,{__proto__:null,value:function(C){if(Z(this,C))return!0;if(this!==i)return!1;return C&&C._writableState instanceof I}}),i.prototype.pipe=function(){h(this,new c)};function K0(C,X,P,o){let r=C._writableState;if(typeof P==="function")o=P,P=r.defaultEncoding;else{if(!P)P=r.defaultEncoding;else if(P!=="buffer"&&!v.isEncoding(P))throw new O(P);if(typeof o!=="function")o=f}if(X===null)throw new _;else if(!r.objectMode)if(typeof X==="string"){if(r.decodeStrings!==!1)X=v.from(X,P),P="buffer"}else if(X instanceof v)P="buffer";else if(M._isUint8Array(X))X=M._uint8ArrayToBuffer(X),P="buffer";else throw new Y("chunk",["string","Buffer","Uint8Array"],X);let l;if(r.ending)l=new g;else if(r.destroyed)l=new m("write");if(l)return q.nextTick(o,l),h(C,l,!0),l;return r.pendingcb++,z0(C,r,X,P,o)}i.prototype.write=function(C,X,P){return K0(this,C,X,P)===!0},i.prototype.cork=function(){this._writableState.corked++},i.prototype.uncork=function(){let C=this._writableState;if(C.corked){if(C.corked--,!C.writing)q0(this,C)}},i.prototype.setDefaultEncoding=function C(X){if(typeof X==="string")X=U(X);if(!v.isEncoding(X))throw new O(X);return this._writableState.defaultEncoding=X,this};function z0(C,X,P,o,r){let l=X.objectMode?1:P.length;X.length+=l;let j=X.lengthP.bufferedIndex)q0(C,P);if(o)if(P.afterWriteTickInfo!==null&&P.afterWriteTickInfo.cb===r)P.afterWriteTickInfo.count++;else P.afterWriteTickInfo={count:1,cb:r,stream:C,state:P},q.nextTick(u,P.afterWriteTickInfo);else Q0(C,P,1,r)}}function u({stream:C,state:X,count:P,cb:o}){return X.afterWriteTickInfo=null,Q0(C,X,P,o)}function Q0(C,X,P,o){if(!X.ending&&!C.destroyed&&X.length===0&&X.needDrain)X.needDrain=!1,C.emit("drain");while(P-- >0)X.pendingcb--,o();if(X.destroyed)E(X);b(C,X)}function E(C){if(C.writing)return;for(let r=C.bufferedIndex;r1&&C._writev){X.pendingcb-=l-1;let d=X.allNoop?f:(p)=>{for(let G0=j;G0256)P.splice(0,j),X.bufferedIndex=0;else X.bufferedIndex=j}X.bufferProcessing=!1}i.prototype._write=function(C,X,P){if(this._writev)this._writev([{chunk:C,encoding:X}],P);else throw new H("_write()")},i.prototype._writev=null,i.prototype.end=function(C,X,P){let o=this._writableState;if(typeof C==="function")P=C,C=null,X=null;else if(typeof X==="function")P=X,X=null;let r;if(C!==null&&C!==void 0){let l=K0(this,C,X);if(l instanceof J)r=l}if(o.corked)o.corked=1,this.uncork();if(r);else if(!o.errored&&!o.ending)o.ending=!0,b(this,o,!0),o.ended=!0;else if(o.finished)r=new $0("end");else if(o.destroyed)r=new m("end");if(typeof P==="function")if(r||o.finished)q.nextTick(P,r);else o[A].push(P);return this};function B0(C){return C.ending&&!C.destroyed&&C.constructed&&C.length===0&&!C.errored&&C.buffered.length===0&&!C.finished&&!C.writing&&!C.errorEmitted&&!C.closeEmitted}function w0(C,X){let P=!1;function o(r){if(P){h(C,r!==null&&r!==void 0?r:R());return}if(P=!0,X.pendingcb--,r){let l=X[A].splice(0);for(let j=0;j{if(B0(r))T(o,r);else r.pendingcb--},C,X);else if(B0(X))X.pendingcb++,T(C,X)}}}function T(C,X){X.pendingcb--,X.finished=!0;let P=X[A].splice(0);for(let o=0;o{var q=e2(),K=(a0(),y0(s0)),{isReadable:J,isWritable:Z,isIterable:G,isNodeStream:B,isReadableNodeStream:W,isWritableNodeStream:U,isDuplexNodeStream:V,isReadableStream:N,isWritableStream:F}=V2(),M=R2(),{AbortError:v,codes:{ERR_INVALID_ARG_TYPE:x,ERR_INVALID_RETURN_VALUE:y}}=V1(),{destroyer:D}=O6(),z=U2(),Y=c5(),H=e7(),{createDeferredPromise:R}=W1(),c=GJ(),m=globalThis.Blob||K.Blob,$0=typeof m!=="undefined"?function A(I){return I instanceof m}:function A(I){return!1},_=globalThis.AbortController||g8().AbortController,{FunctionPrototypeCall:g}=b0();class O extends z{constructor(A){super(A);if((A===null||A===void 0?void 0:A.readable)===!1)this._readableState.readable=!1,this._readableState.ended=!0,this._readableState.endEmitted=!0;if((A===null||A===void 0?void 0:A.writable)===!1)this._writableState.writable=!1,this._writableState.ending=!0,this._writableState.ended=!0,this._writableState.finished=!0}}$.exports=function A(I,n){if(V(I))return I;if(W(I))return f({readable:I});if(U(I))return f({writable:I});if(B(I))return f({writable:!1,readable:!1});if(N(I))return f({readable:Y.fromWeb(I)});if(F(I))return f({writable:H.fromWeb(I)});if(typeof I==="function"){let{value:K0,write:z0,final:S,destroy:U0}=h(I);if(G(K0))return c(O,K0,{objectMode:!0,write:z0,final:S,destroy:U0});let k=K0===null||K0===void 0?void 0:K0.then;if(typeof k==="function"){let u,Q0=g(k,K0,(E)=>{if(E!=null)throw new y("nully","body",E)},(E)=>{D(u,E)});return u=new O({objectMode:!0,readable:!1,write:z0,final(E){S(async()=>{try{await Q0,q.nextTick(E,null)}catch(q0){q.nextTick(E,q0)}})},destroy:U0})}throw new y("Iterable, AsyncIterable or AsyncFunction",n,K0)}if($0(I))return A(I.arrayBuffer());if(G(I))return c(O,I,{objectMode:!0,writable:!1});if(N(I===null||I===void 0?void 0:I.readable)&&F(I===null||I===void 0?void 0:I.writable))return O.fromWeb(I);if(typeof(I===null||I===void 0?void 0:I.writable)==="object"||typeof(I===null||I===void 0?void 0:I.readable)==="object"){let K0=I!==null&&I!==void 0&&I.readable?W(I===null||I===void 0?void 0:I.readable)?I===null||I===void 0?void 0:I.readable:A(I.readable):void 0,z0=I!==null&&I!==void 0&&I.writable?U(I===null||I===void 0?void 0:I.writable)?I===null||I===void 0?void 0:I.writable:A(I.writable):void 0;return f({readable:K0,writable:z0})}let i=I===null||I===void 0?void 0:I.then;if(typeof i==="function"){let K0;return g(i,I,(z0)=>{if(z0!=null)K0.push(z0);K0.push(null)},(z0)=>{D(K0,z0)}),K0=new O({objectMode:!0,writable:!1,read(){}})}throw new x(n,["Blob","ReadableStream","WritableStream","Stream","Iterable","AsyncIterable","Function","{ readable, writable } pair","Promise"],I)};function h(A){let{promise:I,resolve:n}=R(),i=new _,K0=i.signal;return{value:A(async function*(){while(!0){let z0=I;I=null;let{chunk:S,done:U0,cb:k}=await z0;if(q.nextTick(k),U0)return;if(K0.aborted)throw new v(void 0,{cause:K0.reason});({promise:I,resolve:n}=R()),yield S}}(),{signal:K0}),write(z0,S,U0){let k=n;n=null,k({chunk:z0,done:!1,cb:U0})},final(z0){let S=n;n=null,S({done:!0,cb:z0})},destroy(z0,S){i.abort(),S(z0)}}}function f(A){let I=A.readable&&typeof A.readable.read!=="function"?Y.wrap(A.readable):A.readable,n=A.writable,i=!!J(I),K0=!!Z(n),z0,S,U0,k,u;function Q0(E){let q0=k;if(k=null,q0)q0(E);else if(E)u.destroy(E)}if(u=new O({readableObjectMode:!!(I!==null&&I!==void 0&&I.readableObjectMode),writableObjectMode:!!(n!==null&&n!==void 0&&n.writableObjectMode),readable:i,writable:K0}),K0)M(n,(E)=>{if(K0=!1,E)D(I,E);Q0(E)}),u._write=function(E,q0,B0){if(n.write(E,q0))B0();else z0=B0},u._final=function(E){n.end(),S=E},n.on("drain",function(){if(z0){let E=z0;z0=null,E()}}),n.on("finish",function(){if(S){let E=S;S=null,E()}});if(i)M(I,(E)=>{if(i=!1,E)D(I,E);Q0(E)}),I.on("readable",function(){if(U0){let E=U0;U0=null,E()}}),I.on("end",function(){u.push(null)}),u._read=function(){while(!0){let E=I.read();if(E===null){U0=u._read;return}if(!u.push(E))return}};return u._destroy=function(E,q0){if(!E&&k!==null)E=new v;if(U0=null,z0=null,S=null,k===null)q0(E);else k=q0,D(n,E),D(I,E)},u}}),U2=R0((Q,$)=>{var{ObjectDefineProperties:q,ObjectGetOwnPropertyDescriptor:K,ObjectKeys:J,ObjectSetPrototypeOf:Z}=b0();$.exports=W;var G=c5(),B=e7();Z(W.prototype,G.prototype),Z(W,G);{let F=J(B.prototype);for(let M=0;M{var{ObjectSetPrototypeOf:q,Symbol:K}=b0();$.exports=W;var{ERR_METHOD_NOT_IMPLEMENTED:J}=V1().codes,Z=U2(),{getHighWaterMark:G}=_5();q(W.prototype,Z.prototype),q(W,Z);var B=K("kCallback");function W(N){if(!(this instanceof W))return new W(N);let F=N?G(this,N,"readableHighWaterMark",!0):null;if(F===0)N={...N,highWaterMark:null,readableHighWaterMark:F,writableHighWaterMark:N.writableHighWaterMark||0};if(Z.call(this,N),this._readableState.sync=!1,this[B]=null,N){if(typeof N.transform==="function")this._transform=N.transform;if(typeof N.flush==="function")this._flush=N.flush}this.on("prefinish",V)}function U(N){if(typeof this._flush==="function"&&!this.destroyed)this._flush((F,M)=>{if(F){if(N)N(F);else this.destroy(F);return}if(M!=null)this.push(M);if(this.push(null),N)N()});else if(this.push(null),N)N()}function V(){if(this._final!==U)U.call(this)}W.prototype._final=U,W.prototype._transform=function(N,F,M){throw new J("_transform()")},W.prototype._write=function(N,F,M){let v=this._readableState,x=this._writableState,y=v.length;this._transform(N,F,(D,z)=>{if(D){M(D);return}if(z!=null)this.push(z);if(x.ended||y===v.length||v.length{var{ObjectSetPrototypeOf:q}=b0();$.exports=J;var K=BJ();q(J.prototype,K.prototype),q(J,K);function J(Z){if(!(this instanceof J))return new J(Z);K.call(this,Z)}J.prototype._transform=function(Z,G,B){B(null,Z)}}),Q9=R0((Q,$)=>{var q=e2(),{ArrayIsArray:K,Promise:J,SymbolAsyncIterator:Z,SymbolDispose:G}=b0(),B=R2(),{once:W}=W1(),U=O6(),V=U2(),{aggregateTwoErrors:N,codes:{ERR_INVALID_ARG_TYPE:F,ERR_INVALID_RETURN_VALUE:M,ERR_MISSING_ARGS:v,ERR_STREAM_DESTROYED:x,ERR_STREAM_PREMATURE_CLOSE:y},AbortError:D}=V1(),{validateFunction:z,validateAbortSignal:Y}=X8(),{isIterable:H,isReadable:R,isReadableNodeStream:c,isNodeStream:m,isTransformStream:$0,isWebStream:_,isReadableStream:g,isReadableFinished:O}=V2(),h=globalThis.AbortController||g8().AbortController,f,A,I;function n(E,q0,B0){let w0=!1;E.on("close",()=>{w0=!0});let M0=B(E,{readable:q0,writable:B0},(b)=>{w0=!b});return{destroy:(b)=>{if(w0)return;w0=!0,U.destroyer(E,b||new x("pipe"))},cleanup:M0}}function i(E){return z(E[E.length-1],"streams[stream.length - 1]"),E.pop()}function K0(E){if(H(E))return E;else if(c(E))return z0(E);throw new F("val",["Readable","Iterable","AsyncIterable"],E)}async function*z0(E){if(!A)A=c5();yield*A.prototype[Z].call(E)}async function S(E,q0,B0,{end:w0}){let M0,b=null,T=(W0)=>{if(W0)M0=W0;if(b){let C=b;b=null,C()}},t=()=>new J((W0,C)=>{if(M0)C(M0);else b=()=>{if(M0)C(M0);else W0()}});q0.on("drain",T);let Z0=B(q0,{readable:!1},T);try{if(q0.writableNeedDrain)await t();for await(let W0 of E)if(!q0.write(W0))await t();if(w0)q0.end(),await t();B0()}catch(W0){B0(M0!==W0?N(M0,W0):W0)}finally{Z0(),q0.off("drain",T)}}async function U0(E,q0,B0,{end:w0}){if($0(q0))q0=q0.writable;let M0=q0.getWriter();try{for await(let b of E)await M0.ready,M0.write(b).catch(()=>{});if(await M0.ready,w0)await M0.close();B0()}catch(b){try{await M0.abort(b),B0(b)}catch(T){B0(T)}}}function k(...E){return u(E,W(i(E)))}function u(E,q0,B0){if(E.length===1&&K(E[0]))E=E[0];if(E.length<2)throw new v("streams");let w0=new h,M0=w0.signal,b=B0===null||B0===void 0?void 0:B0.signal,T=[];Y(b,"options.signal");function t(){r(new D)}I=I||W1().addAbortListener;let Z0;if(b)Z0=I(b,t);let W0,C,X=[],P=0;function o(p){r(p,--P===0)}function r(p,G0){var P0;if(p&&(!W0||W0.code==="ERR_STREAM_PREMATURE_CLOSE"))W0=p;if(!W0&&!G0)return;while(X.length)X.shift()(W0);if((P0=Z0)===null||P0===void 0||P0[G](),w0.abort(),G0){if(!W0)T.forEach((k0)=>k0());q.nextTick(q0,W0,C)}}let l;for(let p=0;p0,I0=P0||(B0===null||B0===void 0?void 0:B0.end)!==!1,Q1=p===E.length-1;if(m(G0)){let A0=function(O0){if(O0&&O0.name!=="AbortError"&&O0.code!=="ERR_STREAM_PREMATURE_CLOSE")o(O0)};var j=A0;if(I0){let{destroy:O0,cleanup:F1}=n(G0,P0,k0);if(X.push(O0),R(G0)&&Q1)T.push(F1)}if(G0.on("error",A0),R(G0)&&Q1)T.push(()=>{G0.removeListener("error",A0)})}if(p===0)if(typeof G0==="function"){if(l=G0({signal:M0}),!H(l))throw new M("Iterable, AsyncIterable or Stream","source",l)}else if(H(G0)||c(G0)||$0(G0))l=G0;else l=V.from(G0);else if(typeof G0==="function"){if($0(l)){var d;l=K0((d=l)===null||d===void 0?void 0:d.readable)}else l=K0(l);if(l=G0(l,{signal:M0}),P0){if(!H(l,!0))throw new M("AsyncIterable",`transform[${p-1}]`,l)}else{var e;if(!f)f=WJ();let A0=new f({objectMode:!0}),O0=(e=l)===null||e===void 0?void 0:e.then;if(typeof O0==="function")P++,O0.call(l,(d0)=>{if(C=d0,d0!=null)A0.write(d0);if(I0)A0.end();q.nextTick(o)},(d0)=>{A0.destroy(d0),q.nextTick(o,d0)});else if(H(l,!0))P++,S(l,A0,o,{end:I0});else if(g(l)||$0(l)){let d0=l.readable||l;P++,S(d0,A0,o,{end:I0})}else throw new M("AsyncIterable or Promise","destination",l);l=A0;let{destroy:F1,cleanup:M1}=n(l,!1,!0);if(X.push(F1),Q1)T.push(M1)}}else if(m(G0)){if(c(l)){P+=2;let A0=Q0(l,G0,o,{end:I0});if(R(G0)&&Q1)T.push(A0)}else if($0(l)||g(l)){let A0=l.readable||l;P++,S(A0,G0,o,{end:I0})}else if(H(l))P++,S(l,G0,o,{end:I0});else throw new F("val",["Readable","Iterable","AsyncIterable","ReadableStream","TransformStream"],l);l=G0}else if(_(G0)){if(c(l))P++,U0(K0(l),G0,o,{end:I0});else if(g(l)||H(l))P++,U0(l,G0,o,{end:I0});else if($0(l))P++,U0(l.readable,G0,o,{end:I0});else throw new F("val",["Readable","Iterable","AsyncIterable","ReadableStream","TransformStream"],l);l=G0}else l=V.from(G0)}if(M0!==null&&M0!==void 0&&M0.aborted||b!==null&&b!==void 0&&b.aborted)q.nextTick(t);return l}function Q0(E,q0,B0,{end:w0}){let M0=!1;if(q0.on("close",()=>{if(!M0)B0(new y)}),E.pipe(q0,{end:!1}),w0){let T=function(){M0=!0,q0.end()};var b=T;if(O(E))q.nextTick(T);else E.once("end",T)}else B0();return B(E,{readable:!0,writable:!1},(T)=>{let t=E._readableState;if(T&&T.code==="ERR_STREAM_PREMATURE_CLOSE"&&t&&t.ended&&!t.errored&&!t.errorEmitted)E.once("end",B0).once("error",B0);else B0(T)}),B(q0,{readable:!1,writable:!0},B0)}$.exports={pipelineImpl:u,pipeline:k}}),zJ=R0((Q,$)=>{var{pipeline:q}=Q9(),K=U2(),{destroyer:J}=O6(),{isNodeStream:Z,isReadable:G,isWritable:B,isWebStream:W,isTransformStream:U,isWritableStream:V,isReadableStream:N}=V2(),{AbortError:F,codes:{ERR_INVALID_ARG_VALUE:M,ERR_MISSING_ARGS:v}}=V1(),x=R2();$.exports=function y(...D){if(D.length===0)throw new v("streams");if(D.length===1)return K.from(D[0]);let z=[...D];if(typeof D[0]==="function")D[0]=K.from(D[0]);if(typeof D[D.length-1]==="function"){let f=D.length-1;D[f]=K.from(D[f])}for(let f=0;f0&&!(B(D[f])||V(D[f])||U(D[f])))throw new M(`streams[${f}]`,z[f],"must be writable")}let Y,H,R,c,m;function $0(f){let A=c;if(c=null,A)A(f);else if(f)m.destroy(f);else if(!h&&!O)m.destroy()}let _=D[0],g=q(D,$0),O=!!(B(_)||V(_)||U(_)),h=!!(G(g)||N(g)||U(g));if(m=new K({writableObjectMode:!!(_!==null&&_!==void 0&&_.writableObjectMode),readableObjectMode:!!(g!==null&&g!==void 0&&g.readableObjectMode),writable:O,readable:h}),O){if(Z(_))m._write=function(A,I,n){if(_.write(A,I))n();else Y=n},m._final=function(A){_.end(),H=A},_.on("drain",function(){if(Y){let A=Y;Y=null,A()}});else if(W(_)){let A=(U(_)?_.writable:_).getWriter();m._write=async function(I,n,i){try{await A.ready,A.write(I).catch(()=>{}),i()}catch(K0){i(K0)}},m._final=async function(I){try{await A.ready,A.close().catch(()=>{}),H=I}catch(n){I(n)}}}let f=U(g)?g.readable:g;x(f,()=>{if(H){let A=H;H=null,A()}})}if(h){if(Z(g))g.on("readable",function(){if(R){let f=R;R=null,f()}}),g.on("end",function(){m.push(null)}),m._read=function(){while(!0){let f=g.read();if(f===null){R=m._read;return}if(!m.push(f))return}};else if(W(g)){let f=(U(g)?g.readable:g).getReader();m._read=async function(){while(!0)try{let{value:A,done:I}=await f.read();if(!m.push(A))return;if(I){m.push(null);return}}catch{return}}}}return m._destroy=function(f,A){if(!f&&c!==null)f=new F;if(R=null,Y=null,H=null,c===null)A(f);else if(c=A,Z(g))J(g,f)},m}}),FW=R0((Q,$)=>{var q=globalThis.AbortController||g8().AbortController,{codes:{ERR_INVALID_ARG_VALUE:K,ERR_INVALID_ARG_TYPE:J,ERR_MISSING_ARGS:Z,ERR_OUT_OF_RANGE:G},AbortError:B}=V1(),{validateAbortSignal:W,validateInteger:U,validateObject:V}=X8(),N=b0().Symbol("kWeak"),F=b0().Symbol("kResistStopPropagation"),{finished:M}=R2(),v=zJ(),{addAbortSignalNoValidate:x}=u5(),{isWritable:y,isNodeStream:D}=V2(),{deprecate:z}=W1(),{ArrayPrototypePush:Y,Boolean:H,MathFloor:R,Number:c,NumberIsNaN:m,Promise:$0,PromiseReject:_,PromiseResolve:g,PromisePrototypeThen:O,Symbol:h}=b0(),f=h("kEmpty"),A=h("kEof");function I(b,T){if(T!=null)V(T,"options");if((T===null||T===void 0?void 0:T.signal)!=null)W(T.signal,"options.signal");if(D(b)&&!y(b))throw new K("stream",b,"must be writable");let t=v(this,b);if(T!==null&&T!==void 0&&T.signal)x(T.signal,t);return t}function n(b,T){if(typeof b!=="function")throw new J("fn",["Function","AsyncFunction"],b);if(T!=null)V(T,"options");if((T===null||T===void 0?void 0:T.signal)!=null)W(T.signal,"options.signal");let t=1;if((T===null||T===void 0?void 0:T.concurrency)!=null)t=R(T.concurrency);let Z0=t-1;if((T===null||T===void 0?void 0:T.highWaterMark)!=null)Z0=R(T.highWaterMark);return U(t,"options.concurrency",1),U(Z0,"options.highWaterMark",0),Z0+=t,async function*W0(){let C=W1().AbortSignalAny([T===null||T===void 0?void 0:T.signal].filter(H)),X=this,P=[],o={signal:C},r,l,j=!1,d=0;function e(){j=!0,p()}function p(){d-=1,G0()}function G0(){if(l&&!j&&d=Z0||d>=t))await new $0((I0)=>{l=I0})}P.push(A)}catch(k0){let I0=_(k0);O(I0,p,e),P.push(I0)}finally{if(j=!0,r)r(),r=null}}P0();try{while(!0){while(P.length>0){let k0=await P[0];if(k0===A)return;if(C.aborted)throw new B;if(k0!==f)yield k0;P.shift(),G0()}await new $0((k0)=>{r=k0})}}finally{if(j=!0,l)l(),l=null}}.call(this)}function i(b=void 0){if(b!=null)V(b,"options");if((b===null||b===void 0?void 0:b.signal)!=null)W(b.signal,"options.signal");return async function*T(){let t=0;for await(let W0 of this){var Z0;if(b!==null&&b!==void 0&&(Z0=b.signal)!==null&&Z0!==void 0&&Z0.aborted)throw new B({cause:b.signal.reason});yield[t++,W0]}}.call(this)}async function K0(b,T=void 0){for await(let t of k.call(this,b,T))return!0;return!1}async function z0(b,T=void 0){if(typeof b!=="function")throw new J("fn",["Function","AsyncFunction"],b);return!await K0.call(this,async(...t)=>{return!await b(...t)},T)}async function S(b,T){for await(let t of k.call(this,b,T))return t;return}async function U0(b,T){if(typeof b!=="function")throw new J("fn",["Function","AsyncFunction"],b);async function t(Z0,W0){return await b(Z0,W0),f}for await(let Z0 of n.call(this,t,T));}function k(b,T){if(typeof b!=="function")throw new J("fn",["Function","AsyncFunction"],b);async function t(Z0,W0){if(await b(Z0,W0))return Z0;return f}return n.call(this,t,T)}class u extends Z{constructor(){super("reduce");this.message="Reduce of an empty stream requires an initial value"}}async function Q0(b,T,t){var Z0;if(typeof b!=="function")throw new J("reducer",["Function","AsyncFunction"],b);if(t!=null)V(t,"options");if((t===null||t===void 0?void 0:t.signal)!=null)W(t.signal,"options.signal");let W0=arguments.length>1;if(t!==null&&t!==void 0&&(Z0=t.signal)!==null&&Z0!==void 0&&Z0.aborted){let r=new B(void 0,{cause:t.signal.reason});throw this.once("error",()=>{}),await M(this.destroy(r)),r}let C=new q,X=C.signal;if(t!==null&&t!==void 0&&t.signal){let r={once:!0,[N]:this,[F]:!0};t.signal.addEventListener("abort",()=>C.abort(),r)}let P=!1;try{for await(let r of this){var o;if(P=!0,t!==null&&t!==void 0&&(o=t.signal)!==null&&o!==void 0&&o.aborted)throw new B;if(!W0)T=r,W0=!0;else T=await b(T,r,{signal:X})}if(!P&&!W0)throw new u}finally{C.abort()}return T}async function E(b){if(b!=null)V(b,"options");if((b===null||b===void 0?void 0:b.signal)!=null)W(b.signal,"options.signal");let T=[];for await(let Z0 of this){var t;if(b!==null&&b!==void 0&&(t=b.signal)!==null&&t!==void 0&&t.aborted)throw new B(void 0,{cause:b.signal.reason});Y(T,Z0)}return T}function q0(b,T){let t=n.call(this,b,T);return async function*Z0(){for await(let W0 of t)yield*W0}.call(this)}function B0(b){if(b=c(b),m(b))return 0;if(b<0)throw new G("number",">= 0",b);return b}function w0(b,T=void 0){if(T!=null)V(T,"options");if((T===null||T===void 0?void 0:T.signal)!=null)W(T.signal,"options.signal");return b=B0(b),async function*t(){var Z0;if(T!==null&&T!==void 0&&(Z0=T.signal)!==null&&Z0!==void 0&&Z0.aborted)throw new B;for await(let C of this){var W0;if(T!==null&&T!==void 0&&(W0=T.signal)!==null&&W0!==void 0&&W0.aborted)throw new B;if(b--<=0)yield C}}.call(this)}function M0(b,T=void 0){if(T!=null)V(T,"options");if((T===null||T===void 0?void 0:T.signal)!=null)W(T.signal,"options.signal");return b=B0(b),async function*t(){var Z0;if(T!==null&&T!==void 0&&(Z0=T.signal)!==null&&Z0!==void 0&&Z0.aborted)throw new B;for await(let C of this){var W0;if(T!==null&&T!==void 0&&(W0=T.signal)!==null&&W0!==void 0&&W0.aborted)throw new B;if(b-- >0)yield C;if(b<=0)return}}.call(this)}Q.streamReturningOperators={asIndexedPairs:z(i,"readable.asIndexedPairs will be removed in a future version."),drop:w0,filter:k,flatMap:q0,map:n,take:M0,compose:I},Q.promiseReturningOperators={every:z0,forEach:U0,reduce:Q0,toArray:E,some:K0,find:S}}),FJ=R0((Q,$)=>{var{ArrayPrototypePop:q,Promise:K}=b0(),{isIterable:J,isNodeStream:Z,isWebStream:G}=V2(),{pipelineImpl:B}=Q9(),{finished:W}=R2();MJ();function U(...V){return new K((N,F)=>{let M,v,x=V[V.length-1];if(x&&typeof x==="object"&&!Z(x)&&!J(x)&&!G(x)){let y=q(V);M=y.signal,v=y.end}B(V,(y,D)=>{if(y)F(y);else N(D)},{signal:M,end:v})})}$.exports={finished:W,pipeline:U}}),MJ=R0((Q,$)=>{var{Buffer:q}=(a0(),y0(s0)),{ObjectDefineProperty:K,ObjectKeys:J,ReflectApply:Z}=b0(),{promisify:{custom:G}}=W1(),{streamReturningOperators:B,promiseReturningOperators:W}=FW(),{codes:{ERR_ILLEGAL_CONSTRUCTOR:U}}=V1(),V=zJ(),{setDefaultHighWaterMark:N,getDefaultHighWaterMark:F}=_5(),{pipeline:M}=Q9(),{destroyer:v}=O6(),x=R2(),y=FJ(),D=V2(),z=$.exports=t7().Stream;z.isDestroyed=D.isDestroyed,z.isDisturbed=D.isDisturbed,z.isErrored=D.isErrored,z.isReadable=D.isReadable,z.isWritable=D.isWritable,z.Readable=c5();for(let H of J(B)){let R=function(...m){if(new.target)throw U();return z.Readable.from(Z(c,this,m))},c=B[H];K(R,"name",{__proto__:null,value:c.name}),K(R,"length",{__proto__:null,value:c.length}),K(z.Readable.prototype,H,{__proto__:null,value:R,enumerable:!1,configurable:!0,writable:!0})}for(let H of J(W)){let R=function(...m){if(new.target)throw U();return Z(c,this,m)},c=W[H];K(R,"name",{__proto__:null,value:c.name}),K(R,"length",{__proto__:null,value:c.length}),K(z.Readable.prototype,H,{__proto__:null,value:R,enumerable:!1,configurable:!0,writable:!0})}z.Writable=e7(),z.Duplex=U2(),z.Transform=BJ(),z.PassThrough=WJ(),z.pipeline=M;var{addAbortSignal:Y}=u5();z.addAbortSignal=Y,z.finished=x,z.destroy=v,z.compose=V,z.setDefaultHighWaterMark=N,z.getDefaultHighWaterMark=F,K(z,"promises",{__proto__:null,configurable:!0,enumerable:!0,get(){return y}}),K(M,G,{__proto__:null,enumerable:!0,get(){return y.pipeline}}),K(x,G,{__proto__:null,enumerable:!0,get(){return y.finished}}),z.Stream=z,z._isUint8Array=function H(R){return R instanceof Uint8Array},z._uint8ArrayToBuffer=function H(R){return q.from(R.buffer,R.byteOffset,R.byteLength)}}),wJ=R0((Q,$)=>{var q=p8();if(q&&process.env.READABLE_STREAM==="disable"){let K=q.promises;$.exports._uint8ArrayToBuffer=q._uint8ArrayToBuffer,$.exports._isUint8Array=q._isUint8Array,$.exports.isDisturbed=q.isDisturbed,$.exports.isErrored=q.isErrored,$.exports.isReadable=q.isReadable,$.exports.Readable=q.Readable,$.exports.Writable=q.Writable,$.exports.Duplex=q.Duplex,$.exports.Transform=q.Transform,$.exports.PassThrough=q.PassThrough,$.exports.addAbortSignal=q.addAbortSignal,$.exports.finished=q.finished,$.exports.destroy=q.destroy,$.exports.pipeline=q.pipeline,$.exports.compose=q.compose,Object.defineProperty(q,"promises",{configurable:!0,enumerable:!0,get(){return K}}),$.exports.Stream=q.Stream}else{let K=MJ(),J=FJ(),Z=K.Readable.destroy;$.exports=K.Readable,$.exports._uint8ArrayToBuffer=K._uint8ArrayToBuffer,$.exports._isUint8Array=K._isUint8Array,$.exports.isDisturbed=K.isDisturbed,$.exports.isErrored=K.isErrored,$.exports.isReadable=K.isReadable,$.exports.Readable=K.Readable,$.exports.Writable=K.Writable,$.exports.Duplex=K.Duplex,$.exports.Transform=K.Transform,$.exports.PassThrough=K.PassThrough,$.exports.addAbortSignal=K.addAbortSignal,$.exports.finished=K.finished,$.exports.destroy=K.destroy,$.exports.destroy=Z,$.exports.pipeline=K.pipeline,$.exports.compose=K.compose,Object.defineProperty(K,"promises",{configurable:!0,enumerable:!0,get(){return J}}),$.exports.Stream=K.Stream}$.exports.default=$.exports}),NJ=R0((Q)=>{var $=UJ(),q=VJ(),K=wJ(),J=Q.readyStates={UNSENT:0,OPENED:1,HEADERS_RECEIVED:2,LOADING:3,DONE:4},Z=Q.IncomingMessage=function(G,B,W,U){var V=this;if(K.Readable.call(V),V._mode=W,V.headers={},V.rawHeaders=[],V.trailers={},V.rawTrailers=[],V.on("end",function(){process.nextTick(function(){V.emit("close")})}),W==="fetch"){let D=function(){M.read().then(function(z){if(V._destroyed)return;if(U(z.done),z.done){V.push(null);return}V.push(Buffer.from(z.value)),D()}).catch(function(z){if(U(!0),!V._destroyed)V.emit("error",z)})};var N=D;if(V._fetchResponse=B,V.url=B.url,V.statusCode=B.status,V.statusMessage=B.statusText,B.headers.forEach(function(z,Y){V.headers[Y.toLowerCase()]=z,V.rawHeaders.push(Y,z)}),$.writableStream){var F=new WritableStream({write:function(z){return U(!1),new Promise(function(Y,H){if(V._destroyed)H();else if(V.push(Buffer.from(z)))Y();else V._resumeFetch=Y})},close:function(){if(U(!0),!V._destroyed)V.push(null)},abort:function(z){if(U(!0),!V._destroyed)V.emit("error",z)}});try{B.body.pipeTo(F).catch(function(z){if(U(!0),!V._destroyed)V.emit("error",z)});return}catch(z){}}var M=B.body.getReader();D()}else{V._xhr=G,V._pos=0,V.url=G.responseURL,V.statusCode=G.status,V.statusMessage=G.statusText;var v=G.getAllResponseHeaders().split(/\r?\n/);if(v.forEach(function(D){var z=D.match(/^([^:]+):\s*(.*)/);if(z){var Y=z[1].toLowerCase();if(Y==="set-cookie"){if(V.headers[Y]===void 0)V.headers[Y]=[];V.headers[Y].push(z[2])}else if(V.headers[Y]!==void 0)V.headers[Y]+=", "+z[2];else V.headers[Y]=z[2];V.rawHeaders.push(z[1],z[2])}}),V._charset="x-user-defined",!$.overrideMimeType){var x=V.rawHeaders["mime-type"];if(x){var y=x.match(/;\s*charset=([^;])(;|$)/);if(y)V._charset=y[1].toLowerCase()}if(!V._charset)V._charset="utf-8"}}};q(Z,K.Readable),Z.prototype._read=function(){var G=this,B=G._resumeFetch;if(B)G._resumeFetch=null,B()},Z.prototype._onXHRProgress=function(G){var B=this,W=B._xhr,U=null;switch(B._mode){case"text":if(U=W.responseText,U.length>B._pos){var V=U.substr(B._pos);if(B._charset==="x-user-defined"){var N=Buffer.alloc(V.length);for(var F=0;FB._pos)B.push(Buffer.from(new Uint8Array(M.result.slice(B._pos)))),B._pos=M.result.byteLength},M.onload=function(){G(!0),B.push(null)},M.readAsArrayBuffer(U);break}if(B._xhr.readyState===J.DONE&&B._mode!=="ms-stream")G(!0),B.push(null)}}),MW=R0((Q,$)=>{var q=UJ(),K=VJ(),J=NJ(),Z=wJ(),G=J.IncomingMessage,B=J.readyStates;function W(F,M){if(q.fetch&&M)return"fetch";else if(q.mozchunkedarraybuffer)return"moz-chunked-arraybuffer";else if(q.msstream)return"ms-stream";else if(q.arraybuffer&&F)return"arraybuffer";else return"text"}var U=$.exports=function(F){var M=this;if(Z.Writable.call(M),M._opts=F,M._body=[],M._headers={},F.auth)M.setHeader("Authorization","Basic "+Buffer.from(F.auth).toString("base64"));Object.keys(F.headers).forEach(function(y){M.setHeader(y,F.headers[y])});var v,x=!0;if(F.mode==="disable-fetch"||"requestTimeout"in F&&!q.abortController)x=!1,v=!0;else if(F.mode==="prefer-streaming")v=!1;else if(F.mode==="allow-wrong-content-type")v=!q.overrideMimeType;else if(!F.mode||F.mode==="default"||F.mode==="prefer-fast")v=!0;else throw new Error("Invalid value for opts.mode");M._mode=W(v,x),M._fetchTimer=null,M._socketTimeout=null,M._socketTimer=null,M.on("finish",function(){M._onFinish()})};K(U,Z.Writable),U.prototype.setHeader=function(F,M){var v=this,x=F.toLowerCase();if(N.indexOf(x)!==-1)return;v._headers[x]={name:F,value:M}},U.prototype.getHeader=function(F){var M=this._headers[F.toLowerCase()];if(M)return M.value;return null},U.prototype.removeHeader=function(F){var M=this;delete M._headers[F.toLowerCase()]},U.prototype._onFinish=function(){var F=this;if(F._destroyed)return;var M=F._opts;if("timeout"in M&&M.timeout!==0)F.setTimeout(M.timeout);var v=F._headers,x=null;if(M.method!=="GET"&&M.method!=="HEAD")x=new Blob(F._body,{type:(v["content-type"]||{}).value||""});var y=[];if(Object.keys(v).forEach(function(H){var R=v[H].name,c=v[H].value;if(Array.isArray(c))c.forEach(function(m){y.push([R,m])});else y.push([R,c])}),F._mode==="fetch"){var D=null;if(q.abortController){var z=new AbortController;if(D=z.signal,F._fetchAbortController=z,"requestTimeout"in M&&M.requestTimeout!==0)F._fetchTimer=global.setTimeout(function(){if(F.emit("requestTimeout"),F._fetchAbortController)F._fetchAbortController.abort()},M.requestTimeout)}global.fetch(F._opts.url,{method:F._opts.method,headers:y,body:x||void 0,mode:"cors",credentials:M.withCredentials?"include":"same-origin",signal:D}).then(function(H){F._fetchResponse=H,F._resetTimers(!1),F._connect()},function(H){if(F._resetTimers(!0),!F._destroyed)F.emit("error",H)})}else{var Y=F._xhr=new global.XMLHttpRequest;try{Y.open(F._opts.method,F._opts.url,!0)}catch(H){process.nextTick(function(){F.emit("error",H)});return}if("responseType"in Y)Y.responseType=F._mode;if("withCredentials"in Y)Y.withCredentials=!!M.withCredentials;if(F._mode==="text"&&"overrideMimeType"in Y)Y.overrideMimeType("text/plain; charset=x-user-defined");if("requestTimeout"in M)Y.timeout=M.requestTimeout,Y.ontimeout=function(){F.emit("requestTimeout")};if(y.forEach(function(H){Y.setRequestHeader(H[0],H[1])}),F._response=null,Y.onreadystatechange=function(){switch(Y.readyState){case B.LOADING:case B.DONE:F._onXHRProgress();break}},F._mode==="moz-chunked-arraybuffer")Y.onprogress=function(){F._onXHRProgress()};Y.onerror=function(){if(F._destroyed)return;F._resetTimers(!0),F.emit("error",new Error("XHR error"))};try{Y.send(x)}catch(H){process.nextTick(function(){F.emit("error",H)});return}}};function V(F){try{var M=F.status;return M!==null&&M!==0}catch(v){return!1}}U.prototype._onXHRProgress=function(){var F=this;if(F._resetTimers(!1),!V(F._xhr)||F._destroyed)return;if(!F._response)F._connect();F._response._onXHRProgress(F._resetTimers.bind(F))},U.prototype._connect=function(){var F=this;if(F._destroyed)return;F._response=new G(F._xhr,F._fetchResponse,F._mode,F._resetTimers.bind(F)),F._response.on("error",function(M){F.emit("error",M)}),F.emit("response",F._response)},U.prototype._write=function(F,M,v){var x=this;x._body.push(F),v()},U.prototype._resetTimers=function(F){var M=this;if(global.clearTimeout(M._socketTimer),M._socketTimer=null,F)global.clearTimeout(M._fetchTimer),M._fetchTimer=null;else if(M._socketTimeout)M._socketTimer=global.setTimeout(function(){M.emit("timeout")},M._socketTimeout)},U.prototype.abort=U.prototype.destroy=function(F){var M=this;if(M._destroyed=!0,M._resetTimers(!0),M._response)M._response._destroyed=!0;if(M._xhr)M._xhr.abort();else if(M._fetchAbortController)M._fetchAbortController.abort();if(F)M.emit("error",F)},U.prototype.end=function(F,M,v){var x=this;if(typeof F==="function")v=F,F=void 0;Z.Writable.prototype.end.call(x,F,M,v)},U.prototype.setTimeout=function(F,M){var v=this;if(M)v.once("timeout",M);v._socketTimeout=F,v._resetTimers(!1)},U.prototype.flushHeaders=function(){},U.prototype.setNoDelay=function(){},U.prototype.setSocketKeepAlive=function(){};var N=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","date","dnt","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","via"]}),wW=R0((Q,$)=>{$.exports=K;var q=Object.prototype.hasOwnProperty;function K(){var J={};for(var Z=0;Z{$.exports=($9(),y0(q9)).STATUS_CODES}),YW=R0((Q)=>{var $=MW(),q=NJ(),K=wW(),J=NW(),Z=(s7(),y0(r7)),G=Q;G.request=function(B,W){if(typeof B==="string")B=Z.parse(B);else B=K(B);var U=global.location.protocol.search(/^https?:$/)===-1?"http:":"",V=B.protocol||U,N=B.hostname||B.host,F=B.port,M=B.path||"/";if(N&&N.indexOf(":")!==-1)N="["+N+"]";B.url=(N?V+"//"+N:"")+(F?":"+F:"")+M,B.method=(B.method||"GET").toUpperCase(),B.headers=B.headers||{};var v=new $(B);if(W)v.on("response",W);return v},G.get=function B(W,U){var V=G.request(W,U);return V.end(),V},G.ClientRequest=$,G.IncomingMessage=q.IncomingMessage,G.Agent=function(){},G.Agent.defaultMaxSockets=4,G.globalAgent=new G.Agent,G.STATUS_CODES=J,G.METHODS=["CHECKOUT","CONNECT","COPY","DELETE","GET","HEAD","LOCK","M-SEARCH","MERGE","MKACTIVITY","MKCOL","MOVE","NOTIFY","OPTIONS","PATCH","POST","PROPFIND","PROPPATCH","PURGE","PUT","REPORT","SEARCH","SUBSCRIBE","TRACE","UNLOCK","UNSUBSCRIBE"]}),LW=UW(YW(),1),{request:DW,get:HW,ClientRequest:kW,IncomingMessage:vW,Agent:IW,globalAgent:RW,STATUS_CODES:CW,METHODS:jW}=LW.default});var LJ={};h2(LJ,{validateHeaderValue:()=>aW,validateHeaderName:()=>oW,setMaxIdleHTTPParsers:()=>lW,request:()=>iW,maxHeaderSize:()=>pW,globalAgent:()=>nW,get:()=>mW,createServer:()=>dW,ServerResponse:()=>bW,Server:()=>cW,STATUS_CODES:()=>_W,OutgoingMessage:()=>uW,METHODS:()=>SW,IncomingMessage:()=>EW,ClientRequest:()=>TW,Agent:()=>PW});var fW,AW,YJ,gW,XW,yW=(Q,$,q)=>{q=Q!=null?fW(AW(Q)):{};let K=$||!Q||!Q.__esModule?YJ(q,"default",{value:Q,enumerable:!0}):q;for(let J of gW(Q))if(!XW.call(K,J))YJ(K,J,{get:()=>Q[J],enumerable:!0});return K},hW=(Q,$)=>()=>($||Q(($={exports:{}}).exports,$),$.exports),xW,OW,PW,TW,EW,SW,uW,_W,cW,bW,dW,mW,nW,pW,iW,lW,oW,aW;var DJ=x2(()=>{fW=Object.create,{getPrototypeOf:AW,defineProperty:YJ,getOwnPropertyNames:gW}=Object,XW=Object.prototype.hasOwnProperty,xW=hW((Q,$)=>{var q=($9(),y0(q9)),K=(s7(),y0(r7)),J=Q;for(Z in q)if(q.hasOwnProperty(Z))J[Z]=q[Z];var Z;J.request=function(B,W){return B=G(B),q.request.call(this,B,W)},J.get=function(B,W){return B=G(B),q.get.call(this,B,W)};function G(B){if(typeof B==="string")B=K.parse(B);if(!B.protocol)B.protocol="https:";if(B.protocol!=="https:")throw new Error('Protocol "'+B.protocol+'" not supported. Expected "https:"');return B}}),OW=yW(xW(),1),{Agent:PW,ClientRequest:TW,IncomingMessage:EW,METHODS:SW,OutgoingMessage:uW,STATUS_CODES:_W,Server:cW,ServerResponse:bW,createServer:dW,get:mW,globalAgent:nW,maxHeaderSize:pW,request:iW,setMaxIdleHTTPParsers:lW,validateHeaderName:oW,validateHeaderValue:aW}=OW});var A9=globalThis;if(typeof A9.global==="undefined")A9.global=globalThis;a0();var bz=E8(t9());var L9=E8(dK());function H1(Q,$,q,K){function J(Z){return Z instanceof q?Z:new q(function(G){G(Z)})}return new(q||(q=Promise))(function(Z,G){function B(V){try{U(K.next(V))}catch(N){G(N)}}function W(V){try{U(K.throw(V))}catch(N){G(N)}}function U(V){V.done?Z(V.value):J(V.value).then(B,W)}U((K=K.apply(Q,$||[])).next())})}var H0=914400,T8=12700,r0=`\r -`,rW=2147483649,K9=/^[0-9a-fA-F]{6}$/,sW=1.67,tW=27,P6={type:"solid",color:"666666",pt:1},CJ=[0.05,0.1,0.05,0.1],T6={color:"363636",pt:1},$6={color:"888888",style:"solid",size:1,cap:"flat"},z1="000000",f1=12,eW=18,E6="LAYOUT_16x9",B9="DEFAULT",jJ="333333",Q6={type:"outer",blur:3,offset:1.811023622047244,angle:90,color:"000000",opacity:0.35,rotateWithShape:!0},P8=[0.5,0.5,0.5,0.5],HJ={color:"000000"},Qz={size:8,color:"FFFFFF",opacity:0.75},Z2="2094734552",d5="2094734553",h8="2094734554",W9="2094734555",fJ="2094734556",y8="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),x8=["C0504D","4F81BD","9BBB59","8064A2","4BACC6","F79646","628FC6","C86360","C0504D","4F81BD","9BBB59","8064A2","4BACC6","F79646","628FC6","C86360"],qz=["5DA5DA","FAA43A","60BD68","F17CB0","B2912F","B276B2","DECF3F","F15854","A7A7A7","5DA5DA","FAA43A","60BD68","F17CB0","B2912F","B276B2","DECF3F","F15854","A7A7A7"],S6;(function(Q){Q.left="left",Q.center="center",Q.right="right",Q.justify="justify"})(S6||(S6={}));var u6;(function(Q){Q.b="b",Q.ctr="ctr",Q.t="t"})(u6||(u6={}));var AJ="{F7021451-1387-4CA6-816F-3879F97B5CBC}",z9;(function(Q){Q.arraybuffer="arraybuffer",Q.base64="base64",Q.binarystring="binarystring",Q.blob="blob",Q.nodebuffer="nodebuffer",Q.uint8array="uint8array"})(z9||(z9={}));var F9;(function(Q){Q.area="area",Q.bar="bar",Q.bar3d="bar3D",Q.bubble="bubble",Q.bubble3d="bubble3D",Q.doughnut="doughnut",Q.line="line",Q.pie="pie",Q.radar="radar",Q.scatter="scatter"})(F9||(F9={}));var M9;(function(Q){Q.accentBorderCallout1="accentBorderCallout1",Q.accentBorderCallout2="accentBorderCallout2",Q.accentBorderCallout3="accentBorderCallout3",Q.accentCallout1="accentCallout1",Q.accentCallout2="accentCallout2",Q.accentCallout3="accentCallout3",Q.actionButtonBackPrevious="actionButtonBackPrevious",Q.actionButtonBeginning="actionButtonBeginning",Q.actionButtonBlank="actionButtonBlank",Q.actionButtonDocument="actionButtonDocument",Q.actionButtonEnd="actionButtonEnd",Q.actionButtonForwardNext="actionButtonForwardNext",Q.actionButtonHelp="actionButtonHelp",Q.actionButtonHome="actionButtonHome",Q.actionButtonInformation="actionButtonInformation",Q.actionButtonMovie="actionButtonMovie",Q.actionButtonReturn="actionButtonReturn",Q.actionButtonSound="actionButtonSound",Q.arc="arc",Q.bentArrow="bentArrow",Q.bentUpArrow="bentUpArrow",Q.bevel="bevel",Q.blockArc="blockArc",Q.borderCallout1="borderCallout1",Q.borderCallout2="borderCallout2",Q.borderCallout3="borderCallout3",Q.bracePair="bracePair",Q.bracketPair="bracketPair",Q.callout1="callout1",Q.callout2="callout2",Q.callout3="callout3",Q.can="can",Q.chartPlus="chartPlus",Q.chartStar="chartStar",Q.chartX="chartX",Q.chevron="chevron",Q.chord="chord",Q.circularArrow="circularArrow",Q.cloud="cloud",Q.cloudCallout="cloudCallout",Q.corner="corner",Q.cornerTabs="cornerTabs",Q.cube="cube",Q.curvedDownArrow="curvedDownArrow",Q.curvedLeftArrow="curvedLeftArrow",Q.curvedRightArrow="curvedRightArrow",Q.curvedUpArrow="curvedUpArrow",Q.custGeom="custGeom",Q.decagon="decagon",Q.diagStripe="diagStripe",Q.diamond="diamond",Q.dodecagon="dodecagon",Q.donut="donut",Q.doubleWave="doubleWave",Q.downArrow="downArrow",Q.downArrowCallout="downArrowCallout",Q.ellipse="ellipse",Q.ellipseRibbon="ellipseRibbon",Q.ellipseRibbon2="ellipseRibbon2",Q.flowChartAlternateProcess="flowChartAlternateProcess",Q.flowChartCollate="flowChartCollate",Q.flowChartConnector="flowChartConnector",Q.flowChartDecision="flowChartDecision",Q.flowChartDelay="flowChartDelay",Q.flowChartDisplay="flowChartDisplay",Q.flowChartDocument="flowChartDocument",Q.flowChartExtract="flowChartExtract",Q.flowChartInputOutput="flowChartInputOutput",Q.flowChartInternalStorage="flowChartInternalStorage",Q.flowChartMagneticDisk="flowChartMagneticDisk",Q.flowChartMagneticDrum="flowChartMagneticDrum",Q.flowChartMagneticTape="flowChartMagneticTape",Q.flowChartManualInput="flowChartManualInput",Q.flowChartManualOperation="flowChartManualOperation",Q.flowChartMerge="flowChartMerge",Q.flowChartMultidocument="flowChartMultidocument",Q.flowChartOfflineStorage="flowChartOfflineStorage",Q.flowChartOffpageConnector="flowChartOffpageConnector",Q.flowChartOnlineStorage="flowChartOnlineStorage",Q.flowChartOr="flowChartOr",Q.flowChartPredefinedProcess="flowChartPredefinedProcess",Q.flowChartPreparation="flowChartPreparation",Q.flowChartProcess="flowChartProcess",Q.flowChartPunchedCard="flowChartPunchedCard",Q.flowChartPunchedTape="flowChartPunchedTape",Q.flowChartSort="flowChartSort",Q.flowChartSummingJunction="flowChartSummingJunction",Q.flowChartTerminator="flowChartTerminator",Q.folderCorner="folderCorner",Q.frame="frame",Q.funnel="funnel",Q.gear6="gear6",Q.gear9="gear9",Q.halfFrame="halfFrame",Q.heart="heart",Q.heptagon="heptagon",Q.hexagon="hexagon",Q.homePlate="homePlate",Q.horizontalScroll="horizontalScroll",Q.irregularSeal1="irregularSeal1",Q.irregularSeal2="irregularSeal2",Q.leftArrow="leftArrow",Q.leftArrowCallout="leftArrowCallout",Q.leftBrace="leftBrace",Q.leftBracket="leftBracket",Q.leftCircularArrow="leftCircularArrow",Q.leftRightArrow="leftRightArrow",Q.leftRightArrowCallout="leftRightArrowCallout",Q.leftRightCircularArrow="leftRightCircularArrow",Q.leftRightRibbon="leftRightRibbon",Q.leftRightUpArrow="leftRightUpArrow",Q.leftUpArrow="leftUpArrow",Q.lightningBolt="lightningBolt",Q.line="line",Q.lineInv="lineInv",Q.mathDivide="mathDivide",Q.mathEqual="mathEqual",Q.mathMinus="mathMinus",Q.mathMultiply="mathMultiply",Q.mathNotEqual="mathNotEqual",Q.mathPlus="mathPlus",Q.moon="moon",Q.noSmoking="noSmoking",Q.nonIsoscelesTrapezoid="nonIsoscelesTrapezoid",Q.notchedRightArrow="notchedRightArrow",Q.octagon="octagon",Q.parallelogram="parallelogram",Q.pentagon="pentagon",Q.pie="pie",Q.pieWedge="pieWedge",Q.plaque="plaque",Q.plaqueTabs="plaqueTabs",Q.plus="plus",Q.quadArrow="quadArrow",Q.quadArrowCallout="quadArrowCallout",Q.rect="rect",Q.ribbon="ribbon",Q.ribbon2="ribbon2",Q.rightArrow="rightArrow",Q.rightArrowCallout="rightArrowCallout",Q.rightBrace="rightBrace",Q.rightBracket="rightBracket",Q.round1Rect="round1Rect",Q.round2DiagRect="round2DiagRect",Q.round2SameRect="round2SameRect",Q.roundRect="roundRect",Q.rtTriangle="rtTriangle",Q.smileyFace="smileyFace",Q.snip1Rect="snip1Rect",Q.snip2DiagRect="snip2DiagRect",Q.snip2SameRect="snip2SameRect",Q.snipRoundRect="snipRoundRect",Q.squareTabs="squareTabs",Q.star10="star10",Q.star12="star12",Q.star16="star16",Q.star24="star24",Q.star32="star32",Q.star4="star4",Q.star5="star5",Q.star6="star6",Q.star7="star7",Q.star8="star8",Q.stripedRightArrow="stripedRightArrow",Q.sun="sun",Q.swooshArrow="swooshArrow",Q.teardrop="teardrop",Q.trapezoid="trapezoid",Q.triangle="triangle",Q.upArrow="upArrow",Q.upArrowCallout="upArrowCallout",Q.upDownArrow="upDownArrow",Q.upDownArrowCallout="upDownArrowCallout",Q.uturnArrow="uturnArrow",Q.verticalScroll="verticalScroll",Q.wave="wave",Q.wedgeEllipseCallout="wedgeEllipseCallout",Q.wedgeRectCallout="wedgeRectCallout",Q.wedgeRoundRectCallout="wedgeRoundRectCallout"})(M9||(M9={}));var D1;(function(Q){Q.text1="tx1",Q.text2="tx2",Q.background1="bg1",Q.background2="bg2",Q.accent1="accent1",Q.accent2="accent2",Q.accent3="accent3",Q.accent4="accent4",Q.accent5="accent5",Q.accent6="accent6"})(D1||(D1={}));var w9;(function(Q){Q.left="left",Q.center="center",Q.right="right",Q.justify="justify"})(w9||(w9={}));var N9;(function(Q){Q.top="top",Q.middle="middle",Q.bottom="bottom"})(N9||(N9={}));var j2;(function(Q){Q.ACTION_BUTTON_BACK_OR_PREVIOUS="actionButtonBackPrevious",Q.ACTION_BUTTON_BEGINNING="actionButtonBeginning",Q.ACTION_BUTTON_CUSTOM="actionButtonBlank",Q.ACTION_BUTTON_DOCUMENT="actionButtonDocument",Q.ACTION_BUTTON_END="actionButtonEnd",Q.ACTION_BUTTON_FORWARD_OR_NEXT="actionButtonForwardNext",Q.ACTION_BUTTON_HELP="actionButtonHelp",Q.ACTION_BUTTON_HOME="actionButtonHome",Q.ACTION_BUTTON_INFORMATION="actionButtonInformation",Q.ACTION_BUTTON_MOVIE="actionButtonMovie",Q.ACTION_BUTTON_RETURN="actionButtonReturn",Q.ACTION_BUTTON_SOUND="actionButtonSound",Q.ARC="arc",Q.BALLOON="wedgeRoundRectCallout",Q.BENT_ARROW="bentArrow",Q.BENT_UP_ARROW="bentUpArrow",Q.BEVEL="bevel",Q.BLOCK_ARC="blockArc",Q.CAN="can",Q.CHART_PLUS="chartPlus",Q.CHART_STAR="chartStar",Q.CHART_X="chartX",Q.CHEVRON="chevron",Q.CHORD="chord",Q.CIRCULAR_ARROW="circularArrow",Q.CLOUD="cloud",Q.CLOUD_CALLOUT="cloudCallout",Q.CORNER="corner",Q.CORNER_TABS="cornerTabs",Q.CROSS="plus",Q.CUBE="cube",Q.CURVED_DOWN_ARROW="curvedDownArrow",Q.CURVED_DOWN_RIBBON="ellipseRibbon",Q.CURVED_LEFT_ARROW="curvedLeftArrow",Q.CURVED_RIGHT_ARROW="curvedRightArrow",Q.CURVED_UP_ARROW="curvedUpArrow",Q.CURVED_UP_RIBBON="ellipseRibbon2",Q.CUSTOM_GEOMETRY="custGeom",Q.DECAGON="decagon",Q.DIAGONAL_STRIPE="diagStripe",Q.DIAMOND="diamond",Q.DODECAGON="dodecagon",Q.DONUT="donut",Q.DOUBLE_BRACE="bracePair",Q.DOUBLE_BRACKET="bracketPair",Q.DOUBLE_WAVE="doubleWave",Q.DOWN_ARROW="downArrow",Q.DOWN_ARROW_CALLOUT="downArrowCallout",Q.DOWN_RIBBON="ribbon",Q.EXPLOSION1="irregularSeal1",Q.EXPLOSION2="irregularSeal2",Q.FLOWCHART_ALTERNATE_PROCESS="flowChartAlternateProcess",Q.FLOWCHART_CARD="flowChartPunchedCard",Q.FLOWCHART_COLLATE="flowChartCollate",Q.FLOWCHART_CONNECTOR="flowChartConnector",Q.FLOWCHART_DATA="flowChartInputOutput",Q.FLOWCHART_DECISION="flowChartDecision",Q.FLOWCHART_DELAY="flowChartDelay",Q.FLOWCHART_DIRECT_ACCESS_STORAGE="flowChartMagneticDrum",Q.FLOWCHART_DISPLAY="flowChartDisplay",Q.FLOWCHART_DOCUMENT="flowChartDocument",Q.FLOWCHART_EXTRACT="flowChartExtract",Q.FLOWCHART_INTERNAL_STORAGE="flowChartInternalStorage",Q.FLOWCHART_MAGNETIC_DISK="flowChartMagneticDisk",Q.FLOWCHART_MANUAL_INPUT="flowChartManualInput",Q.FLOWCHART_MANUAL_OPERATION="flowChartManualOperation",Q.FLOWCHART_MERGE="flowChartMerge",Q.FLOWCHART_MULTIDOCUMENT="flowChartMultidocument",Q.FLOWCHART_OFFLINE_STORAGE="flowChartOfflineStorage",Q.FLOWCHART_OFFPAGE_CONNECTOR="flowChartOffpageConnector",Q.FLOWCHART_OR="flowChartOr",Q.FLOWCHART_PREDEFINED_PROCESS="flowChartPredefinedProcess",Q.FLOWCHART_PREPARATION="flowChartPreparation",Q.FLOWCHART_PROCESS="flowChartProcess",Q.FLOWCHART_PUNCHED_TAPE="flowChartPunchedTape",Q.FLOWCHART_SEQUENTIAL_ACCESS_STORAGE="flowChartMagneticTape",Q.FLOWCHART_SORT="flowChartSort",Q.FLOWCHART_STORED_DATA="flowChartOnlineStorage",Q.FLOWCHART_SUMMING_JUNCTION="flowChartSummingJunction",Q.FLOWCHART_TERMINATOR="flowChartTerminator",Q.FOLDED_CORNER="folderCorner",Q.FRAME="frame",Q.FUNNEL="funnel",Q.GEAR_6="gear6",Q.GEAR_9="gear9",Q.HALF_FRAME="halfFrame",Q.HEART="heart",Q.HEPTAGON="heptagon",Q.HEXAGON="hexagon",Q.HORIZONTAL_SCROLL="horizontalScroll",Q.ISOSCELES_TRIANGLE="triangle",Q.LEFT_ARROW="leftArrow",Q.LEFT_ARROW_CALLOUT="leftArrowCallout",Q.LEFT_BRACE="leftBrace",Q.LEFT_BRACKET="leftBracket",Q.LEFT_CIRCULAR_ARROW="leftCircularArrow",Q.LEFT_RIGHT_ARROW="leftRightArrow",Q.LEFT_RIGHT_ARROW_CALLOUT="leftRightArrowCallout",Q.LEFT_RIGHT_CIRCULAR_ARROW="leftRightCircularArrow",Q.LEFT_RIGHT_RIBBON="leftRightRibbon",Q.LEFT_RIGHT_UP_ARROW="leftRightUpArrow",Q.LEFT_UP_ARROW="leftUpArrow",Q.LIGHTNING_BOLT="lightningBolt",Q.LINE_CALLOUT_1="borderCallout1",Q.LINE_CALLOUT_1_ACCENT_BAR="accentCallout1",Q.LINE_CALLOUT_1_BORDER_AND_ACCENT_BAR="accentBorderCallout1",Q.LINE_CALLOUT_1_NO_BORDER="callout1",Q.LINE_CALLOUT_2="borderCallout2",Q.LINE_CALLOUT_2_ACCENT_BAR="accentCallout2",Q.LINE_CALLOUT_2_BORDER_AND_ACCENT_BAR="accentBorderCallout2",Q.LINE_CALLOUT_2_NO_BORDER="callout2",Q.LINE_CALLOUT_3="borderCallout3",Q.LINE_CALLOUT_3_ACCENT_BAR="accentCallout3",Q.LINE_CALLOUT_3_BORDER_AND_ACCENT_BAR="accentBorderCallout3",Q.LINE_CALLOUT_3_NO_BORDER="callout3",Q.LINE_CALLOUT_4="borderCallout4",Q.LINE_CALLOUT_4_ACCENT_BAR="accentCallout3=4",Q.LINE_CALLOUT_4_BORDER_AND_ACCENT_BAR="accentBorderCallout4",Q.LINE_CALLOUT_4_NO_BORDER="callout4",Q.LINE="line",Q.LINE_INVERSE="lineInv",Q.MATH_DIVIDE="mathDivide",Q.MATH_EQUAL="mathEqual",Q.MATH_MINUS="mathMinus",Q.MATH_MULTIPLY="mathMultiply",Q.MATH_NOT_EQUAL="mathNotEqual",Q.MATH_PLUS="mathPlus",Q.MOON="moon",Q.NON_ISOSCELES_TRAPEZOID="nonIsoscelesTrapezoid",Q.NOTCHED_RIGHT_ARROW="notchedRightArrow",Q.NO_SYMBOL="noSmoking",Q.OCTAGON="octagon",Q.OVAL="ellipse",Q.OVAL_CALLOUT="wedgeEllipseCallout",Q.PARALLELOGRAM="parallelogram",Q.PENTAGON="homePlate",Q.PIE="pie",Q.PIE_WEDGE="pieWedge",Q.PLAQUE="plaque",Q.PLAQUE_TABS="plaqueTabs",Q.QUAD_ARROW="quadArrow",Q.QUAD_ARROW_CALLOUT="quadArrowCallout",Q.RECTANGLE="rect",Q.RECTANGULAR_CALLOUT="wedgeRectCallout",Q.REGULAR_PENTAGON="pentagon",Q.RIGHT_ARROW="rightArrow",Q.RIGHT_ARROW_CALLOUT="rightArrowCallout",Q.RIGHT_BRACE="rightBrace",Q.RIGHT_BRACKET="rightBracket",Q.RIGHT_TRIANGLE="rtTriangle",Q.ROUNDED_RECTANGLE="roundRect",Q.ROUNDED_RECTANGULAR_CALLOUT="wedgeRoundRectCallout",Q.ROUND_1_RECTANGLE="round1Rect",Q.ROUND_2_DIAG_RECTANGLE="round2DiagRect",Q.ROUND_2_SAME_RECTANGLE="round2SameRect",Q.SMILEY_FACE="smileyFace",Q.SNIP_1_RECTANGLE="snip1Rect",Q.SNIP_2_DIAG_RECTANGLE="snip2DiagRect",Q.SNIP_2_SAME_RECTANGLE="snip2SameRect",Q.SNIP_ROUND_RECTANGLE="snipRoundRect",Q.SQUARE_TABS="squareTabs",Q.STAR_10_POINT="star10",Q.STAR_12_POINT="star12",Q.STAR_16_POINT="star16",Q.STAR_24_POINT="star24",Q.STAR_32_POINT="star32",Q.STAR_4_POINT="star4",Q.STAR_5_POINT="star5",Q.STAR_6_POINT="star6",Q.STAR_7_POINT="star7",Q.STAR_8_POINT="star8",Q.STRIPED_RIGHT_ARROW="stripedRightArrow",Q.SUN="sun",Q.SWOOSH_ARROW="swooshArrow",Q.TEAR="teardrop",Q.TRAPEZOID="trapezoid",Q.UP_ARROW="upArrow",Q.UP_ARROW_CALLOUT="upArrowCallout",Q.UP_DOWN_ARROW="upDownArrow",Q.UP_DOWN_ARROW_CALLOUT="upDownArrowCallout",Q.UP_RIBBON="ribbon2",Q.U_TURN_ARROW="uturnArrow",Q.VERTICAL_SCROLL="verticalScroll",Q.WAVE="wave"})(j2||(j2={}));var F0;(function(Q){Q.AREA="area",Q.BAR="bar",Q.BAR3D="bar3D",Q.BUBBLE="bubble",Q.BUBBLE3D="bubble3D",Q.DOUGHNUT="doughnut",Q.LINE="line",Q.PIE="pie",Q.RADAR="radar",Q.SCATTER="scatter"})(F0||(F0={}));var p5;(function(Q){Q.TEXT1="tx1",Q.TEXT2="tx2",Q.BACKGROUND1="bg1",Q.BACKGROUND2="bg2",Q.ACCENT1="accent1",Q.ACCENT2="accent2",Q.ACCENT3="accent3",Q.ACCENT4="accent4",Q.ACCENT5="accent5",Q.ACCENT6="accent6"})(p5||(p5={}));var C2;(function(Q){Q.chart="chart",Q.image="image",Q.line="line",Q.rect="rect",Q.text="text",Q.placeholder="placeholder"})(C2||(C2={}));var D0;(function(Q){Q.chart="chart",Q.hyperlink="hyperlink",Q.image="image",Q.media="media",Q.online="online",Q.placeholder="placeholder",Q.table="table",Q.tablecell="tablecell",Q.text="text",Q.notes="notes"})(D0||(D0={}));var O8;(function(Q){Q.title="title",Q.body="body",Q.image="pic",Q.chart="chart",Q.table="tbl",Q.media="media"})(O8||(O8={}));var _6;(function(Q){Q.DEFAULT="•",Q.CHECK="✓",Q.STAR="★",Q.TRIANGLE="▶"})(_6||(_6={}));var c6="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAB3CAYAAAD1oOVhAAAGAUlEQVR4Xu2dT0xcRRzHf7tAYSsc0EBSIq2xEg8mtTGebVzEqOVIolz0siRE4gGTStqKwdpWsXoyGhMuyAVJOHBgqyvLNgonDkabeCBYW/8kTUr0wsJC+Wfm0bfuvn37Znbem9mR9303mJnf/Pb7ed95M7PDI5JIJPYJV5EC7e3t1N/fT62trdqViQCIu+bVgpIHEo/Hqbe3V/sdYVKHyWSSZmZm8ilVA0oeyNjYmEnaVC2Xvr6+qg5fAOJAz4DU1dURGzFSqZRVqtMpAFIGyMjICC0vL9PExIRWKADiAYTNshYWFrRCARAOEFZcCKWtrY0GBgaUTYkBRACIE4rKZwqACALR5RQAqQCIDqcASIVAVDsFQCSAqHQKgEgCUeUUAPEBRIVTAMQnEBvK5OQkbW9vk991CoAEAMQJxc86BUACAhKUUwAkQCBBOAVAAgbi1ykAogCIH6cAiCIgsk4BEIVAZJwCIIqBVLqiBxANQFgXS0tLND4+zl08AogmIG5OSSQS1gGKwgtANAIRcQqAaAbCe6YASBWA2E6xDyeyDUl7+AKQMkDYYevm5mZHabA/Li4uUiaTsYLau8QA4gLE/hU7wajyYtv1hReDAiAOxQcHBymbzark4BkbQKom/X8dp9Npmpqasn4BIAYAYSnYp+4BBEAMUcCwNOCQsAKZnp62NtQOw8WmwT09PUo+ijaHsOMx7GppaaH6+nolH0Z10K2tLVpdXbW6UfV3mNqBdHd3U1NTk2rtlMRfW1uj2dlZAFGirkRQAJEQTWUTAFGprkRsAJEQTWUTAFGprkRsAJEQTWUTAFGprkRsAJEQTWUTAFGprkRsAJEQTWUTAFGprkRsAJEQTWUTAGHqrm8caPzQ0WC1logbeiC7X3xJm0PvUmRzh45cuki1588FAmVn9BO6P3yF9utrqGH0MtW82S8UN9RA9v/4k7InjhcJFTs/TLVXLwmJV67S7vD7tHF5pKi46fYdosdOcOOGG8j1OcqefbFEJD9Q3GCwDhqT31HklS4A8VRgfYM2Op6k3bt/BQJl58J7lPvwg5JYNccepaMry0LPqFA7hCm39+NNyp2J0172b19QysGINj5CsRtpij57musOViH0QPJQXn6J9u7dlYJSFkbrMYolrwvDAJAC+WWdEpQz7FTgECeUCpzi6YxvvqXoM6eEhqnCSgDikEzUKUE7Aw7xuHctKB5OYU3dZlNR9syQdAaAcAYTC0pXF+39c09o2Ik+3EqxVKqiB7hbYAxZkk4pbBaEM+AQofv+wTrFwylBOQNABIGwavdfe4O2pg5elO+86l99nY58/VUF0byrYsjiSFluNlXYrOHcBar7+EogUADEQ0YRGHbzoKAASBkg2+9cpM1rV0tK2QOcXW7bLEFAARAXIF4w2DrDWoeUWaf4hQIgDiA8GPZ2iNfi0Q8UACkAIgrDbrJ385eDxaPLLrEsFAB5oG6lMPJQPLZZZKAACBGVhcG2Q+bmuLu2nk55e4jqPv1IeEoceiBeX7s2zCa5MAqdstl91vfXwaEGsv/rb5TtOFk6tWXOuJGh6KmnhO9sayrMninPx103JBtXblHkice58cINZP4Hyr5wpkgkdiChEmc4FWazLzenNKa/p0jncwDiqcD6BuWePk07t1asatZGoYQzSqA4nFJ7soNiP/+EUyfc25GI2GG53dHPrKo1g/1Cw4pIXLrzO+1c+/wg7tBbFDle/EbQcjFCPWQJCau5EoBoFpzXHYDwFNJcDiCaBed1ByA8hTSXA4hmwXndAQhPIc3lAKJZcF53AMJTSHM5gGgWnNcdgPAU0lwOIJoF53UHIDyFNJcfSiCdnZ0Ui8U0SxlMd7lcjubn561gh+Y1scFIU/0o/3sgeLO12E2k7UXKYumgFoAYdg8ACIAYpoBh6cAhAGKYAoalA4cAiGEKGJYOHAIghilgWDpwCIAYpoBh6cAhAGKYAoalA4cAiGEKGJYOHAIghilgWDpwCIAYpoBh6ZQ4JB6PKzviYthnNy4d9h+1M5mMlVckkUjsG5dhiBMCEMPg/wuOfrZZ/RSywQAAAABJRU5ErkJggg==",$z="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB4AAAAVnCAYAAACzfHDVAAAAYHpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjaVcjJDYAwDEXBu6ughBfH+YnLQSwSHVA+Yrkwx7HtPHabHuEWrQ+lBBAZ6TMweBWoCwUH8quZH6VWFXVT696zxp12ARkVFEqn8wB8AAAACXBIWXMAAC4jAAAuIwF4pT92AADZLklEQVR42uzdd5hV9Z0/8M+dmcsUZmDovYOhKCiKYhR7JJuoSTCWGFI0WUxijBoTTXazVlyza4maYm9rTRSJigVsqCDNQhHBAogKCEgRMjMMU+7vj93sL8kqClLmnPt6PY+PeXZM9vP9vO8jZ+Y955xMfJLjorBrRMuSgmiViyjN1Ee2oSCyucbIBAAAAAAAAADbXaYgcoWNUZcrirpMbdRsysa69wbF+rggGrf439vSF7seF12aFUTnxvoosGIAAAAAAACAXacgoqEgF++/VRgr4r5o+Kh/pvD//F8uiII+LaPrum/EXzqui2b1ddHGKgEAAAAAAAB2rVxEQWMmWrQtjHZlA6N2w2tR84//zP8pgHu3ib6NBdG+zdqorK6KVUXZaB85j3sGAAAAAAAAaAoaG6OwIBdtyneP2PBabPzbr/1dAdx3VHRtyESHiIhcYzQrLo7WmVzkcjmPgAYAAAAAAABoSgpy0eIfS+D/LYD7fy3abC6Inn/7X2hsjELlLwAAAAAAAEDT9D8lcM1fHwddFBFxyAVR9M686PVp/gfqayKiJiLqLBMAAAAAAABgh8hGRGlEUekn/6PFEb3ikNgQk6O+KCJi6dzoksv83/cB/1X9xoiaJdmoWxlRV1dk2QAAAAAAAAA7QTZbH9muERX96v7n9t7/q6Exinq3i86LI94pjOOisHUu+uYykfmof7h+Y8Sa6aVRt74gGhs9DRoAAAAAAABgZ2lsLIi69QWxeUUmSjs0/vedwR8hk4uydSfE+wVd6qOyMfMx7/mtj9jwUtbjngEAAAAAAAB2obrqolg7IxtR/9Ffb4wo7P5GtCwobRaVH/c/UvNmNuqqPfIZAAAAAAAAYFerqy6KmjezH/v1ktpoVZBr/PgCeMN7yl8AAAAAAACApmJLHW5jUVQWNDSP+Q3ZeLco4i9/+8X6teHRzwAAAAAAAABNSd3/dLn/oLAoqqIuVhXFxhhSGB/xqGjlLwAAAAAAAECTU1eTjaK/KXSLIv7SWB+bc5ko9YxnAAAAAAAAgATJFv393bz1EeV//c8F1gMAAAAAAACQDgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKREkRUAAACwrUpLSwuGDRvWfMCAAS26du3avKysrLiioqKkZcuWzZs1a1bcvHnz0tLS0rJsNtusuLi4ebNmzUoLCgo+8/eijY2N9Zs3b66pra2tqqur21xTU1NdVVVVs2nTptqNGzdWbdiwoeYvf/nL5hUrVlQtWLBgw6xZs6pqamoaJQYAAEDaKYABAACIiIghQ4aUHnTQQW379u3bql27dq3at2/fpkWLFq2bN29eWVpa2qpZs2bNCwsLm2ez2fLCwsLyoqKi8sLCwtKknK+hoaG6vr6+qqGh4S91dXV/aWhoqNq8eXNVTU3NuqqqqvUbNmxYu2rVqjWrV69e99Zbb6177rnnPpgzZ06NTwYAAABJogAGAADIA8OGDWt+xBFHdBwwYECnLl26dGjdunXHFi1adCgtLe1YUlLSvlmzZq0KCgqK07yDwsLCssLCwrKIaPdp/zuNjY21mzdvXrdp06ZVNTU172/YsGHl2rVr31+2bNnKBQsWrHjyySffnzVrVpVPGAAAAE1Fpuexsd9HfaF+ZcSal0ptCAAAIAE6deqUPf744zvtueeeXbp3796lbdu2XSorKzuXlpZ2KS0t7VBYWFhhSztGQ0PDxpqampU1NTXL169fv+yDDz5Y9s477yybPXv2sj/96U8rVqxYUWdLAAAAbE9t9q6Jog4f/TUFMAAAQEJks9nMt7/97Y4jRozo1bdv397t2rXrXl5e3rWsrKxzcXFx+4gosKUmp7G2tnZVTU3Nso0bNy5btWrV0tdff/2tJ598cvG999672noAAADYFgpgAACAhPne977X6a9Fb/v27Xu1bNmyV1lZWa8kvXOXLauvr9/wl7/8ZdG6desWL1u2bNHChQsX/fGPf1w8derUjbYDAADAliiAAQAAmqhsNps59dRTuxx66KH9+/Tp87n27dv3Ly8v719UVOSRzXlq06ZNKzZu3Pj6+++//8abb775xqOPPvrG3XffvcpmAAAA+CsFMAAAQBNx6qmndvniF784qHfv3v3btWv3uYqKis8VFhaW2wxbUl9fv37Dhg1vfPDBB68vXrz4jccee2z+jTfeuNxmAAAA8pMCGAAAYBc45phjWn/rW9/aq3///kPatGnTv6Kiop9HOLO9NDQ0VG/cuPGtNWvWLFy4cOGcO+6445WHHnporc0AAACknwIYAABgJzjjjDO6f+lLX9qrV69eg1u3bj2orKysR0RkbIadJFddXb103bp18xcvXjz30UcffeXqq69+x1oAAADSRwEMAACwnZWWlhb86le/2u3QQw8d1r17931btmw5qLCwsMxmaEoaGhqqP/zww/nvvPPOzGeeeWbW2LFj36ipqWm0GQAAgGRTAAMAAGwHP/7xj7t+9atf3bdXr15D27Ztu1c2m21jKyRJXV3dmg8++OCVRYsWvfznP/95xh/+8IdltgIAAJA8CmAAAIBtcOKJJ7Y75ZRTDujXr9+w1q1bD81ms61shTSpq6tbt3bt2pfffPPNWbfccsvUe++9d7WtAAAANH0KYAAAgE+hoqKi4IILLhg0YsSI/bp27bpfy5YtB2YymUKbIR/kcrmGDz/8cP6777474/nnn59x4YUXvrZx40aPiwYAAGiCFMAAAAAf4/jjj2/7/e9//8D+/fsf2Lp1630KCgpKbAUiGhsbN61fv37eW2+9NeWGG2545u67715lKwAAAE2DAhgAAOB/ZLPZzAUXXPC5I4888sDu3bsfWFFRsVtEFNgMbFl1dfWSd999d8qsWbNmnnvuuS+vW7euwVYAAAB2DQUwAACQ10pLSwsuvfTSQYcccsjBXbt2HVFWVtbDVmDb1dbWrnr//fdfmDp16uRf/vKXL65evbreVgAAAHYeBTAAAJB3Bg0aVHrBBRd8fs899zywQ4cOBxQVFbWwFdj+Ghsba9euXTtrzpw5T59//vmTX3755WpbAQAA2LEUwAAAQF4YNmxY8/POO+/gIUOGHOZ9vrDz/W0ZfNFFFz07a9asKlsBAADY/hTAAABAarVq1arwyiuv3HfEiBEjO3TocFBhYWGZrcCu19DQUP3+++8/O2XKlIk/+clPZm7cuLHRVgAAALYPBTAAAJAqrVq1Kvztb3+7/3777Xd4x44dRxQWFpbbCjRdDQ0NG99///0pM2bMeOqHP/zhC8pgAACAz0YBDAAApMJZZ53V45vf/OaRvXr1GllaWtrVRiB5ampq3l28ePHEO++8c9LVV1/9jo0AAABsPQUwAACQWMOHDy+/6KKLvjB48OCjW7RoMdBGID0+/PDDV+fNmzfhvPPOe3L69Ol/sREAAIBPRwEMAAAkSqtWrQpvuOGGQ/bbb79/atOmzX6ZTCZrK5BeuVyubs2aNTNmzJjx2JgxYyavW7euwVYAAAA+ngIYAABIhB//+Mddv/e9732lZ8+e/1RcXNzWRiD/1NbWfvD2228/dssttzz029/+9l0bAQAA+L8UwAAAQJNVUVFRcO21137+4IMPPrZ169b7ZTKZAlsBIqJxzZo1M59//vnxp5122hR3BQMAAPx/CmAAAKDJOeWUUzqefvrpx/bu3ftL2Wy2jY0AH6e+vn7j0qVLH/vd7373x+uvv36ZjQAAAPlOAQwAADQJ2Ww2c+uttx5wyCGHnNC6deu9I8LdvsDWaFy7du1L06ZN+/OPfvSjZ1evXl1vJQAAQD5SAAMAALtU//79S6655pp/2nPPPY8tLy/vayPAZ1VTU7NswYIF488999wHp06dutFGAACAfKIABgAAdomf//znPU855ZQTu3btemRhYWGZjQDbW2NjY92KFSuevOWWW+689NJLF9kIAACQDxTAAADATuMxz8Cusn79+rlPP/30f5188slT6+rqcjYCAACklQIYAADY4fr27Vv8hz/84a+Pee5nI8CuUlNT8+68efPu/8EPfvDgwoULN9kIAACQNgpgAABghxkyZEjpNddc89XBgwefWFxc3MFGgKaitrZ21dy5c+/5yU9+8uc5c+bU2AgAAJAWWyqAPYoNAADYJqNHj+4wb968n06ZMuXRYcOGnaH8BZqa4uLi9sOGDTtjypQpj86bN++nJ510UntbAQAA0s4dwAAAwFY599xze33/+9//dufOnY/IZDJZGwGSIpfL1S1fvvzJG2644fbLLrvsbRsBAACSyiOgAQCAz+y8887r+53vfOfbHTt2PDyTyRTaCJBUuVyuYcWKFU/cdNNN//XrX/96sY0AAABJowAGAAC22WWXXTboG9/4xg9at249zDaAtFm7du2su++++9pzzjnnNdsAAACSQgEMAABsNcUvkE8UwQAAQJIogAEAgE9N8Qvks7Vr18665557rvv5z38+3zYAAICmaksFcGHlwOj6UV9orIqoWZG1PQAAyBO/+MUvet9xxx3nHHrooT8pLS3tYiNAPiotLe2y7777HvP973+/X1lZ2ZIpU6assxUAAKCpKetcHwXlH/01BTAAAOS5M844o/u99957zpe//OWflZeX94qIjK0AeS5TXl7e8+CDDx71/e9/v3dEvDVjxowPrQUAAGgqFMAAAMD/ceKJJ7a77777fjJq1Kh/KS8v7xOKX4B/lCkvL+99+OGHj/rWt77VfvXq1Qvnz59fbS0AAMCutqUC2DuAAQAgzwwdOrTs+uuvP6l///4nFRYWltkI20NjY2Ns2rQpqquro6amJurr62PTpk2xefPmqK+vj+rq6qivr4/NmzfHpk2boqGhYZv/fxUWFkZJSUk0a9YsioqKoqysLIqKiqJZs2ZRUlISRUVFUVpa+r9/FRQUCIjtoqGhoeq11167a8yYMffMmTOnxkYAAIBdZUvvAFYAAwBAnujUqVP2nnvuGbXXXnudnM1mK22Ej9PQ0BAbN26MDRs2/J+/Nm7cGBs3boyamprYtGlTbNq0KWpqaqK2trbJnqe4uDhKSkqitLT0f/9eUVERFRUV0aJFi//zV0VFRRQWFvog8LHq6urWvvjii7eceOKJf169enW9jQAAADubAhgAAPLcXXfdddAXv/jF00tLS7vZRn7L5XKxYcOGWLt2baxbty7Wrl37d3+tW7cuNmzYkPd7atGiRbRu3TpatWoVrVu3jjZt2vzvf27dunW0aNHCh4morq5e+sgjj1zzne98Z6ptAAAAO5MCGAAA8tTVV189+MQTTzyzoqJioG3kj8bGxli5cmUsX748Pvjgg1i9evX//n3t2rXR2NhoSZ9RYWFhtGrVKtq1axdt27b937937tw5OnTo4LHTeWbDhg3z77333qvOPPPMebYBAADsDApgAADIM1/72tfaXHrppad27979qIjQRKVUQ0NDrFq1KlasWBHvv//+//595cqVTfqRzGlXXFwcHTp0iI4dO0bnzp2jY8eO0alTp2jXrp1HS6dYLpdrfOeddx76+c9/fv2ECRPW2QgAALAjKYABACBP9OrVq9ldd931jT322OM7hYWFZTaSHh9++GG88847sXTp0njvvfdixYoVsXr16mhoaLCchCgsLIz27dtHp06dolu3btG9e/fo3r27x0mnTENDQ9W8efNu++Y3v/nHJUuWbLYRAABgR1AAAwBAHrjrrrtG/NM//dOZJSUlXWwj2davXx9Lly6Nd955539L3w8//NBiUqqysvJ/y+C//tWqVSuLSbiamppljz322G9Gjx49xTYAAIDtTQEMAAAp9qtf/arPD3/4w5+1atVqL9tIno0bN8aSJUvirbfeikWLFsV7770XmzZtspg8V1JSEl27do0+ffpE3759o3fv3lFeXm4xCbRu3bqXr7322ivGjh27yDYAAIDtRQEMAAApNGjQoNI77rjju7vttttJBQUFWRtJhtWrV8ebb74ZixcvjiVLlsTy5cujsbHRYtiigoKC6Ny5c/Tu3Tt69+4d/fr1i7Zt21pMQjQ2Nta98cYbd33rW9+6ff78+TU2AgAAfFYKYAAASJHS0tKCBx988Jj99tvvn7PZbBsbaboaGhri7bffjrfeeisWLFgQS5YscXcv201FRUX06tUr+vbtG3379o2ePXtGYWGhxTRhdXV1a2bMmHHjV77ylYdqamr85gcAALDNFMAAAJASp59+erdf/vKX51ZWVu5jG03T6tWr47XXXouFCxfGm2++GRs3brQUdooWLVpE3759Y8CAATFw4EB3CDdh69evf/E//uM//vPqq69+xzYAAIBtoQAGAICEGzRoUOm99977w969ex+byWTc4teErF+/PubNmxcLFiyIN954Q+FLk9GiRYvo169fDBgwIPbYY4+orKy0lCYkl8s1LF68eNyJJ554rcdCAwAAW0sBDAAACXbNNdcMOemkk35RVlbWyzZ2vVwuF++++27MnTs3XnvttViyZIl3+NLkFRQURK9evWLQoEExePDg6Natm6U0EdXV1UvuvvvuX//kJz+ZYxsAAMCnpQAGAIAEOuqoo1r99re//VmHDh0Ot41da9OmTTF79uyYO3duLFy4MKqqqiyFRGvevHn0798/Bg8eHHvuuWeUlJRYyi62cuXKp04//fTLJ0yYsM42AACAT6IABgCAhBk3btwRRxxxxFnZbLaNbewaVVVVMXfu3Jg7d27Mnz8/amtrLYVUKi4ujoEDB8bgwYNj8ODBUV5ebim7SF1d3ZqnnnrqqlGjRj1hGwAAwJYogAEAICFOOeWUjhdddNEvW7duvZ9t7HwrV66MWbNmxdy5c+Odd96JXC5nKeSdzp07x9577x3Dhg2LDh06WMgusHbt2hnnnXfepbfccsv7tgEAAHwUBTAAADRxpaWlBU899dQ3Bw8e/L2CggLPYt2JVqxYES+99FK89NJLsXz5cguBv/HXMnjvvfeOTp06WchO1NjYuGnu3Lk3H3744XfV1NR40TgAAPB3FMAAANCEjR49usOll176yzZt2gy3jZ1j/fr18eKLL8bMmTNj6dKlFgKfQs+ePWPfffeNYcOGRYsWLSxkJ1mzZs0L55577q/vvvvuVbYBAAD8lQIYAACaoIqKioKJEyd+c/Dgwd8vKCgotpEda8OGDfHiiy/G9OnTlb7wGfXo0SOGDx8ew4YNi4qKCgvZwdwNDAAA/CMFMAAANDGnnHJKx7Fjx/5rZWXlMNvYcerr6+PVV1+NGTNmxLx586Kurs5SYDvKZrMxZMiQ2HfffWP33XePwsJCS9mB1q5dO+MXv/jFv995550rbQMAAPKbAhgAAJqIbDabeeKJJ47fZ599fuSu3x0jl8vFwoULY/r06TF79uzYtGmTpcBOUFpaGkOGDInhw4fHgAEDLGQHaWhoqJ42bdo1Rx555J9tAwAA8pcCGAAAmoDjjz++7ZVXXvmr1q1be9fvDrBmzZqYNm1azJw5M1audHMc7EodO3aMz3/+87H//vt7X/CO+3fetDPPPPOScePGfWAbAACQfxTAAACwi9100037HXvssf9WXFzc1ja2n1wuF6+99lo8//zzMW/evKivr7cUaEKKiopizz33jBEjRsTnPve5yGQylrId1dbWrvrjH/948Q9+8INZtgEAAPlFAQwAALvIkCFDSu+///5zunTp8k+2sf2sXbs2Jk+eHNOnT48PP/zQQiABKisrY8SIEXHIIYdEeXm5hWxHy5Yte+zrX//6f86ZM6fGNgAAID9sqQAurBwYXT/qC41VETUrsrYHAADb6IILLtjt97///VVt2rQZZhvbx+LFi2P8+PFx9913xxtvvBG1tbWWAgmxadOmeOONN+LZZ5+NtWvXRps2bTweejtp0aJFv5NOOumg0tLSuc8+++xaGwEAgPQr61wfBR/zu7XuAAYAgO0sm81mJk2a9PVhw4b9pKCgwG9VfkZ1dXUxY8aMeOaZZ+K9996zEEiRfv36xSGHHBJDhw6NgoICC/mMGhsbN8+YMeOaL37xi+Pq6upyNgIAAOnlEdAAALCTHH/88W2vuuqqCyorK/exjc9mzZo18dRTT8XUqVNj06ZNFgIpVlFREZ///OfjsMMOi8rKSgv5jNavXz/r9NNPv3DcuHEf2AYAAKSTAhgAAHaC22677fNf+9rXzstms5W2se0WLVoUjz/+eMybNy9yOTewQT4pKiqKIUOGxBFHHBG9e/e2kM+grq5u3QMPPHDRySefPM02AAAgfRTAAACwA1VUVBQ8/fTTpwwcOPCUTCbjGabbIJfLxauvvhpPPvlkLFy40EIgz2UymRgwYEAcccQRMWjQIAvZ9n+3Ns6fP/+Www8//JaNGzc22ggAAKTHlgrgwsqB0fWjvtBYFVGzwuvKAABgS0488cR2EyZMuLx79+5fzmQyGRvZOo2NjTFr1qy49dZb48knn4wPPvC0UuC/rV69OmbMmBFz5syJ0tLS6NSpU/jX7NbJZDKZ9u3bD/3+978/dPny5TNfffXValsBAIB0KOtcHwXlH/O9gDuAAQBg29x66637H3vssRcWFRW1sI2tU1NTE0899VQ8++yzsWHDBgsBPlGLFi3i4IMPjsMPPzxKS/28YmvV19d/OG7cuPNPPvnk6bYBAADJ5xHQAACwHWWz2cyzzz77rSFDhvzAI5+3zqZNm2Ly5Mnx1FNPKX6BbdKiRYs47LDD4pBDDlEEb6VcLtfwyiuvXHfooYfeWVdX5yXrAACQYApgAADYTo455pjW11133cWVlZV728ant2HDhnj88cdjypQpUVtbayHAZ1ZcXBwHHnhgfPGLX4wWLTyIYWusWbNm2re//e3zn3nmGb+JAwAACeUdwAAAsB1cfvnlu1900UW/LS8v72cbn05VVVVMmDAhbrnllnjzzTejoaHBUoDtoqGhIZYsWRLPPfdc1NTURI8ePSKb9XOMT6OsrKzb17/+9SPbtm0774knnlhtIwAAkMDreu8ABgCAz+bhhx/+8qGHHnpOQUFBsW18sk2bNsUzzzwTTzzxRFRVVVkIsMOVl5fHkUceGYccckgUF/tX9afR2Ni46emnn/71Mccc87htAABAsngENAAAbKN27doVTZ48+YxevXodZxufrK6uLp5++umYOHGi4hfYJSoqKuKLX/xiHHzwwe4I/pQWLVr0x4MOOuiadevWeUwDAAAkhEdAAwDANjj22GPbPvzww7/p2LHjobaxZXV1dfHkk0/GddddF3Pnzo26ujpLAXaJzZs3x2uvvRbPPfdcRET06NEjCgsLLWYLWrduvfv3vve9fd9+++1pCxYsqLYRAABo+rb0CGgFMAAAfITLL7989wsuuOB3zZs372UbH6+xsTGmTJkS119/fbzyyiuKX6DJ2Lx5cyxYsCCmT58excXF0a1bt8hkMhbzMUpKSjp8+ctfPrJt27ZzvBcYAACaPu8ABgCArTB+/Pgjv/CFL/xLQUFBiW18vAULFsT48eNj6dKllgE0eT169IivfOUrMWjQIMvYgsbGxpqJEydecuyxxz5pGwAA0HR5BzAAAHwK7dq1K3ruued+1qNHj6/axsdbtGhR3H///bF48WLLABKnV69ecdxxx0WfPn0sYwuWLl3654MOOujy1atX19sGAAA0Pd4BDAAAn2DYsGHNn3766V936tTpC7bx0TZs2BD33Xdf/PGPf4y1a9daCJBI69evj2nTpsW6deuiZ8+eUVLiYQ8fpbKysv+3v/3t/lOmTJmyfPlyz/cHAIAmxjuAAQBgC372s5/1uP76669t0aKF54J+hJqamhg/fnzcfPPN8fbbb0cul7MUINFyuVy888478cwzz0RVVVX07t07slk/A/lHZWVl3U488cTD6+rqZkyfPv1DGwEAgCZ0va4ABgCAj3bFFVfscdZZZ11dXFzcwTb+Xi6XixkzZsR1110XCxYsiMbGRksBUqWxsTGWLFkSM2bMiPLy8ujSpUtkMhmL+RvZbLbFQQcddHibNm1mP/HEE6ttBAAAmoYtFcDeAQwAQN6aNGnSqAMOOODsTCZTaBt/b9GiRXHPPffEu+++axlA3ujWrVucdNJJ0bt3b8v4B7lcrm7y5Mm//vKXv/yIbQAAwK63pXcAK4ABAMg7paWlBTNnzjyzT58+x9vG39uwYUOMGzcuZsyY4VHPQF7KZDKx3377xde//vWoqKiwkH+waNGiP+27775X1dTUeCwEAADsQgpgAAD4H926dctOnjz5V506dRppG/9fLpeLqVOnxp///OfYuHGjhQB5r6KiIkaNGhX777+/x0L/g+XLlz9+6KGHXvLuu+/W2QYAAOwaWyqAvQMYAIC8MXz48PInnnjiynbt2o2wjf/vnXfeiWuvvTaee+652Lx5s4UARMTmzZtjzpw58dprr0XPnj2jRYsWlvI/Kioq+n7rW98aMnXq1Ofee+89f3AAAMAusKV3ACuAAQDIC9/+9rc73n777X9o0aLFANv4b1VVVXHXXXfFvffeG+vXr7cQgI+wbt26eP7552P9+vWx2267RVFRkaVERElJSefjjjvuoA8++GDKK6+88hcbAQCAnUsBDABAXjv//PP7XXzxxX8oKSnpbBv/bfr06XHttdfGokWLLAPgU3jnnXdi2rRp0bp16+jc2R8nERHZbLbyC1/4whElJSUvTp48eY2NAADAzqMABgAgb/3ud7/b60c/+tFVRUVFrWwjYs2aNXHzzTfHpEmTora21kIAtkJtbW289NJL8c4770Tfvn2jtLQ073dSWFhYNnz48C/26dNn4UMPPbTMpwQAAHYOBTAAAHnp1ltv3f+b3/zmfxYWFjbP913kcrl4/vnn4/rrr4/ly5f7cAB8BitXroxp06ZFRUVFdOvWLTKZTF7vo6CgIDto0KBDBw0atOiBBx54xycEAAB2vC0VwJmex8Z+H/WF+pURa17ym6wAACTTww8//KXDDjvsXzKZTN6/rPGDDz6I22+/Pd544w0fDIDtbMCAAfGtb30r2rRpk/e7yOVyjVOmTPn1yJEjH/LJAACAHavN3jVR1OGjv6YABgAgdV555ZXTPve5z30r3/fQ0NAQjz32WDz++ONRV1fngwGwg2Sz2Tj66KPjC1/4QhQUFOT9Pl5//fU79tprr9/7ZAAAwI6jAAYAIC9ks9nMyy+/fFafPn2Oz/ddvPvuu3HbbbfFe++954MBsJN069YtvvOd70S3bt3yfhdLliy5f5999rmypqam0ScDAAC2PwUwAACpV1paWjBr1qyzevfufVw+7yGXy8WTTz4ZDz74oLt+AXaBbDYbxxxzTBxxxBF5fzfw0qVLHxg6dOjlSmAAANj+FMAAAKRar169mk2ePHlsu3btDsrnPaxcuTJuueWWePvtt30oAHaxnj17ximnnBIdOnTI6z2sXr16yiGHHPIvS5Ys2exTAQAA28+WCuDCyoHR9aO+0FgVUbMia3sAADRpQ4cOLXvqqacub9Omzf75uoNcLhfPPPNMXH/99bF27VofCoAmYP369TFlypQoKSmJnj17RiaTycs9NG/evPtJJ500ZPLkyc+sWLHCoykAAGA7KetcHwXlH/01BTAAAIk1ZMiQ0kceeeSKVq1a7Z2vO6iuro7bb789nnjiiWhs9IRNgKaksbEx5s+fH++//34MGDAgstn8/DlLaWlpp6997WuDn3rqqadXrlxZ75MBAACfnQIYAIDUOfTQQ1s8+OCDv2/ZsuUe+bqDOXPmxNVXX+2RzwBN3PLly+OFF16Ijh075u0joUtLSzudcMIJ+7/00ktPv/3227U+FQAA8NkogAEASJVhw4Y1v++++37TsmXLQfl4/vr6+hg/fnz88Y9/jNpaP0MHSILNmzfHiy++GJs3b47ddtstCgoK8m4HxcXFbY866qg9n3vuuaeXL1/ucdAAAPAZKIABAEiNI488snLcuHG/b9GixcB8PP97770XV111VcyZM8eHASCBFi1aFC+//HL069cvWrRokXfnLykp6XDcccftP2fOnGcWLVq0yScCAAC2jQIYAIBUOPLIIyvvvPPO35aXl++Wj+d/+umn48Ybb4wPP/zQhwEgwf7yl7/ECy+8ECUlJdGrV6+8O3+zZs3aHHXUUfspgQEAYNspgAEASLxjjz227W233faH5s2b98m3s1dVVcXNN98cTz31VDQ2NvowAKRAY2NjzJ8/P5YtWxYDBgyIZs2a5dX5mzVr1uaYY4458M0333xm4cKFNT4RAACwdRTAAAAk2qGHHtritttuuzofy9+33347rrnmmli8eLEPAkAKvf/++/HKK69Enz59orKyMq/Ons1mK4888sh9Zs6c+dTSpUs3+zQAAMCnpwAGACCxjjjiiJb33nvvteXl5f3y6dy5XC4mTZoUN998c1RVVfkgAKRYVVVVTJ06NbLZbPTp0ycymUzenL24uLjtV7/61c+/8sorTy1evLjWpwEAAD4dBTAAAIl06KGHtrj33nt/l2/lb3V1ddx0000xefLkyOVyPggAeSCXy8WCBQvi3Xffjd133z2y2fz5mUyzZs1aH3300fvNmDHjSXcCAwDAp6MABgAgcYYOHVo2fvz4qysqKgbk07mXLVsWV111lUc+A+SplStXxiuvvBKf+9znoqKiIm/O3axZszZHH3300GeeeebJFStW1PkkAADAlimAAQBIlCFDhpQ++uij17Rs2XL3fDr31KlT49prr42NGzf6EADksaqqqpg+fXq0bds2unTpkjfnLikpaT9q1KihTz755JMrV66s90kAAICPt6UCuMB6AABoSjp16pSdMGHCv1dWVu6RL2dubGyMcePGxR133BF1dW56AiCitrY2br755hg/fnw0NjbmzbkrKyv3mDBhwr9369bNXQkAALCNFMAAADQZrVq1Kpw+ffolbdq02T9fzlxdXR2/+93vYtKkSd73C8DfyeVy8fjjj8fvf//7qK6uzptzt2nTZv8pU6Zc0qpVq0KfAgAA2HoKYAAAmoSKioqC2bNnX9KuXbuD8uXMS5cujYsuuijmz5/vAwDAx3r11VfjoosuiqVLl+bNmdu1a3fQ7Nmz/72iosLPrgAAYCu5iAYAoEmYOXPmz9q1a3dIvpz35ZdfjiuuuCLWrVsnfAA+0bp16+KKK66Il19+OW/O3K5du4Nnzpz5M+kDAMDWUQADALDLvfjii2N69OgxKh/Omsvl4oEHHogbbrghamtrhQ/Ap1ZbWxs33HBDPPDAA3nz2oAePXqMevHFF8dIHwAAPj0FMAAAu9SkSZO+NnDgwFPy4ax1dXVx8803x8SJE73vF4BtksvlYuLEiXHLLbdEXV1dXpx54MCBJ0+aNOlr0gcAgE9HAQwAwC7z6KOPHnXggQeekw9nXbduXfz617+OWbNmCR6Az2zmzJnx61//Ol9eJZA58MADz3n00UePkjwAAHyywsqB0fWjvtBYFVGzImtDAADsEDfeeOO+Rx999EWZTKYw7Wddvnx5XHXVVbFy5UrBA7DdbNiwIWbPnh0DBw6MioqKtB8307179/179uz56sMPP7xc+gAA5LuyzvVRUP7RX1MAAwCw011xxRV7fPe7372qoKCgWdrPOmfOnPjtb38bGzduFDwA2111dXVMmzYtOnfuHB07dkz1WTOZTOHuu+9+eJs2bV6aNGnSKukDAJDPFMAAADQZZ5xxRvef/exnvy0sLCxP+1knTJgQd999d9TX1wsegB2moaEhXnrppchms9G3b99UnzWTyRTttddeB/3lL395dubMmRukDwBAvlIAAwDQJBx00EEVf/jDH64pLi7ulOZz5nK5eOCBB+Kxxx4TOgA77c+eBQsWRF1dXfTv3z8ymUxqz1pQUFBywAEHDJs+ffqkpUuXbpY+AAD5aEsFcIH1AACwMwwaNKj0vvvuu7qsrKxXms9ZV1cX1113XUyaNEnoAOx0EydOjOuvvz7q6upSfc6ysrJef/rTn67u379/idQBAODvKYABANjhKioqCh577LGLKyoqBqb5nNXV1XHNNdfE7NmzhQ7ALvPKK6/ElVdeGVVVVak+Z4sWLQZOnDhxbEVFhZ9vAQDA33CBDADADjdz5syftW3b9sA0n3HdunVx2WWXxRtvvCFwAHa5xYsXx2WXXRZr165N9TnbtWt34MyZM38mcQAA+P8UwAAA7FBPPvnkqB49eoxK8xlXrVoVV1xxRSxfvlzgADQZK1asiCuuuCJWrlyZ6nP26NFj1KRJk0ZJHAAA/lth5cDo+lFfaKyKqFmRtSEAALbZjTfeuO+XvvSlCzOZTGp/8fDdd9+NK6+8MtatWydwAJqc6urqmDVrVvTv3z8qKytTe85u3boN79mz57yHH37Yb2MBAJAXyjrXR0H5R39NAQwAwA5x3nnn9T311FOvLigoKE7rGV977bW45pprorq6WuAANFmbN2+OGTNmRI8ePaJ9+/apPGMmkykYNGjQIYWFhVOee+45v5UFAEDqKYABANipjjrqqFb/8R//8YdmzZq1SusZX3755bj++uujrq5O4AA0eQ0NDfHSSy9Fp06dolOnTqk8Y0FBQXbYsGGfnz9//qQ33nhjk9QBAEizLRXA3gEMAMB21a1bt+wNN9zwnyUlJR3TesYpU6bEjTfeGPX19QIHIDHq6+vjxhtvjKlTp6b2jCUlJZ1uuOGG/+jWrZu7GgAAyFsKYAAAtqunn376XyorK/dI6/kmTZoUd955ZzQ2NgobgMRpbGyMO+64I5588snUnrGysnLw008//UtpAwCQrxTAAABsN88///w3unTp8k9pPd/EiRNj3LhxkcvlhA1AYuVyubj//vtTXQJ36dLlS88+++yJ0gYAIB95BzAAANvFTTfdNPzII488L5PJZNJ4vsceeyzGjx8vaABS47XXXotmzZpF3759U3m+zp0779urV695Dz/88DJpAwCQNlt6B7ACGACAz+wXv/hF7x/+8IdXFxQUNEvj+R544IF45JFHBA1A6ixYsCDq6upiwIABqTtbJpPJDBo06ODGxsbnpk6dul7aAACkiQIYAIAd5oADDqj43e9+99tmzZq1TeP5xo0bF5MmTRI0AKm1aNGi2Lx5cwwcODB1ZysoKMjut99+w5577rnH33vvvc3SBgAgLbZUAHsHMAAA2yybzWbuvPPOfyktLe2exvNNmDBB+QtAXpg0aVI89NBDqTxbaWlpj3vuuedfstlsRtIAAOQDBTAAANvs+eef/06HDh0OTePZHn744Xj44YeFDEDeeOSRR+LPf/5zKs/WoUOHw5599tlvSxkAgHygAAYAYJvcd999hw8ePPjUNJ7t/vvvjwkTJggZgLzz2GOPxX333ZfKs+25554/+NOf/nSYlAEASDvvAAYAYKudccYZ3ceMGXN5QUFBcdrONnHixHjkkUeEDEDeWrx4cWSz2ejbt2/ajpbp06fPvn/5y18mz5w5c4OkAQBIsi29A1gBDADAVhk2bFjzG2+88Q/NmjVrl7azPfroo6l99CUAbI2FCxdGUVFR9OvXL1XnKigoKD7wwAP3e/LJJx9dsWJFnaQBAEiqLRXAHgENAMBWuffee39ZWlraPW3nevzxx+PBBx8UMAD8jz//+c8xceLE1J2rtLS0x3333fdLCQMAkFYKYAAAPrVJkyaN6tSp0xEpPFeMHz9ewADwD8aPHx+TJ09O3bk6der0hUmTJn1VwgAApJFHQAMA8Kmcd955fU888cR/z2QyRWk618yZM+Puu+8WMAB8jNdeey06duwYnTt3TtW5unbtuk9BQcHzzz333DopAwCQNN4BDADAZ3LEEUe0vOKKK67NZrOVaTrXyy+/HDfffHPkcjkhA8DHyOVyMXv27OjSpUt06tQpNefKZDJF++yzz/CpU6c+9u67726WNAAASeIdwAAAbLNsNpu55ZZb/q2kpKRjms61YMGCuPnmm6OxsVHIAPAJGhsb4+abb44333wzVecqLS3tcvfdd5+fzWYzUgYAIC0UwAAAbNGkSZO+3rZt2wPTdKZly5bFDTfcEPX19QIGgE+prq4urr322li+fHmqztWuXbsDH3/88VESBgAgLTwCGgCAj3XZZZcN+upXvzo2k8mk5hcH33///bjyyiujqqpKwACwlerq6uLll1+OIUOGRHl5eWrO1aVLl31LS0unPvPMM2ukDABAEngENAAAW61///4lJ5988q8ymUxRWs60YcOG+P3vfx8bN24UMABso40bN8bvfve7VP15WlBQkP3hD394ft++fYslDABA4q9vrQAAgI/y4IMPnl1WVtYrLeeprq6O3/zmN7Fq1SrhAsBntGrVqrjyyiujuro6NWcqKyvr8/DDD58lXQAAkk4BDADA/zF+/Pgju3XrdnRazlNfX5/KdxYCwK60fPnyuO6666K+vj41Z+rRo8dXx40bd4R0AQBIMgUwAAB/53vf+16nI4444py0nCeXy8Vtt90Wb7zxhnABYDt7/fXX47bbbotcLpeaMx155JHnfvvb3+4oXQAAkkoBDADA/6qoqCi4+OKLLywsLCxPy5nGjx8fs2bNEi4A7CCzZs2Khx56KDXnKSwsrPj1r399QUVFhZ+bAQCQSC5kAQD4XxMnThxdWVk5OC3nef7552PixImCBYAd7LHHHosXXnghNeeprKzc89FHHz1RsgAAJFFh5cDo+lFfaKyKqFmRtSEAgDxxwQUX7DZq1KgLM5lMYRrO8+qrr8Ytt9ySqkdSAkBT/7O3d+/e0a5du1Scp2PHjkNzudxzU6ZMWSddAACamrLO9VHwMc/wcwcwAADRt2/f4h//+McXZzKZVPwG4HvvvRc33HBDNDY2ChcAdpKGhoa47rrrYtmyZak4T0FBQfbss88e27dv32LpAgCQqGtZKwAAYPz48T8qKyvrkYazbNiwIX7/+99HbW2tYAFgJ9u0aVP8/ve/j40bN6biPGVlZb3GjRs3RrIAACSJAhgAIM/ddNNNw/v06XN8Gs5SX18f1157baxdu1awALCLrFmzJq699tqor69PxXn69ev3jd///vdDJQsAQFIogAEA8thBBx1Uceyxx/5rRGTScJ477rgjFi9eLFgA2MUWLVoUd955Z1qOU/CNb3zj34YNG9ZcsgAAJOIC1goAAPLXzTfffFZxcXG7NJxl4sSJMX36dKECQBMxbdq0mDRpUirOUlJS0unOO+88Q6oAACSBAhgAIE/913/914FdunT5UhrO8tprr8Wf//xnoQJAEzN+/PhYsGBBKs7SrVu3o2+66abhUgUAoKlTAAMA5KEvfelLlV/5yld+lYazrFixIq6//vpobGwULAA0MY2NjXHdddfFihUr0nCczHHHHfergw46qEKyAAA0ZQpgAIA8dPXVV5+ezWYrk36OmpqauPbaa2PTpk1CBYAmatOmTXHttddGTU1N4s+SzWbb3njjjT+RKgAATZkCGAAgz9x6663Du3Tp8uWknyOXy8Utt9wSK1euFCoANHErV66MW2+9NXK5XOLP4lHQAAA0dQpgAIA8MnTo0LKvfvWrv0jDWSZMmBBz584VKgAkxJw5c+Kxxx5LxVlGjRr1i6FDh5ZJFQCApkgBDACQR+64444fFRcXd0z6OV5++eV45JFHBAoACfPQQw+l4he4SkpKOt5xxx0/lCgAAE2RAhgAIE9cfvnlu/fs2XNU0s/xwQcfxB133JGKR0gCQL7J5XJx2223xZo1axJ/lp49ex57+eWX7y5VAACaGgUwAEAe6NatW/a73/3uv2YymURf/9XX18cNN9wQ1dXVQgWAhKqqqoobb7wx6uvrE32OTCZT8N3vfvdX3bp1y0oVAICmRAEMAJAHxo8ff0pZWVmvpJ/jnnvuiaVLlwoUABJuyZIlcd999yX+HGVlZT3Hjx9/ikQBAGhKFMAAACn385//vOeAAQNGJ/0c06dPjylTpggUAFJi8uTJMWPGjMSfY8CAAaN//vOf95QoAABNhQIYACDFstls5qyzzjo3k8kk+tGEK1asiLvvvlugAJAyd911V6xYsSLRZ8hkMtmzzjrr3Gw2m5EoAABNgQIYACDFxo0b98XKysq9knyG2trauOGGG6K2tlagAJAyf/1zfvPmzYk+R2Vl5V7jxo0bKVEAAJoCBTAAQEoNHz68/OCDDz4t6ee4//77Y/ny5QIFgJRavnx5jBs3LvHnGDFixI+HDRvWXKIAAOxqCmAAgJS69dZbT8tms22TfIYZM2bEc889J0wASLnJkyfHzJkzE32G4uLitrfffvtp0gQAYFdTAAMApNBVV121R48ePb6S5DOsXLky7rrrLmECQJ64++6744MPPkj0GXr27PnVK664Yg9pAgCwKymAAQBSprS0tOAb3/jGT5N8rdfY2Bi333679/4CQB6pqamJ2267LRobG5N8jIJvfvObZ5aWlvqZGwAAu+6i1AoAANJlwoQJX6uoqBiQ5DOMHz8+Fi1aJEwAyDNvvvlmPPjgg4k+Q4sWLQY9+OCDx0gTAIBdRQEMAJAiRx55ZOWwYcN+kOQzzJ07N5544glhAkCemjhxYixYsCDRZxg+fPiPjjjiiJbSBABgV1AAAwCkyBVXXHFyUVFRRVLnr6qqijvvvDNyuZwwASBP5XK5uP3226O6ujqxZygqKmrxm9/85mRpAgCwKyiAAQBS4vzzz+/Xu3fv45J8httvvz0+/PBDYQJAnlu3bl3cfvvtiT5D7969jz///PP7SRMAgJ1NAQwAkALZbDZz6qmn/jyTyST2+m769OkxZ84cYQIAERExe/bsmDFjRmLnz2QyBaeeeurPs9lsRpoAAOxMCmAAgBT44x//eERlZeXgpM6/du3auPfeewUJAPyde+65J9atW5fY+SsrKwf/6U9/+oIkAQDYmRTAAAAJ17dv3+JDDjnkR0k+w9133x01NTXCBAD+Tk1NTdx9992JPsPBBx/8o759+xZLEwCAnUUBDACQcHfdddc3S0pKOiV1/smTJ8e8efMECQB8pLlz58azzz6b2PlLSko63nPPPd+SJAAAO4sCGAAgwb70pS9VDhw48KSkzr9mzZoYP368IAGALXrggQdizZo1iZ2/f//+Jx111FGtJAkAwM6gAAYASLArrrji1MLCwvIkzp7L5eK2226LTZs2CRIA2KJNmzbFbbfdFrlcLpHzFxYWll1++eU/kCQAADuDAhgAIKF+8Ytf9O7evftXkjr/s88+G2+88YYgAYBP5Y033ojnn38+sfN369bt6F/96ld9JAkAwI6mAAYASKgf/vCHP8pkMom8nvvggw/igQceECIAsFXGjRsX69atS+TsmUym4NRTT/2xFAEA2NEUwAAACXTdddcNa9eu3YFJnD2Xy8Udd9wRtbW1ggQAtsqmTZvizjvvTOz8bdq02f+mm27aT5IAAOxICmAAgIQpLS0t+NrXvnZ6Uud/4YUXYuHChYIEALbJq6++GjNmzEjs/Mccc8zpFRUVfiYHAMAO42ITACBhbr/99oMrKip2S+LsGzZsiHHjxgkRAPhM7r///qiqqkrk7OXl5X3/67/+6wgpAgCwoyiAAQASpKKiouCwww47Nanz33vvvYn9YS0A0HRs2LAh7r///sTOf9BBB/1zq1atCiUJAMCOoAAGAEiQ+++//+iysrKeSZx9zpw58dJLLwkRANguXnjhhViwYEEiZy8tLe32xz/+8StSBABgR1AAAwAkRN++fYv33Xfff07i7LW1tXHvvfcKEQDYru6+++6oq6tL5Oz77bffKf379y+RIgAA25sCGAAgIW6++eZRxcXFbZM4+yOPPBJr164VIgCwXa1atSoee+yxRM6ezWbb3njjjV+TIgAA25sCGAAgAYYOHVq21157fSeJs7/33nvxxBNPCBEA2CEmTpwYK1asSOTsQ4YM+c7QoUPLpAgAwPakAAYASIBrr732xKKiosqkzZ3L5eKee+6JxsZGIQIAO0R9fX3cddddkcvlEjd7UVFR5bXXXnuCFAEA2J4UwAAATdwBBxxQMWDAgG8kcfYZM2bEW2+9JUQAYId6880348UXX0zk7AMGDPjG8OHDy6UIAMD2ogAGAGjirrrqqhOKiooqkjb3pk2b4oEHHhAgALBT3H///VFbW5u4uYuKilpcffXV7gIGAGC7UQADADRhBx10UEX//v0Teffvww8/HB9++KEQAYCdYv369TFhwoREzj5w4MBvHHDAARVSBABge1AAAwA0Yf/5n/95bGFhYfOkzb1q1aqYPHmyAAGAnerpp5+O1atXJ27uwsLC8ssuu2yUBAEA2B4UwAAATdQBBxxQMWjQoNFJnP3uu++O+vp6IQIAO1V9fX3cddddiZx99913/+bQoUPLpAgAwGelAAYAaKIuv/zyYwsLC8uTNvfcuXNjwYIFAgQAdokFCxbE3LlzEzd3UVFRi9/97ndflyAAAJ+VAhgAoAkaOnRo2aBBgxL37t+6urr405/+JEAAYJf605/+FHV1dYmbe/fdd//mkCFDSiUIAMBnoQAGAGiCfvOb33ylqKioZdLmfu655xL53j0AIF1Wr14dzz33XOLmLioqann11VcfLUEAAD4LBTAAQBPTq1evZoMHD/5m0uaurq6ORx55RIAAQJPwyCOPRHV1deLmHjJkyLe6deuWlSAAANtKAQwA0MTcdNNNxxQXF7dN2twTJkyIqqoqAQIATUJVVVUifzmtuLi43a233uouYAAAtpkCGACgCWnVqlXhXnvtdVLS5l61alU8++yzAgQAmpTJkyfHqlWrEjf30KFDR7dq1apQggAAbAsFMABAE3LLLbccXlJS0jlpcz/44INRX18vQACgSamvr48HH3wwcXOXlJR0vummmw6VIAAA20IBDADQRGSz2cwBBxzw7aTNvWjRonjppZcECAA0SS+99FIsXrw4cXOPGDHiO9lsNiNBAAC2lgIYAKCJuOaaa/YuLy/vm7S5H3roocjlcgIEAJqkXC6XyLuAy8vL+1111VV7SRAAgK2lAAYAaCK+8pWvfDdpM8+bNy8WLlwoPACgSVu4cGG8+uqrrg8BAMgLCmAAgCbgsssuG1RZWblPkmbO5XIxfvx44QEAifDAAw8k7qklrVu33veSSy7pLz0AALaGAhgAoAkYNWrUCUmbefbs2bFs2TLhAQCJsGzZsnjllVcSN/cJJ5xwovQAANgaCmAAgF3sn//5nzt37NjxiCTN3NjYGA888IDwAIBEGT9+fDQ0NCRq5k6dOn1h9OjRHaQHAMCnpQAGANjFfvSjH30tk8kk6rps2rRpsWrVKuEBAImyatWqeOGFFxI1cyaTKfzpT386SnoAAHxaCmAAgF1o0KBBpX369Plqkmaur6+PCRMmCA8ASKQJEyZEXV1dombu27fvV/r27VssPQAAPg0FMADALnTZZZcdXlRUVJGkmadOnRpr164VHgCQSOvXr48pU6YkauaioqLK3/zmN0dIDwCAT0MBDACwi2Sz2cy+++57UpJmrqurc/cvAJB4jz76aOLuAt5///1PymazGekBAPBJFMAAALvI1VdfPbSsrKx3kmaeMmVKbNiwQXgAQKJt2LAhnn/++UTNXFZW1ueqq67aS3oAAHwSBTAAwC7y5S9/+bgkzVtfXx8TJ04UHACQCo8//nji7gL+0pe+dLzkAAD4JApgAIBdYPTo0R3atm07IkkzT5s2LdatWyc8ACAVPvzww5g+fXqiZm7fvv2I0aNHd5AeAABbogAGANgFfvrTn47KZDKFSZm3vr4+HnnkEcEBAKnyyCOPRH19fWLmzWQyhT/96U+/JjkAALZEAQwAsJN16tQp26dPn6OTNLO7fwGANFq3bl1MmzYtUTP36dPnmE6dOmWlBwDAx1EAAwDsZFddddUB2Wy2dVLmbWxsjEmTJgmOVOvYsWN06OCJmgD5aNKkSdHY2JiYebPZbOurrrrqAMkBAPBxFMAAADvZiBEjvp6keV988cVYtWqV4Ei1Ll26xIUXXhinnXZadO3a1UIA8siqVavipZdecj0JAEBqKIABAHaiM844o3tlZeXeSZk3l8vFxIkTBUdeyGQyMXjw4PjVr34VY8aMcUcwQB55/PHHI5fLJWbeysrKvc8444zukgMA4KMogAEAdqJTTjnlqxGRScq8CxYsiPfee09w5JVMJhN77713XHjhhTFmzJho3769pQCk3HvvvRcLFy5M1B9X/3NdCQAA/4cCGABgJ+nVq1ezXr16fTlJM3v3L/nsr0XwBRdcECeffHK0bdvWUgBSLGnXPb169fpyr169mkkOAIB/pAAGANhJrrjiioOLiopaJmXeBN4JAztEYWFhDB8+PC688MIYPXp0VFZWWgpACi1YsCCWLVuWmHmLiopaXnnllYdIDgCAf6QABgDYSYYPH/6VJM2btHfhwY5WVFQUI0aMiEsuuSRGjx4dLVu2tBSAFMnlcvH4448naub99tvvK5IDAOAfKYABAHaC0aNHd6isrByalHnXrl0bL7/8suDgI/y1CL744ovjhBNOiBYtWlgKQEq89NJLsW7dusTMW1lZudfo0aM7SA4AgL+lAAYA2AlOP/30o5J07fXMM89EQ0OD4GALiouL47DDDouxY8fGqFGjoqyszFIAEq6hoSGeeeaZJI1c8D/XmQAA8P8vEq0AAGDHymazmX79+n05KfPW1tbGlClTBAefUnFxcYwcOTIuvfTSGDVqVJSWlloKQII9//zzUVtbm5h5+/Xr9+VsNpuRHAAAf6UABgDYwX7zm9/sWVJS0jkp886YMSOqq6sFB1uppKQkRo4cGZdcckkcffTRUVJSYikACVRdXR0zZ85M0p8/na+44orBkgMA4K8UwAAAO9gXvvCFLyVl1lwuF08//bTQ4DNo3rx5HHXUUXHJJZfEyJEjI5vNWgpAwjz11FORy+USM++RRx75ZakBAPBXCmAAgB1oyJAhpZ07dz4iKfO+/vrrsWLFCsHBdlBeXh6jRo2KSy+9VBEMkDArVqyI119/PTHzdunS5fD+/ft79AQAABGhAAYA2KHGjh17aGFhYWJeCOruX9j+KioqYtSoUXHxxRfH4YcfHkVFRZYC4LpouyosLGz+H//xHwdLDQCACAUwAMAOteeeex6ZlFnXrl0b8+bNExrsIK1atYrjjz8+LrroohgxYkQUFPh2DKApmzdvXqxZsyYx8+61115HSg0AgAgFMADADnPMMce0bt269b5Jmfe5556LxsZGwcEO1qZNmxg9enRcfPHFimCAJqyxsTGee+65JP35MvyYY45pLTkAAPykAQBgBznzzDMPz2Qyibjeqq+vj6lTpwoNdqK2bdvG6NGj47zzzovhw4crggGaoBdeeCHq6+sTMWsmkyk844wzDpUaAAB+wgAAsIP079//C0mZdc6cObFhwwahwS7QqVOnOPnkk+Pf/u3fYu+9945MJmMpAE3Ehg0bYvbs2YmZd8CAAR4DDQCAAhgAYEf43ve+16mysnKPpMybpMcbQlp17tw5xowZE7/61a8UwQBNyPPPP5+YWSsrKwd/73vf6yQ1AID8pgAGANgBTj755CMiIhHtzcqVK+P1118XGjQRXbt2jTFjxsQ555wTgwcPthCAXez111+PlStXJmXczMknn3y41AAA8psCGABgB+jXr19iHv88ZcqUyOVyQoMmpnfv3nHaaafFOeecE/3797cQgF0kl8vFlClTknQd6jHQAAB5TgEMALCdnX766d0qKip2S8Ks9fX1MW3aNKFBE9anT58466yz4pxzzonddtvNQgB2gWnTpkV9fX0iZq2oqNjt9NNP7yY1AID8pQAGANjORo8efURSZp03b15s3LhRaJAAffr0ibPPPjvOPPPM6Nmzp4UA7EQbN26MefPmuR4FACARFMAAANtZr169EvPetSQ9zhD4bwMGDIhf/vKXceaZZ0b37t0tBGAnmTp1apKuRw+TGABA/lIAAwBsR2eccUb38vLyvkmYdf369fHaa68JDRJqwIAB8S//8i9x2mmnRbdunvQJsKPNnz8/Pvzww0TMWl5e3u9HP/pRF6kBAOQnBTAAwHZ03HHHHZSUWWfMmBGNjY1CgwTLZDIxePDg+Nd//dcYM2ZMdOjQwVIAdpDGxsaYMWNGYub9xje+cYjUAADykwIYAGA76tOnz8FJmDOXyyXqMYbAlmUymdh7773jwgsvjDFjxkT79u0tBWAHeOGFF5J0XXqIxAAA8pMCGABgOznppJPat2zZcvckzLpkyZJYuXKl0CBl/loEX3DBBXHyySdH27ZtLQVgO1qxYkW8/fbbiZi1srJy0PHHH+8PAgCAPKQABgDYTr773e8eGBGZJMyapMcXAluvsLAwhg8fHhdeeGGMHj06KisrLQVgO5k+fXpSRi34/ve/f6DEAADyjwIYAGA72X333Q9Nwpz19fUxc+ZMgUEeKCoqihEjRsQll1wSo0ePjpYtW1oKwGc0c+bMqK+vT8SsAwcOPFRiAAD5RwEMALAdHHTQQRUtW7bcKwmzLly4MKqrq4UGeeSvRfDFF18cJ5xwQrRo0cJSALZRVVVVvP7664mYtVWrVkOHDx9eLjUAgPyiAAYA2A7OPvvsz2cymaIkzOrxz5C/iouL47DDDouxY8fGqFGjoqyszFIAtkFSnqaSyWSy55577uclBgCQXxTAAADbwe67735AEuasra2NOXPmCAzyXHFxcYwcOTIuvfRSRTDANpg9e3bU1dUlYtY99tjjAIkBAOQXBTAAwGfUqlWrwnbt2u2fhFnnzZsXtbW1QgMiIqKkpCRGjhwZY8eOjaOPPjpKSkosBeBT2LRpU8ybNy8Rs7Zv337/iooKPwMEAMgjLv4AAD6jCy+8cPeioqKKJMz64osvCgz4P5o3bx5HHXVUXHLJJTFy5MjIZrOWAvAJZs2alYg5i4qKWlx88cWDJAYAkD8UwAAAn9GBBx6YiMfqVVdXJ+ZOFWDXKC8vj1GjRsWll16qCAb4BPPmzYuamppEzHrQQQd5DDQAQB5RAAMAfEZdu3YdnoQ5582bF/X19QIDPlFFRUWMGjUqLr744jj88MOjqKjIUgD+QV1dXbz66quJmLVLly77SwwAIH8ogAEAPoNTTjmlY3l5+W5JmPXll18WGLBVWrVqFccff3xcdNFFMWLEiCgo8C0kwN966aWXEjFnRUXFbieddFJ7iQEA5AffvQMAfAYnnnji55MwZ21tbcyfP19gwDZp06ZNjB49OsaOHasIBvgb8+fPj9ra2iSMmvnud7/7eYkBAOQH37UDAHwGn/vc5/ZLwpwLFy6Muro6gQGfyV+L4PPOOy+GDx+uCAby3ubNm2PhwoWJmLVfv37DJQYAkB98tw4AsI1atWpV2Lp1672TMKvHPwPbU6dOneLkk0+Oc889NwYNGmQhQF6bPXt2IuZs06bN3hUVFX4WCACQB1z0AQBso/PPP39gYWFheVOfs76+PubMmSMwYLvr2bNn/OQnP4nzzjsv9t5778hkMpYC5J3Zs2dHfX19k5+zqKio4vzzzx8oMQCA9FMAAwBso/3333/fJMz5+uuvR01NjcCAHaZLly4xZsyYOOecc2Lw4MEWAuSV6urqeOONNxIx64EHHriPxAAA0k8BDACwjbp27ZqIxz/PnTtXWMBO0bt37zjttNPinHPOif79+1sIkDeScr3VvXv3vaUFAJB+CmAAgG0wZMiQ0srKyj2a+py5XM7jn4Gdrk+fPnHWWWfFOeecE7vttpuFAKk3e/bsyOVyTX7Oli1b7jlo0KBSiQEApJsCGABgG5x55pl7ZjKZbFOfc9myZbFu3TqBAbtEnz594uyzz44zzzwzevbsaSFAaq1bty6WL1/e5OfMZDLZs846a4jEAADSrcgKAAC23tChQ4clYc558+YJC9jlBgwYEAMGDIgFCxbE+PHjY+nSpZYCpM68efOiS5cuTX7OffbZZ5+ImC4xAID0cgcwAMA26Nix4z5JmHP+/PnCApqMAQMGxC9/+cs47bTTolu3bhYCpEpSrrs6deq0j7QAANJNAQwAsJWOOOKIlhUVFf2a+pxVVVWxaNEigQFNSiaTicGDB8e//uu/xpgxY6JDhw6WAqTCW2+9FVVVVU1+zoqKis8deuihLSQGAJBeCmAAgK108sknD46ITFOfc/78+dHY2CgwoEnKZDKx9957x4UXXhhjxoyJ9u3bWwqQaI2NjbFgwYJE/Cv4u9/97h4SAwBILwUwAMBW2n333fdMwpze/wskwV+L4AsuuCBOPvnkaNu2raUAiZWU66/BgwfvKS0AgPQqsgIAgK3Trl27wU19xlwul5Q7UAAiIqKwsDCGDx8e++yzT0ybNi0mTJgQ69evtxggURYsWBC5XC4ymab9sJgOHToMlhYAQHq5AxgAYCsMGjSotGXLlgOa+pzvvfdebNy4UWBA4hQVFcWIESPikksuidGjR0fLli0tBUiMDz/8MJYtW9bk52zZsuXA/v37l0gMACCdFMAAAFvhxz/+8aBMJtPkn6Li7l8g6f5aBI8dOzZOOOGEaNGihaUAibBw4cImP2Mmk8n+5Cc/GSAtAIB0UgADAGyFvffee88kzJmEHzwCfBrNmjWLww47LMaOHRujRo2KsrIySwGatKT8Il5SrmsBANh63gEMALAVunbtOqSpz1hfXx9vvvmmsIBUKS4ujpEjR8bBBx8czz77bDz++ONRXV1tMUCT8+abb0Z9fX0UFTXtH7t16dJlT2kBAKSTO4ABAD6lioqKgoqKikFNfc4lS5bE5s2bBQakUklJSYwcOTLGjh0bRx99dJSUeIUl0LTU1tbG0qVLm/ycLVu2HFRaWupngwAAKeQiDwDgUzr77LP7FhYWNvlnj7722mvCAlKvefPmcdRRR8Ull1wSI0eOjGbNmlkK4HpsKxQWFpafffbZvaQFAJA+CmAAgE9p//3375+EOV9//XVhAXmjvLw8Ro0aFf/+7/8eI0eOjGw2aymA67FP6fOf//xAaQEApI8CGADgU+rRo8fuTX3G2traePvtt4UF5J2KiooYNWpUXHzxxXH44Yc3+XdvAum2ePHiRLySo1evXoOkBQCQPgpgAIBPqXXr1k3+DoklS5ZEQ0ODsIC81apVqzj++OPj4osvjhEjRkRBgW97gZ2voaEhlixZ0uTnbNOmjQIYACCFfCcMAPApDBkypLR58+a9m/qcb775prAAIqJ169YxevToGDt2rCIYcF32MZo3b95n0KBBpdICAEgX3wEDAHwKp556av9MJtPkr53eeustYQH8jTZt2sTo0aPjvPPOi+HDhyuCAddlfyOTyRT84Ac/+Jy0AADSxXe+AACfwuDBg5v84/Hq6+tj0aJFwgL4CJ06dYqTTz45/u3f/i323nvvyGQylgLsUIsXL07Eqzn23HPPgdICAEgXBTAAwKfQpUuXAU19xnfeeSfq6uqEBbAFnTt3jjFjxiiCgR2utrY23n333SRc53oPMABAyiiAAQA+hZYtW/Zv6jN6/DPAp9elS5cYM2ZMnHvuuTF48GALAfL2+iwJ17kAAGwdBTAAwCcYPnx4eUlJSeemPqfHPwNsvV69esVpp50W55xzTvTvrwMB8u/6rLS0tPPw4cPLpQUAkB4KYACAT/Ctb31rt4ho8s8IXbx4sbAAtlGfPn3irLPOinPOOSd22203CwG2i4T8gl7m29/+dj9pAQCkhwIYAOAT7L777k2+CVi7dm1s2LBBWACfUZ8+feLss8+OM888M3r27GkhwGfy4Ycfxrp165r8nAMHDlQAAwCkSJEVAABsWadOnZr8D8TefvttQQFsRwMGDIgBAwbEggULYvz48bF06VJLAbb5Oq1Vq1audwEA2GkUwAAAn6CyslIBDJCnBgwYEP3794958+bFQw89FO+++66lAFtlyZIlsddeezX1613PvgcASBEFMADAFnTq1CnbvHnzXk19ziVLlggLYAfJZDIxePDg2GOPPeLll1+OBx98MFauXGkxQGqu05o3b967Xbt2RatXr66XGABA8nkHMADAFowZM6ZnJpPJNuUZGxsbPZoUYCfIZDKx9957x4UXXhhjxoyJ9u3bWwrwiZYuXRqNjY1NesaCgoLsqaee2kNaAADp4A5gAIAt2Hvvvfs29RlXrlwZtbW1wgLYSf5aBO+5554xa9asmDBhQqxevdpigI9UW1sb77//fnTu3LlJzzls2LC+EbFIYgAAyecOYACALejRo0eTL4DfeecdQQHsAoWFhTF8+PC48MILY/To0VFZWWkpQGKv15Jw3QsAwKejAAYA2ILWrVs3+ff/vvvuu4IC2IUKCwtjxIgRcckll8To0aOjZcuWlgIk7notCde9AAB8Oh4BDQCwBc2bN+/Z1GdUAAM0kW+wi4pixIgRsd9++8WUKVPiscceiw0bNlgMEO+9914SrnsVwAAAKeEOYACAj9G/f/+SkpKSjk19TgUwQNPSrFmzOOyww2Ls2LExatSoKCsrsxTIc0m4XistLe3Ut2/fYmkBACSfAhgA4GOccMIJ3Zr69dK6deuiqqpKWABNUHFxcYwcOTJ+/etfK4Ihz1VVVcX69eub+pgF3/zmN7tLCwAg+RTAAAAfY8iQIT2b+oxJeJwgQL77axE8duzYOProo6OkpMRSIA8l4botCde/AAB8MgUwAMDH6N69e8+mPqPHPwMkR/PmzeOoo46KSy65JEaOHBnNmjWzFMgjSbhuS8L1LwAAn0wBDADwMVq1atWjqc+4bNkyQQEkTHl5eYwaNSr+/d//PUaOHBnZbNZSIA8k4botCde/AAB8MgUwAMDHqKio6NXUZ1y+fLmgAJL750yMGjUqLr744jj88MOjqKjIUiDFknDd1rJly16SAgBIPgUwAMBHyGazmbKysq5NecbGxsZYtWqVsAASrlWrVnH88cfHxRdfHCNGjIiCAt+qQxqtWrUqGhsbm/SMJSUlXbPZbEZaAADJ5rtKAICPcNxxx7UrKCgobsozrl69Ourr64UFkBKtW7eO0aNHx9ixYxXBkEJ1dXXxwQcfNOkZCwoKio877rh20gIASDbfTQIAfITPf/7zXZr6jO+//76gAFKoTZs2MXr06Dj//PNj+PDhimBIkRUrVrgOBgBgh/NdJP+PvTuPr7I888d/nSwEkhD2HUQEUVRAoIiouCtq64Jabd1arVorbqO2tlXbaavTOu38Rqffdmpbu9rWpYogsqgFRXCttAIKArJDgAAJBLKQ5JzfH8WO4+DOcp6T9/v18jWvTv657ut6hNvnk/t+AICd2G+//bL+xVcSXiAC8PF17do1Lr300rj99ttj2LBhkUq5lRWSLgn7tyTsgwEAeH8FWgAA8H917txZAAxAVujevXtceeWVsXr16njiiSdi9uzZkclkNAYSKAn7tyTsgwEAeH8CYACAnWjXrp0roAHIKj169Igrr7wyli5dGpMmTYo5c+ZoCiRMEvZvSdgHAwDw/gTAAAA7UVxc3D3baxQAAzRPffr0ibFjx8aSJUti/PjxsWDBAk2BhEjC/i0J+2AAAN6fbwADAOxESUlJz2yur7q6Ourq6gwKoBnbb7/94l/+5V/ia1/7WhxwwAEaAglQV1cX1dXV9sEAAOxWAmAAgHc5/PDDSwsKCtpmc40VFRUGBUBERPTt2zduvPHGuOGGG2LffffVEMhy2b6PKygoaDt8+PASkwIASC4BMADAu5x44oldsr3GDRs2GBQA/8uAAQPiG9/4Rtxwww3Ru3dvDQH7uE+yH+5qUgAAyeUbwAAA79KvX7+sD4DXr19vUADs1IABA+LAAw+MuXPnxoQJE2LlypWaAlkkCTe5HHDAAV0i4i3TAgBIJgEwAMC7dO/evXO21+gEMADvJ5VKxaBBg2LgwIExe/bsGD9+fKxbt05jwD4uZ/bDAAC8NwEwAMC7tG/fvlO21ygABuDDSKVSMWzYsBg6dGjMnj07HnvsMbdIwF6WhBPASdgPAwDw3gTAAADv0rp166w/8ZCEF4cAZI+3g+BDDz00XnnllZg4caK/S8A+LtH7YQAA3psAGADgXUpKSrL6xENjY2Ns3rzZoAD4yPLz8+Pwww+P4cOHx/PPPx8TJ06MqqoqjYE9aPPmzdHY2BgFBdn7Wi7b98MAALw/ATAAwLu0bNmySzbXV1lZGZlMxqAA+Njy8/Nj1KhRMXLkyHjhhRcEwbAHZTKZqKqqio4dO9oPAwCwWwiAAQDepaioKKuvvKusrDQkAHaJgoKCGDVqVIwYMSJmzpwZkydPji1btmgM7IH9XDYHwNm+HwYA4P3laQEAwP8YPnx4SX5+fkk21ygABmBXa9GiRRx//PFxxx13xNlnnx0lJSWaAs14P5efn18yfPhwfxAAACSUABgA4B2OOOKIDtleo+//ArC7FBUVxejRo+P73/9+nH322VFcXKwpsBsk4cr1JOyLAQDYOQEwAMA79O3bt1221+gEMAC729tB8B133BGnn356tGrVSlOgme3n9ttvv7YmBQCQTAJgAIB36NSpkwAYAHYoKSmJz3zmM3HnnXfG6NGjo0WLFpoCzWQ/l4R9MQAAOycABgB4hw4dOrTN9hqTcGUgALmlpKQkzj777PjOd74To0aNivz8fE2BHN/PJWFfDADAzgmAAQDeoaysrG221ygABmBvad++fVx00UVx5513xgknnBCFhYWaAjm6nysrK3MCGAAgoQTAAADvUFJS0j6b68tkMlFdXW1QAOxV7dq1i/POOy+++93vxqhRoyIvz+sF+CiSsJ8rLS0VAAMAJJT/QgMAeIfi4uK22VxfXV1dNDY2GhQAWeHtE8F33HGHIBg+gsbGxqirq7MvBgBgt/BfZgAA79CqVausPung9C8A2ahDhw5x0UUXxbe//e04/PDDBcGQA/u6oqIiJ4ABABLKf5EBALxDQUGBABgAPqauXbvGpZdeGt/61rdi2LBhkUqlNAUSuq9r0aJFW1MCAEimAi0AAPgfhYWFZdlc39atWw0JgKzXrVu3uPLKK2P16tXxxBNPxOzZsyOTyWgMJGhfl+37YgAA3psAGADgnZujgoLW2VyfE8AAJEmPHj3iyiuvjKVLl8akSZNizpw5mgIJ2ddl+74YAID35gpoAIAdWrdunZefn98ym2sUAAOQRH369ImxY8fGLbfcEgMGDNAQSMC+Lj8/v1WrVq28OwQASCCbOACAHQYNGlQSEVn9scJt27YZFACJtd9++8UNN9wQX/va1+KAAw7QEJq1BOzr8gYPHlxsUgAAySMABgDY4YADDijJ9hpramoMCoDE69u3b9x4441xww03xL777qshNEu1tbVZX2P//v1LTQoAIHl8AxgAYIeePXtm/QuuJLwoBIAPa8CAATFgwICYP39+jBs3LpYvX64pNBtJ2Nf16NGjxKQAAJJHAAwAsEOnTp0EwACwFwwYMCAOPPDAmDt3bkyYMCFWrlypKeS8JOzrunbtKgAGAEggATAAwA5lZWVZ/4Krrq7OoADISalUKgYNGhQDBw6M2bNnx4QJE2Lt2rUaQ85KQgDcpk0bV0ADACSQABgAYIeysjIngAFgL0ulUjFs2LAYOnRozJ49O8aPHx/r1q3TGHKOABgAgN1FAAwAsENJSUlxttfoBDAAzcXbQfCQIUPi5ZdfjokTJ0ZFRYXGkDOSEAAnYX8MAMD/JQAGANihqKioKNtrrKmpMSgAmpW8vLw4/PDDY/jw4fH888/HE088EZWVlRpD4iUhAG7RokWRSQEAJI8AGABgh8LCwhbZXF86nY7t27cbFADNUn5+fowaNSpGjhwZL7zwQkycODGqqqo0hsTavn17ZDKZSKVSWVtjixYtWpgUAEDyCIABAHbI9gC4oaHBkABo9goKCmLUqFExYsSImDlzZkyePDm2bNmiMSROJpOJhoaGyOaMtbCw0AlgAIAk/neTFgAA7NgYFRRk9QuuxsZGQwKAHVq0aBHHH398HHnkkfHMM8/E1KlTY9u2bRpDomR7AJzt+2MAAN5jH6cFAAA7NkZZ/oLL9c8A8H8VFRXF6NGj49hjj41nnnkmpkyZEjU1NRpDImT7DS8FBQWugAYASCABMADA2xujLH/B5QpoAHhvbwfBRx11VEyfPj2efvrpqK2t1RiymgAYAIDdIU8LAAD+QQAMAMlXUlISn/nMZ+LOO++M0aNHZ/X1uiAABgBgdxAAAwDskO1XQAuAAeDDKykpibPPPjv+7d/+LUaPHh2FhYWagv3dR5Sfn9/SlAAAkkcADADw9sYoL88JYADIMa1bt46zzz47vve978UJJ5wgCMb+7iPIz8/3LwwAQAIJgAEAdkilUlm9N2psbDQkAPiY2rVrF+edd15897vfjRNOOCEKCgo0Bfu7D94f55sSAEDyCIABAHbI9gA4nU4bEgB8Qu3bt/9nEDxq1KjIy/NqBPu799kfp0wJACB5/FcOAMAOXnABQPPRoUOHuOiii+J73/ueIJi9JpPJZHuJ/sUAAEggmzgAgP+R1QFwAl4QAkDidOzYMS666KL41re+FYcffnj4fTDs796xOc7yG3IAANg5mzgAgITsjQTAALD7dOvWLS699NL41re+FcOGDRMEs0dk+xXQeXl5/kUAAEigAi0AAPiHbH/BJQAGgN2ve/fuceWVV8ayZcviiSeeiDlz5mgKzXl/5/AIAEACCYABAHbIZDJOAAMAERGx7777xtixY2PJkiUxYcKEmD9/vqZgfwwAQCIIgAEA/ocr7gCA/2W//faLG264Id56660YP358vPnmm5rCLpPtV0Cn3IUOAJBIAmAAgB2y/QVXtr8gBIBc1rdv37jxxhvjrbfeinHjxsWiRYs0hU/MFdAAANjEAQDsXln9Bs4BDADY+/r27Rs333xz3HDDDdG7d28NIdf3d75BAgCQQE4AAwDskO0nMATAAJA9BgwYEAMGDIj58+fHI488EitXrtQUcnF/5woaAIAEcgIYAGCHVCqVzvL6DAkAssyAAQPi1ltvjbFjx0bPnj01hJza32UScEc1AAD/lxPAAAD/QwAMAHysv6MHDRoUBx98cDz//PMxadKk2LRpk8aQ+P1dtv+CJAAAO+cEMADADul0dr/fEgADQHarr6+PioqK2LZtm2aQE/u7dDrtBDAAQAI5AQwA8D+cAAYAPrK6urp4+umnY9q0acJfcm1/5wQwAEACCYABAP6HEw4AwIfW0NAQ06ZNiyeffDK2bt2qIXxkCfgGsAAYACCBBMAAADtkMpmsDoDz8ny9AwCywdvB71NPPRXV1dUaQs7u7wTAAADJJAAGANgh219wCYABYO9qbGyMGTNmxJNPPhmVlZUawieWn5+f9VtkUwIASB4BMADADplMpiGb6yssLDQkANgL0ul0zJo1KyZPnhwbN27UEHaZgoLsfjXX1NTUaEoAAAncZ2oBAMA/NDY2bs/m+gTAALBnpdPpePnll2Py5Mmxdu1aDWGXa9GiRbb/O1BvSgAAySMABgDYoampSQAMAEQmk4nZs2fH448/HuXl5RpCs93fNTY2CoABABJIAAwAsENDQ0NWv+ASAAPA7vV28PvEE0/E6tWrNYTdLtuvgM72G3IAAHiPfaYWAAD8gyugAaD5mjNnTkyaNCmWLl2qGewx2X4FtAAYACCZBMAAADs0NTU5AQwAzcyCBQtiwoQJ8dZbb2kG9nfv0tDQIAAGAEggATAAwA7Z/oJLAAwAu87ChQtj/PjxsXjxYs1gr8n2K6Cz/RckAQB4j32mFgAA/EO2B8AFBQWRl5cX6XTasADgY1q+fHmMGzcu5s+frxnsVXl5eVkfAG/fvt0JYACABBIAAwDs0NDQkPUnHFq1ahXbtm0zLAD4iFauXBmPPPKI4Jes2tclYH8sAAYASCABMADADrW1tXXZXqMAGAA+mnXr1sX48eNj9uzZkclkNISs2tdlu7q6ulqTAgBIHgEwAMAOW7du3ZrtNSbhRSEAZIP169fHY489JvjFvu4TqK6u3mpSAADJIwAGANihqqpKAAwACbdhw4Z4/PHH45VXXommpiYNwb7uE6isrHT1DABAAgmAAQB22LRpU9a/4GrZsqVBAcBOVFVVxcSJE+OFF16IxsZGDSHrJSEA3rRpkxPAAAAJJAAGANhh3bp1WR8AOwEMAP/bli1bYsKECYJfEicJ+7ry8nIBMABAAgmAAQB2WLZsmSugASAhqqurY/LkyTFz5syor6/XEBInCfu6pUuXCoABABJIAAwAsMP8+fOz/gRwcXGxQQHQrNXU1MSUKVPimWeeEfySaEnY173++uu+AQwAkEACYACAHRYsWFCXyWQaUqlUYbbW2Lp1a4MCoFmqq6uLp59+OqZNmxbbtsmkSL5s39el0+mGpUuXbjcpAIDkEQADALxDU1PTtoKCgrbZWp8AGIDmZvv27TF9+vR48sknY+tWt9GSO7J9X9fU1ORfOACAhBIAAwC8Q0NDw9ZsDoBLS0sNCYDm8ndyTJs2LZ566qmorq7WEHJOtu/rGhsb/YsHAJBQAmAAgHeor6+vbNWqVc9src8JYAByXWNjY8yYMSOefPLJqKys1BByVrbv6+rr66tMCQAgmQTAAADv0NDQkNVvmgXAAOSqdDods2bNismTJ8fGjRs1hJyX7fu6bN8XAwDw3gTAAADvUFdXV5XN9ZWWlkYqlYpMJmNYAOSETCYTr732Wjz++OOxatUqDaFZSKVSUVJSktU11tbWVpkUAEAyCYABAN5h27Ztm7K5vvz8/GjVqlXU1NQYFgCJlslkYvbs2fH4449HeXm5htCstGrVKvLz87O6xq1btzoBDACQUAJgAIB3qK6u3pztNZaVlQmAAUist4PfiRMnxpo1azSEZqmsrCzra9y2bVuVSQEAJJMAGADgHaqqqjZle43t2rWLtWvXGhYAiTNnzpyYNGlSLF26VDNo1tq1a5f1NW7atMkJYACALNbQWBgFjQ0REZFKRSavMJre/pkAGADgHSoqKqqyvcYkvDAEgHdasGBBTJgwId566y3NgITs5zZs2CAABgDIYoUFDf9MejMRqab0/+S+AmAAgHdYtWpV1r/oatu2rUEBkAgLFy6M8ePHx+LFizUD3iEJAfDq1aurTAoAIJkEwAAA77BgwYKsD4CdAAYg2y1fvjzGjRsX8+fP1wzYiST8Ql8S9sUAAOycABgA4B2eeOKJjZlMpimVSuVna41OAAOQrVauXBmPPPKI4Bc+QLb/Ql8mk2l64oknNpoUAEAyCYABAN6huro6vX379g1FRUVdsrVGJ4AByDZr166NCRMmxOzZsyOTyWgIJHw/t3379g3V1dVpkwIASCYBMADAu9TV1a0XAAPAB1u/fn089thjgl/Isf1cXV3delMCAEguATAAwLvU1dVVtGnTJmvrKykpiRYtWsT27dsNC4C9oqKiIiZOnBivvPJKNDU1aQh8BEVFRVFcXJz1+2GTAgBILgEwAMC7bN26dV2XLll7ADhSqVR07Ngx1qxZY1gA7FFVVVUxceLEeP755wW/8DF17NgxUqlU1u+HTQoAILkEwAAA71JVVZX1Jx46deokAAZgj9m8eXM8/vjj8cILL0RjY6OGwCfcx9kPAwCwOwmAAQDeZf369Vn/zbMkvDgEIPm2bNkSU6ZMiZkzZ0Z9fb2GwC7QsWNH+2EAAHYrATAAwLusXr066088JOHFIQDJVVNTE1OmTIlnnnlG8Au7WBJ+kW/VqlUCYACABBMAAwC8y9///ves/+aZABiA3aG2tjYmT54czz77bNTV1WkINNN93KuvvioABgBIMAEwAMC7PPzww+t//OMfN6RSqcJsrbFz584GBcAus3379pg+fXpMnTo1tm3bpiGwG2X7CeB0Ot3w8MMPC4ABABJMAAwA8C7V1dXpurq68latWu2TrTV26NAh8vLyIp1OGxgAH1tDQ0NMmzYtnnrqqaiurtYQ2M3y8vKiQ4cOWV1jfX39mtraWptMAIAEEwADAOxEbW3tmmwOgAsKCqJdu3axceNGwwLgI2tsbIwZM2bEk08+GZWVlRoCe0j79u2joCC7X8fV1NSUmxQAQLIJgAEAdmLz5s2r2rdvn9U1duvWTQAMwEeSTqdj1qxZMXnyZH+HwF7av2W7LVu2rDQpAIBkEwADAOzEpk2bVvfp0yera+zWrVvMmzfPsAD4QG8Hv1OmTIkNGzZoCOzF/Vu227BhwxqTAgBINgEwAMBOrFixYvWwYcOyusYkvEAEYO/KZDLx0ksvxZQpU6K83K2usLd17do162tctWrVKpMCAEg2ATAAwE7Mnz9/9ZgxY7K6xiS8QARg78hkMjF79uyYOHFirFnjMB9kiyT8At+8efP8oQEAkHACYACAnRg3btyab37zm5mISGVrjU4AA7Azc+bMiSeeeCKWLVumGZBlEvALfJlx48atNikAgGQTAAMA7MTrr79e29DQsKmwsLBDttZYXFwcZWVlsWXLFgMDIBYsWBDjx4+PJUuWaAZkobKysiguLs7qGhsaGjYuWLCgzrQAAJJNAAwA8B62bt26vF27dh2yucauXbsKgAGauYULF8b48eNj8eLFmgFZLAm3t2zbtm25SQEAJJ8AGADgPVRVVS1t167d0GyusWfPnrFw4ULDAmiGli1bFo899ljMnz9fMyABevbsmfU1VlZWLjUpAIDkEwADALyHdevWLevTp09W15iEF4kA7ForVqyIRx99VPALCZOEfdvatWuXmRQAQPIJgAEA3sPChQuXHX744VldY69evQwKoJlYtWpVjB8/PubOnRuZTEZDIGGSsG9buHDhMpMCAEg+ATAAwHuYNm3a0ksuuSSra+zevXvk5+dHU1OTgQHkqHXr1sX48eNj9uzZgl9IqIKCgkR8A/jpp59eZloAADmw/9QCAICde+ihhzbcd999W/Pz80uzdjNXUBBdunSJNWvWGBhAjqmoqIiJEyfGyy+/HOl0WkMgwbp27RoFBdn9Gq6xsbH6kUce2WBaAADJJwAGAHgf27ZtW15WVnZwNtfYq1cvATBADqmqqoqJEyfG888/74YHyBFJ+P7vtm3blpsUAEBuEAADALyPLVu2LMv2ALhnz57x0ksvGRZAwm3evDkef/zxeOGFF6KxsVFDIIck4fu/W7ZsWWpSAAC5QQAMAPA+1q9fvyzbT2z06NHDoAASbMuWLTFlypSYOXNm1NfXawjkoCTs19avX7/MpAAAcoMAGADgfSxYsGDh0KFDs7rGfffdN1KpVGQyGQMDSJCampqYMmVKPPPMM4JfyGGpVCr23XffrK9z/vz5C00LACA3CIABAN7Ho48++uYFF1yQ1TWWlJRE586dY926dQYGkAC1tbUxefLkePbZZ6Ourk5DIMd17do1WrVqlfV1/vnPf15kWgAAuUEADADwPiZNmlRVX1+/oaioqGM217nvvvsKgAGy3Pbt22P69OkxderU2LZtm4ZAM9GnT5+sr7G+vr7iySefrDItAIDcIAAGAPgAW7duXZTtAXCfPn3ipZdeMiyALNTQ0BDTpk2Lp556KqqrqzUEmpkkXP+8detWp38BAHKIABgA4ANUVFQs7NChw8hsrjEJLxYBmpvGxsaYMWNGPPnkk1FZWakh0EwlYZ9WUVHh+78AADlEAAwA8AGWLl266MADD8zqGnv16hUFBQXR2NhoYAB7WTqdjlmzZsWkSZNi06ZNGgLNWGFhYfTs2TMR+13TAgDIHQJgAIAPMHPmzEWnnnpqdm/qCgqiZ8+esWzZMgMD2EveDn4nT54cGzdu1BAg9tlnn8jPz0/CfnexaQEA5I48LQAAeH+//OUvV6bT6bpsr7NPnz6GBbAXZDKZePHFF+O73/1u3H///cJf4J+ScP1zOp2u++Uvf7nStAAAcocTwAAAH6C6ujpdXV29uE2bNodkc539+vWL6dOnGxjAHpLJZGL27NkxceLEWLNmjYYAO92fJWCvu7i6ujptWgAAuUMADADwIWzYsGFetgfA/fv3NyiAPeTVV1+NSZMmxapVqzQD2KlUKpWI/dmGDRvmmhYAQG4RAAMAfAiLFy9+o2/fvlldY1lZWXTu3DnWr19vYAC7yYIFC2L8+PGxZMkSzQDeV5cuXaK0tDQJ+9z5pgUAkFsEwAAAH8JTTz31+ujRo7O+zv33318ADLAbLFy4MMaPHx+LFy/WDOBD78uSYMqUKa+bFgBAbsnTAgCAD/aLX/xiTWNjY1W215mUF40ASbFs2bK4++674z/+4z+Ev8BHkoTv/zY0NFTee++9q00LACC3OAEMAPAhNDQ0ZDZv3jy/Q4cOI7O5TgEwwK6xYsWKePTRR2P+fDejArm7L9uyZYs/5AAAcpAAGADgQ1q3bl3WB8AdO3aMNm3axObNmw0M4GNYtWpVjB8/PubOnRuZTEZDgI+lbdu20aFDh0Tsb00LACD3CIABAD6kefPmzTvooIOyvs4DDzwwXnrpJQMD+AjWrVsX48ePj9mzZwt+gV2yH0uCuXPnzjMtAIDcIwAGAPiQ/vznP88/77zzsr7OAw44QAAM8CFVVFTEuHHjBL/ALt+PJcHDDz/sBDAAQA4SAAMAfEgTJ06srK2tXdGqVat9srnOgw8+2LAAPkBVVVVMnDgxnn/++WhqatIQYJdKwq0xNTU1yydNmlRlWgAAuUcADADwEWzYsOHvvXr1yuoAuG3bttG1a9dYu3atgQG8y+bNm+Pxxx+PF154IRobGzUE2OW6desWbdu2TcS+1rQAAHKTABgA4CNYuHDha7169Toj2+scMGCAABjgHbZs2RJTpkyJ5557LrZv364hwG6TlO//Lly48O+mBQCQmwTAAAAfwcSJE/9+wgknZH2dBx54YEyfPt3AgGavpqYmpkyZEs8880zU19drCLDbDRgwIBF1jh8//u+mBQCQmwTAAAAfwb333rv6Bz/4wfqioqLO2VznAQccEHl5eZFOpw0NaJZqa2tj8uTJ8eyzz0ZdXZ2GAHtEXl5e9O/fP+vrrK+vX3ffffeVmxgAQG4SAAMAfESVlZVzu3btmtXHgFu1ahX77LNPLFu2zMCAZqWuri6efvrpmDZtWmzbtk1DgD1qn332iVatWmV9nZs2bZpjWgAAuUsADADwES1dunR2tgfAERGDBg0SAAPNRkNDQ0ybNi2eeuqpqK6u1hBgr+2/kuCtt976m2kBAOQuATAAwEc0ffr0v48cOTLr6xw4cGBMmDDBwICc1tDQEM8991w8+eSTUVlZqSHAXt9/JcG0adP+bloAALlLAAwA8BH9x3/8x9JbbrmlOj8/v3U219mrV68oKyuLLVu2GBqQc9LpdMyaNSsmTZoUmzZt0hBgrysrK4tevXplfZ2NjY1b7rnnnmUmBgCQuwTAAAAfUW1tbXrDhg1/7dKly3HZXGcqlYqBAwfGrFmzDA3IGW8Hv5MnT46NGzdqCJA1Bg4cGKlUKuvr3Lhx4yu1tbVpEwMAyF0CYACAj+Gtt956JdsD4IgQAAM5I51Ox8svvxxTpkyJ8vJyDQGyct+VBIsWLXrFtAAAcpsAGADgYxg/fvwrRxxxRNbXedBBB0VBQUE0NjYaGpBImUwmZs+eHRMnTow1a9ZoCJCVCgoK4qCDDkpErY888ogAGAAgx+VpAQDAR/fjH/94ZX19/fpsr7OoqCj69etnYEAivfrqq3HHHXfEz3/+c+EvkNX69esXRUVFWV9nXV1d+b333rvaxAAAcpsTwAAAH9OGDRte6dGjx6ezvc5BgwbFggULDAxIjCVLlsSECRNi/vz5mgEkwuDBgxNR5/r1653+BQBoBgTAAAAf07x5815OQgA8bNiwePjhhyOTyRgakNXefPPNmDBhQixevFgzgMRIpVIxdOjQRNQ6d+7cl0wMACD3CYABAD6m++677+XRo0dnIiKVzXW2bds2evfuHcuWLTM0ICstW7YsHnvsMSd+gUTq06dPtG3bNgmlpu+9996/mhgAQO4TAAMAfEwTJ06s3Lp165LS0tK+2V7rkCFDBMBA1lmxYkU8+uijgl8g0YYMGZKIOqurqxc+/fTTm00MACD3CYABAD6B8vLyl/fff/+sD4AHDx4c48aNMzAgK6xcuTImTJgQc+fOdT09kHhJ+f7vmjVrfP8XAKCZEAADAHwCM2fOfG7//ff/fLbX2a1bt+jWrVuUl5cbGrDXrFu3LsaPHx+zZ88W/AI5oWfPntGlS5dE1DpjxoznTAwAoHkQAAMAfAK33Xbba5dcckl1fn5+62yvdciQIQJgYK9Yv359PPbYY4JfIOck5frnxsbGzbfddts8EwMAaB4EwAAAn0BlZWXThg0b/tqlS5fjsr3WQw89NCZNmmRowJ78MzKeeOKJeP7556OpqUlDgJxz6KGHJqLOioqKV6qrq9MmBgDQPAiAAQA+oXnz5s1MQgDcu3dv10ADe0RVVVVMnDgxXnjhhWhsbNQQICd17949evbsmZT9quufAQCakTwtAAD4ZP77v/97VkQk4kTFpz71KQMDdpstW7bEQw89FLfffns899xzwl8gpw0fPjwRdWYymfTdd9/9gokBADQfTgADAHxCkyZNqtqyZcuCsrKyg7K91uHDh8fjjz9uaMAuVVNTE1OmTIlnnnkm6uvrNQTIealUKg477LBE1Lply5bXp0+fvsXUAACaDwEwAMAusHz58lkDBw7M+gC4S5cu0atXr1i5cqWhAZ9YbW1tTJ48OZ599tmoq6vTEKDZ6N27d3Ts2DEx+1QTAwBoXgTAAAC7wLPPPvvCwIEDr0hCrcOGDRMAA59IXV1dPP300zFt2rTYtm2bhgDNzrBhwxJT61/+8pcXTQwAoHnxDWAAgF3g1ltvnV9fX782CbUefvjhkUqlDA34yBoaGmLq1Klx6623xuOPPy78BZqlJF3/XFdXt/rWW29dYGoAAM2LE8AAALtAQ0NDZs2aNc/16dPns9lea7t27aJPnz6xZMkSgwM+7J9xMW3atHjqqaeiurpaQ4Bmbb/99ou2bdsmotbVq1fPNDEAgOZHAAwAsIs8++yz05IQAEdEHHHEEQJg4AOl0+mYNWtWTJo0KTZt2qQhABFx5JFHJqbW6dOnTzMxAIDmxxXQAAC7yC233PJaQ0NDZRJqHT58eLRo0cLQgJ1Kp9Px3HPPxW233Rb333+/8Bdgh6KiovjUpz6ViFobGho23HLLLXNNDQCg+XECGABgF6murk6Xl5c/t88++5yR7bW2bNkyDj300Hj55ZcNDvindDodL7/8ckyZMiXKy8s1BOBdhgwZEkVFRYmodc2aNc/V1tamTQ0AoPkRAAMA7EIvvvjiM0kIgCMiRo4cKQAGIiIik8nE7NmzY+LEibFmzRoNAXif/VNSzJo161kTAwBongTAAAC70O233/7KOeecszU/P78022sdMGBAtG/f3tWu0My9+uqrMWnSpFi1apVmALyPjh07xgEHHJCIWhsbG6u/8Y1v/NXUAACaJwEwAMAutHLlyob169fP6tat2+hsrzWVSsXhhx8ekyZNMjhohubMmROTJ0+OJUuWaAbAh3D44YdHKpVKRK3r16+fVVFR0WhqAADNU54WAADsWq+++mpirts77LDDDAyamTfffDP+/d//PX7yk58IfwE+pFQqFSNGjEhMva+88sozpgYA0Hw5AQwAsIvddNNNz5166qnV+fn5rbO91m7dukX//v1j4cKFBgc5btmyZfHYY4/F/PnzNQPgIzrggAOic+fOiai1sbFxy4033jjL1AAAmi8BMADALrZy5cqG8vLyGT179vx0Euo9+uijBcCQw5YvXx7jxo0T/AJ8wv1SUpSXlz9TXl7eYGoAAM2XABgAYDeYMWPGUxdccEEiAuAhQ4ZE69ato7q62uAgh6xcuTImTJgQc+fOjUwmoyEAH1ObNm3i0EMPTUy9zz777FOmBgDQvPkGMADAbvDVr371lYaGhk1JqLWgoCCOOOIIQ4McsW7duvj5z38ed955Z8yZM0f4C/AJjRw5MvLz8xNRa0NDw8abbrrpVVMDAGjenAAGANgNKisrm1atWjW9T58+5ySh3qOPPjqefPJJQREk2Pr16+Oxxx6L2bNn+3cZYBdJpVIxatSoxNS7cuXKadXV1WmTAwBo3pwABgDYTaZNm5aY6/c6duwYAwYMMDRIoA0bNsSvf/3r+Nd//dd49dVXhb8Au9CAAQOiY8eOian36aefftLUAAAQAAMA7CZf+9rX5tTX11ckpd6jjjrK0CBBqqqq4v77749vf/vb8eKLL0ZTU5OmAOxiRx55ZGJqra+vX/eNb3zjdVMDAMAV0AAAu0ltbW16xYoVT++///6fT0K9hx56aLRt2zaqqqoMD7LYli1bYsqUKfHcc8/F9u3bNQRgN2nbtm0MGTIkMfUuX778qdraWtc/AwDgBDAAwO70xz/+cUJSas3Pz4/jjjvO0CBL1dTUxKOPPhq33XZb/OUvfxH+Auxmxx57bOTn5yel3Myvf/3rCaYGAECEABgAYLe66667llZXV89PSr1HH310tGjRwuAgi7wd/H7jG9+IqVOnRn19vaYA7GYtWrSIo48+OjH1btmy5Y177rlnhckBABDhCmgAgN3u9ddfn3T44YcPSEKtxcXFcdhhh8XMmTMNDvayurq6ePrpp2PatGmxbds2DQHYgw477LAoKSlJTL3z5s17wtQAAHibE8AAALvZ9773vanpdLohKfWecMIJkUqlDA72koaGhpg6dWrceuut8fjjjwt/AfawVCoVJ5xwQmLqTafT27/73e8+ZXIAALzNCWAAgN1s+vTpWyoqKmZ26dIlER/Y7d69e/Tv3z/efPNNw4M9qKGhIaZNmxZPPfVUVFdXawjAXnLAAQdE9+7dE1NvRUXFczNmzPAXBwAA/+QEMADAHjBr1qxEXcuXpFMvkHTpdDqee+65uP322+PRRx8V/gLsZccff3yi6p0xY8YkUwMA4J2cAAYA2AO++tWvvnT66adXFRYWtk1CvQMHDoyOHTvGhg0bDA92k3Q6HbNmzYrJkyfHxo0bNQQgC3Ts2DEGDhyYmHobGhoqb7755pdMDgCAd3ICGABgDygvL29YsWLF1MRsEvPy4sQTTzQ42A3S6XS8+OKL8Z3vfCfuv/9+4S9AFjnppJMiLy85r8tWrFgxpaKiotHkAAB4JwEwAMAe8qtf/erRiMgkpd6jjjoqysrKDA52kUwmE6+++mp873vfi1//+texdu1aTQHIImVlZXHUUUcl6q+W//7v//6zyQEA8G4CYACAPeQ///M/l1dWVv4tKfUWFhbGMcccY3CwC7wd/P785z+PNWvWaAhAFjruuOOioCA5X0urqqqa/dOf/nS1yQEA8G4CYACAPeill14al6R6jzvuuCgqKjI4+JjmzJkTd911V/z85z+P1au9owfIVkVFRYn7xbcXXnhhnMkBALAzBVoAALDnjB079pkFCxZUFhYWtktCvSUlJXHEEUfE9OnTDQ8+gjfffDPGjx8fb731lmYAJMCRRx4ZJSUliam3oaFh0zXXXPOsyQEAsDMCYACAPai8vLxh6dKlE/v3739xUmo+8cQT49lnn410Om2A8AEWLVoUjz32WCxevFgzABIiLy8vTjzxxETVvGTJkifKy8sbTA8AgJ3ucbUAAGDP+u1vfzsxIjJJqbdjx44xdOhQg4P3sXz58rj77rvjRz/6kfAXIGGGDRsWHTp0SFLJmd/85jePmxwAAO9FAAwAsIf953/+5/JNmza9kqSaTz/99EilUoYH77Jy5cr4yU9+Et///vdj/vz5GgKQMHl5eXHGGWckquZNmza9fM8996wwPQAA3osroAEA9oKXXnpp/KmnnnpYUurt2rVrDBkyJGbPnm14EBHr1q2L8ePHx+zZsyOTyWgIQEINHTo0OnfunKiaX3jhhQkmBwDA+xEAAwDsBZdffvkzS5YsWVdUVNQlKTWfccYZ8be//U3YRbO2fv36eOyxxwS/ADkglUrF6aefnqia6+rq1lx22WXTTQ8AgPcjAAYA2AsqKyub5s+f/8ihhx56dVJq7tatm1PANFsbNmyIxx9/PF555ZVoamrSEIAc8KlPfSq6du2aqJrfeOONcdXV1WnTAwDg/fgGMADAXvL1r399XDqdrktSzb4FTHNTVVUV999/f3z729+OF198UfgLkCNSqVR8+tOfTlTN6XS69pvf/OZjpgcAwAdxAhgAYC+ZMWNG9Zo1a/7Ss2fPxLx97N69ewwcODDmzJljgOS0LVu2xIQJE+KFF16IxsZGDQHIMYceemh069YtUTWvXr36qRkzZlSbHgAAH8QJYACAvejXv/71HyMiUR8SPeuss5wCJmdt27YtHn300bjtttviueeeE/4C5KC8vLwYM2ZM0srO/OpXv/qT6QEA8KH2vFoAALD3fP/733+rqqoqUR/V7dGjR3zqU58yPHJKfX19TJ06Nb71rW/F1KlTo76+XlMActSIESOiS5cuiap506ZNf73rrruWmh4AAB+GABgAYC975plnHkpazWeccUbk5dlKkjvmzZsXjz76aGzdulUzAHJYQUFBnH766Ymre9q0aQ+aHgAAH5a3dgAAe9nYsWNn1tfXr01SzZ07d47DDjvM8ACARBk5cmR06NAhUTXX1dWtHjt27POmBwDAhyUABgDYyyorK5tee+21Pyat7jPPPDMKCgoMEABIhBYtWiTy9O/s2bP/UF1dnTZBAAA+LAEwAEAWuOqqqyY0NjZWJanm9u3bx9FHH214AEAiHHfccdGmTZtE1dzQ0LDxiiuumGh6AAB8FAJgAIAssGDBgrqFCxc+lrS6R48eHYWFhQYIAGS1li1bxsknn5y4uhcuXDhu6dKl200QAICPQgAMAJAlvv71r/8pnU7XJqnmtm3bximnnGJ4AEBWO+2006K0tDRRNTc1NdV+7Wtfe8j0AAD4qATAAABZ4umnn968fPnyxF3xN3r06GjXrp0BAgBZqUOHDnH88ccnru5ly5ZNmD59+hYTBADgoxIAAwBkkbvvvvtPmUymKUk1FxYWxumnn254AEBWOvPMMxP3yYpMJtN41113/dH0AAD4OATAAABZ5Be/+MWatWvXTkta3UcccUT06tXLAAGArNK7d+847LDDEld3eXn5X+6///51JggAwMchAAYAyDIPP/zwn5JWcyqVijPPPNPwAICsMmbMmEilUomr+8EHH/yT6QEA8HEJgAEAsszXv/71NzZs2DAraXUPHDgwDj74YAMEALLCoEGDYsCAAYmru6KiYuatt966wAQBAPi4BMAAAFlo3Lhxv01i3WPGjIm8PFtMAGDvysvLizFjxiSy9j//+c+/NUEAAD7RflgLAACyz/XXXz+nqqrqr0mru1evXnHUUUcZIACwVx1zzDHRvXv3xNW9adOmV2666aa5JggAwCchAAYAyFJ/+tOf7k1i3WPGjInS0lIDBAD2ijZt2sRZZ52VyNofeOCBe00QAIBPSgAMAJClbrrpprlJPAVcXFwcZ555pgECAHvFWWedFS1btkxc3Zs2bXrl5ptvnmeCAAB8UgJgAIAsNm7cuF8lse5Ro0ZF7969DRAA2KP69OkTI0eOTGTtjz322K9MEACAXUEADACQxcaOHTu7qqrqb0mrO5VKxfnnnx+pVMoQAYA9tv/4/Oc/n8j9R2Vl5d+uueaav5kiAAC7ggAYACDLTZ069bdJrLtv374xZMgQAwQA9ojDDjsssTeQTJ48+TcmCADAriIABgDIcpdeeumLVVVVryax9s9//vNRXFxsiADAblVaWhrnn39+Imuvqqr66+WXX/6SKQIAsKsIgAEAEuChhx76WRLrLisri9NPP90AAYDd6qyzzoqSkpIklp753e9+91MTBABgVxIAAwAkwA033DB3w4YNs5JY+3HHHRd9+vQxRABgt+jbt28cddRRiay9oqJi1te//vU3TBEAgF1JAAwAkBA///nPfxoR6aTVnUql4vOf/3zk5dl6AgC7Vn5+flx00UWRSqWSWH76F7/4xX+bIgAAu5q3cAAACXHHHXe8tW7duulJrL13795xzDHHGCIAsEudcMIJ0b1790TWXl5e/pc77rjjLVMEAGBXEwADACTI3XfffW8mk2lKYu1nnXVWtG3b1hABgF2iQ4cOcfrppyey9kwm03T33Xf/3BQBANgdBMAAAAlyzz33rCgvL386ibW3bNkyzj33XEMEAHaJc889N1q0aJHI2tesWTP1xz/+8UpTBABgdxAAAwAkzA9/+MOfZzKZhiTWPnz48Bg0aJAhAgCfyKGHHhpDhw5NZO3pdLrhBz/4wS9MEQCA3UUADACQMPfee+/qRYsWPZDU+i+++OIoKSkxSADgY2ndunVcfPHFia1/4cKFf7jvvvvKTRIAgN1FAAwAkECXXXbZrxsaGjYlsfaysjJXQQMAH9u5554bpaWliay9oaFh4+WXX/47UwQAYHcSAAMAJNDs2bNrXn311V8ntf4jjjgiDj74YIMEAD6SwYMHx+GHH57Y+l955ZX7Zs+eXWOSAADsTgJgAICEOueccx6tqalZmtT6L7roomjZsqVBAgAfSsuWLeNzn/tcYuuvqalZMmbMmMdMEgCA3U0ADACQUJWVlU3Tpk37RVLrb9++fZx++ukGCQB8KGeccUa0b98+sfU/+eST91ZXV6dNEgCA3U0ADACQYOedd960qqqqV5Ja/wknnOAqaADgAx188MFx/PHHJ7b+TZs2vXzBBRc8a5IAAOwJAmAAgIT74x//eG9EZJJYeyqVigsuuMBV0ADAe2rZsmVccMEFkUqlkrqEzP333/8zkwQAYE8RAAMAJNzNN988b9WqVU8ktf6OHTsm+nt+AMDudcEFF0THjh0TW/+KFSse//rXv/6GSQIAsKcIgAEAcsCNN974k6ampq1JrX/kyJExdOhQgwQA/pdPfepTMWLEiMTW39TUVH3zzTf/t0kCALAnCYABAHLAxIkTK//+97//KslruPDCC6OsrMwwAYCIiGjTpk18/vOfT/QaZs+efd/EiRMrTRMAgD1JAAwAkCPOPvvsh2pqapYntf7S0tK46KKLDBIAiFQqFV/84hejtLQ0sWuoqal566yzznrYNAEA2NMEwAAAOaKioqJx0qRJP07yGgYPHhwjR440TABo5o444og46KCDEr2GJ5544qeVlZVNpgkAwJ4mAAYAyCGXXHLJzIqKihlJXsMFF1wQ3bp1M0wAaKZ69uyZ+KufKyoqZnzhC1+YZZoAAOwNAmAAgBzzb//2b/ek0+ntSa2/RYsWceWVV0ZhYaFhAkAzU1hYGF/60pcSvQ9Ip9Pb/+3f/u0e0wQAYG8RAAMA5Jh777139aJFix5M8hq6d+8eZ555pmECQDNzxhlnRPfu3RO9hsWLFz947733rjZNAAD2FgEwAEAO+uxnP/vL2traRL94PPHEE2Pw4MGGCQDNxKBBg+Kkk05K9Bpqa2tXn3vuub80TQAA9iYBMABADlq8eHH9uHHj/j3Ja0ilUnHJJZdE27ZtDRQAclybNm3ikksuiVQqleh1jBs37t8XL15cb6IAAOxNAmAAgBx1+eWXv1RRUTEjyWsoLS2NL3zhC4l/GQwAvLe3f+mrdevWiV5HRUXFM5dffvlLJgoAwN4mAAYAyGE33HDDXU1NTVuTvIaDDjrI94ABIId95jOfiUMOOSTRa2hqaqq+4YYbfmiaAABkAwEwAEAOGzdu3MbZs2cn/jt0p5xyiu8BA0AOOuSQQ+LTn/504tfx17/+9efjxo3baKIAAGQDATAAQI77zGc+81B1dfXCJK8hlUrFF7/4xejQoYOBAkCO6NixY3zpS19K/KceNm/ePO+00057xEQBAMgWAmAAgBxXXV2dfuCBB34UEekkr6O4uDguvfTSyMuzhQWApMvPz4/LLrssiouLk76U9P333/+ftbW1aVMFACBbeHsGANAMXH/99XMWLVr0YNLXsf/++8e5555roACQcOedd1707ds38etYuHDhH7/61a++bqIAAGQTATAAQDNxySWX/Lyurq486es4/vjjfQ8YABJs2LBhccwxxyR+HXV1dWsuvPDC+0wUAIBsIwAGAGgmXnvttdoHHnjguxGRSfI6UqlUfOlLX4oePXoYKgAkTO/evePSSy9N/Hd/IyLzwAMPfO/111+vNVUAALKNABgAoBm5+uqr/7Z06dJHk76OoqKiGDt2bJSWlhoqACRE69at46qrrorCwsLEr2X58uXjrr766r+ZKgAA2UgADADQzJx33nn/r66ubnXS19GhQ4e4/PLLIy/PlhYAsl1eXl5cfvnl0b59+8Svpb6+ft0ll1zyE1MFACBr999aAADQvLz++uu1Dz744Pcj4VdBR0QMGDAgzjrrLEMFgCw3ZsyYOPDAA3NiLY899tgPXnnllW2mCgBAthIAAwA0Q1/5ylf+umbNmqm5sJaTTz45Dj30UEMFgCw1ZMiQOOmkk3JiLWvXrv3LpZde+oKpAgCQzQTAAADN1GWXXfYf9fX1FUlfRyqViksvvTS6d+9uqACQZXr06BFf/OIXI5VKJX4tDQ0Nm6655pofmioAANlOAAwA0EzNmDGj+oEHHvhO5MBV0C1btozrr78+2rZta7AAkCXatWsX1113XbRs2TIXlpN56KGH/nXSpElVJgsAQLYTAAMANGNf+cpX/rpkyZI/58Ja2rZtG1dffXW0aNHCYAFgL2vRokVcffXVOfPLWUuXLn30iiuueNlkAQBIAgEwAEAzd+655/6ktrZ2eS6spXfv3jlzzSQAJNXbn2fYZ599cmI9tbW1y88555wfmywAAEkhAAYAaOYWLFhQ97Of/ezbmUymMRfWM2zYsDjllFMMFgD2kk9/+tMxdOjQnFhLJpNp/NnPfvbtBQsW1JksAABJIQAGACBuvfXWBfPnz78/V9Zz5plnxuDBgw0WAPaw4cOHx2c+85mcWc/8+fN/d+utty4wWQAAkkQADABARESMGTPmvpqamrdyYS2pVCouu+yy6Nmzp8ECwB7Su3fvuPjii3PmUwxbt25ddPrpp//aZAEASBoBMAAAERGxcuXKhh/+8Ie3pdPpnLjisGXLlvEv//Iv0aVLF8MFgN2sS5cucf3110dRUVFOrKepqanmu9/97jfKy8sbTBcAgKQRAAMA8E933XXX0ueff/6eXFlPaWlpXHvttVFWVma4ALCblJWVxXXXXRclJSU5s6aZM2fe/f/+3/9bZboAACSRABgAgP/l5JNPHldeXv50rqynU6dOMXbs2Jw5kQQA2aSoqCiuueaa6NixY86sqby8/MlTTz11gukCAJBUAmAAAP6PSy655K66urq1ubKefffdN6644orIy7P9BYBdJS8vL6688sro3bt3zqyprq6u/JJLLvmh6QIAkOi9uhYAAPBus2bNqn7ooYfujIh0rqxp4MCBcd555xkuAOwi559/fhxyyCG5tKT0gw8+eOesWbOqTRcAgCTLb3tQ9NzpjndbRG15oQ4BADRTEydOXDNmzJi8Tp06Dc2VNfXp0yfy8/PjzTffNGAA+ATOOuusOOmkk3JqTa+//vp9Z5555kTTBQAgCYq7N0Ze6c5/5gQwAADv6dRTT/31li1bXs+lNZ122mlx9NFHGy4AfEzHHntsnHrqqTm1pi1btrxx2mmn/cZ0AQDIBQJgAADeU0VFReONN974jcbGxqpcWtcFF1wQRx55pAEDwEd05JFHxuc+97mcWlNjY2PVzTff/I2KiopGEwYAIBcIgAEAeF9//OMf1z/yyCPfiRz6HnAqlYqLLroohgwZYsAA8CENHTo0LrrookilUrm0rPQjjzzynfvvv3+dCQMAkCsEwAAAfKBLL730hQULFvwupzbCeXnxpS99Kfbff38DBoAPcNBBB8WXvvSlyMvLrVdJCxYs+N2ll176ggkDAJBLBMAAAHwoo0eP/mVVVdXcXFpTYWFhfOUrX4kePXoYMAC8h169esUVV1wRBQUFObWuqqqqOaNHj/6lCQMAkGsEwAAAfCgVFRWNV1111S0NDQ0bcmldJSUlcfPNN8c+++xjyADwLr17946bbropiouLc2pdDQ0NG6666qqv++4vAAC5SAAMAMCHNmHChE3333//tzKZTDqX1lVcXBzXXXdddO/e3ZABYIfu3bvHtddeG61atcqpdWUymfT999//rQkTJmwyZQAAcpEAGACAj2Ts2LGz58+f/9tcW1fr1q3juuuuiw4dOhgyAM1ehw4d4rrrrovWrVvn3Nrmz5//m7Fjx842ZQAAcpUAGACAj+y44477xaZNm17MtXW1a9cubrzxxmjXrp0hA9BstW3bNmf/Pty4ceOLxx13nO/+AgCQ0wTAAAB8ZNXV1emLL774W3V1datzbW0dO3aMG2+8Mdq0aWPQADQ7ZWVlceONN0bHjh1zbm21tbWrL7zwwturq6vTJg0AQC7Lb3tQ9NzZD9LbImrLC3UIAICdWrZsWf327dtfOvbYY0/Ny8trkUtrKykpiaFDh8Zrr70WNTU1hg1As9ChQ4f42te+Fp06dcq5tTU1NW39zne+M/bBBx9cb9IAAOSC4u6NkVe6858JgAEA+NhefPHFzYcccsiyAQMGnBgRqZzaRBcXx5AhQ4TAADQLHTt2jJtuuik6dOiQi8tLjx8//ravfvWrc0waAIBc8X4BsCugAQD4RC688MIZb7zxxm9ycW3t27ePm266KSdPQgHA2zp16pTL4W+88cYbv77wwgufM2kAAJoLATAAAJ/YqFGjfrFhw4aZubi2t0Pgzp07GzQAOadz585x0003Rfv27XNyfRs2bJg5atSo+0waAIDmRAAMAMAnVltbm77sssu+V1dXtzoX19euXbu44YYbomPHjoYNQM7o0KFDXH/99dGuXbtc3Z+s/sIXvvDd2tratGkDANCc+AYwAAC7xJIlS+oj4pVRo0admpeX1yLX1ldcXBxDhw6NuXPnxrZt2wwcgETr0qVL3HjjjTl77XNTU1P1nXfeec0f/vCHdaYNAEAuer9vAAuAAQDYZWbNmlXVo0ePuYceeujoVCqVn2vra9WqVYwYMSIWLVoUlZWVBg5AIu23335x0003RVlZWU6uL51ON/z617++4fbbb3/TtAEAyFUCYAAA9phJkyatPeqoozbsu+++R+fi+goLC2P48OGxbNmy2LBhg4EDkCgDBgyIa6+9Nlq1apWza5w2bdq/XXLJJc+ZNgAAuez9AmDfAAYAYJc77bTTHn/rrbcezNX1FRUVxTXXXBNDhgwxbAASY8iQIXHNNddEUVFRzq5xwYIFvzv99NOfMG0AAJozATAAALvFEUcccc+GDRtm5ur6CgoK4sorr4wjjjjCsAFIwt/LceWVV0ZBQUHOrrG8vPypESNG/LdpAwDQ3AmAAQDYLaqrq9MXXXTRd2pra1fk7GY6Ly8uvvjiOPLIIw0cgKw1atSouPjiiyMvL3dfA23dunXxZz/72e83NDRkTBwAgObON4ABANhtli9fvr2mpuaFY4899uT8/PyWubjGVCoVgwYNikwmE4sWLTJ0ALLK6aefHueee26kUqmcXWN9fX3FDTfccM3UqVOrTBwAgObi/b4BLAAGAGC3evnll7cUFBS8cMQRR4zOy8trkYtrTKVSccABB0SnTp1i7ty5kck4fATA3lVYWBhXXHFFHHPMMTm9zsbGxuo777zzKz/72c9WmzoAAM2JABgAgL1qxowZlb169Xp98ODBJ6dSqfxcXWfPnj2jb9++8fe//z0aGxsNHoC9olWrVnH11VfHwIEDc3qd6XS64be//e2Nt9122wJTBwCguREAAwCw1z3xxBPlw4cPX9OvX79jIyJn76Hs2LFjDBw4MObMmRN1dXUGD8Ae1a5du7jxxhujT58+ub7U9JQpU779xS9+8XlTBwCgOXq/ADhPewAA2FPGjBkz9Y033vh1rq+zZ8+eceONN0bHjh0NHYA9pkuXLnHTTTdF9+7dc36tc+fO/eU555zzF1MHAID/SwAMAMAe9alPfernS5cufTjX19mlS5e49dZb48ADDzR0AHa7gQMHxje/+c3o1KlTzq/1rbfeemjEiBG/MnUAANg5ATAAAHvcsccee8/GjRtfyPV1FhcXx7XXXhsjRowwdAB2m8MPPzyuuuqqaNmyZc6vdePGjc8fffTR95g6AAC8NwEwAAB7XEVFReNxxx339crKyr/l+loLCgrisssui/PPPz9SqZThA7DLpFKpOP/88+PSSy+NgoKCnF/vpk2bXj7ssMNuqaysbDJ9AAB4bwJgAAD2isWLF9efddZZN1dXV7/ZHNZ7/PHHx5e//OUoKioyfAA+sRYtWsSXv/zlOP7445vFequrq98cM2bMN8rLyxtMHwAA3l9+24Oi585+kN4WUVteqEMAAOw2a9asaVi1atWs0aNHH1dQUNA619fbrVu3OOCAA2LevHlRX1/vAQDgYykrK4trrrkmDjrooGax3rq6uvKxY8de89RTT202fQAA+Ifi7o2RV7rznwmAAQDYq+bNm1ezevXqZ04++eTjCwoKSnN9ve3atYuRI0fG8uXLY+PGjR4AAD6S/v37x0033RRdu3ZtFuutr69fd9111335T3/6U4XpAwDA/xAAAwCQ1ebMmbMtlUq9fOSRR56Ul5eX83ckt2jRIkaMGBG1tbWxdOlSDwAAH8rxxx8fX/rSl5rN5wQaGxu33HXXXdf99Kc/XWn6AADwvwmAAQDIejNnzqzs2bPn64MHDz4plUrl5/p6U6lUHHLIIdGqVatYsGBBZDIZDwEAO5WXlxef/exn4/TTT49UKtUs1pxOp7f//ve//+o3vvGN1z0BAADwfwmAAQBIhEmTJpXvs88+8wYOHHhCKpUqaA5r3m+//WLAgAExd+5c3wUG4P8oKyuL6667LoYNG9Zs1pxOp7f/8Y9/vOmqq676qycAAAB2TgAMAEBiTJw4cc3BBx+85MADDzwulUrlNYc1t2/fPoYOHRqLFi2KLVu2eAgAiIiIffbZJ66//vro2bNns1lzJpNpnDBhwm1f/OIXn/cEAADAexMAAwCQKI8++ujy/fff/42DDjrohOZwHXRERHFxcRx11FHR2NgYb731locAoJkbPXp0XHHFFVFSUtJs1pxOpxsefvjhr15yySWzPAEAAPD+BMAAACTO+PHjVw0cOHDpAQcccGxzOQmcSqViwIAB0aVLl3jjjTeiqanJgwDQzBQVFcWll14aJ554YrP53m/EP07+Pv7447dffPHFMz0FAADwwQTAAAAk0iOPPLLs0EMPXbb//vs3mxA4IqJHjx4xZMiQePPNN2Pr1q0eBIBmonv37vEv//IvccABBzSrdWcymaYnnnji9s997nPPeAoAAODDEQADAJBYDz/88NJjjjlmY+/evY+KiGZzFKq0tDSGDx8eq1evjvXr13sQAHLcwIED45prrol27do1t6VnZsyY8YOzzjprqqcAAAA+PAEwAACJdv/99795zDHHVO6zzz5HRDMKgVu0aBGHHXZYtGzZMhYuXBjpdNrDAJBjCgoK4pxzzonzzz8/WrRo0dyWn37uuefuOuWUUyZ4EgAA4KMRAAMAkHi///3v5w8bNmxF3759j2lO10GnUqno27dvDB06NBYvXhxbtmzxMADkiJ49e8YNN9wQgwcPblbf+434x7XPU6ZM+fbpp58+2ZMAAAAfnQAYAICc8OCDDy4ZNmzYin79+jWrEDgionXr1nHEEUdEfX19LF261MMAkGCpVCpOOOGEuOKKK6JNmzbNbv07wt9vnXPOOX/xNAAAwMcjAAYAIGc89NBDS4YNG7a8X79+xza3EDg/Pz8OPvjg6NWrV8yfPz8aGho8EAAJU1JSEpdffnmccMIJkZ+f3+zWn8lkGp944olvffazn53maQAAgI9PAAwAQE556KGHlo4cOXJdnz59RqWa252ZEdG1a9cYNmxYLFu2LCorKz0QAAnRt2/fuO6662K//fZrluvPZDLpp59++rvnnHPO054GAAD4ZATAAADknD/96U+LDj300KX7779/s7sOOiKiuLg4jjzyyCgpKYk333wz0um0hwIgSxUUFMRnP/vZuPDCC6OkpKRZ9iCdTjc88sgjt5x//vnTPREAAPDJCYABAMhJDz/88NId3wQelUqlmt09mqlUKvr06RMHH3xwLFy4MLZt2+ahAMgynTt3jrFjx8bQoUOjGV5aERH/CH+feOKJ2y+88MLnPBEAALBrCIABAMhZDz300JIePXq8NmjQoGPz8vJaNMcetG3bNkaNGhVNTU2xZMkSDwVAFkilUjF69Oi48soro0OHDs22D01NTdt++9vf/stll132oqcCAAB2HQEwAAA5bdKkSeXdu3efM3jw4GYbAufn58eAAQOiV69esWDBgti+fbsHA2Avad26dVx66aVx/PHHR35+frPtQ2NjY/WvfvWrf7nuuute81QAAMCuJQAGACDnTZ48eW1jY+OMI4444uiCgoKS5tqHrl27xqhRo2Lbtm2xcuVKDwbAHpRKpWLUqFExduzY6NWrV7PuRX19/fo77rjjK9/61rcWejIAAGDXEwADANAsPP/881UbNmx45rjjjjuqsLCwrLn2obCwMAYNGhT77bdfLF68OGpraz0cALtZ+/bt44orrogTTzwxCgub9/uU2tralTfffPPVP/nJT1Z7MgAAYPcQAAMA0Gz87W9/27p27doZJ5xwwsjCwsK2zbkXnTp1ipEjR0Z1dbXTwAC70ciRI+Pqq6+OHj16NPte1NTULL/hhhuu/e1vf7vOkwEAALuPABgAgGbltdde2zpv3rynTznllKFFRUWdmnMvCgsL49BDD4399tsvFi1a5DQwwC709qnfk08+udmf+o2I2Lx587yLL774unHjxm30dAAAwO71fgFwat9zYsTOftC4LmLjq610DwCAxOrVq1fhs88++69du3Y9QTciGhoaYurUqTF58uRobGzUEICPqaCgIE499dQYPXq04HeH8vLyp4499tjvrly5skE3AABg9+swrDYKuuz8ZwJgAAByWuvWrfNeeumlm/fdd9+zdeMfVq9eHffff38sWbJEMwA+ov322y8uuugi1z2/w8KFC38/fPjwnzY0NGR0AwAA9gwBMAAAzd7zzz9/8aGHHnp1RKR0IyKTycTMmTPjz3/+c9TV1WkIwAcoKSmJ8847L0aMGBGplL9Kdki//PLL9xx77LEPagUAAOxZ7xcA+wYwAADNwn333Tfn+OOP39yrV6/DQwgcqVQqevfuHcOHD49169ZFRUWFhwTgPRxyyCExduzY6N+/v/B3h0wm0/jMM8/828knnzxONwAAYM97v28AC4ABAGg2fve7370xePDgJf369Ts6lUrl60hEcXFxjBgxInr06BFLly6N2tpaTQHYoUOHDvGFL3whzjzzzCguLtaQHZqammoeeOCBWz73uc9N1w0AANg7BMAAALDDww8/vKygoOC54cOHH1FQUFCqI//QrVu3OO6446K0tDQWL14cTU1NmgI0Wy1btoxzzjknLr300ujevbuGvENtbe2K22677arbbrvtDd0AAIC9RwAMAADv8Oyzz25avHjx0yeddNKQoqKiTjryD3l5edGnT58YOXJkbN26NVatWqUpQLNz+OGHx1e+8pUYMGBA5OXlacg7VFVV/e3CCy+8/oEHHvDdAAAA2MsEwAAA8C7z58+vefbZZ58+44wz+hcXF/fSkf/RsmXLGDJkSOyzzz6xdOnSqKmp0RQg53Xs2DG++MUvximnnBItW7bUkHdZt27dMyeffPI3Xn755W26AQAAe9/7BcCpfc+JETv7QeO6iI2vttI9AAByWmFhYer555//0sEHH3y5bvxfTU1N8fzzz8f48eOjurpaQ4Cc07p16zjzzDPjyCOPdOJ35zJ///vff3rMMcfc39DQkNEOAADIDh2G1UZBl53/TAAMAAARMWnSpM8cc8wxt6RSKdfg7ERNTU1MmTIlpk2bFg0NDRoCJF5hYWGccsopcdJJJ0VRUZGG7EQ6na6fOnXqd88555y/6AYAAGSX9wuAXQENAAAR8Yc//GHhfvvt98aAAQOOysvLkwS8S2FhYQwYMCCGDh0amzZtinXr1mkKkFiDBw+Oq666KoYOHRoFBQUashONjY1Vv//972/5whe+MEs3AAAg+/gGMAAAfAgTJkxYXV1dPf3II4/8VGFhYTsd+b9KS0vjsMMOi/79+8eaNWti8+bNmgIkRu/evePyyy+PU045JUpLSzXkPWzdunXxLbfccs33vve9hboBAADZyTeAAQDgI+jTp0+LJ5988us9evQ4TTfe3/z58+ORRx6JlStXagaQtXr16hXnnHNODBgwQDM+wKpVq5444YQTfrBy5Ur3/QMAQBbzDWAAAPgYnnnmmfOHDx9+fSqVytON95bJZGL27Nkxbty4qKio0BAga3Tu3DnOOuusGDp0aKRSKQ15/z/Lm2bNmvXDk08++THdAACA7OcbwAAA8DH85je/eX3//fd//cADDzzSd4HfWyqViu7du8cxxxwT7dq1i2XLlkV9fb3GAHtN27Zt49xzz42LL744evToIfz9AI2NjdUPPvjgLZ/97Gf/ohsAAJAMvgEMAAAf0/jx41dFxPOHHXbYiMLCwjIdeW95eXnRu3fvOOqoo6KgoCBWrlwZjY2NGgPsMcXFxXHKKafEl770pejbt2/k5bnA4YPU1tau+MEPfnD9LbfcMk83AAAgQf/94xvAAADwyQwePLjVo48++s1u3bqdpBsfTn19fTzzzDMxderU2LZtm4YAu01ZWVmceuqpceSRR0ZRkQsbPqyVK1c+/ulPf/pHixcvdm0DAAAkjG8AAwDALvLkk0+edeSRR96USqVcl/MhCYKB3eXtE7/HHnus4PcjyGQyDbNmzfoP3/sFAIDk8g1gAADYRX7/+98v6NGjx2uHHHLIyPz8fL8x+SEUFBREv3794qijjoq8vLxYtWqVq6GBT6Rly5ZxwgknxBVXXBEHHXRQFBQUaMqH1NDQsOG3v/3t1z7/+c8/oxsAAJBcroAGAIBd7Lzzzut4991339m2bdvBuvHR1NTUxLPPPhvTpk2LLVu2aAjwoZWVlcXxxx8fxxxzTBQXF2vIR1RVVfW3a6+99vZHHnlkg24AAECyuQIaAAB2g06dOhVMmzZtbN++fT8XESkd+WgaGhri+eefjyeffDI2bJBFAO/7522cdNJJccQRR0RhodvKPobMokWL/nTsscf+pLKyskk7AAAg+QTAAACwG/3hD38Ydfrpp99WUFDQRjc+unQ6Ha+++mpMnTo1Vq5cqSHAP/Xq1StOOeWUGDp0aOTl5WnIx9DY2Fg1YcKEOy666KKZugEAALlDAAwAALvZaaed1vbee+/9docOHUbqxse3fPnymDZtWrz88suRTqc1BJqhvLy8OOyww+L444+P3r17a8gnsHHjxue//OUvf3fSpElVugEAALlFAAwAAHtAYWFh6qmnnjpv+PDh16RSKXeUfgIbNmyIGTNmxHPPPRc1NTUaAs1AcXFxjBo1Ko4++ujo2LGjhnwCmUym4ZVXXvl/J5100kMNDQ0ZHQEAgNzzfgFwftuDoufOfpDeFlFb7p0VAAB8WOl0On7zm9+8Xlpa+uLgwYM/VVhYWKYrH09xcXEMGDAgjj322GjTpk2sXbs2amtrNQZyUIcOHeKMM86ISy+9NAYOHBjFxcWa8gnU1tau+slPfnLjxRdf/IybFAAAIHcVd2+MvNKd/8wJYAAA2A1OPPHENvfdd9+tnTp1Olo3PrnGxsb429/+Fs8++2wsWrRIQyAH9OvXL44++ugYNmxYFBQUaMguUFFR8cwXv/jFf5s+ffoW3QAAgNzmCmgAANhLHn744RNGjx799YKCgta6sWusX78+Zs6cGc8//3xUV1drCCRIaWlpHHnkkXHUUUdF586dNWQXaWxs3DJ16tS7PvvZz/5FNwAAoHkQAAMAwF50ySWXdP3+97//rXbt2g3VjV2nsbExXnvttXjuuedi/vz5GgJZbMCAATFq1KgYPHiw0767WFVV1atf//rXv/e73/1urW4AAEDzIQAGAIC9rF27dvlTp0699OCDD740lUrl68iutXz58nj++efj5ZdfjpqaGg2BLFBSUhLDhw+PI444Inr37q0hu1gmk2mcN2/efSeeeOJvq6urfewXAACaGQEwAABkia9//ev73Xjjjf9aWlraXzd2vXQ6HW+++WY899xz8dprr0VjY6OmwB5UUFAQgwcPjlGjRsUBBxwQeXl5mrIbVFdXL/zP//zPf/3BD36wRDcAAKB5EgADAEAWOfjgg1v9+c9/vrZ3795jIiKlI7tHZWVlvPjii/HCCy/EunXrNAR2o65du8bIkSPj8MMPj7Zt22rI7pNZunTpn88888z/t3jx4nrtAACA5ksADAAAWejuu+8eePHFF9/WqlUrd6PuZuXl5fHqq6/GSy+9FOvXr9cQ2AU6d+4cI0aMiGHDhkW3bt00ZDerqalZ9tvf/vbOm266aa5uAAAAAmAAAMhS/fr1K3r44Ycv79+//4WpVMpdqXvA8uXL46WXXoqXX345qqurNQQ+grKyshg+fHiMGDHCd333kEwmk164cOEfzj777F8sXbp0u44AAAARAmAAAMh6P/3pT4d97nOf+2bLli176Mae0dDQEHPnzo2//vWvMXfu3Ni+Xa4CO9OyZcsYNGhQDBs2LA455JAoKCjQlD2ktrZ21R//+Mc7rr322r/rBgAA8E4CYAAASIA+ffq0ePTRR69wGnjPS6fTsXTp0nj11VedDIaIaNu2bQwbNiyGDRsWffr0ibw8fyTtSZlMpuG11177+ZlnnvmnioqKRh0BAADeTQAMAAAJ8uMf//jQCy644JutWrXaRzf2vLdPBs+ePTvmzp0bdXV1mkKzUFZWFoMHD45hw4ZF//79Iz8/X1P2gpqammX333//nTfccINv/QIAAO9JAAwAAAnTrl27/HHjxp37qU996qq8vDwb870kk8nEihUrYu7cuTFnzpxYsWJFZDIZjSEnpFKp6Nu3bwwbNiwGDRoUHTt21JS9qKmpqfbVV1/92ZgxY/5cWVnZpCMAAMD7EQADAEBCffnLX+5x++23f7V9+/aH68bet2XLlnjjjTdizpw5MW/evKivr9cUEqVly5Zx8MEHx6BBg+KQQw6J0tJSTckCGzdufPG73/3uv//iF79YoxsAAMCHIQAGAIAEKywsTE2cOPGMkSNHXlNQUNBaR7JDXV1dvPnmm/HGG2/EG2+8EevXr9cUslKXLl3ioIMOioMOOigOOOCAKCoq0pQs0djYuGXmzJk/PvPMMyc2NDS4XgAAAPjQBMAAAJADjjzyyNY/+9nPrujbt++5EZGnI9mluro6Fi5cGPPnz4958+ZFZWWlprBXtGvXLg455JAYMGBA9O/fP1q39nsjWSj91ltv/fmqq676xaxZs6q1AwAA+KgEwAAAkEN++ctfjhgzZsyNrVq16q0b2SmdTsfKlStj0aJFsXDhwli8eHFs27ZNY9gtSkpKol+/ftG/f//Yf//9o1evXpGX53dEslVNTc3yRx999EdXXnnlK7oBAAB8XAJgAADIMd26dSt8+OGHPzd48ODL8vPzbdyzXCaTiTVr1sTChQtj0aJFsWjRotiyZYvG8LGUlZVF//79/xn6du/ePVKplMZkuaampprXXnvtV2PGjHmgoqKiUUcAAIBPQgAMAAA56rjjjiv7r//6r8tdC508mzdvjuXLl8eKFSti+fLlsXjx4qipqdEY/pfi4uLo169f9O7dO/bZZ5/Yd999o6ysTGMSJJPJpJcsWfLn66677pfTp0/3mx8AAMAuIQAGAIAc99Of/nTIueeee3NpaWlf3UimxsbGWLlyZSxdujSWLVsWy5cvj3Xr1kUmk9GcZiKVSkWXLl1in332iT59+kSfPn2iV69eUVBQoDkJtXXr1sUPPvjgj6699tq/6wYAALArCYABAKAZaNeuXf64cePOGTp06BUFBQWtdST56uvrY+XKlf88KbxixYpYu3ZtpNNpzUm4vLy86Nq1a+yzzz7//KdXr17RsmVLzckBjY2NW/7617/+4pxzznm0srKySUcAAIBdTQAMAADNyIknntjmnnvuuXzfffcdk0qlHB3MMdu3b481a9bEmjVrYu3atbF27dooLy+PDRs2CIazUF5eXnTs2DG6desWXbt2jW7dukW3bt2iR48eUVhYqEE5JpPJNC5ZsuRR1z0DAAC7mwAYAACaoa9+9av7Xnfdddd16NDhCN3IfY2Njf8MhNetWxfr1q2LioqKWLduXWzbtk2DdrPS0tLo3LnzP//p0qVLdO3aNbp27eoK52Ziw4YNM//rv/7rxz/60Y+W6wYAALC7CYABAKAZ++UvfznirLPOuq64uNj3gZupmpqaWL9+/T//qaioiMrKyqisrIxNmzZFY2OjJn2AgoKCaN++fbRr1y7at28fHTt2jC5dukSnTp2ic+fOUVxcrEnN1NatW98aP378PVdcccXLugEAAOwpAmAAAGjm2rVrl//ggw+eOWLEiCsLCwvb6gjvtHnz5n+GwZs2bYrKysqorq6OLVu2xJYtW6K6ujqqq6sjk8nk3NpTqVS0bt06WrduHWVlZdGmTZsoLS39X2Fvu3btok2bNh4U/peGhobKl1566efnnHPO+OrqavevAwAAe5QAGAAAiIiIoUOHFt97770XHHjggRfk5+c7ssiHlk6n/xkEV1dXR01Nzfv+k8lkora2NtLpdNTX10dTU1PU1dXt0u8U5+XlRcuWLSM/Pz+KiooiLy8vWrVqFalUKoqLi3f6T0lJSbRq1eqfgW9paWnk5eUZMB9aU1NTzYIFC/745S9/+Y+zZ8+u0REAAGBvEAADAAD/y2mnndb2rrvuurRPnz5n5+XlFeoIe9LbgfDbtm/f/r7XUBcUFESLFi3++b/fDnxhT8pkMg1LliwZd8stt/xq0qRJVToCAADsTQJgAABgp0477bS2d95554X777//5wTBAP9XJpNpWLhw4QO33nrrHwS/AABAtni/ADi/7UHRc2c/SG+LqC33/gcAAHLZokWL6u69995X0un0swcddFCnkpKS3roC8A8VFRUz/7//7/+77aKLLpq6aNGiOh0BAACyRXH3xsgr3fnPBMAAAEDMnDmz8u67736qqalpWr9+/Ypbt27dN5VKpXQGaG4ymUx6zZo1U+65555/Peeccx6cOXNmpa4AAADZRgAMAAB8KDNnzqz88Y9//Gw6nZ4uCAaak7eD37vvvvtfzz///McEvwAAQDYTAAMAAB+JIBhoLgS/AABAEgmAAQCAj+XtILisrOyFvn37diwuLu4VEYJgIBdkKioqnrv33nu/PWbMmEcEvwAAQJK8XwCc2vecGLGzHzSui9j4aivdAwAA/unqq6/u8ZWvfOX8Pn36nJWXl9dCR4CkSafT9UuXLh3/X//1Xw/84he/WKMjAABAEnUYVhsFXXb+MwEwAADwkZ1xxhntb7/99rMPPPDA8/Pz81vrCJDtmpqaqhcsWPDgd77znUcmTpzotC8AAJBoAmAAAGC3GD58eMkPf/jDzwwePPjioqKijjoCZJv6+voNr7322u9vvPHGx2fPnl2jIwAAQC4QAAMAALvV0KFDi++5556zDjnkkPOKioq66giwt9XV1a19/fXXH7z++uvHC34BAIBcIwAGAAD2iFatWuXdc889w0455ZTzO3bseJSOAHtYZsOGDbOmTJny4PXXX/9qbW1tWksAAIBcJAAGAAD2uH/913/tf/7555/dq1ev0/Ly8lroCLC7pNPp+pUrV05+4IEHHvnOd76zSEcAAIBcJwAGAAD2mjPOOKP97bfffvYBBxzw2YKCgjY6AuwqjY2NVW+++eafv/e97z06YcKETToCAAA0FwJgAABgrxs+fHjJ97///dGDBg0aU1paur+OAB9XdXX1wtdee+3Rr371q1Nfe+21Wh0BAACaGwEwAACQVb761a/ue8EFF3y6b9++ZxUUFLTWEeCDNDY2bnnrrbfG/+EPf5j4ox/9aLmOAAAAzZkAGAAAyEpDhw4t/sEPfnDy4MGDz27dunV/HQHerbq6+s2XX375weuuu+7ppUuXbtcRAAAAATAAAJDlCgsLU3ffffeQ0aNHn9G1a9fj8vLyinQFmq90Ol1XXl4+bcqUKROuvfbav+sIAADA/yYABgAAEqNPnz4t/v3f/33UyJEjz2rfvv2nIiKlK9AsZDZt2vTXF1544bGvfe1rzzntCwAA8N4EwAAAQCJddNFFXa6++uqTDzzwwLNbtmzZTUcg99TV1a1ZsGDBuJ/+9KdP3n///et0BAAA4IMJgAEAgETr1q1b4d13333k4YcffmqHDh2OyMvLK9QVSK50Ot2wcePGWbNmzZp8/fXXz6qoqGjUFQAAgA9PAAwAAOSMo48+uvWtt956/CGHHHJKu3btBkdEnq5AIqQrKytfmzdv3uQ777xz+owZM6q1BAAA4OMRAAMAADnpuOOOK/vGN75x/CGHHHJa27ZtB4bvBUO2yVRVVc2dN2/epO9///vTpk+fvkVLAAAAPjkBMAAAkPNuu+22vmedddZJffr0Oa5Vq1a9dQT2ntra2uXLly+f/uijjz51xx13vKUjAAAAu5YAGAAAaFa+9KUvdbv44ouP7t+//wlOBsMekamqqpq7cOHCv/z+97+fcd9995VrCQAAwO4jAAYAAJqtSy65pOtll112jDAYdrl0VVXVvIULF/7lV7/61bO/+93v1moJAADAniEABgAAiIirr766x/nnnz9q//33P7JNmzZDUqlUga7Ah5fJZBoqKyv/vnjx4uf+9Kc/zbr33ntX6woAAMCeJwAGAAB4l379+hV97WtfGzRy5MhRPXv2PLaoqKizrsD/VV9fv37VqlXPvPDCC8/9+7//+5zFixfX6woAAMDeJQAGAAB4H61bt8678847Bx599NFHde/efURpaen+4apomq/M1q1bF69Zs+bF5557btY3v/nNOdXV1WltAQAAyB4CYAAAgI9g8ODBrcaOHXvI8OHDD+vevfvw1q1bHxACYXJXprq6+s01a9a88sorr7z8k5/8ZN5rr71Wqy0AAADZSwAMAADwCVx//fX7nHHGGYf169dvePv27Yfm5+e31hWSrLGxsXrjxo2vvvXWWy+PHz/+lR//+McrdQUAACA5BMAAAAC70Je//OUe55xzzvA+ffoM7tix45CioqKuukI2q6+vX7t27doXFy9ePGfixImv3Xvvvat1BQAAILkEwAAAALvRl7/85R6f+cxnBvfr129Qly5dDm/ZsqVAmL2qrq5u7bp16wS+AAAAOUoADAAAsIe0atUq75prrtnn2GOPPXi//fY7uH379oeUlpb2TaVS+brDbpKuqalZtnHjxnlvvfXW3GeffXbef/3Xfy2vra1Naw0AAEBuEgADAADsRQceeGDLq6+++oAhQ4Yc3LNnz4Pbtm17sGuj+biampqqq6qqXi8vL583Z86ceb/85S/nvfjii1t1BgAAoPkQAAMAAGSZoUOHFn/xi1/cf9CgQQf26NHjwHbt2h3YqlWr3qlUKk932CFdU1OzvLKycsHq1asXzJkzZ8Gf//znJTNmzKjWGgAAgOZNAAwAAJAAxx13XNkFF1xw4MEHH3xA165dDywtLd23pKRkn1QqVag7uS2TyTRs27ZtRXV19dJ169YtfOONNxZOmDBh4YQJEzbpDgAAAO8mAAYAAEiw8847r+OJJ57Yp3///vt16dKlT5s2bfZr3bp1v/z8/GLdSZampqaa6urqxZs3b16ybt26pQsXLlzy9NNPL33ooYc26A4AAAAflgAYAAAgx7Rr1y7/kksu6TFkyJCe++67b89OnTr1Kisr61VcXNyzZcuW3VKpVL4u7R2ZTKaprq6uvKamZtWWLVtWVlRUrFy6dOnK2bNnr7r//vvXVFZWNukSAAAAn4QAGAAAoBnp1KlTwec+97luQ4cO7bnPPvv0aNeuXafWrVt3Li4u7tqyZcvORUVFnfLy8lro1MeTTqe319fXr6+rq6uoqalZW11dvb6ysnL9ihUrVr/66qurHnzwwbUVFRWNOgUAAMDuIgAGAADgfznjjDPaH3bYYZ369OnTuUuXLp3Kysral5SUtC0uLu5YVFTUrqioqG2LFi065OfnlzaXnjQ1NW3dvn37xvr6+qr6+vrKmpqaDdu2bavasmXLpnXr1lUsXbp0/Ysvvrh+4sSJlZ4gAAAA9iYBMAAAAB9Lr169CkeNGtXuoIMOatexY8ey9u3bl7Zp06Z1SUlJWXFxcetWrVq1btGiRVlRUVHrwsLC1hGRX1hYWBoR+QUFBSV5eXkFeXl5u/0/LtPpdG06nW5sbGzcFhFNDQ0NW3f83+r6+vrq7du3b6mtra2uqamp3rZtW/XmzZurN23aVL1hw4YtCxYsqJo1a1bl0qVLt5s4AAAASSAABgAAYK/q169fUffu3Vvss88+xSUlJQVv//8LCwtT3bp1+8BTxuXl5VsbGhoyb//vbdu2Na5YsaJmzZo12xcvXlyvwwAAADQn7xcAF2gPAAAAu9vixYvrdwS11boBAAAAu0+eFgAAAAAAAADkBgEwAAAAAAAAQI4QAAMAAAAAAADkCAEwAAAAAAAAQI4QAAMAAAAAAADkCAEwAAAAAAAAQI4QAAMAAAAAAADkCAEwAAAAAAAAQI4QAAMAAAAAAADkCAEwAAAAAAAAQI4QAAMAAAAAAADkCAEwAAAAAAAAQI4QAAMAAAAAAADkCAEwAAAAAAAAQI4o0AIAAAAAAACA5GhoLIyCxoaIiEilIpNXGE1v/0wADAAAAAAAAJAghQUN/0x6MxGppvT/5L6ugAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAIb/v5272ZHiusM4/FZ1NUkz9sQwOF4EyZJtpJCwysa5jSy4n1xPEqRIuQFvvfGSgIwBOzGRQAQERnx0d1UW0cgWGvKxsMGvnmfVdc7/1OJsf+oCAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoMY3JP//9K8My551lzpAk293a7QAAAAAAAAD8iIw3r+SL7TpPxuSt4/ibJJuz20QDBgAAAAAAAHhzrJPp6NvHYcyyjLl7dJTPbl/Jp6sPLufSsM+5ec7q5YOrF0OeP/SVaAAAAAAAAIA3weH7u6zfm79dWDIMSw6225w785vsx3XyzasOby5ssz69c4sAAAAAAAAAr9n69C6bC9sT93a7rKdnORin5Otxynzi1JQcfiwCAwAAAAAAALxO69O7HH68TaaT98cp85R8vbp3Nfszv8q0LHn7xMF1sjk/ZzUPmZ/MmWefhAYAAAAAAAD4oayPdjn7223Gn7x6ZrXPnetX8mBKkpv3cufDd/Pufn5FL56SzcVtNheT3dNt8tQlAwAAAAAAAHyv1sm0ySv/9XtsNWZ3I/lHkgzHi7/4XY7WYz5yiwAAAAAAAAA/Ivtcv/3nPEyS1fHa42t5+vNLyX7JoRsCAAAAAAAAePPt1/nbV3/KvePn1Xc371/NYxEYAAAAAAAA4M0yTHk2rvNo2WdzvHZqzN9v/SF3vju3evng/at5fPDLPDu1yuGyZHSVAAAAAAAAAK/XOGe4ueSvZ4e8M8xZbVe5ceuPufvy3Oqkw4+v5emDX+fuuTlLhhwsEYIBAAAAAAAAXpclGR8OuXP0TR4cPM/9z/+SRyfNDf/1TZezOp/87KdjzizJZkhO7edMy/w/nAUAAAAAAADg/zaMWcZkP8/ZLsmLacr2/MV8+cnvs/tP5/4FmLjAq1ifcioAAAAASUVORK5CYII=";function v0(Q,$,q){if(typeof Q==="string"&&!isNaN(Number(Q)))Q=Number(Q);if(typeof Q==="number"&&Q<100)return C0(Q);if(typeof Q==="number"&&Q>=100)return Q;if(typeof Q==="string"&&Q.includes("%")){if($&&$==="X")return Math.round(parseFloat(Q)/100*q.width);if($&&$==="Y")return Math.round(parseFloat(Q)/100*q.height);return Math.round(parseFloat(Q)/100*q.width)}return 0}function m5(Q){return Q.replace(/[xy]/g,function($){let q=Math.random()*16|0;return($==="x"?q:q&3|8).toString(16)})}function L0(Q){if(typeof Q==="undefined"||Q==null)return"";return Q.toString().replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function C0(Q){if(typeof Q==="number"&&Q>100)return Q;if(typeof Q==="string")Q=Number(Q.replace(/in*/gi,""));return Math.round(H0*Q)}function Y0(Q){let $=Number(Q)||0;return isNaN($)?0:Math.round($*T8)}function K6(Q){return Q=Q||0,Math.round((Q>360?Q-360:Q)*60000)}function J9(Q){let $=Q.toString(16);return $.length===1?"0"+$:$}function U9(Q,$,q){return(J9(Q)+J9($)+J9(q)).toUpperCase()}function f0(Q,$){let q=(Q||"").replace("#","");if(!K9.test(q)&&q!==D1.background1&&q!==D1.background2&&q!==D1.text1&&q!==D1.text2&&q!==D1.accent1&&q!==D1.accent2&&q!==D1.accent3&&q!==D1.accent4&&q!==D1.accent5&&q!==D1.accent6)console.warn(`"${q}" is not a valid scheme color or hex RGB! "${z1}" used instead. Only provide 6-digit RGB or 'pptx.SchemeColor' values!`),q=z1;let K=K9.test(q)?"srgbClr":"schemeClr",J='val="'+(K9.test(q)?q.toUpperCase():q)+'"';return $?`${$}`:``}function Kz(Q,$){let q="",K=Object.assign(Object.assign({},$),Q),J=Math.round(K.size*T8),Z=K.color,G=Math.round(K.opacity*1e5);return q+=``,q+=f0(Z,``),q+="",q}function k1(Q){let $="solid",q="",K="",J="";if(Q){if(typeof Q==="string")q=Q;else{if(Q.type)$=Q.type;if(Q.color)q=Q.color;if(Q.alpha)K+=``;if(Q.transparency)K+=``}switch($){case"solid":J+=`${f0(q,K)}`;break;default:J+="";break}}return J}function G2(Q){return Q._rels.length+Q._relsChart.length+Q._relsMedia.length+1}function D9(Q){if(!Q||typeof Q!=="object")return;if(Q.type!=="outer"&&Q.type!=="inner"&&Q.type!=="none")console.warn("Warning: shadow.type options are `outer`, `inner` or `none`."),Q.type="outer";if(Q.angle){if(isNaN(Number(Q.angle))||Q.angle<0||Q.angle>359)console.warn("Warning: shadow.angle can only be 0-359"),Q.angle=270;Q.angle=Math.round(Number(Q.angle))}if(Q.opacity){if(isNaN(Number(Q.opacity))||Q.opacity<0||Q.opacity>1)console.warn("Warning: shadow.opacity can only be 0-1"),Q.opacity=0.75;Q.opacity=Number(Q.opacity)}if(Q.color){if(Q.color.startsWith("#"))console.warn('Warning: shadow.color should not include hash (#) character, , e.g. "FF0000"'),Q.color=Q.color.replace("#","")}return Q}function Jz(Q,$,q){var K,J;let Z=2.3+(((K=Q.options)===null||K===void 0?void 0:K.autoPageCharWeight)?Q.options.autoPageCharWeight:0),G=Math.floor($/T8*H0)/((((J=Q.options)===null||J===void 0?void 0:J.fontSize)?Q.options.fontSize:f1)/Z),B=[],W=[],U=[],V=[];if(Q.text&&Q.text.toString().trim().length===0)W.push({_type:D0.tablecell,text:" "});else if(typeof Q.text==="number"||typeof Q.text==="string")W.push({_type:D0.tablecell,text:(Q.text||"").toString().trim()});else if(Array.isArray(Q.text))W=Q.text;let N=[];return W.forEach((F)=>{var M;if(typeof F.text==="string"){if(F.text.split(` +(()=>{var fJ=Object.create;var{getPrototypeOf:RJ,defineProperty:X6,getOwnPropertyNames:$9,getOwnPropertyDescriptor:IJ}=Object,Q9=Object.prototype.hasOwnProperty;function q9($){return this[$]}var CJ,jJ,K9=($,q,Q)=>{var K=$!=null&&typeof $==="object";if(K){var J=q?CJ??=new WeakMap:jJ??=new WeakMap,Z=J.get($);if(Z)return Z}Q=$!=null?fJ(RJ($)):{};let G=q||!$||!$.__esModule?X6(Q,"default",{value:$,enumerable:!0}):Q;for(let W of $9($))if(!Q9.call(G,W))X6(G,W,{get:q9.bind($,W),enumerable:!0});if(K)J.set($,G);return G},X0=($)=>{var q=(e7??=new WeakMap).get($),Q;if(q)return q;if(q=X6({},"__esModule",{value:!0}),$&&typeof $==="object"||typeof $==="function"){for(var K of $9($))if(!Q9.call(q,K))X6(q,K,{get:q9.bind($,K),enumerable:!(Q=IJ($,K))||Q.enumerable})}return e7.set($,q),q},e7,N0=($,q)=>()=>(q||$((q={exports:{}}).exports,q),q.exports);var gJ=($)=>$;function AJ($,q){this[$]=gJ.bind(null,q)}var c1=($,q)=>{for(var Q in q)X6($,Q,{get:q[Q],enumerable:!0,configurable:!0,set:AJ.bind(q,Q)})};var b1=($,q)=>()=>($&&(q=$($=0)),q);var J9=(($)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy($,{get:(q,Q)=>(typeof require<"u"?require:q)[Q]}):$)(function($){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+$+'" is not supported')});var K2={};c1(K2,{transcode:()=>MV,resolveObjectURL:()=>BV,kStringMaxLength:()=>w9,kMaxLength:()=>y6,isUtf8:()=>zV,isAscii:()=>FV,default:()=>wV,constants:()=>EJ,btoa:()=>PJ,atob:()=>TJ,INSPECT_MAX_BYTES:()=>M9,File:()=>uJ,Buffer:()=>o,Blob:()=>SJ});function XJ($){var q=$.length;if(q%4>0)throw Error("Invalid string. Length must be a multiple of 4");var Q=$.indexOf("=");if(Q===-1)Q=q;var K=Q===q?0:4-Q%4;return[Q,K]}function yJ($,q){return($+q)*3/4-q}function hJ($){var q,Q=XJ($),K=Q[0],J=Q[1],Z=new Uint8Array(yJ(K,J)),G=0,W=J>0?K-4:K,B;for(B=0;B>16&255,Z[G++]=q>>8&255,Z[G++]=q&255;if(J===2)q=F2[$.charCodeAt(B)]<<2|F2[$.charCodeAt(B+1)]>>4,Z[G++]=q&255;if(J===1)q=F2[$.charCodeAt(B)]<<10|F2[$.charCodeAt(B+1)]<<4|F2[$.charCodeAt(B+2)]>>2,Z[G++]=q>>8&255,Z[G++]=q&255;return Z}function xJ($){return I2[$>>18&63]+I2[$>>12&63]+I2[$>>6&63]+I2[$&63]}function OJ($,q,Q){var K,J=[];for(var Z=q;ZW?W:G+Z));if(K===1)q=$[Q-1],J.push(I2[q>>2]+I2[q<<4&63]+"==");else if(K===2)q=($[Q-2]<<8)+$[Q-1],J.push(I2[q>>10]+I2[q>>4&63]+I2[q<<2&63]+"=");return J.join("")}function N8($,q,Q,K,J){var Z,G,W=J*8-K-1,B=(1<>1,U=-7,w=Q?J-1:0,F=Q?-1:1,M=$[q+w];w+=F,Z=M&(1<<-U)-1,M>>=-U,U+=W;for(;U>0;Z=Z*256+$[q+w],w+=F,U-=8);G=Z&(1<<-U)-1,Z>>=-U,U+=K;for(;U>0;G=G*256+$[q+w],w+=F,U-=8);if(Z===0)Z=1-V;else if(Z===B)return G?NaN:(M?-1:1)*(1/0);else G=G+Math.pow(2,K),Z=Z-V;return(M?-1:1)*G*Math.pow(2,Z-K)}function F9($,q,Q,K,J,Z){var G,W,B,V=Z*8-J-1,U=(1<>1,F=J===23?Math.pow(2,-24)-Math.pow(2,-77):0,M=K?0:Z-1,k=K?1:-1,f=q<0||q===0&&1/q<0?1:0;if(q=Math.abs(q),isNaN(q)||q===1/0)W=isNaN(q)?1:0,G=U;else{if(G=Math.floor(Math.log(q)/Math.LN2),q*(B=Math.pow(2,-G))<1)G--,B*=2;if(G+w>=1)q+=F/B;else q+=F*Math.pow(2,1-w);if(q*B>=2)G++,B/=2;if(G+w>=U)W=0,G=U;else if(G+w>=1)W=(q*B-1)*Math.pow(2,J),G=G+w;else W=q*Math.pow(2,w-1)*Math.pow(2,J),G=0}for(;J>=8;$[Q+M]=W&255,M+=k,W/=256,J-=8);G=G<0;$[Q+M]=G&255,M+=k,G/=256,V-=8);$[Q+M-k]|=f*128}function S2($){if($>y6)throw RangeError('The value "'+$+'" is invalid for option "size"');let q=new Uint8Array($);return Object.setPrototypeOf(q,o.prototype),q}function h5($,q,Q){return class extends Q{constructor(){super();Object.defineProperty(this,"message",{value:q.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${$}]`,this.stack,delete this.name}get code(){return $}set code(K){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:K,writable:!0})}toString(){return`${this.name} [${$}]: ${this.message}`}}}function o($,q,Q){if(typeof $==="number"){if(typeof q==="string")throw TypeError('The "string" argument must be of type string. Received type number');return x5($)}return N9($,q,Q)}function N9($,q,Q){if(typeof $==="string")return nJ($,q);if(ArrayBuffer.isView($))return dJ($);if($==null)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof $);if(C2($,ArrayBuffer)||$&&C2($.buffer,ArrayBuffer))return X5($,q,Q);if(typeof SharedArrayBuffer<"u"&&(C2($,SharedArrayBuffer)||$&&C2($.buffer,SharedArrayBuffer)))return X5($,q,Q);if(typeof $==="number")throw TypeError('The "value" argument must not be of type number. Received type number');let K=$.valueOf&&$.valueOf();if(K!=null&&K!==$)return o.from(K,q,Q);let J=mJ($);if(J)return J;if(typeof Symbol<"u"&&Symbol.toPrimitive!=null&&typeof $[Symbol.toPrimitive]==="function")return o.from($[Symbol.toPrimitive]("string"),q,Q);throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof $)}function Y9($){if(typeof $!=="number")throw TypeError('"size" argument must be of type number');else if($<0)throw RangeError('The value "'+$+'" is invalid for option "size"')}function bJ($,q,Q){if(Y9($),$<=0)return S2($);if(q!==void 0)return typeof Q==="string"?S2($).fill(q,Q):S2($).fill(q);return S2($)}function x5($){return Y9($),S2($<0?0:O5($)|0)}function nJ($,q){if(typeof q!=="string"||q==="")q="utf8";if(!o.isEncoding(q))throw TypeError("Unknown encoding: "+q);let Q=k9($,q)|0,K=S2(Q),J=K.write($,q);if(J!==Q)K=K.slice(0,J);return K}function A5($){let q=$.length<0?0:O5($.length)|0,Q=S2(q);for(let K=0;K=y6)throw RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+y6.toString(16)+" bytes");return $|0}function k9($,q){if(o.isBuffer($))return $.length;if(ArrayBuffer.isView($)||C2($,ArrayBuffer))return $.byteLength;if(typeof $!=="string")throw TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof $);let Q=$.length,K=arguments.length>2&&arguments[2]===!0;if(!K&&Q===0)return 0;let J=!1;for(;;)switch(q){case"ascii":case"latin1":case"binary":return Q;case"utf8":case"utf-8":return y5($).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Q*2;case"hex":return Q>>>1;case"base64":return j9($).length;default:if(J)return K?-1:y5($).length;q=(""+q).toLowerCase(),J=!0}}function pJ($,q,Q){let K=!1;if(q===void 0||q<0)q=0;if(q>this.length)return"";if(Q===void 0||Q>this.length)Q=this.length;if(Q<=0)return"";if(Q>>>=0,q>>>=0,Q<=q)return"";if(!$)$="utf8";while(!0)switch($){case"hex":return QV(this,q,Q);case"utf8":case"utf-8":return L9(this,q,Q);case"ascii":return eJ(this,q,Q);case"latin1":case"binary":return $V(this,q,Q);case"base64":return sJ(this,q,Q);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return qV(this,q,Q);default:if(K)throw TypeError("Unknown encoding: "+$);$=($+"").toLowerCase(),K=!0}}function w1($,q,Q){let K=$[q];$[q]=$[Q],$[Q]=K}function D9($,q,Q,K,J){if($.length===0)return-1;if(typeof Q==="string")K=Q,Q=0;else if(Q>2147483647)Q=2147483647;else if(Q<-2147483648)Q=-2147483648;if(Q=+Q,Number.isNaN(Q))Q=J?0:$.length-1;if(Q<0)Q=$.length+Q;if(Q>=$.length)if(J)return-1;else Q=$.length-1;else if(Q<0)if(J)Q=0;else return-1;if(typeof q==="string")q=o.from(q,K);if(o.isBuffer(q)){if(q.length===0)return-1;return W9($,q,Q,K,J)}else if(typeof q==="number"){if(q=q&255,typeof Uint8Array.prototype.indexOf==="function")if(J)return Uint8Array.prototype.indexOf.call($,q,Q);else return Uint8Array.prototype.lastIndexOf.call($,q,Q);return W9($,[q],Q,K,J)}throw TypeError("val must be string, number or Buffer")}function W9($,q,Q,K,J){let Z=1,G=$.length,W=q.length;if(K!==void 0){if(K=String(K).toLowerCase(),K==="ucs2"||K==="ucs-2"||K==="utf16le"||K==="utf-16le"){if($.length<2||q.length<2)return-1;Z=2,G/=2,W/=2,Q/=2}}function B(U,w){if(Z===1)return U[w];else return U.readUInt16BE(w*Z)}let V;if(J){let U=-1;for(V=Q;VG)Q=G-W;for(V=Q;V>=0;V--){let U=!0;for(let w=0;wJ)K=J;let Z=q.length;if(K>Z/2)K=Z/2;let G;for(G=0;G239?4:Z>223?3:Z>191?2:1;if(J+W<=Q){let B,V,U,w;switch(W){case 1:if(Z<128)G=Z;break;case 2:if(B=$[J+1],(B&192)===128){if(w=(Z&31)<<6|B&63,w>127)G=w}break;case 3:if(B=$[J+1],V=$[J+2],(B&192)===128&&(V&192)===128){if(w=(Z&15)<<12|(B&63)<<6|V&63,w>2047&&(w<55296||w>57343))G=w}break;case 4:if(B=$[J+1],V=$[J+2],U=$[J+3],(B&192)===128&&(V&192)===128&&(U&192)===128){if(w=(Z&15)<<18|(B&63)<<12|(V&63)<<6|U&63,w>65535&&w<1114112)G=w}}}if(G===null)G=65533,W=1;else if(G>65535)G-=65536,K.push(G>>>10&1023|55296),G=56320|G&1023;K.push(G),J+=W}return tJ(K)}function tJ($){let q=$.length;if(q<=B9)return String.fromCharCode.apply(String,$);let Q="",K=0;while(KK)Q=K;let J="";for(let Z=q;ZQ)throw RangeError("Trying to access beyond buffer length")}function s0($,q,Q,K,J,Z){if(!o.isBuffer($))throw TypeError('"buffer" argument must be a Buffer instance');if(q>J||q$.length)throw RangeError("Index out of range")}function H9($,q,Q,K,J){C9(q,K,J,$,Q,7);let Z=Number(q&BigInt(4294967295));$[Q++]=Z,Z=Z>>8,$[Q++]=Z,Z=Z>>8,$[Q++]=Z,Z=Z>>8,$[Q++]=Z;let G=Number(q>>BigInt(32)&BigInt(4294967295));return $[Q++]=G,G=G>>8,$[Q++]=G,G=G>>8,$[Q++]=G,G=G>>8,$[Q++]=G,Q}function v9($,q,Q,K,J){C9(q,K,J,$,Q,7);let Z=Number(q&BigInt(4294967295));$[Q+7]=Z,Z=Z>>8,$[Q+6]=Z,Z=Z>>8,$[Q+5]=Z,Z=Z>>8,$[Q+4]=Z;let G=Number(q>>BigInt(32)&BigInt(4294967295));return $[Q+3]=G,G=G>>8,$[Q+2]=G,G=G>>8,$[Q+1]=G,G=G>>8,$[Q]=G,Q+8}function f9($,q,Q,K,J,Z){if(Q+K>$.length)throw RangeError("Index out of range");if(Q<0)throw RangeError("Index out of range")}function R9($,q,Q,K,J){if(q=+q,Q=Q>>>0,!J)f9($,q,Q,4,340282346638528860000000000000000000000,-340282346638528860000000000000000000000);return F9($,q,Q,K,23,4),Q+4}function I9($,q,Q,K,J){if(q=+q,Q=Q>>>0,!J)f9($,q,Q,8,179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,-179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);return F9($,q,Q,K,52,8),Q+8}function z9($){let q="",Q=$.length,K=$[0]==="-"?1:0;for(;Q>=K+4;Q-=3)q=`_${$.slice(Q-3,Q)}${q}`;return`${$.slice(0,Q)}${q}`}function KV($,q,Q){if(n1(q,"offset"),$[q]===void 0||$[q+Q]===void 0)h6(q,$.length-(Q+1))}function C9($,q,Q,K,J,Z){if($>Q||$3)if(q===0||q===BigInt(0))W=`>= 0${G} and < 2${G} ** ${(Z+1)*8}${G}`;else W=`>= -(2${G} ** ${(Z+1)*8-1}${G}) and < 2 ** ${(Z+1)*8-1}${G}`;else W=`>= ${q}${G} and <= ${Q}${G}`;throw new g5("value",W,$)}KV(K,J,Z)}function n1($,q){if(typeof $!=="number")throw new cJ(q,"number",$)}function h6($,q,Q){if(Math.floor($)!==$)throw n1($,Q),new g5(Q||"offset","an integer",$);if(q<0)throw new _J;throw new g5(Q||"offset",`>= ${Q?1:0} and <= ${q}`,$)}function VV($){if($=$.split("=")[0],$=$.trim().replace(JV,""),$.length<2)return"";while($.length%4!==0)$=$+"=";return $}function y5($,q){q=q||1/0;let Q,K=$.length,J=null,Z=[];for(let G=0;G55295&&Q<57344){if(!J){if(Q>56319){if((q-=3)>-1)Z.push(239,191,189);continue}else if(G+1===K){if((q-=3)>-1)Z.push(239,191,189);continue}J=Q;continue}if(Q<56320){if((q-=3)>-1)Z.push(239,191,189);J=Q;continue}Q=(J-55296<<10|Q-56320)+65536}else if(J){if((q-=3)>-1)Z.push(239,191,189)}if(J=null,Q<128){if((q-=1)<0)break;Z.push(Q)}else if(Q<2048){if((q-=2)<0)break;Z.push(Q>>6|192,Q&63|128)}else if(Q<65536){if((q-=3)<0)break;Z.push(Q>>12|224,Q>>6&63|128,Q&63|128)}else if(Q<1114112){if((q-=4)<0)break;Z.push(Q>>18|240,Q>>12&63|128,Q>>6&63|128,Q&63|128)}else throw Error("Invalid code point")}return Z}function UV($){let q=[];for(let Q=0;Q<$.length;++Q)q.push($.charCodeAt(Q)&255);return q}function ZV($,q){let Q,K,J,Z=[];for(let G=0;G<$.length;++G){if((q-=2)<0)break;Q=$.charCodeAt(G),K=Q>>8,J=Q%256,Z.push(J),Z.push(K)}return Z}function j9($){return hJ(VV($))}function Y8($,q,Q,K){let J;for(J=0;J=q.length||J>=$.length)break;q[J+Q]=$[J]}return J}function C2($,q){return $ instanceof q||$!=null&&$.constructor!=null&&$.constructor.name!=null&&$.constructor.name===q.name}function l2($){return typeof BigInt>"u"?WV:$}function WV(){throw Error("BigInt not supported")}function P5($){return()=>{throw Error($+" is not implemented for node:buffer browser polyfill")}}var I2,F2,j5="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",M1,U9,G9,M9=50,y6=2147483647,w9=536870888,PJ,TJ,uJ,SJ,EJ,_J,cJ,g5,B9=4096,JV,GV,BV,zV,FV=($)=>{for(let q of $)if(q.charCodeAt(0)>127)return!1;return!0},MV,wV;var t0=b1(()=>{I2=[],F2=[];for(M1=0,U9=j5.length;M14294967296)J=z9(String(Q));else if(typeof Q==="bigint"){if(J=String(Q),Q>BigInt(2)**BigInt(32)||Q<-(BigInt(2)**BigInt(32)))J=z9(J);J+="n"}return K+=` It must be ${q}. Received ${J}`,K},RangeError);Object.defineProperty(o.prototype,"parent",{enumerable:!0,get:function(){if(!o.isBuffer(this))return;return this.buffer}});Object.defineProperty(o.prototype,"offset",{enumerable:!0,get:function(){if(!o.isBuffer(this))return;return this.byteOffset}});o.poolSize=8192;o.from=function($,q,Q){return N9($,q,Q)};Object.setPrototypeOf(o.prototype,Uint8Array.prototype);Object.setPrototypeOf(o,Uint8Array);o.alloc=function($,q,Q){return bJ($,q,Q)};o.allocUnsafe=function($){return x5($)};o.allocUnsafeSlow=function($){return x5($)};o.isBuffer=function($){return $!=null&&$._isBuffer===!0&&$!==o.prototype};o.compare=function($,q){if(C2($,Uint8Array))$=o.from($,$.offset,$.byteLength);if(C2(q,Uint8Array))q=o.from(q,q.offset,q.byteLength);if(!o.isBuffer($)||!o.isBuffer(q))throw TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if($===q)return 0;let Q=$.length,K=q.length;for(let J=0,Z=Math.min(Q,K);JK.length){if(!o.isBuffer(Z))Z=o.from(Z);Z.copy(K,J)}else Uint8Array.prototype.set.call(K,Z,J);else if(!o.isBuffer(Z))throw TypeError('"list" argument must be an Array of Buffers');else Z.copy(K,J);J+=Z.length}return K};o.byteLength=k9;o.prototype._isBuffer=!0;o.prototype.swap16=function(){let $=this.length;if($%2!==0)throw RangeError("Buffer size must be a multiple of 16-bits");for(let q=0;q<$;q+=2)w1(this,q,q+1);return this};o.prototype.swap32=function(){let $=this.length;if($%4!==0)throw RangeError("Buffer size must be a multiple of 32-bits");for(let q=0;q<$;q+=4)w1(this,q,q+3),w1(this,q+1,q+2);return this};o.prototype.swap64=function(){let $=this.length;if($%8!==0)throw RangeError("Buffer size must be a multiple of 64-bits");for(let q=0;q<$;q+=8)w1(this,q,q+7),w1(this,q+1,q+6),w1(this,q+2,q+5),w1(this,q+3,q+4);return this};o.prototype.toString=function(){let $=this.length;if($===0)return"";if(arguments.length===0)return L9(this,0,$);return pJ.apply(this,arguments)};o.prototype.toLocaleString=o.prototype.toString;o.prototype.equals=function($){if(!o.isBuffer($))throw TypeError("Argument must be a Buffer");if(this===$)return!0;return o.compare(this,$)===0};o.prototype.inspect=function(){let $="",q=M9;if($=this.toString("hex",0,q).replace(/(.{2})/g,"$1 ").trim(),this.length>q)$+=" ... ";return""};if(G9)o.prototype[G9]=o.prototype.inspect;o.prototype.compare=function($,q,Q,K,J){if(C2($,Uint8Array))$=o.from($,$.offset,$.byteLength);if(!o.isBuffer($))throw TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof $);if(q===void 0)q=0;if(Q===void 0)Q=$?$.length:0;if(K===void 0)K=0;if(J===void 0)J=this.length;if(q<0||Q>$.length||K<0||J>this.length)throw RangeError("out of range index");if(K>=J&&q>=Q)return 0;if(K>=J)return-1;if(q>=Q)return 1;if(q>>>=0,Q>>>=0,K>>>=0,J>>>=0,this===$)return 0;let Z=J-K,G=Q-q,W=Math.min(Z,G),B=this.slice(K,J),V=$.slice(q,Q);for(let U=0;U>>0,isFinite(Q)){if(Q=Q>>>0,K===void 0)K="utf8"}else K=Q,Q=void 0;else throw Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");let J=this.length-q;if(Q===void 0||Q>J)Q=J;if($.length>0&&(Q<0||q<0)||q>this.length)throw RangeError("Attempt to write outside buffer bounds");if(!K)K="utf8";let Z=!1;for(;;)switch(K){case"hex":return iJ(this,$,q,Q);case"utf8":case"utf-8":return oJ(this,$,q,Q);case"ascii":case"latin1":case"binary":return aJ(this,$,q,Q);case"base64":return lJ(this,$,q,Q);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return rJ(this,$,q,Q);default:if(Z)throw TypeError("Unknown encoding: "+K);K=(""+K).toLowerCase(),Z=!0}};o.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};o.prototype.slice=function($,q){let Q=this.length;if($=~~$,q=q===void 0?Q:~~q,$<0){if($+=Q,$<0)$=0}else if($>Q)$=Q;if(q<0){if(q+=Q,q<0)q=0}else if(q>Q)q=Q;if(q<$)q=$;let K=this.subarray($,q);return Object.setPrototypeOf(K,o.prototype),K};o.prototype.readUintLE=o.prototype.readUIntLE=function($,q,Q){if($=$>>>0,q=q>>>0,!Q)b0($,q,this.length);let K=this[$],J=1,Z=0;while(++Z>>0,q=q>>>0,!Q)b0($,q,this.length);let K=this[$+--q],J=1;while(q>0&&(J*=256))K+=this[$+--q]*J;return K};o.prototype.readUint8=o.prototype.readUInt8=function($,q){if($=$>>>0,!q)b0($,1,this.length);return this[$]};o.prototype.readUint16LE=o.prototype.readUInt16LE=function($,q){if($=$>>>0,!q)b0($,2,this.length);return this[$]|this[$+1]<<8};o.prototype.readUint16BE=o.prototype.readUInt16BE=function($,q){if($=$>>>0,!q)b0($,2,this.length);return this[$]<<8|this[$+1]};o.prototype.readUint32LE=o.prototype.readUInt32LE=function($,q){if($=$>>>0,!q)b0($,4,this.length);return(this[$]|this[$+1]<<8|this[$+2]<<16)+this[$+3]*16777216};o.prototype.readUint32BE=o.prototype.readUInt32BE=function($,q){if($=$>>>0,!q)b0($,4,this.length);return this[$]*16777216+(this[$+1]<<16|this[$+2]<<8|this[$+3])};o.prototype.readBigUInt64LE=l2(function($){$=$>>>0,n1($,"offset");let q=this[$],Q=this[$+7];if(q===void 0||Q===void 0)h6($,this.length-8);let K=q+this[++$]*256+this[++$]*65536+this[++$]*16777216,J=this[++$]+this[++$]*256+this[++$]*65536+Q*16777216;return BigInt(K)+(BigInt(J)<>>0,n1($,"offset");let q=this[$],Q=this[$+7];if(q===void 0||Q===void 0)h6($,this.length-8);let K=q*16777216+this[++$]*65536+this[++$]*256+this[++$],J=this[++$]*16777216+this[++$]*65536+this[++$]*256+Q;return(BigInt(K)<>>0,q=q>>>0,!Q)b0($,q,this.length);let K=this[$],J=1,Z=0;while(++Z=J)K-=Math.pow(2,8*q);return K};o.prototype.readIntBE=function($,q,Q){if($=$>>>0,q=q>>>0,!Q)b0($,q,this.length);let K=q,J=1,Z=this[$+--K];while(K>0&&(J*=256))Z+=this[$+--K]*J;if(J*=128,Z>=J)Z-=Math.pow(2,8*q);return Z};o.prototype.readInt8=function($,q){if($=$>>>0,!q)b0($,1,this.length);if(!(this[$]&128))return this[$];return(255-this[$]+1)*-1};o.prototype.readInt16LE=function($,q){if($=$>>>0,!q)b0($,2,this.length);let Q=this[$]|this[$+1]<<8;return Q&32768?Q|4294901760:Q};o.prototype.readInt16BE=function($,q){if($=$>>>0,!q)b0($,2,this.length);let Q=this[$+1]|this[$]<<8;return Q&32768?Q|4294901760:Q};o.prototype.readInt32LE=function($,q){if($=$>>>0,!q)b0($,4,this.length);return this[$]|this[$+1]<<8|this[$+2]<<16|this[$+3]<<24};o.prototype.readInt32BE=function($,q){if($=$>>>0,!q)b0($,4,this.length);return this[$]<<24|this[$+1]<<16|this[$+2]<<8|this[$+3]};o.prototype.readBigInt64LE=l2(function($){$=$>>>0,n1($,"offset");let q=this[$],Q=this[$+7];if(q===void 0||Q===void 0)h6($,this.length-8);let K=this[$+4]+this[$+5]*256+this[$+6]*65536+(Q<<24);return(BigInt(K)<>>0,n1($,"offset");let q=this[$],Q=this[$+7];if(q===void 0||Q===void 0)h6($,this.length-8);let K=(q<<24)+this[++$]*65536+this[++$]*256+this[++$];return(BigInt(K)<>>0,!q)b0($,4,this.length);return N8(this,$,!0,23,4)};o.prototype.readFloatBE=function($,q){if($=$>>>0,!q)b0($,4,this.length);return N8(this,$,!1,23,4)};o.prototype.readDoubleLE=function($,q){if($=$>>>0,!q)b0($,8,this.length);return N8(this,$,!0,52,8)};o.prototype.readDoubleBE=function($,q){if($=$>>>0,!q)b0($,8,this.length);return N8(this,$,!1,52,8)};o.prototype.writeUintLE=o.prototype.writeUIntLE=function($,q,Q,K){if($=+$,q=q>>>0,Q=Q>>>0,!K){let G=Math.pow(2,8*Q)-1;s0(this,$,q,Q,G,0)}let J=1,Z=0;this[q]=$&255;while(++Z>>0,Q=Q>>>0,!K){let G=Math.pow(2,8*Q)-1;s0(this,$,q,Q,G,0)}let J=Q-1,Z=1;this[q+J]=$&255;while(--J>=0&&(Z*=256))this[q+J]=$/Z&255;return q+Q};o.prototype.writeUint8=o.prototype.writeUInt8=function($,q,Q){if($=+$,q=q>>>0,!Q)s0(this,$,q,1,255,0);return this[q]=$&255,q+1};o.prototype.writeUint16LE=o.prototype.writeUInt16LE=function($,q,Q){if($=+$,q=q>>>0,!Q)s0(this,$,q,2,65535,0);return this[q]=$&255,this[q+1]=$>>>8,q+2};o.prototype.writeUint16BE=o.prototype.writeUInt16BE=function($,q,Q){if($=+$,q=q>>>0,!Q)s0(this,$,q,2,65535,0);return this[q]=$>>>8,this[q+1]=$&255,q+2};o.prototype.writeUint32LE=o.prototype.writeUInt32LE=function($,q,Q){if($=+$,q=q>>>0,!Q)s0(this,$,q,4,4294967295,0);return this[q+3]=$>>>24,this[q+2]=$>>>16,this[q+1]=$>>>8,this[q]=$&255,q+4};o.prototype.writeUint32BE=o.prototype.writeUInt32BE=function($,q,Q){if($=+$,q=q>>>0,!Q)s0(this,$,q,4,4294967295,0);return this[q]=$>>>24,this[q+1]=$>>>16,this[q+2]=$>>>8,this[q+3]=$&255,q+4};o.prototype.writeBigUInt64LE=l2(function($,q=0){return H9(this,$,q,BigInt(0),BigInt("0xffffffffffffffff"))});o.prototype.writeBigUInt64BE=l2(function($,q=0){return v9(this,$,q,BigInt(0),BigInt("0xffffffffffffffff"))});o.prototype.writeIntLE=function($,q,Q,K){if($=+$,q=q>>>0,!K){let W=Math.pow(2,8*Q-1);s0(this,$,q,Q,W-1,-W)}let J=0,Z=1,G=0;this[q]=$&255;while(++J>0)-G&255}return q+Q};o.prototype.writeIntBE=function($,q,Q,K){if($=+$,q=q>>>0,!K){let W=Math.pow(2,8*Q-1);s0(this,$,q,Q,W-1,-W)}let J=Q-1,Z=1,G=0;this[q+J]=$&255;while(--J>=0&&(Z*=256)){if($<0&&G===0&&this[q+J+1]!==0)G=1;this[q+J]=($/Z>>0)-G&255}return q+Q};o.prototype.writeInt8=function($,q,Q){if($=+$,q=q>>>0,!Q)s0(this,$,q,1,127,-128);if($<0)$=255+$+1;return this[q]=$&255,q+1};o.prototype.writeInt16LE=function($,q,Q){if($=+$,q=q>>>0,!Q)s0(this,$,q,2,32767,-32768);return this[q]=$&255,this[q+1]=$>>>8,q+2};o.prototype.writeInt16BE=function($,q,Q){if($=+$,q=q>>>0,!Q)s0(this,$,q,2,32767,-32768);return this[q]=$>>>8,this[q+1]=$&255,q+2};o.prototype.writeInt32LE=function($,q,Q){if($=+$,q=q>>>0,!Q)s0(this,$,q,4,2147483647,-2147483648);return this[q]=$&255,this[q+1]=$>>>8,this[q+2]=$>>>16,this[q+3]=$>>>24,q+4};o.prototype.writeInt32BE=function($,q,Q){if($=+$,q=q>>>0,!Q)s0(this,$,q,4,2147483647,-2147483648);if($<0)$=4294967295+$+1;return this[q]=$>>>24,this[q+1]=$>>>16,this[q+2]=$>>>8,this[q+3]=$&255,q+4};o.prototype.writeBigInt64LE=l2(function($,q=0){return H9(this,$,q,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});o.prototype.writeBigInt64BE=l2(function($,q=0){return v9(this,$,q,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});o.prototype.writeFloatLE=function($,q,Q){return R9(this,$,q,!0,Q)};o.prototype.writeFloatBE=function($,q,Q){return R9(this,$,q,!1,Q)};o.prototype.writeDoubleLE=function($,q,Q){return I9(this,$,q,!0,Q)};o.prototype.writeDoubleBE=function($,q,Q){return I9(this,$,q,!1,Q)};o.prototype.copy=function($,q,Q,K){if(!o.isBuffer($))throw TypeError("argument should be a Buffer");if(!Q)Q=0;if(!K&&K!==0)K=this.length;if(q>=$.length)q=$.length;if(!q)q=0;if(K>0&&K=this.length)throw RangeError("Index out of range");if(K<0)throw RangeError("sourceEnd out of bounds");if(K>this.length)K=this.length;if($.length-q>>0,Q=Q===void 0?this.length:Q>>>0,!$)$=0;let J;if(typeof $==="number")for(J=q;J{var S0=y9.exports={},j2,g2;function T5(){throw Error("setTimeout has not been defined")}function u5(){throw Error("clearTimeout has not been defined")}(function(){try{if(typeof setTimeout==="function")j2=setTimeout;else j2=T5}catch($){j2=T5}try{if(typeof clearTimeout==="function")g2=clearTimeout;else g2=u5}catch($){g2=u5}})();function g9($){if(j2===setTimeout)return setTimeout($,0);if((j2===T5||!j2)&&setTimeout)return j2=setTimeout,setTimeout($,0);try{return j2($,0)}catch(q){try{return j2.call(null,$,0)}catch(Q){return j2.call(this,$,0)}}}function NV($){if(g2===clearTimeout)return clearTimeout($);if((g2===u5||!g2)&&clearTimeout)return g2=clearTimeout,clearTimeout($);try{return g2($)}catch(q){try{return g2.call(null,$)}catch(Q){return g2.call(this,$)}}}var E2=[],d1=!1,N1,k8=-1;function YV(){if(!d1||!N1)return;if(d1=!1,N1.length)E2=N1.concat(E2);else k8=-1;if(E2.length)A9()}function A9(){if(d1)return;var $=g9(YV);d1=!0;var q=E2.length;while(q){N1=E2,E2=[];while(++k81)for(var Q=1;Qn9,once:()=>c9,listenerCount:()=>d9,init:()=>r2,getMaxListeners:()=>p9,getEventListeners:()=>b9,default:()=>CV,captureRejectionSymbol:()=>u9,addAbortListener:()=>i9,EventEmitter:()=>r2});function S9($,q){var{_events:Q}=$;if(q[0]??=Error("Unhandled error."),!Q)throw q[0];var K=Q[T9];if(K)for(var J of O9.call(K))J.apply($,q);var Z=Q.error;if(!Z)throw q[0];for(var J of O9.call(Z))J.apply($,q);return!0}function LV($,q,Q,K){q.then(void 0,function(J){queueMicrotask(()=>HV($,J,Q,K))})}function HV($,q,Q,K){if(typeof $[x9]==="function")$[x9](q,Q,...K);else try{$[Y1]=!1,$.emit("error",q)}finally{$[Y1]=!0}}function E9($,q,Q){Q.warned=!0;let K=Error(`Possible EventEmitter memory leak detected. ${Q.length} ${String(q)} listeners added to [${$.constructor.name}]. Use emitter.setMaxListeners() to increase limit`);K.name="MaxListenersExceededWarning",K.emitter=$,K.type=q,K.count=Q.length,console.warn(K)}function _9($,q,...Q){this.removeListener($,q),q.apply(this,Q)}function c9($,q,Q){var K=Q?.signal;if(m9(K,"options.signal"),K?.aborted)throw new S5(void 0,{cause:K?.reason});let{resolve:J,reject:Z,promise:G}=$newPromiseCapability(Promise),W=(U)=>{if($.removeListener(q,B),K!=null)D8(K,"abort",V);Z(U)},B=(...U)=>{if(typeof $.removeListener==="function")$.removeListener("error",W);if(K!=null)D8(K,"abort",V);J(U)};if(P9($,q,B,{once:!0}),q!=="error"&&typeof $.once==="function")$.once("error",W);function V(){D8($,q,B),D8($,"error",W),Z(new S5(void 0,{cause:K?.reason}))}if(K!=null)P9(K,"abort",V,{once:!0});return G}function b9($,q){return $.listeners(q)}function n9($,...q){_5($,"setMaxListeners",0);var Q;if(q&&(Q=q.length))for(let K=0;KK||(Q!=null||K!=null)&&Number.isNaN($))throw RV(q,`${Q!=null?`>= ${Q}`:""}${Q!=null&&K!=null?" && ":""}${K!=null?`<= ${K}`:""}`,$)}function x6($){if(typeof $!=="function")throw TypeError("The listener must be a function")}function IV($,q){if(typeof $!=="boolean")throw m1(q,"boolean",$)}function p9($){return $?._maxListeners??k1}function i9($,q){if($===void 0)throw m1("signal","AbortSignal",$);if(m9($,"signal"),typeof q!=="function")throw m1("listener","function",q);let Q;if($.aborted)queueMicrotask(()=>q());else $.addEventListener("abort",q,{__proto__:null,once:!0}),Q=()=>{$.removeEventListener("abort",q)};return{__proto__:null,[Symbol.dispose](){Q?.()}}}var E5,Y1,T9,kV,DV,x9,u9,O9,k1=10,r2=function($){if(this._events===void 0||this._events===this.__proto__._events)this._events={__proto__:null},this._eventsCount=0;if(this._maxListeners??=void 0,this[Y1]=$?.captureRejections?Boolean($?.captureRejections):y0[Y1])this.emit=fV},y0,vV=function($,...q){if($==="error")return S9(this,q);var{_events:Q}=this;if(Q===void 0)return!1;var K=Q[$];if(K===void 0)return!1;let J=K.length>1?K.slice():K;for(let Z=0,{length:G}=J;Z1?K.slice():K;for(let Z=0,{length:G}=J;Z{E5=Symbol.for,Y1=Symbol("kCapture"),T9=E5("events.errorMonitor"),kV=Symbol("events.maxEventTargetListeners"),DV=Symbol("events.maxEventTargetListenersWarned"),x9=E5("nodejs.rejection"),u9=E5("nodejs.rejection"),O9=Array.prototype.slice,y0=r2.prototype={};y0._events=void 0;y0._eventsCount=0;y0._maxListeners=void 0;y0.setMaxListeners=function($){return _5($,"setMaxListeners",0),this._maxListeners=$,this};y0.constructor=r2;y0.getMaxListeners=function(){return this?._maxListeners??k1};y0.emit=vV;y0.addListener=function($,q){x6(q);var Q=this._events;if(!Q)Q=this._events={__proto__:null},this._eventsCount=0;else if(Q.newListener)this.emit("newListener",$,q.listener??q);var K=Q[$];if(!K)Q[$]=[q],this._eventsCount++;else{K.push(q);var J=this._maxListeners??k1;if(J>0&&K.length>J&&!K.warned)E9(this,$,K)}return this};y0.on=y0.addListener;y0.prependListener=function($,q){x6(q);var Q=this._events;if(!Q)Q=this._events={__proto__:null},this._eventsCount=0;else if(Q.newListener)this.emit("newListener",$,q.listener??q);var K=Q[$];if(!K)Q[$]=[q],this._eventsCount++;else{K.unshift(q);var J=this._maxListeners??k1;if(J>0&&K.length>J&&!K.warned)E9(this,$,K)}return this};y0.once=function($,q){x6(q);let Q=_9.bind(this,$,q);return Q.listener=q,this.addListener($,Q),this};y0.prependOnceListener=function($,q){x6(q);let Q=_9.bind(this,$,q);return Q.listener=q,this.prependListener($,Q),this};y0.removeListener=function($,q){x6(q);var{_events:Q}=this;if(!Q)return this;var K=Q[$];if(!K)return this;var J=K.length;let Z=-1;for(let G=J-1;G>=0;G--)if(K[G]===q||K[G].listener===q){Z=G;break}if(Z<0)return this;if(Z===0)K.shift();else K.splice(Z,1);if(K.length===0)delete Q[$],this._eventsCount--;return this};y0.off=y0.removeListener;y0.removeAllListeners=function($){var{_events:q}=this;if($&&q){if(q[$])delete q[$],this._eventsCount--}else this._events={__proto__:null};return this};y0.listeners=function($){var{_events:q}=this;if(!q)return[];var Q=q[$];if(!Q)return[];return Q.map((K)=>K.listener??K)};y0.rawListeners=function($){var{_events:q}=this;if(!q)return[];var Q=q[$];if(!Q)return[];return Q.slice()};y0.listenerCount=function($){var{_events:q}=this;if(!q)return 0;return q[$]?.length??0};y0.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};y0[Y1]=!1;S5=class S5 extends Error{constructor($="The operation was aborted",q=void 0){if(q!==void 0&&typeof q!=="object")throw m1("options","Object",q);super($,q);this.code="ABORT_ERR",this.name="AbortError"}};Object.defineProperties(r2,{captureRejections:{get(){return y0[Y1]},set($){IV($,"EventEmitter.captureRejections"),y0[Y1]=$},enumerable:!0},defaultMaxListeners:{enumerable:!0,get:()=>{return k1},set:($)=>{_5($,"defaultMaxListeners",0),k1=$}},kMaxEventTargetListeners:{value:kV,enumerable:!1,configurable:!1,writable:!1},kMaxEventTargetListenersWarned:{value:DV,enumerable:!1,configurable:!1,writable:!1}});Object.assign(r2,{once:c9,getEventListeners:b9,getMaxListeners:p9,setMaxListeners:n9,EventEmitter:r2,usingDomains:!1,captureRejectionSymbol:u9,errorMonitor:T9,addAbortListener:i9,init:r2,listenerCount:d9});CV=r2});var a1=N0((Bz,$$)=>{var g0=($,q)=>()=>(q||$((q={exports:{}}).exports,q),q.exports),P0=g0(($,q)=>{class Q extends Error{constructor(K){if(!Array.isArray(K))throw TypeError(`Expected input to be an Array, got ${typeof K}`);let J="";for(let Z=0;Z{q.exports={format(Q,...K){return Q.replace(/%([sdifj])/g,function(...[J,Z]){let G=K.shift();if(Z==="f")return G.toFixed(6);else if(Z==="j")return JSON.stringify(G);else if(Z==="s"&&typeof G==="object")return`${G.constructor!==Object?G.constructor.name:""} {}`.trim();else return G.toString()})},inspect(Q){switch(typeof Q){case"string":if(Q.includes("'")){if(!Q.includes('"'))return`"${Q}"`;else if(!Q.includes("`")&&!Q.includes("${"))return`\`${Q}\``}return`'${Q}'`;case"number":if(isNaN(Q))return"NaN";else if(Object.is(Q,-0))return String(Q);return Q;case"bigint":return`${String(Q)}n`;case"boolean":case"undefined":return String(Q);case"object":return"{}"}}}}),a0=g0(($,q)=>{var{format:Q,inspect:K}=o9(),{AggregateError:J}=P0(),Z=globalThis.AggregateError||J,G=Symbol("kIsNodeError"),W=["string","function","number","object","Function","Object","boolean","bigint","symbol"],B=/^([A-Z][a-z0-9]*)+$/,V={};function U(D,z){if(!D)throw new V.ERR_INTERNAL_ASSERTION(z)}function w(D){let z="",N=D.length,H=D[0]==="-"?1:0;for(;N>=H+4;N-=3)z=`_${D.slice(N-3,N)}${z}`;return`${D.slice(0,N)}${z}`}function F(D,z,N){if(typeof z==="function")return U(z.length<=N.length,`Code: ${D}; The provided arguments length (${N.length}) does not match the required ones (${z.length}).`),z(...N);let H=(z.match(/%[dfijoOs]/g)||[]).length;if(U(H===N.length,`Code: ${D}; The provided arguments length (${N.length}) does not match the required ones (${H}).`),N.length===0)return z;return Q(z,...N)}function M(D,z,N){if(!N)N=Error;class H extends N{constructor(...v){super(F(D,z,v))}toString(){return`${this.name} [${D}]: ${this.message}`}}Object.defineProperties(H.prototype,{name:{value:N.name,writable:!0,enumerable:!1,configurable:!0},toString:{value(){return`${this.name} [${D}]: ${this.message}`},writable:!0,enumerable:!1,configurable:!0}}),H.prototype.code=D,H.prototype[G]=!0,V[D]=H}function k(D){let z="__node_internal_"+D.name;return Object.defineProperty(D,"name",{value:z}),D}function f(D,z){if(D&&z&&D!==z){if(Array.isArray(z.errors))return z.errors.push(D),z;let N=new Z([z,D],z.message);return N.code=z.code,N}return D||z}class L extends Error{constructor(D="The operation was aborted",z=void 0){if(z!==void 0&&typeof z!=="object")throw new V.ERR_INVALID_ARG_TYPE("options","Object",z);super(D,z);this.code="ABORT_ERR",this.name="AbortError"}}M("ERR_ASSERTION","%s",Error),M("ERR_INVALID_ARG_TYPE",(D,z,N)=>{if(U(typeof D==="string","'name' must be a string"),!Array.isArray(z))z=[z];let H="The ";if(D.endsWith(" argument"))H+=`${D} `;else H+=`"${D}" ${D.includes(".")?"property":"argument"} `;H+="must be ";let v=[],j=[],n=[];for(let _ of z)if(U(typeof _==="string","All expected entries have to be of type string"),W.includes(_))v.push(_.toLowerCase());else if(B.test(_))j.push(_);else U(_!=="object",'The value "object" should be written as "Object"'),n.push(_);if(j.length>0){let _=v.indexOf("object");if(_!==-1)v.splice(v,_,1),j.push("Object")}if(v.length>0){switch(v.length){case 1:H+=`of type ${v[0]}`;break;case 2:H+=`one of type ${v[0]} or ${v[1]}`;break;default:{let _=v.pop();H+=`one of type ${v.join(", ")}, or ${_}`}}if(j.length>0||n.length>0)H+=" or "}if(j.length>0){switch(j.length){case 1:H+=`an instance of ${j[0]}`;break;case 2:H+=`an instance of ${j[0]} or ${j[1]}`;break;default:{let _=j.pop();H+=`an instance of ${j.join(", ")}, or ${_}`}}if(n.length>0)H+=" or "}switch(n.length){case 0:break;case 1:if(n[0].toLowerCase()!==n[0])H+="an ";H+=`${n[0]}`;break;case 2:H+=`one of ${n[0]} or ${n[1]}`;break;default:{let _=n.pop();H+=`one of ${n.join(", ")}, or ${_}`}}if(N==null)H+=`. Received ${N}`;else if(typeof N==="function"&&N.name)H+=`. Received function ${N.name}`;else if(typeof N==="object"){var d;if((d=N.constructor)!==null&&d!==void 0&&d.name)H+=`. Received an instance of ${N.constructor.name}`;else{let _=K(N,{depth:-1});H+=`. Received ${_}`}}else{let _=K(N,{colors:!1});if(_.length>25)_=`${_.slice(0,25)}...`;H+=`. Received type ${typeof N} (${_})`}return H},TypeError),M("ERR_INVALID_ARG_VALUE",(D,z,N="is invalid")=>{let H=K(z);if(H.length>128)H=H.slice(0,128)+"...";return`The ${D.includes(".")?"property":"argument"} '${D}' ${N}. Received ${H}`},TypeError),M("ERR_INVALID_RETURN_VALUE",(D,z,N)=>{var H;let v=N!==null&&N!==void 0&&(H=N.constructor)!==null&&H!==void 0&&H.name?`instance of ${N.constructor.name}`:`type ${typeof N}`;return`Expected ${D} to be returned from the "${z}" function but got ${v}.`},TypeError),M("ERR_MISSING_ARGS",(...D)=>{U(D.length>0,"At least one arg needs to be specified");let z,N=D.length;switch(D=(Array.isArray(D)?D:[D]).map((H)=>`"${H}"`).join(" or "),N){case 1:z+=`The ${D[0]} argument`;break;case 2:z+=`The ${D[0]} and ${D[1]} arguments`;break;default:{let H=D.pop();z+=`The ${D.join(", ")}, and ${H} arguments`}break}return`${z} must be specified`},TypeError),M("ERR_OUT_OF_RANGE",(D,z,N)=>{U(z,'Missing "range" argument');let H;if(Number.isInteger(N)&&Math.abs(N)>4294967296)H=w(String(N));else if(typeof N==="bigint"){H=String(N);let v=BigInt(2)**BigInt(32);if(N>v||N<-v)H=w(H);H+="n"}else H=K(N);return`The value of "${D}" is out of range. It must be ${z}. Received ${H}`},RangeError),M("ERR_MULTIPLE_CALLBACK","Callback called multiple times",Error),M("ERR_METHOD_NOT_IMPLEMENTED","The %s method is not implemented",Error),M("ERR_STREAM_ALREADY_FINISHED","Cannot call %s after a stream was finished",Error),M("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable",Error),M("ERR_STREAM_DESTROYED","Cannot call %s after a stream was destroyed",Error),M("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),M("ERR_STREAM_PREMATURE_CLOSE","Premature close",Error),M("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF",Error),M("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event",Error),M("ERR_STREAM_WRITE_AFTER_END","write after end",Error),M("ERR_UNKNOWN_ENCODING","Unknown encoding: %s",TypeError),q.exports={AbortError:L,aggregateTwoErrors:k(f),hideStackFrames:k,codes:V}}),jV=g0(($,q)=>{Object.defineProperty($,"__esModule",{value:!0});var Q=new WeakMap,K=new WeakMap;function J(X){let P=Q.get(X);return console.assert(P!=null,"'this' is expected an Event object, but got",X),P}function Z(X){if(X.passiveListener!=null){if(typeof console<"u"&&typeof console.error==="function")console.error("Unable to preventDefault inside passive event listener invocation.",X.passiveListener);return}if(!X.event.cancelable)return;if(X.canceled=!0,typeof X.event.preventDefault==="function")X.event.preventDefault()}function G(X,P){Q.set(this,{eventTarget:X,event:P,eventPhase:2,currentTarget:X,canceled:!1,stopped:!1,immediateStopped:!1,passiveListener:null,timeStamp:P.timeStamp||Date.now()}),Object.defineProperty(this,"isTrusted",{value:!1,enumerable:!0});let g=Object.keys(P);for(let c=0;c0){let X=Array(arguments.length);for(let P=0;P{Object.defineProperty($,"__esModule",{value:!0});var Q=jV();class K extends Q.EventTarget{constructor(){super();throw TypeError("AbortSignal cannot be constructed directly")}get aborted(){let U=G.get(this);if(typeof U!=="boolean")throw TypeError(`Expected 'this' to be an 'AbortSignal' object, but got ${this===null?"null":typeof this}`);return U}}Q.defineEventAttribute(K.prototype,"abort");function J(){let U=Object.create(K.prototype);return Q.EventTarget.call(U),G.set(U,!1),U}function Z(U){if(G.get(U)!==!1)return;G.set(U,!0),U.dispatchEvent({type:"abort"})}var G=new WeakMap;if(Object.defineProperties(K.prototype,{aborted:{enumerable:!0}}),typeof Symbol==="function"&&typeof Symbol.toStringTag==="symbol")Object.defineProperty(K.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortSignal"});class W{constructor(){B.set(this,J())}get signal(){return V(this)}abort(){Z(V(this))}}var B=new WeakMap;function V(U){let w=B.get(U);if(w==null)throw TypeError(`Expected 'this' to be an 'AbortController' object, but got ${U===null?"null":typeof U}`);return w}if(Object.defineProperties(W.prototype,{signal:{enumerable:!0},abort:{enumerable:!0}}),typeof Symbol==="function"&&typeof Symbol.toStringTag==="symbol")Object.defineProperty(W.prototype,Symbol.toStringTag,{configurable:!0,value:"AbortController"});$.AbortController=W,$.AbortSignal=K,$.default=W,q.exports=W,q.exports.AbortController=q.exports.default=W,q.exports.AbortSignal=K}),e0=g0(($,q)=>{var Q=(t0(),X0(K2)),{format:K,inspect:J}=o9(),{codes:{ERR_INVALID_ARG_TYPE:Z}}=a0(),{kResistStopPropagation:G,AggregateError:W,SymbolDispose:B}=P0(),V=globalThis.AbortSignal||O6().AbortSignal,U=globalThis.AbortController||O6().AbortController,w=Object.getPrototypeOf(async function(){}).constructor,F=globalThis.Blob||Q.Blob,M=typeof F<"u"?function(L){return L instanceof F}:function(L){return!1},k=(L,D)=>{if(L!==void 0&&(L===null||typeof L!=="object"||!("aborted"in L)))throw new Z(D,"AbortSignal",L)},f=(L,D)=>{if(typeof L!=="function")throw new Z(D,"Function",L)};q.exports={AggregateError:W,kEmptyObject:Object.freeze({}),once(L){let D=!1;return function(...z){if(D)return;D=!0,L.apply(this,z)}},createDeferredPromise:function(){let L,D;return{promise:new Promise((z,N)=>{L=z,D=N}),resolve:L,reject:D}},promisify(L){return new Promise((D,z)=>{L((N,...H)=>{if(N)return z(N);return D(...H)})})},debuglog(){return function(){}},format:K,inspect:J,types:{isAsyncFunction(L){return L instanceof w},isArrayBufferView(L){return ArrayBuffer.isView(L)}},isBlob:M,deprecate(L,D){return L},addAbortListener:(i1(),X0(p1)).addAbortListener||function(L,D){if(L===void 0)throw new Z("signal","AbortSignal",L);k(L,"signal"),f(D,"listener");let z;if(L.aborted)queueMicrotask(()=>D());else L.addEventListener("abort",D,{__proto__:null,once:!0,[G]:!0}),z=()=>{L.removeEventListener("abort",D)};return{__proto__:null,[B](){var N;(N=z)===null||N===void 0||N()}}},AbortSignalAny:V.any||function(L){if(L.length===1)return L[0];let D=new U,z=()=>D.abort();return L.forEach((N)=>{k(N,"signals"),N.addEventListener("abort",z,{once:!0})}),D.signal.addEventListener("abort",()=>{L.forEach((N)=>N.removeEventListener("abort",z))},{once:!0}),D.signal}},q.exports.promisify.custom=Symbol.for("nodejs.util.promisify.custom")}),P6=g0(($,q)=>{var{ArrayIsArray:Q,ArrayPrototypeIncludes:K,ArrayPrototypeJoin:J,ArrayPrototypeMap:Z,NumberIsInteger:G,NumberIsNaN:W,NumberMAX_SAFE_INTEGER:B,NumberMIN_SAFE_INTEGER:V,NumberParseInt:U,ObjectPrototypeHasOwnProperty:w,RegExpPrototypeExec:F,String:M,StringPrototypeToUpperCase:k,StringPrototypeTrim:f}=P0(),{hideStackFrames:L,codes:{ERR_SOCKET_BAD_PORT:D,ERR_INVALID_ARG_TYPE:z,ERR_INVALID_ARG_VALUE:N,ERR_OUT_OF_RANGE:H,ERR_UNKNOWN_SIGNAL:v}}=a0(),{normalizeEncoding:j}=e0(),{isAsyncFunction:n,isArrayBufferView:d}=e0().types,_={};function X(T){return T===(T|0)}function P(T){return T===T>>>0}var g=/^[0-7]+$/,c="must be a 32-bit unsigned integer or an octal string";function h(T,t,G0){if(typeof T>"u")T=G0;if(typeof T==="string"){if(F(g,T)===null)throw new N(t,T,c);T=U(T,8)}return $0(T,t),T}var x=L((T,t,G0=V,Q0=B)=>{if(typeof T!=="number")throw new z(t,"number",T);if(!G(T))throw new H(t,"an integer",T);if(TQ0)throw new H(t,`>= ${G0} && <= ${Q0}`,T)}),l=L((T,t,G0=-2147483648,Q0=2147483647)=>{if(typeof T!=="number")throw new z(t,"number",T);if(!G(T))throw new H(t,"an integer",T);if(TQ0)throw new H(t,`>= ${G0} && <= ${Q0}`,T)}),$0=L((T,t,G0=!1)=>{if(typeof T!=="number")throw new z(t,"number",T);if(!G(T))throw new H(t,"an integer",T);let Q0=G0?1:0,M0=4294967295;if(TM0)throw new H(t,`>= ${Q0} && <= ${M0}`,T)});function Z0(T,t){if(typeof T!=="string")throw new z(t,"string",T)}function F0(T,t,G0=void 0,Q0){if(typeof T!=="number")throw new z(t,"number",T);if(G0!=null&&TQ0||(G0!=null||Q0!=null)&&W(T))throw new H(t,`${G0!=null?`>= ${G0}`:""}${G0!=null&&Q0!=null?" && ":""}${Q0!=null?`<= ${Q0}`:""}`,T)}var p=L((T,t,G0)=>{if(!K(G0,T)){let Q0="must be one of: "+J(Z(G0,(M0)=>typeof M0==="string"?`'${M0}'`:M(M0)),", ");throw new N(t,T,Q0)}});function W0(T,t){if(typeof T!=="boolean")throw new z(t,"boolean",T)}function y(T,t,G0){return T==null||!w(T,t)?G0:T[t]}var i=L((T,t,G0=null)=>{let Q0=y(G0,"allowArray",!1),M0=y(G0,"allowFunction",!1);if(!y(G0,"nullable",!1)&&T===null||!Q0&&Q(T)||typeof T!=="object"&&(!M0||typeof T!=="function"))throw new z(t,"Object",T)}),U0=L((T,t)=>{if(T!=null&&typeof T!=="object"&&typeof T!=="function")throw new z(t,"a dictionary",T)}),m=L((T,t,G0=0)=>{if(!Q(T))throw new z(t,"Array",T);if(T.length{if(!d(T))throw new z(t,["Buffer","TypedArray","DataView"],T)});function E(T,t){let G0=j(t),Q0=T.length;if(G0==="hex"&&Q0%2!==0)throw new N("encoding",t,`is invalid for data of length ${Q0}`)}function a(T,t="Port",G0=!0){if(typeof T!=="number"&&typeof T!=="string"||typeof T==="string"&&f(T).length===0||+T!==+T>>>0||T>65535||T===0&&!G0)throw new D(t,T,G0);return T|0}var K0=L((T,t)=>{if(T!==void 0&&(T===null||typeof T!=="object"||!("aborted"in T)))throw new z(t,"AbortSignal",T)}),R=L((T,t)=>{if(typeof T!=="function")throw new z(t,"Function",T)}),Y=L((T,t)=>{if(typeof T!=="function"||n(T))throw new z(t,"Function",T)}),C=L((T,t)=>{if(T!==void 0)throw new z(t,"undefined",T)});function u(T,t,G0){if(!K(G0,T))throw new z(t,`('${J(G0,"|")}')`,T)}var e=/^(?:<[^>]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/;function r(T,t){if(typeof T>"u"||!F(e,T))throw new N(t,T,'must be an array or string of format "; rel=preload; as=style"')}function s(T){if(typeof T==="string")return r(T,"hints"),T;else if(Q(T)){let t=T.length,G0="";if(t===0)return G0;for(let Q0=0;Q0; rel=preload; as=style"')}q.exports={isInt32:X,isUint32:P,parseFileMode:h,validateArray:m,validateStringArray:V0,validateBooleanArray:w0,validateAbortSignalArray:S,validateBoolean:W0,validateBuffer:O,validateDictionary:U0,validateEncoding:E,validateFunction:R,validateInt32:l,validateInteger:x,validateNumber:F0,validateObject:i,validateOneOf:p,validatePlainFunction:Y,validatePort:a,validateSignalName:b,validateString:Z0,validateUint32:$0,validateUndefined:C,validateUnion:u,validateAbortSignal:K0,validateLinkHeaderValue:s}}),D1=g0(($,q)=>{q.exports=globalThis.process}),b2=g0(($,q)=>{var{SymbolAsyncIterator:Q,SymbolIterator:K,SymbolFor:J}=P0(),Z=J("nodejs.stream.destroyed"),G=J("nodejs.stream.errored"),W=J("nodejs.stream.readable"),B=J("nodejs.stream.writable"),V=J("nodejs.stream.disturbed"),U=J("nodejs.webstream.isClosedPromise"),w=J("nodejs.webstream.controllerErrorFunction");function F(y,i=!1){var U0;return!!(y&&typeof y.pipe==="function"&&typeof y.on==="function"&&(!i||typeof y.pause==="function"&&typeof y.resume==="function")&&(!y._writableState||((U0=y._readableState)===null||U0===void 0?void 0:U0.readable)!==!1)&&(!y._writableState||y._readableState))}function M(y){var i;return!!(y&&typeof y.write==="function"&&typeof y.on==="function"&&(!y._readableState||((i=y._writableState)===null||i===void 0?void 0:i.writable)!==!1))}function k(y){return!!(y&&typeof y.pipe==="function"&&y._readableState&&typeof y.on==="function"&&typeof y.write==="function")}function f(y){return y&&(y._readableState||y._writableState||typeof y.write==="function"&&typeof y.on==="function"||typeof y.pipe==="function"&&typeof y.on==="function")}function L(y){return!!(y&&!f(y)&&typeof y.pipeThrough==="function"&&typeof y.getReader==="function"&&typeof y.cancel==="function")}function D(y){return!!(y&&!f(y)&&typeof y.getWriter==="function"&&typeof y.abort==="function")}function z(y){return!!(y&&!f(y)&&typeof y.readable==="object"&&typeof y.writable==="object")}function N(y){return L(y)||D(y)||z(y)}function H(y,i){if(y==null)return!1;if(i===!0)return typeof y[Q]==="function";if(i===!1)return typeof y[K]==="function";return typeof y[Q]==="function"||typeof y[K]==="function"}function v(y){if(!f(y))return null;let{_writableState:i,_readableState:U0}=y,m=i||U0;return!!(y.destroyed||y[Z]||m!==null&&m!==void 0&&m.destroyed)}function j(y){if(!M(y))return null;if(y.writableEnded===!0)return!0;let i=y._writableState;if(i!==null&&i!==void 0&&i.errored)return!1;if(typeof(i===null||i===void 0?void 0:i.ended)!=="boolean")return null;return i.ended}function n(y,i){if(!M(y))return null;if(y.writableFinished===!0)return!0;let U0=y._writableState;if(U0!==null&&U0!==void 0&&U0.errored)return!1;if(typeof(U0===null||U0===void 0?void 0:U0.finished)!=="boolean")return null;return!!(U0.finished||i===!1&&U0.ended===!0&&U0.length===0)}function d(y){if(!F(y))return null;if(y.readableEnded===!0)return!0;let i=y._readableState;if(!i||i.errored)return!1;if(typeof(i===null||i===void 0?void 0:i.ended)!=="boolean")return null;return i.ended}function _(y,i){if(!F(y))return null;let U0=y._readableState;if(U0!==null&&U0!==void 0&&U0.errored)return!1;if(typeof(U0===null||U0===void 0?void 0:U0.endEmitted)!=="boolean")return null;return!!(U0.endEmitted||i===!1&&U0.ended===!0&&U0.length===0)}function X(y){if(y&&y[W]!=null)return y[W];if(typeof(y===null||y===void 0?void 0:y.readable)!=="boolean")return null;if(v(y))return!1;return F(y)&&y.readable&&!_(y)}function P(y){if(y&&y[B]!=null)return y[B];if(typeof(y===null||y===void 0?void 0:y.writable)!=="boolean")return null;if(v(y))return!1;return M(y)&&y.writable&&!j(y)}function g(y,i){if(!f(y))return null;if(v(y))return!0;if((i===null||i===void 0?void 0:i.readable)!==!1&&X(y))return!1;if((i===null||i===void 0?void 0:i.writable)!==!1&&P(y))return!1;return!0}function c(y){var i,U0;if(!f(y))return null;if(y.writableErrored)return y.writableErrored;return(i=(U0=y._writableState)===null||U0===void 0?void 0:U0.errored)!==null&&i!==void 0?i:null}function h(y){var i,U0;if(!f(y))return null;if(y.readableErrored)return y.readableErrored;return(i=(U0=y._readableState)===null||U0===void 0?void 0:U0.errored)!==null&&i!==void 0?i:null}function x(y){if(!f(y))return null;if(typeof y.closed==="boolean")return y.closed;let{_writableState:i,_readableState:U0}=y;if(typeof(i===null||i===void 0?void 0:i.closed)==="boolean"||typeof(U0===null||U0===void 0?void 0:U0.closed)==="boolean")return(i===null||i===void 0?void 0:i.closed)||(U0===null||U0===void 0?void 0:U0.closed);if(typeof y._closed==="boolean"&&l(y))return y._closed;return null}function l(y){return typeof y._closed==="boolean"&&typeof y._defaultKeepAlive==="boolean"&&typeof y._removedConnection==="boolean"&&typeof y._removedContLen==="boolean"}function $0(y){return typeof y._sent100==="boolean"&&l(y)}function Z0(y){var i;return typeof y._consuming==="boolean"&&typeof y._dumped==="boolean"&&((i=y.req)===null||i===void 0?void 0:i.upgradeOrConnect)===void 0}function F0(y){if(!f(y))return null;let{_writableState:i,_readableState:U0}=y,m=i||U0;return!m&&$0(y)||!!(m&&m.autoDestroy&&m.emitClose&&m.closed===!1)}function p(y){var i;return!!(y&&((i=y[V])!==null&&i!==void 0?i:y.readableDidRead||y.readableAborted))}function W0(y){var i,U0,m,V0,w0,S,b,O,E,a;return!!(y&&((i=(U0=(m=(V0=(w0=(S=y[G])!==null&&S!==void 0?S:y.readableErrored)!==null&&w0!==void 0?w0:y.writableErrored)!==null&&V0!==void 0?V0:(b=y._readableState)===null||b===void 0?void 0:b.errorEmitted)!==null&&m!==void 0?m:(O=y._writableState)===null||O===void 0?void 0:O.errorEmitted)!==null&&U0!==void 0?U0:(E=y._readableState)===null||E===void 0?void 0:E.errored)!==null&&i!==void 0?i:(a=y._writableState)===null||a===void 0?void 0:a.errored))}q.exports={isDestroyed:v,kIsDestroyed:Z,isDisturbed:p,kIsDisturbed:V,isErrored:W0,kIsErrored:G,isReadable:X,kIsReadable:W,kIsClosedPromise:U,kControllerErrorFunction:w,kIsWritable:B,isClosed:x,isDuplexNodeStream:k,isFinished:g,isIterable:H,isReadableNodeStream:F,isReadableStream:L,isReadableEnded:d,isReadableFinished:_,isReadableErrored:h,isNodeStream:f,isWebStream:N,isWritable:P,isWritableNodeStream:M,isWritableStream:D,isWritableEnded:j,isWritableFinished:n,isWritableErrored:c,isServerRequest:Z0,isServerResponse:$0,willEmitClose:F0,isTransformStream:z}}),s2=g0(($,q)=>{var Q=D1(),{AbortError:K,codes:J}=a0(),{ERR_INVALID_ARG_TYPE:Z,ERR_STREAM_PREMATURE_CLOSE:G}=J,{kEmptyObject:W,once:B}=e0(),{validateAbortSignal:V,validateFunction:U,validateObject:w,validateBoolean:F}=P6(),{Promise:M,PromisePrototypeThen:k,SymbolDispose:f}=P0(),{isClosed:L,isReadable:D,isReadableNodeStream:z,isReadableStream:N,isReadableFinished:H,isReadableErrored:v,isWritable:j,isWritableNodeStream:n,isWritableStream:d,isWritableFinished:_,isWritableErrored:X,isNodeStream:P,willEmitClose:g,kIsClosedPromise:c}=b2(),h;function x(p){return p.setHeader&&typeof p.abort==="function"}var l=()=>{};function $0(p,W0,y){var i,U0;if(arguments.length===2)y=W0,W0=W;else if(W0==null)W0=W;else w(W0,"options");if(U(y,"callback"),V(W0.signal,"options.signal"),y=B(y),N(p)||d(p))return Z0(p,W0,y);if(!P(p))throw new Z("stream",["ReadableStream","WritableStream","Stream"],p);let m=(i=W0.readable)!==null&&i!==void 0?i:z(p),V0=(U0=W0.writable)!==null&&U0!==void 0?U0:n(p),w0=p._writableState,S=p._readableState,b=()=>{if(!p.writable)a()},O=g(p)&&z(p)===m&&n(p)===V0,E=_(p,!1),a=()=>{if(E=!0,p.destroyed)O=!1;if(O&&(!p.readable||m))return;if(!m||K0)y.call(p)},K0=H(p,!1),R=()=>{if(K0=!0,p.destroyed)O=!1;if(O&&(!p.writable||V0))return;if(!V0||E)y.call(p)},Y=(T)=>{y.call(p,T)},C=L(p),u=()=>{C=!0;let T=X(p)||v(p);if(T&&typeof T!=="boolean")return y.call(p,T);if(m&&!K0&&z(p,!0)){if(!H(p,!1))return y.call(p,new G)}if(V0&&!E){if(!_(p,!1))return y.call(p,new G)}y.call(p)},e=()=>{C=!0;let T=X(p)||v(p);if(T&&typeof T!=="boolean")return y.call(p,T);y.call(p)},r=()=>{p.req.on("finish",a)};if(x(p)){if(p.on("complete",a),!O)p.on("abort",u);if(p.req)r();else p.on("request",r)}else if(V0&&!w0)p.on("end",b),p.on("close",b);if(!O&&typeof p.aborted==="boolean")p.on("aborted",u);if(p.on("end",R),p.on("finish",a),W0.error!==!1)p.on("error",Y);if(p.on("close",u),C)Q.nextTick(u);else if(w0!==null&&w0!==void 0&&w0.errorEmitted||S!==null&&S!==void 0&&S.errorEmitted){if(!O)Q.nextTick(e)}else if(!m&&(!O||D(p))&&(E||j(p)===!1))Q.nextTick(e);else if(!V0&&(!O||j(p))&&(K0||D(p)===!1))Q.nextTick(e);else if(S&&p.req&&p.aborted)Q.nextTick(e);let s=()=>{if(y=l,p.removeListener("aborted",u),p.removeListener("complete",a),p.removeListener("abort",u),p.removeListener("request",r),p.req)p.req.removeListener("finish",a);p.removeListener("end",b),p.removeListener("close",b),p.removeListener("finish",a),p.removeListener("end",R),p.removeListener("error",Y),p.removeListener("close",u)};if(W0.signal&&!C){let T=()=>{let t=y;s(),t.call(p,new K(void 0,{cause:W0.signal.reason}))};if(W0.signal.aborted)Q.nextTick(T);else{h=h||e0().addAbortListener;let t=h(W0.signal,T),G0=y;y=B((...Q0)=>{t[f](),G0.apply(p,Q0)})}}return s}function Z0(p,W0,y){let i=!1,U0=l;if(W0.signal)if(U0=()=>{i=!0,y.call(p,new K(void 0,{cause:W0.signal.reason}))},W0.signal.aborted)Q.nextTick(U0);else{h=h||e0().addAbortListener;let V0=h(W0.signal,U0),w0=y;y=B((...S)=>{V0[f](),w0.apply(p,S)})}let m=(...V0)=>{if(!i)Q.nextTick(()=>y.apply(p,V0))};return k(p[c].promise,m,m),l}function F0(p,W0){var y;let i=!1;if(W0===null)W0=W;if((y=W0)!==null&&y!==void 0&&y.cleanup)F(W0.cleanup,"cleanup"),i=W0.cleanup;return new M((U0,m)=>{let V0=$0(p,W0,(w0)=>{if(i)V0();if(w0)m(w0);else U0()})})}q.exports=$0,q.exports.finished=F0}),o1=g0(($,q)=>{var Q=D1(),{aggregateTwoErrors:K,codes:{ERR_MULTIPLE_CALLBACK:J},AbortError:Z}=a0(),{Symbol:G}=P0(),{kIsDestroyed:W,isDestroyed:B,isFinished:V,isServerRequest:U}=b2(),w=G("kDestroy"),F=G("kConstruct");function M(g,c,h){if(g){if(g.stack,c&&!c.errored)c.errored=g;if(h&&!h.errored)h.errored=g}}function k(g,c){let h=this._readableState,x=this._writableState,l=x||h;if(x!==null&&x!==void 0&&x.destroyed||h!==null&&h!==void 0&&h.destroyed){if(typeof c==="function")c();return this}if(M(g,x,h),x)x.destroyed=!0;if(h)h.destroyed=!0;if(!l.constructed)this.once(w,function($0){f(this,K($0,g),c)});else f(this,g,c);return this}function f(g,c,h){let x=!1;function l($0){if(x)return;x=!0;let{_readableState:Z0,_writableState:F0}=g;if(M($0,F0,Z0),F0)F0.closed=!0;if(Z0)Z0.closed=!0;if(typeof h==="function")h($0);if($0)Q.nextTick(L,g,$0);else Q.nextTick(D,g)}try{g._destroy(c||null,l)}catch($0){l($0)}}function L(g,c){z(g,c),D(g)}function D(g){let{_readableState:c,_writableState:h}=g;if(h)h.closeEmitted=!0;if(c)c.closeEmitted=!0;if(h!==null&&h!==void 0&&h.emitClose||c!==null&&c!==void 0&&c.emitClose)g.emit("close")}function z(g,c){let{_readableState:h,_writableState:x}=g;if(x!==null&&x!==void 0&&x.errorEmitted||h!==null&&h!==void 0&&h.errorEmitted)return;if(x)x.errorEmitted=!0;if(h)h.errorEmitted=!0;g.emit("error",c)}function N(){let g=this._readableState,c=this._writableState;if(g)g.constructed=!0,g.closed=!1,g.closeEmitted=!1,g.destroyed=!1,g.errored=null,g.errorEmitted=!1,g.reading=!1,g.ended=g.readable===!1,g.endEmitted=g.readable===!1;if(c)c.constructed=!0,c.destroyed=!1,c.closed=!1,c.closeEmitted=!1,c.errored=null,c.errorEmitted=!1,c.finalCalled=!1,c.prefinished=!1,c.ended=c.writable===!1,c.ending=c.writable===!1,c.finished=c.writable===!1}function H(g,c,h){let{_readableState:x,_writableState:l}=g;if(l!==null&&l!==void 0&&l.destroyed||x!==null&&x!==void 0&&x.destroyed)return this;if(x!==null&&x!==void 0&&x.autoDestroy||l!==null&&l!==void 0&&l.autoDestroy)g.destroy(c);else if(c){if(c.stack,l&&!l.errored)l.errored=c;if(x&&!x.errored)x.errored=c;if(h)Q.nextTick(z,g,c);else z(g,c)}}function v(g,c){if(typeof g._construct!=="function")return;let{_readableState:h,_writableState:x}=g;if(h)h.constructed=!1;if(x)x.constructed=!1;if(g.once(F,c),g.listenerCount(F)>1)return;Q.nextTick(j,g)}function j(g){let c=!1;function h(x){if(c){H(g,x!==null&&x!==void 0?x:new J);return}c=!0;let{_readableState:l,_writableState:$0}=g,Z0=$0||l;if(l)l.constructed=!0;if($0)$0.constructed=!0;if(Z0.destroyed)g.emit(w,x);else if(x)H(g,x,!0);else Q.nextTick(n,g)}try{g._construct((x)=>{Q.nextTick(h,x)})}catch(x){Q.nextTick(h,x)}}function n(g){g.emit(F)}function d(g){return(g===null||g===void 0?void 0:g.setHeader)&&typeof g.abort==="function"}function _(g){g.emit("close")}function X(g,c){g.emit("error",c),Q.nextTick(_,g)}function P(g,c){if(!g||B(g))return;if(!c&&!V(g))c=new Z;if(U(g))g.socket=null,g.destroy(c);else if(d(g))g.abort();else if(d(g.req))g.req.abort();else if(typeof g.destroy==="function")g.destroy(c);else if(typeof g.close==="function")g.close();else if(c)Q.nextTick(X,g,c);else Q.nextTick(_,g);if(!g.destroyed)g[W]=!0}q.exports={construct:v,destroyer:P,destroy:k,undestroy:N,errorOrDestroy:H}}),c5=g0(($,q)=>{var{ArrayIsArray:Q,ObjectSetPrototypeOf:K}=P0(),{EventEmitter:J}=(i1(),X0(p1));function Z(W){J.call(this,W)}K(Z.prototype,J.prototype),K(Z,J),Z.prototype.pipe=function(W,B){let V=this;function U(D){if(W.writable&&W.write(D)===!1&&V.pause)V.pause()}V.on("data",U);function w(){if(V.readable&&V.resume)V.resume()}if(W.on("drain",w),!W._isStdio&&(!B||B.end!==!1))V.on("end",M),V.on("close",k);let F=!1;function M(){if(F)return;F=!0,W.end()}function k(){if(F)return;if(F=!0,typeof W.destroy==="function")W.destroy()}function f(D){if(L(),J.listenerCount(this,"error")===0)this.emit("error",D)}G(V,"error",f),G(W,"error",f);function L(){V.removeListener("data",U),W.removeListener("drain",w),V.removeListener("end",M),V.removeListener("close",k),V.removeListener("error",f),W.removeListener("error",f),V.removeListener("end",L),V.removeListener("close",L),W.removeListener("close",L)}return V.on("end",L),V.on("close",L),W.on("close",L),W.emit("pipe",V),W};function G(W,B,V){if(typeof W.prependListener==="function")return W.prependListener(B,V);if(!W._events||!W._events[B])W.on(B,V);else if(Q(W._events[B]))W._events[B].unshift(V);else W._events[B]=[V,W._events[B]]}q.exports={Stream:Z,prependListener:G}}),L8=g0(($,q)=>{var{SymbolDispose:Q}=P0(),{AbortError:K,codes:J}=a0(),{isNodeStream:Z,isWebStream:G,kControllerErrorFunction:W}=b2(),B=s2(),{ERR_INVALID_ARG_TYPE:V}=J,U,w=(F,M)=>{if(typeof F!=="object"||!("aborted"in F))throw new V(M,"AbortSignal",F)};q.exports.addAbortSignal=function(F,M){if(w(F,"signal"),!Z(M)&&!G(M))throw new V("stream",["ReadableStream","WritableStream","Stream"],M);return q.exports.addAbortSignalNoValidate(F,M)},q.exports.addAbortSignalNoValidate=function(F,M){if(typeof F!=="object"||!("aborted"in F))return M;let k=Z(M)?()=>{M.destroy(new K(void 0,{cause:F.reason}))}:()=>{M[W](new K(void 0,{cause:F.reason}))};if(F.aborted)k();else{U=U||e0().addAbortListener;let f=U(F,k);B(M,f[Q])}return M}}),gV=g0(($,q)=>{var{StringPrototypeSlice:Q,SymbolIterator:K,TypedArrayPrototypeSet:J,Uint8Array:Z}=P0(),{Buffer:G}=(t0(),X0(K2)),{inspect:W}=e0();q.exports=class{constructor(){this.head=null,this.tail=null,this.length=0}push(B){let V={data:B,next:null};if(this.length>0)this.tail.next=V;else this.head=V;this.tail=V,++this.length}unshift(B){let V={data:B,next:this.head};if(this.length===0)this.tail=V;this.head=V,++this.length}shift(){if(this.length===0)return;let B=this.head.data;if(this.length===1)this.head=this.tail=null;else this.head=this.head.next;return--this.length,B}clear(){this.head=this.tail=null,this.length=0}join(B){if(this.length===0)return"";let V=this.head,U=""+V.data;while((V=V.next)!==null)U+=B+V.data;return U}concat(B){if(this.length===0)return G.alloc(0);let V=G.allocUnsafe(B>>>0),U=this.head,w=0;while(U)J(V,U.data,w),w+=U.data.length,U=U.next;return V}consume(B,V){let U=this.head.data;if(BF.length)V+=F,B-=F.length;else{if(B===F.length)if(V+=F,++w,U.next)this.head=U.next;else this.head=this.tail=null;else V+=Q(F,0,B),this.head=U,U.data=Q(F,B);break}++w}while((U=U.next)!==null);return this.length-=w,V}_getBuffer(B){let V=G.allocUnsafe(B),U=B,w=this.head,F=0;do{let M=w.data;if(B>M.length)J(V,M,U-B),B-=M.length;else{if(B===M.length)if(J(V,M,U-B),++F,w.next)this.head=w.next;else this.head=this.tail=null;else J(V,new Z(M.buffer,M.byteOffset,B),U-B),this.head=w,w.data=M.slice(B);break}++F}while((w=w.next)!==null);return this.length-=F,V}[Symbol.for("nodejs.util.inspect.custom")](B,V){return W(this,{...V,depth:0,customInspect:!1})}}}),H8=g0(($,q)=>{var{MathFloor:Q,NumberIsInteger:K}=P0(),{validateInteger:J}=P6(),{ERR_INVALID_ARG_VALUE:Z}=a0().codes,G=16384,W=16;function B(F,M,k){return F.highWaterMark!=null?F.highWaterMark:M?F[k]:null}function V(F){return F?W:G}function U(F,M){if(J(M,"value",0),F)W=M;else G=M}function w(F,M,k,f){let L=B(M,f,k);if(L!=null){if(!K(L)||L<0){let D=f?`options.${k}`:"options.highWaterMark";throw new Z(D,L)}return Q(L)}return V(F.objectMode)}q.exports={getHighWaterMark:w,getDefaultHighWaterMark:V,setDefaultHighWaterMark:U}}),AV=g0(($,q)=>{/*! safe-buffer. MIT License. Feross Aboukhadijeh */var Q=(t0(),X0(K2)),K=Q.Buffer;function J(G,W){for(var B in G)W[B]=G[B]}if(K.from&&K.alloc&&K.allocUnsafe&&K.allocUnsafeSlow)q.exports=Q;else J(Q,$),$.Buffer=Z;function Z(G,W,B){return K(G,W,B)}Z.prototype=Object.create(K.prototype),J(K,Z),Z.from=function(G,W,B){if(typeof G==="number")throw TypeError("Argument must not be a number");return K(G,W,B)},Z.alloc=function(G,W,B){if(typeof G!=="number")throw TypeError("Argument must be a number");var V=K(G);if(W!==void 0)if(typeof B==="string")V.fill(W,B);else V.fill(W);else V.fill(0);return V},Z.allocUnsafe=function(G){if(typeof G!=="number")throw TypeError("Argument must be a number");return K(G)},Z.allocUnsafeSlow=function(G){if(typeof G!=="number")throw TypeError("Argument must be a number");return Q.SlowBuffer(G)}}),XV=g0(($)=>{var q=AV().Buffer,Q=q.isEncoding||function(z){switch(z=""+z,z&&z.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function K(z){if(!z)return"utf8";var N;while(!0)switch(z){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return z;default:if(N)return;z=(""+z).toLowerCase(),N=!0}}function J(z){var N=K(z);if(typeof N!=="string"&&(q.isEncoding===Q||!Q(z)))throw Error("Unknown encoding: "+z);return N||z}$.StringDecoder=Z;function Z(z){this.encoding=J(z);var N;switch(this.encoding){case"utf16le":this.text=F,this.end=M,N=4;break;case"utf8":this.fillLast=V,N=4;break;case"base64":this.text=k,this.end=f,N=3;break;default:this.write=L,this.end=D;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=q.allocUnsafe(N)}Z.prototype.write=function(z){if(z.length===0)return"";var N,H;if(this.lastNeed){if(N=this.fillLast(z),N===void 0)return"";H=this.lastNeed,this.lastNeed=0}else H=0;if(H>5===6)return 2;else if(z>>4===14)return 3;else if(z>>3===30)return 4;return z>>6===2?-1:-2}function W(z,N,H){var v=N.length-1;if(v=0){if(j>0)z.lastNeed=j-1;return j}if(--v=0){if(j>0)z.lastNeed=j-2;return j}if(--v=0){if(j>0)if(j===2)j=0;else z.lastNeed=j-3;return j}return 0}function B(z,N,H){if((N[0]&192)!==128)return z.lastNeed=0,"�";if(z.lastNeed>1&&N.length>1){if((N[1]&192)!==128)return z.lastNeed=1,"�";if(z.lastNeed>2&&N.length>2){if((N[2]&192)!==128)return z.lastNeed=2,"�"}}}function V(z){var N=this.lastTotal-this.lastNeed,H=B(this,z,N);if(H!==void 0)return H;if(this.lastNeed<=z.length)return z.copy(this.lastChar,N,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);z.copy(this.lastChar,N,0,z.length),this.lastNeed-=z.length}function U(z,N){var H=W(this,z,N);if(!this.lastNeed)return z.toString("utf8",N);this.lastTotal=H;var v=z.length-(H-this.lastNeed);return z.copy(this.lastChar,0,v),z.toString("utf8",N,v)}function w(z){var N=z&&z.length?this.write(z):"";if(this.lastNeed)return N+"�";return N}function F(z,N){if((z.length-N)%2===0){var H=z.toString("utf16le",N);if(H){var v=H.charCodeAt(H.length-1);if(v>=55296&&v<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=z[z.length-2],this.lastChar[1]=z[z.length-1],H.slice(0,-1)}return H}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=z[z.length-1],z.toString("utf16le",N,z.length-1)}function M(z){var N=z&&z.length?this.write(z):"";if(this.lastNeed){var H=this.lastTotal-this.lastNeed;return N+this.lastChar.toString("utf16le",0,H)}return N}function k(z,N){var H=(z.length-N)%3;if(H===0)return z.toString("base64",N);if(this.lastNeed=3-H,this.lastTotal=3,H===1)this.lastChar[0]=z[z.length-1];else this.lastChar[0]=z[z.length-2],this.lastChar[1]=z[z.length-1];return z.toString("base64",N,z.length-H)}function f(z){var N=z&&z.length?this.write(z):"";if(this.lastNeed)return N+this.lastChar.toString("base64",0,3-this.lastNeed);return N}function L(z){return z.toString(this.encoding)}function D(z){return z&&z.length?this.write(z):""}}),a9=g0(($,q)=>{var Q=D1(),{PromisePrototypeThen:K,SymbolAsyncIterator:J,SymbolIterator:Z}=P0(),{Buffer:G}=(t0(),X0(K2)),{ERR_INVALID_ARG_TYPE:W,ERR_STREAM_NULL_VALUES:B}=a0().codes;function V(U,w,F){let M;if(typeof w==="string"||w instanceof G)return new U({objectMode:!0,...F,read(){this.push(w),this.push(null)}});let k;if(w&&w[J])k=!0,M=w[J]();else if(w&&w[Z])k=!1,M=w[Z]();else throw new W("iterable",["Iterable"],w);let f=new U({objectMode:!0,highWaterMark:1,...F}),L=!1;f._read=function(){if(!L)L=!0,z()},f._destroy=function(N,H){K(D(N),()=>Q.nextTick(H,N),(v)=>Q.nextTick(H,v||N))};async function D(N){let H=N!==void 0&&N!==null,v=typeof M.throw==="function";if(H&&v){let{value:j,done:n}=await M.throw(N);if(await j,n)return}if(typeof M.return==="function"){let{value:j}=await M.return();await j}}async function z(){for(;;){try{let{value:N,done:H}=k?await M.next():M.next();if(H)f.push(null);else{let v=N&&typeof N.then==="function"?await N:N;if(v===null)throw L=!1,new B;else if(f.push(v))continue;else L=!1}}catch(N){f.destroy(N)}break}}return f}q.exports=V}),v8=g0(($,q)=>{var Q=D1(),{ArrayPrototypeIndexOf:K,NumberIsInteger:J,NumberIsNaN:Z,NumberParseInt:G,ObjectDefineProperties:W,ObjectKeys:B,ObjectSetPrototypeOf:V,Promise:U,SafeSet:w,SymbolAsyncDispose:F,SymbolAsyncIterator:M,Symbol:k}=P0();q.exports=Q0,Q0.ReadableState=G0;var{EventEmitter:f}=(i1(),X0(p1)),{Stream:L,prependListener:D}=c5(),{Buffer:z}=(t0(),X0(K2)),{addAbortSignal:N}=L8(),H=s2(),v=e0().debuglog("stream",(I)=>{v=I}),j=gV(),n=o1(),{getHighWaterMark:d,getDefaultHighWaterMark:_}=H8(),{aggregateTwoErrors:X,codes:{ERR_INVALID_ARG_TYPE:P,ERR_METHOD_NOT_IMPLEMENTED:g,ERR_OUT_OF_RANGE:c,ERR_STREAM_PUSH_AFTER_EOF:h,ERR_STREAM_UNSHIFT_AFTER_END_EVENT:x},AbortError:l}=a0(),{validateObject:$0}=P6(),Z0=k("kPaused"),{StringDecoder:F0}=XV(),p=a9();V(Q0.prototype,L.prototype),V(Q0,L);var W0=()=>{},{errorOrDestroy:y}=n,i=1,U0=2,m=4,V0=8,w0=16,S=32,b=64,O=128,E=256,a=512,K0=1024,R=2048,Y=4096,C=8192,u=16384,e=32768,r=65536,s=131072,T=262144;function t(I){return{enumerable:!1,get(){return(this.state&I)!==0},set(A){if(A)this.state|=I;else this.state&=~I}}}W(G0.prototype,{objectMode:t(i),ended:t(U0),endEmitted:t(m),reading:t(V0),constructed:t(w0),sync:t(S),needReadable:t(b),emittedReadable:t(O),readableListening:t(E),resumeScheduled:t(a),errorEmitted:t(K0),emitClose:t(R),autoDestroy:t(Y),destroyed:t(C),closed:t(u),closeEmitted:t(e),multiAwaitDrain:t(r),readingMore:t(s),dataEmitted:t(T)});function G0(I,A,J0){if(typeof J0!=="boolean")J0=A instanceof c2();if(this.state=R|Y|w0|S,I&&I.objectMode)this.state|=i;if(J0&&I&&I.readableObjectMode)this.state|=i;if(this.highWaterMark=I?d(this,I,"readableHighWaterMark",J0):_(!1),this.buffer=new j,this.length=0,this.pipes=[],this.flowing=null,this[Z0]=null,I&&I.emitClose===!1)this.state&=~R;if(I&&I.autoDestroy===!1)this.state&=~Y;if(this.errored=null,this.defaultEncoding=I&&I.defaultEncoding||"utf8",this.awaitDrainWriters=null,this.decoder=null,this.encoding=null,I&&I.encoding)this.decoder=new F0(I.encoding),this.encoding=I.encoding}function Q0(I){if(!(this instanceof Q0))return new Q0(I);let A=this instanceof c2();if(this._readableState=new G0(I,this,A),I){if(typeof I.read==="function")this._read=I.read;if(typeof I.destroy==="function")this._destroy=I.destroy;if(typeof I.construct==="function")this._construct=I.construct;if(I.signal&&!A)N(I.signal,this)}L.call(this,I),n.construct(this,()=>{if(this._readableState.needReadable)_1(this,this._readableState)})}Q0.prototype.destroy=n.destroy,Q0.prototype._undestroy=n.undestroy,Q0.prototype._destroy=function(I,A){A(I)},Q0.prototype[f.captureRejectionSymbol]=function(I){this.destroy(I)},Q0.prototype[F]=function(){let I;if(!this.destroyed)I=this.readableEnded?null:new l,this.destroy(I);return new U((A,J0)=>H(this,(B0)=>B0&&B0!==I?J0(B0):A(null)))},Q0.prototype.push=function(I,A){return M0(this,I,A,!1)},Q0.prototype.unshift=function(I,A){return M0(this,I,A,!0)};function M0(I,A,J0,B0){v("readableAddChunk",A);let z0=I._readableState,i0;if((z0.state&i)===0){if(typeof A==="string"){if(J0=J0||z0.defaultEncoding,z0.encoding!==J0)if(B0&&z0.encoding)A=z.from(A,J0).toString(z0.encoding);else A=z.from(A,J0),J0=""}else if(A instanceof z)J0="";else if(L._isUint8Array(A))A=L._uint8ArrayToBuffer(A),J0="";else if(A!=null)i0=new P("chunk",["string","Buffer","Uint8Array"],A)}if(i0)y(I,i0);else if(A===null)z0.state&=~V0,O0(I,z0);else if((z0.state&i)!==0||A&&A.length>0)if(B0)if((z0.state&m)!==0)y(I,new x);else if(z0.destroyed||z0.errored)return!1;else I0(I,z0,A,!0);else if(z0.ended)y(I,new h);else if(z0.destroyed||z0.errored)return!1;else if(z0.state&=~V0,z0.decoder&&!J0)if(A=z0.decoder.write(A),z0.objectMode||A.length!==0)I0(I,z0,A,!1);else _1(I,z0);else I0(I,z0,A,!1);else if(!B0)z0.state&=~V0,_1(I,z0);return!z0.ended&&(z0.length0){if((A.state&r)!==0)A.awaitDrainWriters.clear();else A.awaitDrainWriters=null;A.dataEmitted=!0,I.emit("data",J0)}else{if(A.length+=A.objectMode?1:J0.length,B0)A.buffer.unshift(J0);else A.buffer.push(J0);if((A.state&b)!==0)u0(I)}_1(I,A)}Q0.prototype.isPaused=function(){let I=this._readableState;return I[Z0]===!0||I.flowing===!1},Q0.prototype.setEncoding=function(I){let A=new F0(I);this._readableState.decoder=A,this._readableState.encoding=this._readableState.decoder.encoding;let J0=this._readableState.buffer,B0="";for(let z0 of J0)B0+=A.write(z0);if(J0.clear(),B0!=="")J0.push(B0);return this._readableState.length=B0.length,this};var m0=1073741824;function p0(I){if(I>m0)throw new c("size","<= 1GiB",I);else I--,I|=I>>>1,I|=I>>>2,I|=I>>>4,I|=I>>>8,I|=I>>>16,I++;return I}function q2(I,A){if(I<=0||A.length===0&&A.ended)return 0;if((A.state&i)!==0)return 1;if(Z(I)){if(A.flowing&&A.length)return A.buffer.first().length;return A.length}if(I<=A.length)return I;return A.ended?A.length:0}Q0.prototype.read=function(I){if(v("read",I),I===void 0)I=NaN;else if(!J(I))I=G(I,10);let A=this._readableState,J0=I;if(I>A.highWaterMark)A.highWaterMark=p0(I);if(I!==0)A.state&=~O;if(I===0&&A.needReadable&&((A.highWaterMark!==0?A.length>=A.highWaterMark:A.length>0)||A.ended)){if(v("read: emitReadable",A.length,A.ended),A.length===0&&A.ended)v5(this);else u0(this);return null}if(I=q2(I,A),I===0&&A.ended){if(A.length===0)v5(this);return null}let B0=(A.state&b)!==0;if(v("need readable",B0),A.length===0||A.length-I0)z0=a7(I,A);else z0=null;if(z0===null)A.needReadable=A.length<=A.highWaterMark,I=0;else if(A.length-=I,A.multiAwaitDrain)A.awaitDrainWriters.clear();else A.awaitDrainWriters=null;if(A.length===0){if(!A.ended)A.needReadable=!0;if(J0!==I&&A.ended)v5(this)}if(z0!==null&&!A.errorEmitted&&!A.closeEmitted)A.dataEmitted=!0,this.emit("data",z0);return z0};function O0(I,A){if(v("onEofChunk"),A.ended)return;if(A.decoder){let J0=A.decoder.end();if(J0&&J0.length)A.buffer.push(J0),A.length+=A.objectMode?1:J0.length}if(A.ended=!0,A.sync)u0(I);else A.needReadable=!1,A.emittedReadable=!0,E1(I)}function u0(I){let A=I._readableState;if(v("emitReadable",A.needReadable,A.emittedReadable),A.needReadable=!1,!A.emittedReadable)v("emitReadable",A.flowing),A.emittedReadable=!0,Q.nextTick(E1,I)}function E1(I){let A=I._readableState;if(v("emitReadable_",A.destroyed,A.length,A.ended),!A.destroyed&&!A.errored&&(A.length||A.ended))I.emit("readable"),A.emittedReadable=!1;A.needReadable=!A.flowing&&!A.ended&&A.length<=A.highWaterMark,i7(I)}function _1(I,A){if(!A.readingMore&&A.constructed)A.readingMore=!0,Q.nextTick(R2,I,A)}function R2(I,A){while(!A.reading&&!A.ended&&(A.length1&&B0.pipes.includes(I))v("false write response, pause",B0.awaitDrainWriters.size),B0.awaitDrainWriters.add(I);J0.pause()}if(!z1)z1=wJ(J0,I),I.on("drain",z1)}J0.on("data",t7);function t7(F1){v("ondata");let u2=I.write(F1);if(v("dest.write",u2),u2===!1)s7()}function R5(F1){if(v("onerror",F1),A6(),I.removeListener("error",R5),I.listenerCount("error")===0){let u2=I._writableState||I._readableState;if(u2&&!u2.errorEmitted)y(I,F1);else I.emit("error",F1)}}D(I,"error",R5);function I5(){I.removeListener("finish",C5),A6()}I.once("close",I5);function C5(){v("onfinish"),I.removeListener("close",I5),A6()}I.once("finish",C5);function A6(){v("unpipe"),J0.unpipe(I)}if(I.emit("pipe",J0),I.writableNeedDrain===!0)s7();else if(!B0.flowing)v("pipe resume"),J0.resume();return I};function wJ(I,A){return function(){let J0=I._readableState;if(J0.awaitDrainWriters===A)v("pipeOnDrain",1),J0.awaitDrainWriters=null;else if(J0.multiAwaitDrain)v("pipeOnDrain",J0.awaitDrainWriters.size),J0.awaitDrainWriters.delete(A);if((!J0.awaitDrainWriters||J0.awaitDrainWriters.size===0)&&I.listenerCount("data"))I.resume()}}Q0.prototype.unpipe=function(I){let A=this._readableState,J0={hasUnpiped:!1};if(A.pipes.length===0)return this;if(!I){let z0=A.pipes;A.pipes=[],this.pause();for(let i0=0;i00,B0.flowing!==!1)this.resume()}else if(I==="readable"){if(!B0.endEmitted&&!B0.readableListening){if(B0.readableListening=B0.needReadable=!0,B0.flowing=!1,B0.emittedReadable=!1,v("on readable",B0.length,B0.reading),B0.length)u0(this);else if(!B0.reading)Q.nextTick(NJ,this)}}return J0},Q0.prototype.addListener=Q0.prototype.on,Q0.prototype.removeListener=function(I,A){let J0=L.prototype.removeListener.call(this,I,A);if(I==="readable")Q.nextTick(p7,this);return J0},Q0.prototype.off=Q0.prototype.removeListener,Q0.prototype.removeAllListeners=function(I){let A=L.prototype.removeAllListeners.apply(this,arguments);if(I==="readable"||I===void 0)Q.nextTick(p7,this);return A};function p7(I){let A=I._readableState;if(A.readableListening=I.listenerCount("readable")>0,A.resumeScheduled&&A[Z0]===!1)A.flowing=!0;else if(I.listenerCount("data")>0)I.resume();else if(!A.readableListening)A.flowing=null}function NJ(I){v("readable nexttick read 0"),I.read(0)}Q0.prototype.resume=function(){let I=this._readableState;if(!I.flowing)v("resume"),I.flowing=!I.readableListening,YJ(this,I);return I[Z0]=!1,this};function YJ(I,A){if(!A.resumeScheduled)A.resumeScheduled=!0,Q.nextTick(kJ,I,A)}function kJ(I,A){if(v("resume",A.reading),!A.reading)I.read(0);if(A.resumeScheduled=!1,I.emit("resume"),i7(I),A.flowing&&!A.reading)I.read(0)}Q0.prototype.pause=function(){if(v("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1)v("pause"),this._readableState.flowing=!1,this.emit("pause");return this._readableState[Z0]=!0,this};function i7(I){let A=I._readableState;v("flow",A.flowing);while(A.flowing&&I.read()!==null);}Q0.prototype.wrap=function(I){let A=!1;I.on("data",(B0)=>{if(!this.push(B0)&&I.pause)A=!0,I.pause()}),I.on("end",()=>{this.push(null)}),I.on("error",(B0)=>{y(this,B0)}),I.on("close",()=>{this.destroy()}),I.on("destroy",()=>{this.destroy()}),this._read=()=>{if(A&&I.resume)A=!1,I.resume()};let J0=B(I);for(let B0=1;B0{z0=z2?X(z0,z2):null,J0(),J0=W0});try{while(!0){let z2=I.destroyed?null:I.read();if(z2!==null)yield z2;else if(z0)throw z0;else if(z0===null)return;else await new U(B0)}}catch(z2){throw z0=X(z0,z2),z0}finally{if((z0||(A===null||A===void 0?void 0:A.destroyOnReturn)!==!1)&&(z0===void 0||I._readableState.autoDestroy))n.destroyer(I,null);else I.off("readable",B0),i0()}}W(Q0.prototype,{readable:{__proto__:null,get(){let I=this._readableState;return!!I&&I.readable!==!1&&!I.destroyed&&!I.errorEmitted&&!I.endEmitted},set(I){if(this._readableState)this._readableState.readable=!!I}},readableDidRead:{__proto__:null,enumerable:!1,get:function(){return this._readableState.dataEmitted}},readableAborted:{__proto__:null,enumerable:!1,get:function(){return!!(this._readableState.readable!==!1&&(this._readableState.destroyed||this._readableState.errored)&&!this._readableState.endEmitted)}},readableHighWaterMark:{__proto__:null,enumerable:!1,get:function(){return this._readableState.highWaterMark}},readableBuffer:{__proto__:null,enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}},readableFlowing:{__proto__:null,enumerable:!1,get:function(){return this._readableState.flowing},set:function(I){if(this._readableState)this._readableState.flowing=I}},readableLength:{__proto__:null,enumerable:!1,get(){return this._readableState.length}},readableObjectMode:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.objectMode:!1}},readableEncoding:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.encoding:null}},errored:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.errored:null}},closed:{__proto__:null,get(){return this._readableState?this._readableState.closed:!1}},destroyed:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.destroyed:!1},set(I){if(!this._readableState)return;this._readableState.destroyed=I}},readableEnded:{__proto__:null,enumerable:!1,get(){return this._readableState?this._readableState.endEmitted:!1}}}),W(G0.prototype,{pipesCount:{__proto__:null,get(){return this.pipes.length}},paused:{__proto__:null,get(){return this[Z0]!==!1},set(I){this[Z0]=!!I}}}),Q0._fromList=a7;function a7(I,A){if(A.length===0)return null;let J0;if(A.objectMode)J0=A.buffer.shift();else if(!I||I>=A.length){if(A.decoder)J0=A.buffer.join("");else if(A.buffer.length===1)J0=A.buffer.first();else J0=A.buffer.concat(A.length);A.buffer.clear()}else J0=A.buffer.consume(I,A.decoder);return J0}function v5(I){let A=I._readableState;if(v("endReadable",A.endEmitted),!A.endEmitted)A.ended=!0,Q.nextTick(LJ,A,I)}function LJ(I,A){if(v("endReadableNT",I.endEmitted,I.length),!I.errored&&!I.closeEmitted&&!I.endEmitted&&I.length===0){if(I.endEmitted=!0,A.emit("end"),A.writable&&A.allowHalfOpen===!1)Q.nextTick(HJ,A);else if(I.autoDestroy){let J0=A._writableState;if(!J0||J0.autoDestroy&&(J0.finished||J0.writable===!1))A.destroy()}}}function HJ(I){if(I.writable&&!I.writableEnded&&!I.destroyed)I.end()}Q0.from=function(I,A){return p(Q0,I,A)};var f5;function l7(){if(f5===void 0)f5={};return f5}Q0.fromWeb=function(I,A){return l7().newStreamReadableFromReadableStream(I,A)},Q0.toWeb=function(I,A){return l7().newReadableStreamFromStreamReadable(I,A)},Q0.wrap=function(I,A){var J0,B0;return new Q0({objectMode:(J0=(B0=I.readableObjectMode)!==null&&B0!==void 0?B0:I.objectMode)!==null&&J0!==void 0?J0:!0,...A,destroy(z0,i0){n.destroyer(I,z0),i0(z0)}}).wrap(I)}}),b5=g0(($,q)=>{var Q=D1(),{ArrayPrototypeSlice:K,Error:J,FunctionPrototypeSymbolHasInstance:Z,ObjectDefineProperty:G,ObjectDefineProperties:W,ObjectSetPrototypeOf:B,StringPrototypeToLowerCase:V,Symbol:U,SymbolHasInstance:w}=P0();q.exports=$0,$0.WritableState=x;var{EventEmitter:F}=(i1(),X0(p1)),M=c5().Stream,{Buffer:k}=(t0(),X0(K2)),f=o1(),{addAbortSignal:L}=L8(),{getHighWaterMark:D,getDefaultHighWaterMark:z}=H8(),{ERR_INVALID_ARG_TYPE:N,ERR_METHOD_NOT_IMPLEMENTED:H,ERR_MULTIPLE_CALLBACK:v,ERR_STREAM_CANNOT_PIPE:j,ERR_STREAM_DESTROYED:n,ERR_STREAM_ALREADY_FINISHED:d,ERR_STREAM_NULL_VALUES:_,ERR_STREAM_WRITE_AFTER_END:X,ERR_UNKNOWN_ENCODING:P}=a0().codes,{errorOrDestroy:g}=f;B($0.prototype,M.prototype),B($0,M);function c(){}var h=U("kOnFinished");function x(Y,C,u){if(typeof u!=="boolean")u=C instanceof c2();if(this.objectMode=!!(Y&&Y.objectMode),u)this.objectMode=this.objectMode||!!(Y&&Y.writableObjectMode);this.highWaterMark=Y?D(this,Y,"writableHighWaterMark",u):z(!1),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;let e=!!(Y&&Y.decodeStrings===!1);this.decodeStrings=!e,this.defaultEncoding=Y&&Y.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=y.bind(void 0,C),this.writecb=null,this.writelen=0,this.afterWriteTickInfo=null,l(this),this.pendingcb=0,this.constructed=!0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=!Y||Y.emitClose!==!1,this.autoDestroy=!Y||Y.autoDestroy!==!1,this.errored=null,this.closed=!1,this.closeEmitted=!1,this[h]=[]}function l(Y){Y.buffered=[],Y.bufferedIndex=0,Y.allBuffers=!0,Y.allNoop=!0}x.prototype.getBuffer=function(){return K(this.buffered,this.bufferedIndex)},G(x.prototype,"bufferedRequestCount",{__proto__:null,get(){return this.buffered.length-this.bufferedIndex}});function $0(Y){let C=this instanceof c2();if(!C&&!Z($0,this))return new $0(Y);if(this._writableState=new x(Y,this,C),Y){if(typeof Y.write==="function")this._write=Y.write;if(typeof Y.writev==="function")this._writev=Y.writev;if(typeof Y.destroy==="function")this._destroy=Y.destroy;if(typeof Y.final==="function")this._final=Y.final;if(typeof Y.construct==="function")this._construct=Y.construct;if(Y.signal)L(Y.signal,this)}M.call(this,Y),f.construct(this,()=>{let u=this._writableState;if(!u.writing)V0(this,u);O(this,u)})}G($0,w,{__proto__:null,value:function(Y){if(Z(this,Y))return!0;if(this!==$0)return!1;return Y&&Y._writableState instanceof x}}),$0.prototype.pipe=function(){g(this,new j)};function Z0(Y,C,u,e){let r=Y._writableState;if(typeof u==="function")e=u,u=r.defaultEncoding;else{if(!u)u=r.defaultEncoding;else if(u!=="buffer"&&!k.isEncoding(u))throw new P(u);if(typeof e!=="function")e=c}if(C===null)throw new _;else if(!r.objectMode)if(typeof C==="string"){if(r.decodeStrings!==!1)C=k.from(C,u),u="buffer"}else if(C instanceof k)u="buffer";else if(M._isUint8Array(C))C=M._uint8ArrayToBuffer(C),u="buffer";else throw new N("chunk",["string","Buffer","Uint8Array"],C);let s;if(r.ending)s=new X;else if(r.destroyed)s=new n("write");if(s)return Q.nextTick(e,s),g(Y,s,!0),s;return r.pendingcb++,F0(Y,r,C,u,e)}$0.prototype.write=function(Y,C,u){return Z0(this,Y,C,u)===!0},$0.prototype.cork=function(){this._writableState.corked++},$0.prototype.uncork=function(){let Y=this._writableState;if(Y.corked){if(Y.corked--,!Y.writing)V0(this,Y)}},$0.prototype.setDefaultEncoding=function(Y){if(typeof Y==="string")Y=V(Y);if(!k.isEncoding(Y))throw new P(Y);return this._writableState.defaultEncoding=Y,this};function F0(Y,C,u,e,r){let s=C.objectMode?1:u.length;C.length+=s;let T=C.lengthu.bufferedIndex)V0(Y,u);if(e)if(u.afterWriteTickInfo!==null&&u.afterWriteTickInfo.cb===r)u.afterWriteTickInfo.count++;else u.afterWriteTickInfo={count:1,cb:r,stream:Y,state:u},Q.nextTick(i,u.afterWriteTickInfo);else U0(Y,u,1,r)}}function i({stream:Y,state:C,count:u,cb:e}){return C.afterWriteTickInfo=null,U0(Y,C,u,e)}function U0(Y,C,u,e){if(!C.ending&&!Y.destroyed&&C.length===0&&C.needDrain)C.needDrain=!1,Y.emit("drain");while(u-- >0)C.pendingcb--,e();if(C.destroyed)m(C);O(Y,C)}function m(Y){if(Y.writing)return;for(let r=Y.bufferedIndex;r1&&Y._writev){C.pendingcb-=s-1;let t=C.allNoop?c:(Q0)=>{for(let M0=T;M0256)u.splice(0,T),C.bufferedIndex=0;else C.bufferedIndex=T}C.bufferProcessing=!1}$0.prototype._write=function(Y,C,u){if(this._writev)this._writev([{chunk:Y,encoding:C}],u);else throw new H("_write()")},$0.prototype._writev=null,$0.prototype.end=function(Y,C,u){let e=this._writableState;if(typeof Y==="function")u=Y,Y=null,C=null;else if(typeof C==="function")u=C,C=null;let r;if(Y!==null&&Y!==void 0){let s=Z0(this,Y,C);if(s instanceof J)r=s}if(e.corked)e.corked=1,this.uncork();if(r);else if(!e.errored&&!e.ending)e.ending=!0,O(this,e,!0),e.ended=!0;else if(e.finished)r=new d("end");else if(e.destroyed)r=new n("end");if(typeof u==="function")if(r||e.finished)Q.nextTick(u,r);else e[h].push(u);return this};function w0(Y){return Y.ending&&!Y.destroyed&&Y.constructed&&Y.length===0&&!Y.errored&&Y.buffered.length===0&&!Y.finished&&!Y.writing&&!Y.errorEmitted&&!Y.closeEmitted}function S(Y,C){let u=!1;function e(r){if(u){g(Y,r!==null&&r!==void 0?r:v());return}if(u=!0,C.pendingcb--,r){let s=C[h].splice(0);for(let T=0;T{if(w0(r))E(e,r);else r.pendingcb--},Y,C);else if(w0(C))C.pendingcb++,E(Y,C)}}}function E(Y,C){C.pendingcb--,C.finished=!0;let u=C[h].splice(0);for(let e=0;e{var Q=D1(),K=(t0(),X0(K2)),{isReadable:J,isWritable:Z,isIterable:G,isNodeStream:W,isReadableNodeStream:B,isWritableNodeStream:V,isDuplexNodeStream:U,isReadableStream:w,isWritableStream:F}=b2(),M=s2(),{AbortError:k,codes:{ERR_INVALID_ARG_TYPE:f,ERR_INVALID_RETURN_VALUE:L}}=a0(),{destroyer:D}=o1(),z=c2(),N=v8(),H=b5(),{createDeferredPromise:v}=e0(),j=a9(),n=globalThis.Blob||K.Blob,d=typeof n<"u"?function(h){return h instanceof n}:function(h){return!1},_=globalThis.AbortController||O6().AbortController,{FunctionPrototypeCall:X}=P0();class P extends z{constructor(h){super(h);if((h===null||h===void 0?void 0:h.readable)===!1)this._readableState.readable=!1,this._readableState.ended=!0,this._readableState.endEmitted=!0;if((h===null||h===void 0?void 0:h.writable)===!1)this._writableState.writable=!1,this._writableState.ending=!0,this._writableState.ended=!0,this._writableState.finished=!0}}q.exports=function h(x,l){if(U(x))return x;if(B(x))return c({readable:x});if(V(x))return c({writable:x});if(W(x))return c({writable:!1,readable:!1});if(w(x))return c({readable:N.fromWeb(x)});if(F(x))return c({writable:H.fromWeb(x)});if(typeof x==="function"){let{value:Z0,write:F0,final:p,destroy:W0}=g(x);if(G(Z0))return j(P,Z0,{objectMode:!0,write:F0,final:p,destroy:W0});let y=Z0===null||Z0===void 0?void 0:Z0.then;if(typeof y==="function"){let i,U0=X(y,Z0,(m)=>{if(m!=null)throw new L("nully","body",m)},(m)=>{D(i,m)});return i=new P({objectMode:!0,readable:!1,write:F0,final(m){p(async()=>{try{await U0,Q.nextTick(m,null)}catch(V0){Q.nextTick(m,V0)}})},destroy:W0})}throw new L("Iterable, AsyncIterable or AsyncFunction",l,Z0)}if(d(x))return h(x.arrayBuffer());if(G(x))return j(P,x,{objectMode:!0,writable:!1});if(w(x===null||x===void 0?void 0:x.readable)&&F(x===null||x===void 0?void 0:x.writable))return P.fromWeb(x);if(typeof(x===null||x===void 0?void 0:x.writable)==="object"||typeof(x===null||x===void 0?void 0:x.readable)==="object"){let Z0=x!==null&&x!==void 0&&x.readable?B(x===null||x===void 0?void 0:x.readable)?x===null||x===void 0?void 0:x.readable:h(x.readable):void 0,F0=x!==null&&x!==void 0&&x.writable?V(x===null||x===void 0?void 0:x.writable)?x===null||x===void 0?void 0:x.writable:h(x.writable):void 0;return c({readable:Z0,writable:F0})}let $0=x===null||x===void 0?void 0:x.then;if(typeof $0==="function"){let Z0;return X($0,x,(F0)=>{if(F0!=null)Z0.push(F0);Z0.push(null)},(F0)=>{D(Z0,F0)}),Z0=new P({objectMode:!0,writable:!1,read(){}})}throw new f(l,["Blob","ReadableStream","WritableStream","Stream","Iterable","AsyncIterable","Function","{ readable, writable } pair","Promise"],x)};function g(h){let{promise:x,resolve:l}=v(),$0=new _,Z0=$0.signal;return{value:h(async function*(){while(!0){let F0=x;x=null;let{chunk:p,done:W0,cb:y}=await F0;if(Q.nextTick(y),W0)return;if(Z0.aborted)throw new k(void 0,{cause:Z0.reason});({promise:x,resolve:l}=v()),yield p}}(),{signal:Z0}),write(F0,p,W0){let y=l;l=null,y({chunk:F0,done:!1,cb:W0})},final(F0){let p=l;l=null,p({done:!0,cb:F0})},destroy(F0,p){$0.abort(),p(F0)}}}function c(h){let x=h.readable&&typeof h.readable.read!=="function"?N.wrap(h.readable):h.readable,l=h.writable,$0=!!J(x),Z0=!!Z(l),F0,p,W0,y,i;function U0(m){let V0=y;if(y=null,V0)V0(m);else if(m)i.destroy(m)}if(i=new P({readableObjectMode:!!(x!==null&&x!==void 0&&x.readableObjectMode),writableObjectMode:!!(l!==null&&l!==void 0&&l.writableObjectMode),readable:$0,writable:Z0}),Z0)M(l,(m)=>{if(Z0=!1,m)D(x,m);U0(m)}),i._write=function(m,V0,w0){if(l.write(m,V0))w0();else F0=w0},i._final=function(m){l.end(),p=m},l.on("drain",function(){if(F0){let m=F0;F0=null,m()}}),l.on("finish",function(){if(p){let m=p;p=null,m()}});if($0)M(x,(m)=>{if($0=!1,m)D(x,m);U0(m)}),x.on("readable",function(){if(W0){let m=W0;W0=null,m()}}),x.on("end",function(){i.push(null)}),i._read=function(){while(!0){let m=x.read();if(m===null){W0=i._read;return}if(!i.push(m))return}};return i._destroy=function(m,V0){if(!m&&y!==null)m=new k;if(W0=null,F0=null,p=null,y===null)V0(m);else y=V0,D(l,m),D(x,m)},i}}),c2=g0(($,q)=>{var{ObjectDefineProperties:Q,ObjectGetOwnPropertyDescriptor:K,ObjectKeys:J,ObjectSetPrototypeOf:Z}=P0();q.exports=B;var G=v8(),W=b5();Z(B.prototype,G.prototype),Z(B,G);{let F=J(W.prototype);for(let M=0;M{var{ObjectSetPrototypeOf:Q,Symbol:K}=P0();q.exports=B;var{ERR_METHOD_NOT_IMPLEMENTED:J}=a0().codes,Z=c2(),{getHighWaterMark:G}=H8();Q(B.prototype,Z.prototype),Q(B,Z);var W=K("kCallback");function B(w){if(!(this instanceof B))return new B(w);let F=w?G(this,w,"readableHighWaterMark",!0):null;if(F===0)w={...w,highWaterMark:null,readableHighWaterMark:F,writableHighWaterMark:w.writableHighWaterMark||0};if(Z.call(this,w),this._readableState.sync=!1,this[W]=null,w){if(typeof w.transform==="function")this._transform=w.transform;if(typeof w.flush==="function")this._flush=w.flush}this.on("prefinish",U)}function V(w){if(typeof this._flush==="function"&&!this.destroyed)this._flush((F,M)=>{if(F){if(w)w(F);else this.destroy(F);return}if(M!=null)this.push(M);if(this.push(null),w)w()});else if(this.push(null),w)w()}function U(){if(this._final!==V)V.call(this)}B.prototype._final=V,B.prototype._transform=function(w,F,M){throw new J("_transform()")},B.prototype._write=function(w,F,M){let k=this._readableState,f=this._writableState,L=k.length;this._transform(w,F,(D,z)=>{if(D){M(D);return}if(z!=null)this.push(z);if(f.ended||L===k.length||k.length{var{ObjectSetPrototypeOf:Q}=P0();q.exports=J;var K=l9();Q(J.prototype,K.prototype),Q(J,K);function J(Z){if(!(this instanceof J))return new J(Z);K.call(this,Z)}J.prototype._transform=function(Z,G,W){W(null,Z)}}),n5=g0(($,q)=>{var Q=D1(),{ArrayIsArray:K,Promise:J,SymbolAsyncIterator:Z,SymbolDispose:G}=P0(),W=s2(),{once:B}=e0(),V=o1(),U=c2(),{aggregateTwoErrors:w,codes:{ERR_INVALID_ARG_TYPE:F,ERR_INVALID_RETURN_VALUE:M,ERR_MISSING_ARGS:k,ERR_STREAM_DESTROYED:f,ERR_STREAM_PREMATURE_CLOSE:L},AbortError:D}=a0(),{validateFunction:z,validateAbortSignal:N}=P6(),{isIterable:H,isReadable:v,isReadableNodeStream:j,isNodeStream:n,isTransformStream:d,isWebStream:_,isReadableStream:X,isReadableFinished:P}=b2(),g=globalThis.AbortController||O6().AbortController,c,h,x;function l(m,V0,w0){let S=!1;m.on("close",()=>{S=!0});let b=W(m,{readable:V0,writable:w0},(O)=>{S=!O});return{destroy:(O)=>{if(S)return;S=!0,V.destroyer(m,O||new f("pipe"))},cleanup:b}}function $0(m){return z(m[m.length-1],"streams[stream.length - 1]"),m.pop()}function Z0(m){if(H(m))return m;else if(j(m))return F0(m);throw new F("val",["Readable","Iterable","AsyncIterable"],m)}async function*F0(m){if(!h)h=v8();yield*h.prototype[Z].call(m)}async function p(m,V0,w0,{end:S}){let b,O=null,E=(R)=>{if(R)b=R;if(O){let Y=O;O=null,Y()}},a=()=>new J((R,Y)=>{if(b)Y(b);else O=()=>{if(b)Y(b);else R()}});V0.on("drain",E);let K0=W(V0,{readable:!1},E);try{if(V0.writableNeedDrain)await a();for await(let R of m)if(!V0.write(R))await a();if(S)V0.end(),await a();w0()}catch(R){w0(b!==R?w(b,R):R)}finally{K0(),V0.off("drain",E)}}async function W0(m,V0,w0,{end:S}){if(d(V0))V0=V0.writable;let b=V0.getWriter();try{for await(let O of m)await b.ready,b.write(O).catch(()=>{});if(await b.ready,S)await b.close();w0()}catch(O){try{await b.abort(O),w0(O)}catch(E){w0(E)}}}function y(...m){return i(m,B($0(m)))}function i(m,V0,w0){if(m.length===1&&K(m[0]))m=m[0];if(m.length<2)throw new k("streams");let S=new g,b=S.signal,O=w0===null||w0===void 0?void 0:w0.signal,E=[];N(O,"options.signal");function a(){r(new D)}x=x||e0().addAbortListener;let K0;if(O)K0=x(O,a);let R,Y,C=[],u=0;function e(Q0){r(Q0,--u===0)}function r(Q0,M0){var I0;if(Q0&&(!R||R.code==="ERR_STREAM_PREMATURE_CLOSE"))R=Q0;if(!R&&!M0)return;while(C.length)C.shift()(R);if((I0=K0)===null||I0===void 0||I0[G](),S.abort(),M0){if(!R)E.forEach((m0)=>m0());Q.nextTick(V0,R,Y)}}let s;for(let Q0=0;Q00,p0=I0||(w0===null||w0===void 0?void 0:w0.end)!==!1,q2=Q0===m.length-1;if(n(M0)){let O0=function(u0){if(u0&&u0.name!=="AbortError"&&u0.code!=="ERR_STREAM_PREMATURE_CLOSE")e(u0)};var T=O0;if(p0){let{destroy:u0,cleanup:E1}=l(M0,I0,m0);if(C.push(u0),v(M0)&&q2)E.push(E1)}if(M0.on("error",O0),v(M0)&&q2)E.push(()=>{M0.removeListener("error",O0)})}if(Q0===0)if(typeof M0==="function"){if(s=M0({signal:b}),!H(s))throw new M("Iterable, AsyncIterable or Stream","source",s)}else if(H(M0)||j(M0)||d(M0))s=M0;else s=U.from(M0);else if(typeof M0==="function"){if(d(s)){var t;s=Z0((t=s)===null||t===void 0?void 0:t.readable)}else s=Z0(s);if(s=M0(s,{signal:b}),I0){if(!H(s,!0))throw new M("AsyncIterable",`transform[${Q0-1}]`,s)}else{var G0;if(!c)c=r9();let O0=new c({objectMode:!0}),u0=(G0=s)===null||G0===void 0?void 0:G0.then;if(typeof u0==="function")u++,u0.call(s,(R2)=>{if(Y=R2,R2!=null)O0.write(R2);if(p0)O0.end();Q.nextTick(e)},(R2)=>{O0.destroy(R2),Q.nextTick(e,R2)});else if(H(s,!0))u++,p(s,O0,e,{end:p0});else if(X(s)||d(s)){let R2=s.readable||s;u++,p(R2,O0,e,{end:p0})}else throw new M("AsyncIterable or Promise","destination",s);s=O0;let{destroy:E1,cleanup:_1}=l(s,!1,!0);if(C.push(E1),q2)E.push(_1)}}else if(n(M0)){if(j(s)){u+=2;let O0=U0(s,M0,e,{end:p0});if(v(M0)&&q2)E.push(O0)}else if(d(s)||X(s)){let O0=s.readable||s;u++,p(O0,M0,e,{end:p0})}else if(H(s))u++,p(s,M0,e,{end:p0});else throw new F("val",["Readable","Iterable","AsyncIterable","ReadableStream","TransformStream"],s);s=M0}else if(_(M0)){if(j(s))u++,W0(Z0(s),M0,e,{end:p0});else if(X(s)||H(s))u++,W0(s,M0,e,{end:p0});else if(d(s))u++,W0(s.readable,M0,e,{end:p0});else throw new F("val",["Readable","Iterable","AsyncIterable","ReadableStream","TransformStream"],s);s=M0}else s=U.from(M0)}if(b!==null&&b!==void 0&&b.aborted||O!==null&&O!==void 0&&O.aborted)Q.nextTick(a);return s}function U0(m,V0,w0,{end:S}){let b=!1;if(V0.on("close",()=>{if(!b)w0(new L)}),m.pipe(V0,{end:!1}),S){let E=function(){b=!0,V0.end()};var O=E;if(P(m))Q.nextTick(E);else m.once("end",E)}else w0();return W(m,{readable:!0,writable:!1},(E)=>{let a=m._readableState;if(E&&E.code==="ERR_STREAM_PREMATURE_CLOSE"&&a&&a.ended&&!a.errored&&!a.errorEmitted)m.once("end",w0).once("error",w0);else w0(E)}),W(V0,{readable:!1,writable:!0},w0)}q.exports={pipelineImpl:i,pipeline:y}}),s9=g0(($,q)=>{var{pipeline:Q}=n5(),K=c2(),{destroyer:J}=o1(),{isNodeStream:Z,isReadable:G,isWritable:W,isWebStream:B,isTransformStream:V,isWritableStream:U,isReadableStream:w}=b2(),{AbortError:F,codes:{ERR_INVALID_ARG_VALUE:M,ERR_MISSING_ARGS:k}}=a0(),f=s2();q.exports=function(...L){if(L.length===0)throw new k("streams");if(L.length===1)return K.from(L[0]);let D=[...L];if(typeof L[0]==="function")L[0]=K.from(L[0]);if(typeof L[L.length-1]==="function"){let g=L.length-1;L[g]=K.from(L[g])}for(let g=0;g0&&!(W(L[g])||U(L[g])||V(L[g])))throw new M(`streams[${g}]`,D[g],"must be writable")}let z,N,H,v,j;function n(g){let c=v;if(v=null,c)c(g);else if(g)j.destroy(g);else if(!P&&!X)j.destroy()}let d=L[0],_=Q(L,n),X=!!(W(d)||U(d)||V(d)),P=!!(G(_)||w(_)||V(_));if(j=new K({writableObjectMode:!!(d!==null&&d!==void 0&&d.writableObjectMode),readableObjectMode:!!(_!==null&&_!==void 0&&_.readableObjectMode),writable:X,readable:P}),X){if(Z(d))j._write=function(c,h,x){if(d.write(c,h))x();else z=x},j._final=function(c){d.end(),N=c},d.on("drain",function(){if(z){let c=z;z=null,c()}});else if(B(d)){let c=(V(d)?d.writable:d).getWriter();j._write=async function(h,x,l){try{await c.ready,c.write(h).catch(()=>{}),l()}catch($0){l($0)}},j._final=async function(h){try{await c.ready,c.close().catch(()=>{}),N=h}catch(x){h(x)}}}let g=V(_)?_.readable:_;f(g,()=>{if(N){let c=N;N=null,c()}})}if(P){if(Z(_))_.on("readable",function(){if(H){let g=H;H=null,g()}}),_.on("end",function(){j.push(null)}),j._read=function(){while(!0){let g=_.read();if(g===null){H=j._read;return}if(!j.push(g))return}};else if(B(_)){let g=(V(_)?_.readable:_).getReader();j._read=async function(){while(!0)try{let{value:c,done:h}=await g.read();if(!j.push(c))return;if(h){j.push(null);return}}catch{return}}}}return j._destroy=function(g,c){if(!g&&v!==null)g=new F;if(H=null,z=null,N=null,v===null)c(g);else if(v=c,Z(_))J(_,g)},j}}),hV=g0(($,q)=>{var Q=globalThis.AbortController||O6().AbortController,{codes:{ERR_INVALID_ARG_VALUE:K,ERR_INVALID_ARG_TYPE:J,ERR_MISSING_ARGS:Z,ERR_OUT_OF_RANGE:G},AbortError:W}=a0(),{validateAbortSignal:B,validateInteger:V,validateObject:U}=P6(),w=P0().Symbol("kWeak"),F=P0().Symbol("kResistStopPropagation"),{finished:M}=s2(),k=s9(),{addAbortSignalNoValidate:f}=L8(),{isWritable:L,isNodeStream:D}=b2(),{deprecate:z}=e0(),{ArrayPrototypePush:N,Boolean:H,MathFloor:v,Number:j,NumberIsNaN:n,Promise:d,PromiseReject:_,PromiseResolve:X,PromisePrototypeThen:P,Symbol:g}=P0(),c=g("kEmpty"),h=g("kEof");function x(O,E){if(E!=null)U(E,"options");if((E===null||E===void 0?void 0:E.signal)!=null)B(E.signal,"options.signal");if(D(O)&&!L(O))throw new K("stream",O,"must be writable");let a=k(this,O);if(E!==null&&E!==void 0&&E.signal)f(E.signal,a);return a}function l(O,E){if(typeof O!=="function")throw new J("fn",["Function","AsyncFunction"],O);if(E!=null)U(E,"options");if((E===null||E===void 0?void 0:E.signal)!=null)B(E.signal,"options.signal");let a=1;if((E===null||E===void 0?void 0:E.concurrency)!=null)a=v(E.concurrency);let K0=a-1;if((E===null||E===void 0?void 0:E.highWaterMark)!=null)K0=v(E.highWaterMark);return V(a,"options.concurrency",1),V(K0,"options.highWaterMark",0),K0+=a,async function*(){let R=e0().AbortSignalAny([E===null||E===void 0?void 0:E.signal].filter(H)),Y=this,C=[],u={signal:R},e,r,s=!1,T=0;function t(){s=!0,G0()}function G0(){T-=1,Q0()}function Q0(){if(r&&!s&&T=K0||T>=a))await new d((m0)=>{r=m0})}C.push(h)}catch(I0){let m0=_(I0);P(m0,G0,t),C.push(m0)}finally{if(s=!0,e)e(),e=null}}M0();try{while(!0){while(C.length>0){let I0=await C[0];if(I0===h)return;if(R.aborted)throw new W;if(I0!==c)yield I0;C.shift(),Q0()}await new d((I0)=>{e=I0})}}finally{if(s=!0,r)r(),r=null}}.call(this)}function $0(O=void 0){if(O!=null)U(O,"options");if((O===null||O===void 0?void 0:O.signal)!=null)B(O.signal,"options.signal");return async function*(){let E=0;for await(let K0 of this){var a;if(O!==null&&O!==void 0&&(a=O.signal)!==null&&a!==void 0&&a.aborted)throw new W({cause:O.signal.reason});yield[E++,K0]}}.call(this)}async function Z0(O,E=void 0){for await(let a of y.call(this,O,E))return!0;return!1}async function F0(O,E=void 0){if(typeof O!=="function")throw new J("fn",["Function","AsyncFunction"],O);return!await Z0.call(this,async(...a)=>{return!await O(...a)},E)}async function p(O,E){for await(let a of y.call(this,O,E))return a;return}async function W0(O,E){if(typeof O!=="function")throw new J("fn",["Function","AsyncFunction"],O);async function a(K0,R){return await O(K0,R),c}for await(let K0 of l.call(this,a,E));}function y(O,E){if(typeof O!=="function")throw new J("fn",["Function","AsyncFunction"],O);async function a(K0,R){if(await O(K0,R))return K0;return c}return l.call(this,a,E)}class i extends Z{constructor(){super("reduce");this.message="Reduce of an empty stream requires an initial value"}}async function U0(O,E,a){var K0;if(typeof O!=="function")throw new J("reducer",["Function","AsyncFunction"],O);if(a!=null)U(a,"options");if((a===null||a===void 0?void 0:a.signal)!=null)B(a.signal,"options.signal");let R=arguments.length>1;if(a!==null&&a!==void 0&&(K0=a.signal)!==null&&K0!==void 0&&K0.aborted){let r=new W(void 0,{cause:a.signal.reason});throw this.once("error",()=>{}),await M(this.destroy(r)),r}let Y=new Q,C=Y.signal;if(a!==null&&a!==void 0&&a.signal){let r={once:!0,[w]:this,[F]:!0};a.signal.addEventListener("abort",()=>Y.abort(),r)}let u=!1;try{for await(let r of this){var e;if(u=!0,a!==null&&a!==void 0&&(e=a.signal)!==null&&e!==void 0&&e.aborted)throw new W;if(!R)E=r,R=!0;else E=await O(E,r,{signal:C})}if(!u&&!R)throw new i}finally{Y.abort()}return E}async function m(O){if(O!=null)U(O,"options");if((O===null||O===void 0?void 0:O.signal)!=null)B(O.signal,"options.signal");let E=[];for await(let K0 of this){var a;if(O!==null&&O!==void 0&&(a=O.signal)!==null&&a!==void 0&&a.aborted)throw new W(void 0,{cause:O.signal.reason});N(E,K0)}return E}function V0(O,E){let a=l.call(this,O,E);return async function*(){for await(let K0 of a)yield*K0}.call(this)}function w0(O){if(O=j(O),n(O))return 0;if(O<0)throw new G("number",">= 0",O);return O}function S(O,E=void 0){if(E!=null)U(E,"options");if((E===null||E===void 0?void 0:E.signal)!=null)B(E.signal,"options.signal");return O=w0(O),async function*(){var a;if(E!==null&&E!==void 0&&(a=E.signal)!==null&&a!==void 0&&a.aborted)throw new W;for await(let R of this){var K0;if(E!==null&&E!==void 0&&(K0=E.signal)!==null&&K0!==void 0&&K0.aborted)throw new W;if(O--<=0)yield R}}.call(this)}function b(O,E=void 0){if(E!=null)U(E,"options");if((E===null||E===void 0?void 0:E.signal)!=null)B(E.signal,"options.signal");return O=w0(O),async function*(){var a;if(E!==null&&E!==void 0&&(a=E.signal)!==null&&a!==void 0&&a.aborted)throw new W;for await(let R of this){var K0;if(E!==null&&E!==void 0&&(K0=E.signal)!==null&&K0!==void 0&&K0.aborted)throw new W;if(O-- >0)yield R;if(O<=0)return}}.call(this)}q.exports.streamReturningOperators={asIndexedPairs:z($0,"readable.asIndexedPairs will be removed in a future version."),drop:S,filter:y,flatMap:V0,map:l,take:b,compose:x},q.exports.promiseReturningOperators={every:F0,forEach:W0,reduce:U0,toArray:m,some:Z0,find:p}}),t9=g0(($,q)=>{var{ArrayPrototypePop:Q,Promise:K}=P0(),{isIterable:J,isNodeStream:Z,isWebStream:G}=b2(),{pipelineImpl:W}=n5(),{finished:B}=s2();e9();function V(...U){return new K((w,F)=>{let M,k,f=U[U.length-1];if(f&&typeof f==="object"&&!Z(f)&&!J(f)&&!G(f)){let L=Q(U);M=L.signal,k=L.end}W(U,(L,D)=>{if(L)F(L);else w(D)},{signal:M,end:k})})}q.exports={finished:B,pipeline:V}}),e9=g0(($,q)=>{var{Buffer:Q}=(t0(),X0(K2)),{ObjectDefineProperty:K,ObjectKeys:J,ReflectApply:Z}=P0(),{promisify:{custom:G}}=e0(),{streamReturningOperators:W,promiseReturningOperators:B}=hV(),{codes:{ERR_ILLEGAL_CONSTRUCTOR:V}}=a0(),U=s9(),{setDefaultHighWaterMark:w,getDefaultHighWaterMark:F}=H8(),{pipeline:M}=n5(),{destroyer:k}=o1(),f=s2(),L=t9(),D=b2(),z=q.exports=c5().Stream;z.isDestroyed=D.isDestroyed,z.isDisturbed=D.isDisturbed,z.isErrored=D.isErrored,z.isReadable=D.isReadable,z.isWritable=D.isWritable,z.Readable=v8();for(let H of J(W)){let v=function(...n){if(new.target)throw V();return z.Readable.from(Z(j,this,n))},j=W[H];K(v,"name",{__proto__:null,value:j.name}),K(v,"length",{__proto__:null,value:j.length}),K(z.Readable.prototype,H,{__proto__:null,value:v,enumerable:!1,configurable:!0,writable:!0})}for(let H of J(B)){let v=function(...n){if(new.target)throw V();return Z(j,this,n)},j=B[H];K(v,"name",{__proto__:null,value:j.name}),K(v,"length",{__proto__:null,value:j.length}),K(z.Readable.prototype,H,{__proto__:null,value:v,enumerable:!1,configurable:!0,writable:!0})}z.Writable=b5(),z.Duplex=c2(),z.Transform=l9(),z.PassThrough=r9(),z.pipeline=M;var{addAbortSignal:N}=L8();z.addAbortSignal=N,z.finished=f,z.destroy=k,z.compose=U,z.setDefaultHighWaterMark=w,z.getDefaultHighWaterMark=F,K(z,"promises",{__proto__:null,configurable:!0,enumerable:!0,get(){return L}}),K(M,G,{__proto__:null,enumerable:!0,get(){return L.pipeline}}),K(f,G,{__proto__:null,enumerable:!0,get(){return L.finished}}),z.Stream=z,z._isUint8Array=function(H){return H instanceof Uint8Array},z._uint8ArrayToBuffer=function(H){return Q.from(H.buffer,H.byteOffset,H.byteLength)}}),xV=g0(($,q)=>{var Q=a1();{let K=e9(),J=t9(),Z=K.Readable.destroy;q.exports=K.Readable,q.exports._uint8ArrayToBuffer=K._uint8ArrayToBuffer,q.exports._isUint8Array=K._isUint8Array,q.exports.isDisturbed=K.isDisturbed,q.exports.isErrored=K.isErrored,q.exports.isReadable=K.isReadable,q.exports.Readable=K.Readable,q.exports.Writable=K.Writable,q.exports.Duplex=K.Duplex,q.exports.Transform=K.Transform,q.exports.PassThrough=K.PassThrough,q.exports.addAbortSignal=K.addAbortSignal,q.exports.finished=K.finished,q.exports.destroy=K.destroy,q.exports.destroy=Z,q.exports.pipeline=K.pipeline,q.exports.compose=K.compose,Object.defineProperty(K,"promises",{configurable:!0,enumerable:!0,get(){return J}}),q.exports.Stream=K.Stream}q.exports.default=q.exports});$$.exports=xV()});var d5=N0((Fz,Q$)=>{Q$.exports=a1()});var n2=N0((J2)=>{J2.base64=!0;J2.array=!0;J2.string=!0;J2.arraybuffer=typeof ArrayBuffer<"u"&&typeof Uint8Array<"u";J2.nodebuffer=typeof Buffer<"u";J2.uint8array=typeof Uint8Array<"u";if(typeof ArrayBuffer>"u")J2.blob=!1;else{f8=new ArrayBuffer(0);try{J2.blob=new Blob([f8],{type:"application/zip"}).size===0}catch($){try{m5=self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder,R8=new m5,R8.append(f8),J2.blob=R8.getBlob("application/zip").size===0}catch(q){J2.blob=!1}}}var f8,m5,R8;try{J2.nodestream=!!d5().Readable}catch($){J2.nodestream=!1}});var i5=N0((p5)=>{var OV=T0(),PV=n2(),A2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";p5.encode=function($){var q=[],Q,K,J,Z,G,W,B,V=0,U=$.length,w=U,F=OV.getTypeOf($)!=="string";while(V<$.length){if(w=U-V,!F)Q=$.charCodeAt(V++),K=V>2,G=(Q&3)<<4|K>>4,W=w>1?(K&15)<<2|J>>6:64,B=w>2?J&63:64,q.push(A2.charAt(Z)+A2.charAt(G)+A2.charAt(W)+A2.charAt(B))}return q.join("")};p5.decode=function($){var q,Q,K,J,Z,G,W,B=0,V=0,U="data:";if($.substr(0,U.length)===U)throw Error("Invalid base64 input, it looks like a data url.");$=$.replace(/[^A-Za-z0-9+/=]/g,"");var w=$.length*3/4;if($.charAt($.length-1)===A2.charAt(64))w--;if($.charAt($.length-2)===A2.charAt(64))w--;if(w%1!==0)throw Error("Invalid base64 input, bad content length.");var F;if(PV.uint8array)F=new Uint8Array(w|0);else F=Array(w|0);while(B<$.length){if(J=A2.indexOf($.charAt(B++)),Z=A2.indexOf($.charAt(B++)),G=A2.indexOf($.charAt(B++)),W=A2.indexOf($.charAt(B++)),q=J<<2|Z>>4,Q=(Z&15)<<4|G>>2,K=(G&3)<<6|W,F[V++]=q,G!==64)F[V++]=Q;if(W!==64)F[V++]=K}return F}});var T6=N0((Nz,q$)=>{q$.exports={isNode:typeof Buffer<"u",newBufferFrom:function($,q){if(Buffer.from&&Buffer.from!==Uint8Array.from)return Buffer.from($,q);else{if(typeof $==="number")throw Error('The "data" argument must not be a number');return new Buffer($,q)}},allocBuffer:function($){if(Buffer.alloc)return Buffer.alloc($);else{var q=new Buffer($);return q.fill(0),q}},isBuffer:function($){return Buffer.isBuffer($)},isStream:function($){return $&&typeof $.on==="function"&&typeof $.pause==="function"&&typeof $.resume==="function"}}});var V$=N0((Yz,J$)=>{var K$=global.MutationObserver||global.WebKitMutationObserver,u6;if(K$)C8=0,o5=new K$(I8),j8=global.document.createTextNode(""),o5.observe(j8,{characterData:!0}),u6=function(){j8.data=C8=++C8%2};else if(!global.setImmediate&&typeof global.MessageChannel<"u")g8=new global.MessageChannel,g8.port1.onmessage=I8,u6=function(){g8.port2.postMessage(0)};else if("document"in global&&"onreadystatechange"in global.document.createElement("script"))u6=function(){var $=global.document.createElement("script");$.onreadystatechange=function(){I8(),$.onreadystatechange=null,$.parentNode.removeChild($),$=null},global.document.documentElement.appendChild($)};else u6=function(){setTimeout(I8,0)};var C8,o5,j8,g8,a5,S6=[];function I8(){a5=!0;var $,q,Q=S6.length;while(Q){q=S6,S6=[],$=-1;while(++${var uV=V$();function l1(){}var o0={},U$=["REJECTED"],l5=["FULFILLED"],Z$=["PENDING"];B$.exports=t2;function t2($){if(typeof $!=="function")throw TypeError("resolver must be a function");if(this.state=Z$,this.queue=[],this.outcome=void 0,$!==l1)G$(this,$)}t2.prototype.finally=function($){if(typeof $!=="function")return this;var q=this.constructor;return this.then(Q,K);function Q(J){function Z(){return J}return q.resolve($()).then(Z)}function K(J){function Z(){throw J}return q.resolve($()).then(Z)}};t2.prototype.catch=function($){return this.then(null,$)};t2.prototype.then=function($,q){if(typeof $!=="function"&&this.state===l5||typeof q!=="function"&&this.state===U$)return this;var Q=new this.constructor(l1);if(this.state!==Z$){var K=this.state===l5?$:q;r5(Q,K,this.outcome)}else this.queue.push(new E6(Q,$,q));return Q};function E6($,q,Q){if(this.promise=$,typeof q==="function")this.onFulfilled=q,this.callFulfilled=this.otherCallFulfilled;if(typeof Q==="function")this.onRejected=Q,this.callRejected=this.otherCallRejected}E6.prototype.callFulfilled=function($){o0.resolve(this.promise,$)};E6.prototype.otherCallFulfilled=function($){r5(this.promise,this.onFulfilled,$)};E6.prototype.callRejected=function($){o0.reject(this.promise,$)};E6.prototype.otherCallRejected=function($){r5(this.promise,this.onRejected,$)};function r5($,q,Q){uV(function(){var K;try{K=q(Q)}catch(J){return o0.reject($,J)}if(K===$)o0.reject($,TypeError("Cannot resolve promise with itself"));else o0.resolve($,K)})}o0.resolve=function($,q){var Q=W$(SV,q);if(Q.status==="error")return o0.reject($,Q.value);var K=Q.value;if(K)G$($,K);else{$.state=l5,$.outcome=q;var J=-1,Z=$.queue.length;while(++J{var s5=null;if(typeof Promise<"u")s5=Promise;else s5=z$();F$.exports={Promise:s5}});var w$=N0((M$)=>{(function($,q){if($.setImmediate)return;var Q=1,K={},J=!1,Z=$.document,G;function W(z){if(typeof z!=="function")z=Function(""+z);var N=Array(arguments.length-1);for(var H=0;H"u"?typeof global>"u"?M$:global:self)});var T0=N0((_0)=>{var e2=n2(),nV=i5(),s1=T6(),t5=r1();w$();function dV($){var q=null;if(e2.uint8array)q=new Uint8Array($.length);else q=Array($.length);return X8($,q)}_0.newBlob=function($,q){_0.checkSupport("blob");try{return new Blob([$],{type:q})}catch(J){try{var Q=self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder,K=new Q;return K.append($),K.getBlob(q)}catch(Z){throw Error("Bug : can't construct the Blob.")}}};function _6($){return $}function X8($,q){for(var Q=0;Q<$.length;++Q)q[Q]=$.charCodeAt(Q)&255;return q}var A8={stringifyByChunk:function($,q,Q){var K=[],J=0,Z=$.length;if(Z<=Q)return String.fromCharCode.apply(null,$);while(J1)try{return A8.stringifyByChunk($,Q,q)}catch(J){q=Math.floor(q/2)}return A8.stringifyByChar($)}_0.applyFromCharCode=c6;function y8($,q){for(var Q=0;Q<$.length;Q++)q[Q]=$[Q];return q}var $1={};$1.string={string:_6,array:function($){return X8($,Array($.length))},arraybuffer:function($){return $1.string.uint8array($).buffer},uint8array:function($){return X8($,new Uint8Array($.length))},nodebuffer:function($){return X8($,s1.allocBuffer($.length))}};$1.array={string:c6,array:_6,arraybuffer:function($){return new Uint8Array($).buffer},uint8array:function($){return new Uint8Array($)},nodebuffer:function($){return s1.newBufferFrom($)}};$1.arraybuffer={string:function($){return c6(new Uint8Array($))},array:function($){return y8(new Uint8Array($),Array($.byteLength))},arraybuffer:_6,uint8array:function($){return new Uint8Array($)},nodebuffer:function($){return s1.newBufferFrom(new Uint8Array($))}};$1.uint8array={string:c6,array:function($){return y8($,Array($.length))},arraybuffer:function($){return $.buffer},uint8array:_6,nodebuffer:function($){return s1.newBufferFrom($)}};$1.nodebuffer={string:c6,array:function($){return y8($,Array($.length))},arraybuffer:function($){return $1.nodebuffer.uint8array($).buffer},uint8array:function($){return y8($,new Uint8Array($.length))},nodebuffer:_6};_0.transformTo=function($,q){if(!q)q="";if(!$)return q;_0.checkSupport($);var Q=_0.getTypeOf(q),K=$1[Q][$](q);return K};_0.resolve=function($){var q=$.split("/"),Q=[];for(var K=0;K"u")$[Q]=arguments[q][Q];return $};_0.prepareContent=function($,q,Q,K,J){var Z=t5.Promise.resolve(q).then(function(G){var W=e2.blob&&(G instanceof Blob||["[object File]","[object Blob]"].indexOf(Object.prototype.toString.call(G))!==-1);if(W&&typeof FileReader<"u")return new t5.Promise(function(B,V){var U=new FileReader;U.onload=function(w){B(w.target.result)},U.onerror=function(w){V(w.target.error)},U.readAsArrayBuffer(G)});else return G});return Z.then(function(G){var W=_0.getTypeOf(G);if(!W)return t5.Promise.reject(Error("Can't read the data of '"+$+"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?"));if(W==="arraybuffer")G=_0.transformTo("uint8array",G);else if(W==="string"){if(J)G=nV.decode(G);else if(Q){if(K!==!0)G=dV(G)}}return G})}});var V2=N0((vz,Y$)=>{function N$($){this.name=$||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}N$.prototype={push:function($){this.emit("data",$)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch($){this.emit("error",$)}return!0},error:function($){if(this.isFinished)return!1;if(this.isPaused)this.generatedError=$;else{if(this.isFinished=!0,this.emit("error",$),this.previous)this.previous.error($);this.cleanUp()}return!0},on:function($,q){return this._listeners[$].push(q),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function($,q){if(this._listeners[$])for(var Q=0;Q "+$;else return $}};Y$.exports=N$});var e1=N0((Q1)=>{var t1=T0(),L1=n2(),mV=T6(),h8=V2(),b6=Array(256);for(X2=0;X2<256;X2++)b6[X2]=X2>=252?6:X2>=248?5:X2>=240?4:X2>=224?3:X2>=192?2:1;var X2;b6[254]=b6[254]=1;var pV=function($){var q,Q,K,J,Z,G=$.length,W=0;for(J=0;J>>6,q[Z++]=128|Q&63;else if(Q<65536)q[Z++]=224|Q>>>12,q[Z++]=128|Q>>>6&63,q[Z++]=128|Q&63;else q[Z++]=240|Q>>>18,q[Z++]=128|Q>>>12&63,q[Z++]=128|Q>>>6&63,q[Z++]=128|Q&63}return q},iV=function($,q){var Q;if(q=q||$.length,q>$.length)q=$.length;Q=q-1;while(Q>=0&&($[Q]&192)===128)Q--;if(Q<0)return q;if(Q===0)return q;return Q+b6[$[Q]]>q?Q:q},oV=function($){var q,Q,K,J,Z=$.length,G=Array(Z*2);for(Q=0,q=0;q4){G[Q++]=65533,q+=J-1;continue}K&=J===2?31:J===3?15:7;while(J>1&&q1){G[Q++]=65533;continue}if(K<65536)G[Q++]=K;else K-=65536,G[Q++]=55296|K>>10&1023,G[Q++]=56320|K&1023}if(G.length!==Q)if(G.subarray)G=G.subarray(0,Q);else G.length=Q;return t1.applyFromCharCode(G)};Q1.utf8encode=function(q){if(L1.nodebuffer)return mV.newBufferFrom(q,"utf-8");return pV(q)};Q1.utf8decode=function(q){if(L1.nodebuffer)return t1.transformTo("nodebuffer",q).toString("utf-8");return q=t1.transformTo(L1.uint8array?"uint8array":"array",q),oV(q)};function x8(){h8.call(this,"utf-8 decode"),this.leftOver=null}t1.inherits(x8,h8);x8.prototype.processChunk=function($){var q=t1.transformTo(L1.uint8array?"uint8array":"array",$.data);if(this.leftOver&&this.leftOver.length){if(L1.uint8array){var Q=q;q=new Uint8Array(Q.length+this.leftOver.length),q.set(this.leftOver,0),q.set(Q,this.leftOver.length)}else q=this.leftOver.concat(q);this.leftOver=null}var K=iV(q),J=q;if(K!==q.length)if(L1.uint8array)J=q.subarray(0,K),this.leftOver=q.subarray(K,q.length);else J=q.slice(0,K),this.leftOver=q.slice(K,q.length);this.push({data:Q1.utf8decode(J),meta:$.meta})};x8.prototype.flush=function(){if(this.leftOver&&this.leftOver.length)this.push({data:Q1.utf8decode(this.leftOver),meta:{}}),this.leftOver=null};Q1.Utf8DecodeWorker=x8;function e5(){h8.call(this,"utf-8 encode")}t1.inherits(e5,h8);e5.prototype.processChunk=function($){this.push({data:Q1.utf8encode($.data),meta:$.meta})};Q1.Utf8EncodeWorker=e5});var H$=N0((Rz,L$)=>{var k$=V2(),D$=T0();function $4($){k$.call(this,"ConvertWorker to "+$),this.destType=$}D$.inherits($4,k$);$4.prototype.processChunk=function($){this.push({data:D$.transformTo(this.destType,$.data),meta:$.meta})};L$.exports=$4});var R$=N0((Iz,f$)=>{var v$=d5().Readable,aV=T0();aV.inherits(Q4,v$);function Q4($,q,Q){v$.call(this,q),this._helper=$;var K=this;$.on("data",function(J,Z){if(!K.push(J))K._helper.pause();if(Q)Q(Z)}).on("error",function(J){K.emit("error",J)}).on("end",function(){K.push(null)})}Q4.prototype._read=function(){this._helper.resume()};f$.exports=Q4});var q4=N0((Cz,j$)=>{var H1=T0(),lV=H$(),rV=V2(),sV=i5(),tV=n2(),eV=r1(),I$=null;if(tV.nodestream)try{I$=R$()}catch($){}function $U($,q,Q){switch($){case"blob":return H1.newBlob(H1.transformTo("arraybuffer",q),Q);case"base64":return sV.encode(q);default:return H1.transformTo($,q)}}function QU($,q){var Q,K=0,J=null,Z=0;for(Q=0;Q{D2.base64=!1;D2.binary=!1;D2.dir=!1;D2.createFolders=!0;D2.date=null;D2.compression=null;D2.compressionOptions=null;D2.comment=null;D2.unixPermissions=null;D2.dosPermissions=null});var J4=N0((gz,g$)=>{var O8=T0(),P8=V2(),KU=16384;function $6($){P8.call(this,"DataWorker");var q=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,$.then(function(Q){if(q.dataIsReady=!0,q.data=Q,q.max=Q&&Q.length||0,q.type=O8.getTypeOf(Q),!q.isPaused)q._tickAndRepeat()},function(Q){q.error(Q)})}O8.inherits($6,P8);$6.prototype.cleanUp=function(){P8.prototype.cleanUp.call(this),this.data=null};$6.prototype.resume=function(){if(!P8.prototype.resume.call(this))return!1;if(!this._tickScheduled&&this.dataIsReady)this._tickScheduled=!0,O8.delay(this._tickAndRepeat,[],this);return!0};$6.prototype._tickAndRepeat=function(){if(this._tickScheduled=!1,this.isPaused||this.isFinished)return;if(this._tick(),!this.isFinished)O8.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0};$6.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var $=KU,q=null,Q=Math.min(this.max,this.index+$);if(this.index>=this.max)return this.end();else{switch(this.type){case"string":q=this.data.substring(this.index,Q);break;case"uint8array":q=this.data.subarray(this.index,Q);break;case"array":case"nodebuffer":q=this.data.slice(this.index,Q);break}return this.index=Q,this.push({data:q,meta:{percent:this.max?this.index/this.max*100:0}})}};g$.exports=$6});var T8=N0((Az,X$)=>{var JU=T0();function VU(){var $,q=[];for(var Q=0;Q<256;Q++){$=Q;for(var K=0;K<8;K++)$=$&1?3988292384^$>>>1:$>>>1;q[Q]=$}return q}var A$=VU();function UU($,q,Q,K){var J=A$,Z=K+Q;$=$^-1;for(var G=K;G>>8^J[($^q[G])&255];return $^-1}function ZU($,q,Q,K){var J=A$,Z=K+Q;$=$^-1;for(var G=K;G>>8^J[($^q.charCodeAt(G))&255];return $^-1}X$.exports=function(q,Q){if(typeof q>"u"||!q.length)return 0;var K=JU.getTypeOf(q)!=="string";if(K)return UU(Q|0,q,q.length,0);else return ZU(Q|0,q,q.length,0)}});var U4=N0((Xz,h$)=>{var y$=V2(),GU=T8(),WU=T0();function V4(){y$.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}WU.inherits(V4,y$);V4.prototype.processChunk=function($){this.streamInfo.crc32=GU($.data,this.streamInfo.crc32||0),this.push($)};h$.exports=V4});var O$=N0((yz,x$)=>{var BU=T0(),Z4=V2();function G4($){Z4.call(this,"DataLengthProbe for "+$),this.propName=$,this.withStreamInfo($,0)}BU.inherits(G4,Z4);G4.prototype.processChunk=function($){if($){var q=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=q+$.data.length}Z4.prototype.processChunk.call(this,$)};x$.exports=G4});var u8=N0((hz,u$)=>{var P$=r1(),T$=J4(),zU=U4(),W4=O$();function B4($,q,Q,K,J){this.compressedSize=$,this.uncompressedSize=q,this.crc32=Q,this.compression=K,this.compressedContent=J}B4.prototype={getContentWorker:function(){var $=new T$(P$.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new W4("data_length")),q=this;return $.on("end",function(){if(this.streamInfo.data_length!==q.uncompressedSize)throw Error("Bug : uncompressed data size mismatch")}),$},getCompressedWorker:function(){return new T$(P$.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}};B4.createWorkerFrom=function($,q,Q){return $.pipe(new zU).pipe(new W4("uncompressedSize")).pipe(q.compressWorker(Q)).pipe(new W4("compressedSize")).withStreamInfo("compression",q)};u$.exports=B4});var c$=N0((xz,_$)=>{var FU=q4(),MU=J4(),z4=e1(),F4=u8(),S$=V2(),M4=function($,q,Q){this.name=$,this.dir=Q.dir,this.date=Q.date,this.comment=Q.comment,this.unixPermissions=Q.unixPermissions,this.dosPermissions=Q.dosPermissions,this._data=q,this._dataBinary=Q.binary,this.options={compression:Q.compression,compressionOptions:Q.compressionOptions}};M4.prototype={internalStream:function($){var q=null,Q="string";try{if(!$)throw Error("No output type specified.");Q=$.toLowerCase();var K=Q==="string"||Q==="text";if(Q==="binarystring"||Q==="text")Q="string";q=this._decompressWorker();var J=!this._dataBinary;if(J&&!K)q=q.pipe(new z4.Utf8EncodeWorker);if(!J&&K)q=q.pipe(new z4.Utf8DecodeWorker)}catch(Z){q=new S$("error"),q.error(Z)}return new FU(q,Q,"")},async:function($,q){return this.internalStream($).accumulate(q)},nodeStream:function($,q){return this.internalStream($||"nodebuffer").toNodejsStream(q)},_compressWorker:function($,q){if(this._data instanceof F4&&this._data.compression.magic===$.magic)return this._data.getCompressedWorker();else{var Q=this._decompressWorker();if(!this._dataBinary)Q=Q.pipe(new z4.Utf8EncodeWorker);return F4.createWorkerFrom(Q,$,q)}},_decompressWorker:function(){if(this._data instanceof F4)return this._data.getContentWorker();else if(this._data instanceof S$)return this._data;else return new MU(this._data)}};var E$=["asText","asBinary","asNodeBuffer","asUint8Array","asArrayBuffer"],wU=function(){throw Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")};for(n6=0;n6{var NU=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Int32Array<"u";function YU($,q){return Object.prototype.hasOwnProperty.call($,q)}l0.assign=function($){var q=Array.prototype.slice.call(arguments,1);while(q.length){var Q=q.shift();if(!Q)continue;if(typeof Q!=="object")throw TypeError(Q+"must be non-object");for(var K in Q)if(YU(Q,K))$[K]=Q[K]}return $};l0.shrinkBuf=function($,q){if($.length===q)return $;if($.subarray)return $.subarray(0,q);return $.length=q,$};var kU={arraySet:function($,q,Q,K,J){if(q.subarray&&$.subarray){$.set(q.subarray(Q,Q+K),J);return}for(var Z=0;Z{var LU=d2(),HU=4,b$=0,n$=1,vU=2;function q6($){var q=$.length;while(--q>=0)$[q]=0}var fU=0,a$=1,RU=2,IU=3,CU=258,H4=29,a6=256,m6=a6+1+H4,Q6=30,v4=19,l$=2*m6+1,v1=15,w4=16,jU=7,f4=256,r$=16,s$=17,t$=18,D4=[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],S8=[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],gU=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],e$=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],AU=512,m2=Array((m6+2)*2);q6(m2);var d6=Array(Q6*2);q6(d6);var p6=Array(AU);q6(p6);var i6=Array(CU-IU+1);q6(i6);var R4=Array(H4);q6(R4);var E8=Array(Q6);q6(E8);function N4($,q,Q,K,J){this.static_tree=$,this.extra_bits=q,this.extra_base=Q,this.elems=K,this.max_length=J,this.has_stree=$&&$.length}var $Q,QQ,qQ;function Y4($,q){this.dyn_tree=$,this.max_code=0,this.stat_desc=q}function KQ($){return $<256?p6[$]:p6[256+($>>>7)]}function o6($,q){$.pending_buf[$.pending++]=q&255,$.pending_buf[$.pending++]=q>>>8&255}function $2($,q,Q){if($.bi_valid>w4-Q)$.bi_buf|=q<<$.bi_valid&65535,o6($,$.bi_buf),$.bi_buf=q>>w4-$.bi_valid,$.bi_valid+=Q-w4;else $.bi_buf|=q<<$.bi_valid&65535,$.bi_valid+=Q}function y2($,q,Q){$2($,Q[q*2],Q[q*2+1])}function JQ($,q){var Q=0;do Q|=$&1,$>>>=1,Q<<=1;while(--q>0);return Q>>>1}function XU($){if($.bi_valid===16)o6($,$.bi_buf),$.bi_buf=0,$.bi_valid=0;else if($.bi_valid>=8)$.pending_buf[$.pending++]=$.bi_buf&255,$.bi_buf>>=8,$.bi_valid-=8}function yU($,q){var{dyn_tree:Q,max_code:K}=q,J=q.stat_desc.static_tree,Z=q.stat_desc.has_stree,G=q.stat_desc.extra_bits,W=q.stat_desc.extra_base,B=q.stat_desc.max_length,V,U,w,F,M,k,f=0;for(F=0;F<=v1;F++)$.bl_count[F]=0;Q[$.heap[$.heap_max]*2+1]=0;for(V=$.heap_max+1;VB)F=B,f++;if(Q[U*2+1]=F,U>K)continue;if($.bl_count[F]++,M=0,U>=W)M=G[U-W];if(k=Q[U*2],$.opt_len+=k*(F+M),Z)$.static_len+=k*(J[U*2+1]+M)}if(f===0)return;do{F=B-1;while($.bl_count[F]===0)F--;$.bl_count[F]--,$.bl_count[F+1]+=2,$.bl_count[B]--,f-=2}while(f>0);for(F=B;F!==0;F--){U=$.bl_count[F];while(U!==0){if(w=$.heap[--V],w>K)continue;if(Q[w*2+1]!==F)$.opt_len+=(F-Q[w*2+1])*Q[w*2],Q[w*2+1]=F;U--}}}function VQ($,q,Q){var K=Array(v1+1),J=0,Z,G;for(Z=1;Z<=v1;Z++)K[Z]=J=J+Q[Z-1]<<1;for(G=0;G<=q;G++){var W=$[G*2+1];if(W===0)continue;$[G*2]=JQ(K[W]++,W)}}function hU(){var $,q,Q,K,J,Z=Array(v1+1);Q=0;for(K=0;K>=7;for(;K8)o6($,$.bi_buf);else if($.bi_valid>0)$.pending_buf[$.pending++]=$.bi_buf;$.bi_buf=0,$.bi_valid=0}function xU($,q,Q,K){if(ZQ($),K)o6($,Q),o6($,~Q);LU.arraySet($.pending_buf,$.window,q,Q,$.pending),$.pending+=Q}function d$($,q,Q,K){var J=q*2,Z=Q*2;return $[J]<$[Z]||$[J]===$[Z]&&K[q]<=K[Q]}function k4($,q,Q){var K=$.heap[Q],J=Q<<1;while(J<=$.heap_len){if(J<$.heap_len&&d$(q,$.heap[J+1],$.heap[J],$.depth))J++;if(d$(q,K,$.heap[J],$.depth))break;$.heap[Q]=$.heap[J],Q=J,J<<=1}$.heap[Q]=K}function m$($,q,Q){var K,J,Z=0,G,W;if($.last_lit!==0)do if(K=$.pending_buf[$.d_buf+Z*2]<<8|$.pending_buf[$.d_buf+Z*2+1],J=$.pending_buf[$.l_buf+Z],Z++,K===0)y2($,J,q);else{if(G=i6[J],y2($,G+a6+1,q),W=D4[G],W!==0)J-=R4[G],$2($,J,W);if(K--,G=KQ(K),y2($,G,Q),W=S8[G],W!==0)K-=E8[G],$2($,K,W)}while(Z<$.last_lit);y2($,f4,q)}function L4($,q){var Q=q.dyn_tree,K=q.stat_desc.static_tree,J=q.stat_desc.has_stree,Z=q.stat_desc.elems,G,W,B=-1,V;$.heap_len=0,$.heap_max=l$;for(G=0;G>1;G>=1;G--)k4($,Q,G);V=Z;do G=$.heap[1],$.heap[1]=$.heap[$.heap_len--],k4($,Q,1),W=$.heap[1],$.heap[--$.heap_max]=G,$.heap[--$.heap_max]=W,Q[V*2]=Q[G*2]+Q[W*2],$.depth[V]=($.depth[G]>=$.depth[W]?$.depth[G]:$.depth[W])+1,Q[G*2+1]=Q[W*2+1]=V,$.heap[1]=V++,k4($,Q,1);while($.heap_len>=2);$.heap[--$.heap_max]=$.heap[1],yU($,q),VQ(Q,B,$.bl_count)}function p$($,q,Q){var K,J=-1,Z,G=q[1],W=0,B=7,V=4;if(G===0)B=138,V=3;q[(Q+1)*2+1]=65535;for(K=0;K<=Q;K++){if(Z=G,G=q[(K+1)*2+1],++W=3;q--)if($.bl_tree[e$[q]*2+1]!==0)break;return $.opt_len+=3*(q+1)+5+5+4,q}function PU($,q,Q,K){var J;$2($,q-257,5),$2($,Q-1,5),$2($,K-4,4);for(J=0;J>>=1)if(q&1&&$.dyn_ltree[Q*2]!==0)return b$;if($.dyn_ltree[18]!==0||$.dyn_ltree[20]!==0||$.dyn_ltree[26]!==0)return n$;for(Q=32;Q0){if($.strm.data_type===vU)$.strm.data_type=TU($);if(L4($,$.l_desc),L4($,$.d_desc),G=OU($),J=$.opt_len+3+7>>>3,Z=$.static_len+3+7>>>3,Z<=J)J=Z}else J=Z=Q+5;if(Q+4<=J&&q!==-1)GQ($,q,Q,K);else if($.strategy===HU||Z===J)$2($,(a$<<1)+(K?1:0),3),m$($,m2,d6);else $2($,(RU<<1)+(K?1:0),3),PU($,$.l_desc.max_code+1,$.d_desc.max_code+1,G+1),m$($,$.dyn_ltree,$.dyn_dtree);if(UQ($),K)ZQ($)}function _U($,q,Q){if($.pending_buf[$.d_buf+$.last_lit*2]=q>>>8&255,$.pending_buf[$.d_buf+$.last_lit*2+1]=q&255,$.pending_buf[$.l_buf+$.last_lit]=Q&255,$.last_lit++,q===0)$.dyn_ltree[Q*2]++;else $.matches++,q--,$.dyn_ltree[(i6[Q]+a6+1)*2]++,$.dyn_dtree[KQ(q)*2]++;return $.last_lit===$.lit_bufsize-1}K6._tr_init=uU;K6._tr_stored_block=GQ;K6._tr_flush_block=EU;K6._tr_tally=_U;K6._tr_align=SU});var I4=N0((Tz,BQ)=>{function cU($,q,Q,K){var J=$&65535|0,Z=$>>>16&65535|0,G=0;while(Q!==0){G=Q>2000?2000:Q,Q-=G;do J=J+q[K++]|0,Z=Z+J|0;while(--G);J%=65521,Z%=65521}return J|Z<<16|0}BQ.exports=cU});var C4=N0((uz,zQ)=>{function bU(){var $,q=[];for(var Q=0;Q<256;Q++){$=Q;for(var K=0;K<8;K++)$=$&1?3988292384^$>>>1:$>>>1;q[Q]=$}return q}var nU=bU();function dU($,q,Q,K){var J=nU,Z=K+Q;$^=-1;for(var G=K;G>>8^J[($^q[G])&255];return $^-1}zQ.exports=dU});var _8=N0((Sz,FQ)=>{FQ.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}});var vQ=N0((O2)=>{var r0=d2(),M2=WQ(),YQ=I4(),q1=C4(),mU=_8(),C1=0,pU=1,iU=3,Z1=4,MQ=5,x2=0,wQ=1,w2=-2,oU=-3,j4=-5,aU=-1,lU=1,c8=2,rU=3,sU=4,tU=0,eU=2,m8=8,$Z=9,QZ=15,qZ=8,KZ=29,JZ=256,A4=JZ+1+KZ,VZ=30,UZ=19,ZZ=2*A4+1,GZ=15,f0=3,V1=258,L2=V1+f0+1,WZ=32,p8=42,X4=69,b8=73,n8=91,d8=103,f1=113,r6=666,c0=1,s6=2,R1=3,U6=4,BZ=3;function U1($,q){return $.msg=mU[q],q}function NQ($){return($<<1)-($>4?9:0)}function J1($){var q=$.length;while(--q>=0)$[q]=0}function K1($){var q=$.state,Q=q.pending;if(Q>$.avail_out)Q=$.avail_out;if(Q===0)return;if(r0.arraySet($.output,q.pending_buf,q.pending_out,Q,$.next_out),$.next_out+=Q,q.pending_out+=Q,$.total_out+=Q,$.avail_out-=Q,q.pending-=Q,q.pending===0)q.pending_out=0}function d0($,q){M2._tr_flush_block($,$.block_start>=0?$.block_start:-1,$.strstart-$.block_start,q),$.block_start=$.strstart,K1($.strm)}function C0($,q){$.pending_buf[$.pending++]=q}function l6($,q){$.pending_buf[$.pending++]=q>>>8&255,$.pending_buf[$.pending++]=q&255}function zZ($,q,Q,K){var J=$.avail_in;if(J>K)J=K;if(J===0)return 0;if($.avail_in-=J,r0.arraySet(q,$.input,$.next_in,J,Q),$.state.wrap===1)$.adler=YQ($.adler,q,J,Q);else if($.state.wrap===2)$.adler=q1($.adler,q,J,Q);return $.next_in+=J,$.total_in+=J,J}function kQ($,q){var{max_chain_length:Q,strstart:K}=$,J,Z,G=$.prev_length,W=$.nice_match,B=$.strstart>$.w_size-L2?$.strstart-($.w_size-L2):0,V=$.window,U=$.w_mask,w=$.prev,F=$.strstart+V1,M=V[K+G-1],k=V[K+G];if($.prev_length>=$.good_match)Q>>=2;if(W>$.lookahead)W=$.lookahead;do{if(J=q,V[J+G]!==k||V[J+G-1]!==M||V[J]!==V[K]||V[++J]!==V[K+1])continue;K+=2,J++;do;while(V[++K]===V[++J]&&V[++K]===V[++J]&&V[++K]===V[++J]&&V[++K]===V[++J]&&V[++K]===V[++J]&&V[++K]===V[++J]&&V[++K]===V[++J]&&V[++K]===V[++J]&&KG){if($.match_start=q,G=Z,Z>=W)break;M=V[K+G-1],k=V[K+G]}}while((q=w[q&U])>B&&--Q!==0);if(G<=$.lookahead)return G;return $.lookahead}function I1($){var q=$.w_size,Q,K,J,Z,G;do{if(Z=$.window_size-$.lookahead-$.strstart,$.strstart>=q+(q-L2)){r0.arraySet($.window,$.window,q,q,0),$.match_start-=q,$.strstart-=q,$.block_start-=q,K=$.hash_size,Q=K;do J=$.head[--Q],$.head[Q]=J>=q?J-q:0;while(--K);K=q,Q=K;do J=$.prev[--Q],$.prev[Q]=J>=q?J-q:0;while(--K);Z+=q}if($.strm.avail_in===0)break;if(K=zZ($.strm,$.window,$.strstart+$.lookahead,Z),$.lookahead+=K,$.lookahead+$.insert>=f0){G=$.strstart-$.insert,$.ins_h=$.window[G],$.ins_h=($.ins_h<<$.hash_shift^$.window[G+1])&$.hash_mask;while($.insert)if($.ins_h=($.ins_h<<$.hash_shift^$.window[G+f0-1])&$.hash_mask,$.prev[G&$.w_mask]=$.head[$.ins_h],$.head[$.ins_h]=G,G++,$.insert--,$.lookahead+$.insert$.pending_buf_size-5)Q=$.pending_buf_size-5;for(;;){if($.lookahead<=1){if(I1($),$.lookahead===0&&q===C1)return c0;if($.lookahead===0)break}$.strstart+=$.lookahead,$.lookahead=0;var K=$.block_start+Q;if($.strstart===0||$.strstart>=K){if($.lookahead=$.strstart-K,$.strstart=K,d0($,!1),$.strm.avail_out===0)return c0}if($.strstart-$.block_start>=$.w_size-L2){if(d0($,!1),$.strm.avail_out===0)return c0}}if($.insert=0,q===Z1){if(d0($,!0),$.strm.avail_out===0)return R1;return U6}if($.strstart>$.block_start){if(d0($,!1),$.strm.avail_out===0)return c0}return c0}function g4($,q){var Q,K;for(;;){if($.lookahead=f0)$.ins_h=($.ins_h<<$.hash_shift^$.window[$.strstart+f0-1])&$.hash_mask,Q=$.prev[$.strstart&$.w_mask]=$.head[$.ins_h],$.head[$.ins_h]=$.strstart;if(Q!==0&&$.strstart-Q<=$.w_size-L2)$.match_length=kQ($,Q);if($.match_length>=f0)if(K=M2._tr_tally($,$.strstart-$.match_start,$.match_length-f0),$.lookahead-=$.match_length,$.match_length<=$.max_lazy_match&&$.lookahead>=f0){$.match_length--;do $.strstart++,$.ins_h=($.ins_h<<$.hash_shift^$.window[$.strstart+f0-1])&$.hash_mask,Q=$.prev[$.strstart&$.w_mask]=$.head[$.ins_h],$.head[$.ins_h]=$.strstart;while(--$.match_length!==0);$.strstart++}else $.strstart+=$.match_length,$.match_length=0,$.ins_h=$.window[$.strstart],$.ins_h=($.ins_h<<$.hash_shift^$.window[$.strstart+1])&$.hash_mask;else K=M2._tr_tally($,0,$.window[$.strstart]),$.lookahead--,$.strstart++;if(K){if(d0($,!1),$.strm.avail_out===0)return c0}}if($.insert=$.strstart=f0)$.ins_h=($.ins_h<<$.hash_shift^$.window[$.strstart+f0-1])&$.hash_mask,Q=$.prev[$.strstart&$.w_mask]=$.head[$.ins_h],$.head[$.ins_h]=$.strstart;if($.prev_length=$.match_length,$.prev_match=$.match_start,$.match_length=f0-1,Q!==0&&$.prev_length<$.max_lazy_match&&$.strstart-Q<=$.w_size-L2){if($.match_length=kQ($,Q),$.match_length<=5&&($.strategy===lU||$.match_length===f0&&$.strstart-$.match_start>4096))$.match_length=f0-1}if($.prev_length>=f0&&$.match_length<=$.prev_length){J=$.strstart+$.lookahead-f0,K=M2._tr_tally($,$.strstart-1-$.prev_match,$.prev_length-f0),$.lookahead-=$.prev_length-1,$.prev_length-=2;do if(++$.strstart<=J)$.ins_h=($.ins_h<<$.hash_shift^$.window[$.strstart+f0-1])&$.hash_mask,Q=$.prev[$.strstart&$.w_mask]=$.head[$.ins_h],$.head[$.ins_h]=$.strstart;while(--$.prev_length!==0);if($.match_available=0,$.match_length=f0-1,$.strstart++,K){if(d0($,!1),$.strm.avail_out===0)return c0}}else if($.match_available){if(K=M2._tr_tally($,0,$.window[$.strstart-1]),K)d0($,!1);if($.strstart++,$.lookahead--,$.strm.avail_out===0)return c0}else $.match_available=1,$.strstart++,$.lookahead--}if($.match_available)K=M2._tr_tally($,0,$.window[$.strstart-1]),$.match_available=0;if($.insert=$.strstart=f0&&$.strstart>0){if(J=$.strstart-1,K=G[J],K===G[++J]&&K===G[++J]&&K===G[++J]){Z=$.strstart+V1;do;while(K===G[++J]&&K===G[++J]&&K===G[++J]&&K===G[++J]&&K===G[++J]&&K===G[++J]&&K===G[++J]&&K===G[++J]&&J$.lookahead)$.match_length=$.lookahead}}if($.match_length>=f0)Q=M2._tr_tally($,1,$.match_length-f0),$.lookahead-=$.match_length,$.strstart+=$.match_length,$.match_length=0;else Q=M2._tr_tally($,0,$.window[$.strstart]),$.lookahead--,$.strstart++;if(Q){if(d0($,!1),$.strm.avail_out===0)return c0}}if($.insert=0,q===Z1){if(d0($,!0),$.strm.avail_out===0)return R1;return U6}if($.last_lit){if(d0($,!1),$.strm.avail_out===0)return c0}return s6}function wZ($,q){var Q;for(;;){if($.lookahead===0){if(I1($),$.lookahead===0){if(q===C1)return c0;break}}if($.match_length=0,Q=M2._tr_tally($,0,$.window[$.strstart]),$.lookahead--,$.strstart++,Q){if(d0($,!1),$.strm.avail_out===0)return c0}}if($.insert=0,q===Z1){if(d0($,!0),$.strm.avail_out===0)return R1;return U6}if($.last_lit){if(d0($,!1),$.strm.avail_out===0)return c0}return s6}function h2($,q,Q,K,J){this.good_length=$,this.max_lazy=q,this.nice_length=Q,this.max_chain=K,this.func=J}var V6;V6=[new h2(0,0,0,0,FZ),new h2(4,4,8,4,g4),new h2(4,5,16,8,g4),new h2(4,6,32,32,g4),new h2(4,4,16,16,J6),new h2(8,16,32,32,J6),new h2(8,16,128,128,J6),new h2(8,32,128,256,J6),new h2(32,128,258,1024,J6),new h2(32,258,258,4096,J6)];function NZ($){$.window_size=2*$.w_size,J1($.head),$.max_lazy_match=V6[$.level].max_lazy,$.good_match=V6[$.level].good_length,$.nice_match=V6[$.level].nice_length,$.max_chain_length=V6[$.level].max_chain,$.strstart=0,$.block_start=0,$.lookahead=0,$.insert=0,$.match_length=$.prev_length=f0-1,$.match_available=0,$.ins_h=0}function YZ(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=m8,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new r0.Buf16(ZZ*2),this.dyn_dtree=new r0.Buf16((2*VZ+1)*2),this.bl_tree=new r0.Buf16((2*UZ+1)*2),J1(this.dyn_ltree),J1(this.dyn_dtree),J1(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new r0.Buf16(GZ+1),this.heap=new r0.Buf16(2*A4+1),J1(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new r0.Buf16(2*A4+1),J1(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function DQ($){var q;if(!$||!$.state)return U1($,w2);if($.total_in=$.total_out=0,$.data_type=eU,q=$.state,q.pending=0,q.pending_out=0,q.wrap<0)q.wrap=-q.wrap;return q.status=q.wrap?p8:f1,$.adler=q.wrap===2?0:1,q.last_flush=C1,M2._tr_init(q),x2}function LQ($){var q=DQ($);if(q===x2)NZ($.state);return q}function kZ($,q){if(!$||!$.state)return w2;if($.state.wrap!==2)return w2;return $.state.gzhead=q,x2}function HQ($,q,Q,K,J,Z){if(!$)return w2;var G=1;if(q===aU)q=6;if(K<0)G=0,K=-K;else if(K>15)G=2,K-=16;if(J<1||J>$Z||Q!==m8||K<8||K>15||q<0||q>9||Z<0||Z>sU)return U1($,w2);if(K===8)K=9;var W=new YZ;return $.state=W,W.strm=$,W.wrap=G,W.gzhead=null,W.w_bits=K,W.w_size=1<MQ||q<0)return $?U1($,w2):w2;if(K=$.state,!$.output||!$.input&&$.avail_in!==0||K.status===r6&&q!==Z1)return U1($,$.avail_out===0?j4:w2);if(K.strm=$,Q=K.last_flush,K.last_flush=q,K.status===p8)if(K.wrap===2)if($.adler=0,C0(K,31),C0(K,139),C0(K,8),!K.gzhead)C0(K,0),C0(K,0),C0(K,0),C0(K,0),C0(K,0),C0(K,K.level===9?2:K.strategy>=c8||K.level<2?4:0),C0(K,BZ),K.status=f1;else{if(C0(K,(K.gzhead.text?1:0)+(K.gzhead.hcrc?2:0)+(!K.gzhead.extra?0:4)+(!K.gzhead.name?0:8)+(!K.gzhead.comment?0:16)),C0(K,K.gzhead.time&255),C0(K,K.gzhead.time>>8&255),C0(K,K.gzhead.time>>16&255),C0(K,K.gzhead.time>>24&255),C0(K,K.level===9?2:K.strategy>=c8||K.level<2?4:0),C0(K,K.gzhead.os&255),K.gzhead.extra&&K.gzhead.extra.length)C0(K,K.gzhead.extra.length&255),C0(K,K.gzhead.extra.length>>8&255);if(K.gzhead.hcrc)$.adler=q1($.adler,K.pending_buf,K.pending,0);K.gzindex=0,K.status=X4}else{var G=m8+(K.w_bits-8<<4)<<8,W=-1;if(K.strategy>=c8||K.level<2)W=0;else if(K.level<6)W=1;else if(K.level===6)W=2;else W=3;if(G|=W<<6,K.strstart!==0)G|=WZ;if(G+=31-G%31,K.status=f1,l6(K,G),K.strstart!==0)l6(K,$.adler>>>16),l6(K,$.adler&65535);$.adler=1}if(K.status===X4)if(K.gzhead.extra){J=K.pending;while(K.gzindex<(K.gzhead.extra.length&65535)){if(K.pending===K.pending_buf_size){if(K.gzhead.hcrc&&K.pending>J)$.adler=q1($.adler,K.pending_buf,K.pending-J,J);if(K1($),J=K.pending,K.pending===K.pending_buf_size)break}C0(K,K.gzhead.extra[K.gzindex]&255),K.gzindex++}if(K.gzhead.hcrc&&K.pending>J)$.adler=q1($.adler,K.pending_buf,K.pending-J,J);if(K.gzindex===K.gzhead.extra.length)K.gzindex=0,K.status=b8}else K.status=b8;if(K.status===b8)if(K.gzhead.name){J=K.pending;do{if(K.pending===K.pending_buf_size){if(K.gzhead.hcrc&&K.pending>J)$.adler=q1($.adler,K.pending_buf,K.pending-J,J);if(K1($),J=K.pending,K.pending===K.pending_buf_size){Z=1;break}}if(K.gzindexJ)$.adler=q1($.adler,K.pending_buf,K.pending-J,J);if(Z===0)K.gzindex=0,K.status=n8}else K.status=n8;if(K.status===n8)if(K.gzhead.comment){J=K.pending;do{if(K.pending===K.pending_buf_size){if(K.gzhead.hcrc&&K.pending>J)$.adler=q1($.adler,K.pending_buf,K.pending-J,J);if(K1($),J=K.pending,K.pending===K.pending_buf_size){Z=1;break}}if(K.gzindexJ)$.adler=q1($.adler,K.pending_buf,K.pending-J,J);if(Z===0)K.status=d8}else K.status=d8;if(K.status===d8)if(K.gzhead.hcrc){if(K.pending+2>K.pending_buf_size)K1($);if(K.pending+2<=K.pending_buf_size)C0(K,$.adler&255),C0(K,$.adler>>8&255),$.adler=0,K.status=f1}else K.status=f1;if(K.pending!==0){if(K1($),$.avail_out===0)return K.last_flush=-1,x2}else if($.avail_in===0&&NQ(q)<=NQ(Q)&&q!==Z1)return U1($,j4);if(K.status===r6&&$.avail_in!==0)return U1($,j4);if($.avail_in!==0||K.lookahead!==0||q!==C1&&K.status!==r6){var B=K.strategy===c8?wZ(K,q):K.strategy===rU?MZ(K,q):V6[K.level].func(K,q);if(B===R1||B===U6)K.status=r6;if(B===c0||B===R1){if($.avail_out===0)K.last_flush=-1;return x2}if(B===s6){if(q===pU)M2._tr_align(K);else if(q!==MQ){if(M2._tr_stored_block(K,0,0,!1),q===iU){if(J1(K.head),K.lookahead===0)K.strstart=0,K.block_start=0,K.insert=0}}if(K1($),$.avail_out===0)return K.last_flush=-1,x2}}if(q!==Z1)return x2;if(K.wrap<=0)return wQ;if(K.wrap===2)C0(K,$.adler&255),C0(K,$.adler>>8&255),C0(K,$.adler>>16&255),C0(K,$.adler>>24&255),C0(K,$.total_in&255),C0(K,$.total_in>>8&255),C0(K,$.total_in>>16&255),C0(K,$.total_in>>24&255);else l6(K,$.adler>>>16),l6(K,$.adler&65535);if(K1($),K.wrap>0)K.wrap=-K.wrap;return K.pending!==0?x2:wQ}function HZ($){var q;if(!$||!$.state)return w2;if(q=$.state.status,q!==p8&&q!==X4&&q!==b8&&q!==n8&&q!==d8&&q!==f1&&q!==r6)return U1($,w2);return $.state=null,q===f1?U1($,oU):x2}function vZ($,q){var Q=q.length,K,J,Z,G,W,B,V,U;if(!$||!$.state)return w2;if(K=$.state,G=K.wrap,G===2||G===1&&K.status!==p8||K.lookahead)return w2;if(G===1)$.adler=YQ($.adler,q,Q,0);if(K.wrap=0,Q>=K.w_size){if(G===0)J1(K.head),K.strstart=0,K.block_start=0,K.insert=0;U=new r0.Buf8(K.w_size),r0.arraySet(U,q,Q-K.w_size,K.w_size,0),q=U,Q=K.w_size}W=$.avail_in,B=$.next_in,V=$.input,$.avail_in=Q,$.next_in=0,$.input=q,I1(K);while(K.lookahead>=f0){J=K.strstart,Z=K.lookahead-(f0-1);do K.ins_h=(K.ins_h<{var i8=d2(),fQ=!0,RQ=!0;try{String.fromCharCode.apply(null,[0])}catch($){fQ=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch($){RQ=!1}var t6=new i8.Buf8(256);for(P2=0;P2<256;P2++)t6[P2]=P2>=252?6:P2>=248?5:P2>=240?4:P2>=224?3:P2>=192?2:1;var P2;t6[254]=t6[254]=1;Z6.string2buf=function($){var q,Q,K,J,Z,G=$.length,W=0;for(J=0;J>>6,q[Z++]=128|Q&63;else if(Q<65536)q[Z++]=224|Q>>>12,q[Z++]=128|Q>>>6&63,q[Z++]=128|Q&63;else q[Z++]=240|Q>>>18,q[Z++]=128|Q>>>12&63,q[Z++]=128|Q>>>6&63,q[Z++]=128|Q&63}return q};function IQ($,q){if(q<65534){if($.subarray&&RQ||!$.subarray&&fQ)return String.fromCharCode.apply(null,i8.shrinkBuf($,q))}var Q="";for(var K=0;K4){W[K++]=65533,Q+=Z-1;continue}J&=Z===2?31:Z===3?15:7;while(Z>1&&Q1){W[K++]=65533;continue}if(J<65536)W[K++]=J;else J-=65536,W[K++]=55296|J>>10&1023,W[K++]=56320|J&1023}return IQ(W,K)};Z6.utf8border=function($,q){var Q;if(q=q||$.length,q>$.length)q=$.length;Q=q-1;while(Q>=0&&($[Q]&192)===128)Q--;if(Q<0)return q;if(Q===0)return q;return Q+t6[$[Q]]>q?Q:q}});var h4=N0((cz,CQ)=>{function fZ(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}CQ.exports=fZ});var XQ=N0((Q8)=>{var e6=vQ(),$8=d2(),O4=y4(),P4=_8(),RZ=h4(),AQ=Object.prototype.toString,IZ=0,x4=4,G6=0,jQ=1,gQ=2,CZ=-1,jZ=0,gZ=8;function j1($){if(!(this instanceof j1))return new j1($);this.options=$8.assign({level:CZ,method:gZ,chunkSize:16384,windowBits:15,memLevel:8,strategy:jZ,to:""},$||{});var q=this.options;if(q.raw&&q.windowBits>0)q.windowBits=-q.windowBits;else if(q.gzip&&q.windowBits>0&&q.windowBits<16)q.windowBits+=16;this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new RZ,this.strm.avail_out=0;var Q=e6.deflateInit2(this.strm,q.level,q.method,q.windowBits,q.memLevel,q.strategy);if(Q!==G6)throw Error(P4[Q]);if(q.header)e6.deflateSetHeader(this.strm,q.header);if(q.dictionary){var K;if(typeof q.dictionary==="string")K=O4.string2buf(q.dictionary);else if(AQ.call(q.dictionary)==="[object ArrayBuffer]")K=new Uint8Array(q.dictionary);else K=q.dictionary;if(Q=e6.deflateSetDictionary(this.strm,K),Q!==G6)throw Error(P4[Q]);this._dict_set=!0}}j1.prototype.push=function($,q){var Q=this.strm,K=this.options.chunkSize,J,Z;if(this.ended)return!1;if(Z=q===~~q?q:q===!0?x4:IZ,typeof $==="string")Q.input=O4.string2buf($);else if(AQ.call($)==="[object ArrayBuffer]")Q.input=new Uint8Array($);else Q.input=$;Q.next_in=0,Q.avail_in=Q.input.length;do{if(Q.avail_out===0)Q.output=new $8.Buf8(K),Q.next_out=0,Q.avail_out=K;if(J=e6.deflate(Q,Z),J!==jQ&&J!==G6)return this.onEnd(J),this.ended=!0,!1;if(Q.avail_out===0||Q.avail_in===0&&(Z===x4||Z===gQ))if(this.options.to==="string")this.onData(O4.buf2binstring($8.shrinkBuf(Q.output,Q.next_out)));else this.onData($8.shrinkBuf(Q.output,Q.next_out))}while((Q.avail_in>0||Q.avail_out===0)&&J!==jQ);if(Z===x4)return J=e6.deflateEnd(this.strm),this.onEnd(J),this.ended=!0,J===G6;if(Z===gQ)return this.onEnd(G6),Q.avail_out=0,!0;return!0};j1.prototype.onData=function($){this.chunks.push($)};j1.prototype.onEnd=function($){if($===G6)if(this.options.to==="string")this.result=this.chunks.join("");else this.result=$8.flattenChunks(this.chunks);this.chunks=[],this.err=$,this.msg=this.strm.msg};function T4($,q){var Q=new j1(q);if(Q.push($,!0),Q.err)throw Q.msg||P4[Q.err];return Q.result}function AZ($,q){return q=q||{},q.raw=!0,T4($,q)}function XZ($,q){return q=q||{},q.gzip=!0,T4($,q)}Q8.Deflate=j1;Q8.deflate=T4;Q8.deflateRaw=AZ;Q8.gzip=XZ});var hQ=N0((nz,yQ)=>{var o8=30,yZ=12;yQ.exports=function(q,Q){var K,J,Z,G,W,B,V,U,w,F,M,k,f,L,D,z,N,H,v,j,n,d,_,X,P;K=q.state,J=q.next_in,X=q.input,Z=J+(q.avail_in-5),G=q.next_out,P=q.output,W=G-(Q-q.avail_out),B=G+(q.avail_out-257),V=K.dmax,U=K.wsize,w=K.whave,F=K.wnext,M=K.window,k=K.hold,f=K.bits,L=K.lencode,D=K.distcode,z=(1<>>24,k>>>=v,f-=v,v=H>>>16&255,v===0)P[G++]=H&65535;else if(v&16){if(j=H&65535,v&=15,v){if(f>>=v,f-=v}if(f<15)k+=X[J++]<>>24,k>>>=v,f-=v,v=H>>>16&255,v&16){if(n=H&65535,v&=15,fV){q.msg="invalid distance too far back",K.mode=o8;break $}if(k>>>=v,f-=v,v=G-W,n>v){if(v=n-v,v>w){if(K.sane){q.msg="invalid distance too far back",K.mode=o8;break $}}if(d=0,_=M,F===0){if(d+=U-v,v2)P[G++]=_[d++],P[G++]=_[d++],P[G++]=_[d++],j-=3;if(j){if(P[G++]=_[d++],j>1)P[G++]=_[d++]}}else{d=G-n;do P[G++]=P[d++],P[G++]=P[d++],P[G++]=P[d++],j-=3;while(j>2);if(j){if(P[G++]=P[d++],j>1)P[G++]=P[d++]}}}else if((v&64)===0){H=D[(H&65535)+(k&(1<>3,J-=j,f-=j<<3,k&=(1<{var xQ=d2(),W6=15,OQ=852,PQ=592,TQ=0,u4=1,uQ=2,hZ=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],xZ=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],OZ=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],PZ=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];SQ.exports=function(q,Q,K,J,Z,G,W,B){var V=B.bits,U=0,w=0,F=0,M=0,k=0,f=0,L=0,D=0,z=0,N=0,H,v,j,n,d,_=null,X=0,P,g=new xQ.Buf16(W6+1),c=new xQ.Buf16(W6+1),h=null,x=0,l,$0,Z0;for(U=0;U<=W6;U++)g[U]=0;for(w=0;w=1;M--)if(g[M]!==0)break;if(k>M)k=M;if(M===0)return Z[G++]=20971520,Z[G++]=20971520,B.bits=1,0;for(F=1;F0&&(q===TQ||M!==1))return-1;c[1]=0;for(U=1;UOQ||q===uQ&&z>PQ)return 1;for(;;){if(l=U-L,W[w]P)$0=h[x+W[w]],Z0=_[X+W[w]];else $0=96,Z0=0;H=1<>L)+v]=l<<24|$0<<16|Z0|0;while(v!==0);H=1<>=1;if(H!==0)N&=H-1,N+=H;else N=0;if(w++,--g[U]===0){if(U===M)break;U=Q[K+W[w]]}if(U>k&&(N&n)!==j){if(L===0)L=k;d+=F,f=U-L,D=1<OQ||q===uQ&&z>PQ)return 1;j=N&n,Z[j]=k<<24|f<<16|d-G|0}}if(N!==0)Z[d+N]=U-L<<24|4194304|0;return B.bits=k,0}});var Lq=N0((H2)=>{var U2=d2(),n4=I4(),T2=C4(),TZ=hQ(),q8=EQ(),uZ=0,Bq=1,zq=2,_Q=4,SZ=5,a8=6,g1=0,EZ=1,_Z=2,N2=-2,Fq=-3,d4=-4,cZ=-5,cQ=8,Mq=1,bQ=2,nQ=3,dQ=4,mQ=5,pQ=6,iQ=7,oQ=8,aQ=9,lQ=10,s8=11,p2=12,S4=13,rQ=14,E4=15,sQ=16,tQ=17,eQ=18,$q=19,l8=20,r8=21,Qq=22,qq=23,Kq=24,Jq=25,Vq=26,_4=27,Uq=28,Zq=29,x0=30,m4=31,bZ=32,nZ=852,dZ=592,mZ=15,pZ=mZ;function Gq($){return($>>>24&255)+($>>>8&65280)+(($&65280)<<8)+(($&255)<<24)}function iZ(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new U2.Buf16(320),this.work=new U2.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function wq($){var q;if(!$||!$.state)return N2;if(q=$.state,$.total_in=$.total_out=q.total=0,$.msg="",q.wrap)$.adler=q.wrap&1;return q.mode=Mq,q.last=0,q.havedict=0,q.dmax=32768,q.head=null,q.hold=0,q.bits=0,q.lencode=q.lendyn=new U2.Buf32(nZ),q.distcode=q.distdyn=new U2.Buf32(dZ),q.sane=1,q.back=-1,g1}function Nq($){var q;if(!$||!$.state)return N2;return q=$.state,q.wsize=0,q.whave=0,q.wnext=0,wq($)}function Yq($,q){var Q,K;if(!$||!$.state)return N2;if(K=$.state,q<0)Q=0,q=-q;else if(Q=(q>>4)+1,q<48)q&=15;if(q&&(q<8||q>15))return N2;if(K.window!==null&&K.wbits!==q)K.window=null;return K.wrap=Q,K.wbits=q,Nq($)}function kq($,q){var Q,K;if(!$)return N2;if(K=new iZ,$.state=K,K.window=null,Q=Yq($,q),Q!==g1)$.state=null;return Q}function oZ($){return kq($,pZ)}var Wq=!0,c4,b4;function aZ($){if(Wq){var q;c4=new U2.Buf32(512),b4=new U2.Buf32(32),q=0;while(q<144)$.lens[q++]=8;while(q<256)$.lens[q++]=9;while(q<280)$.lens[q++]=7;while(q<288)$.lens[q++]=8;q8(Bq,$.lens,0,288,c4,0,$.work,{bits:9}),q=0;while(q<32)$.lens[q++]=5;q8(zq,$.lens,0,32,b4,0,$.work,{bits:5}),Wq=!1}$.lencode=c4,$.lenbits=9,$.distcode=b4,$.distbits=5}function Dq($,q,Q,K){var J,Z=$.state;if(Z.window===null)Z.wsize=1<=Z.wsize)U2.arraySet(Z.window,q,Q-Z.wsize,Z.wsize,0),Z.wnext=0,Z.whave=Z.wsize;else{if(J=Z.wsize-Z.wnext,J>K)J=K;if(U2.arraySet(Z.window,q,Q-K,J,Z.wnext),K-=J,K)U2.arraySet(Z.window,q,Q-K,K,0),Z.wnext=K,Z.whave=Z.wsize;else{if(Z.wnext+=J,Z.wnext===Z.wsize)Z.wnext=0;if(Z.whave>>8&255,Q.check=T2(Q.check,_,2,0),V=0,U=0,Q.mode=bQ;break}if(Q.flags=0,Q.head)Q.head.done=!1;if(!(Q.wrap&1)||(((V&255)<<8)+(V>>8))%31){$.msg="incorrect header check",Q.mode=x0;break}if((V&15)!==cQ){$.msg="unknown compression method",Q.mode=x0;break}if(V>>>=4,U-=4,n=(V&15)+8,Q.wbits===0)Q.wbits=n;else if(n>Q.wbits){$.msg="invalid window size",Q.mode=x0;break}Q.dmax=1<>8&1;if(Q.flags&512)_[0]=V&255,_[1]=V>>>8&255,Q.check=T2(Q.check,_,2,0);V=0,U=0,Q.mode=nQ;case nQ:while(U<32){if(W===0)break $;W--,V+=K[Z++]<>>8&255,_[2]=V>>>16&255,_[3]=V>>>24&255,Q.check=T2(Q.check,_,4,0);V=0,U=0,Q.mode=dQ;case dQ:while(U<16){if(W===0)break $;W--,V+=K[Z++]<>8;if(Q.flags&512)_[0]=V&255,_[1]=V>>>8&255,Q.check=T2(Q.check,_,2,0);V=0,U=0,Q.mode=mQ;case mQ:if(Q.flags&1024){while(U<16){if(W===0)break $;W--,V+=K[Z++]<>>8&255,Q.check=T2(Q.check,_,2,0);V=0,U=0}else if(Q.head)Q.head.extra=null;Q.mode=pQ;case pQ:if(Q.flags&1024){if(M=Q.length,M>W)M=W;if(M){if(Q.head){if(n=Q.head.extra_len-Q.length,!Q.head.extra)Q.head.extra=Array(Q.head.extra_len);U2.arraySet(Q.head.extra,K,Z,M,n)}if(Q.flags&512)Q.check=T2(Q.check,K,M,Z);W-=M,Z+=M,Q.length-=M}if(Q.length)break $}Q.length=0,Q.mode=iQ;case iQ:if(Q.flags&2048){if(W===0)break $;M=0;do if(n=K[Z+M++],Q.head&&n&&Q.length<65536)Q.head.name+=String.fromCharCode(n);while(n&&M>9&1,Q.head.done=!0;$.adler=Q.check=0,Q.mode=p2;break;case lQ:while(U<32){if(W===0)break $;W--,V+=K[Z++]<>>=U&7,U-=U&7,Q.mode=_4;break}while(U<3){if(W===0)break $;W--,V+=K[Z++]<>>=1,U-=1,V&3){case 0:Q.mode=rQ;break;case 1:if(aZ(Q),Q.mode=l8,q===a8){V>>>=2,U-=2;break $}break;case 2:Q.mode=tQ;break;case 3:$.msg="invalid block type",Q.mode=x0}V>>>=2,U-=2;break;case rQ:V>>>=U&7,U-=U&7;while(U<32){if(W===0)break $;W--,V+=K[Z++]<>>16^65535)){$.msg="invalid stored block lengths",Q.mode=x0;break}if(Q.length=V&65535,V=0,U=0,Q.mode=E4,q===a8)break $;case E4:Q.mode=sQ;case sQ:if(M=Q.length,M){if(M>W)M=W;if(M>B)M=B;if(M===0)break $;U2.arraySet(J,K,Z,M,G),W-=M,Z+=M,B-=M,G+=M,Q.length-=M;break}Q.mode=p2;break;case tQ:while(U<14){if(W===0)break $;W--,V+=K[Z++]<>>=5,U-=5,Q.ndist=(V&31)+1,V>>>=5,U-=5,Q.ncode=(V&15)+4,V>>>=4,U-=4,Q.nlen>286||Q.ndist>30){$.msg="too many length or distance symbols",Q.mode=x0;break}Q.have=0,Q.mode=eQ;case eQ:while(Q.have>>=3,U-=3}while(Q.have<19)Q.lens[g[Q.have++]]=0;if(Q.lencode=Q.lendyn,Q.lenbits=7,X={bits:Q.lenbits},d=q8(uZ,Q.lens,0,19,Q.lencode,0,Q.work,X),Q.lenbits=X.bits,d){$.msg="invalid code lengths set",Q.mode=x0;break}Q.have=0,Q.mode=$q;case $q:while(Q.have>>24,z=L>>>16&255,N=L&65535,D<=U)break;if(W===0)break $;W--,V+=K[Z++]<>>=D,U-=D,Q.lens[Q.have++]=N;else{if(N===16){P=D+2;while(U>>=D,U-=D,Q.have===0){$.msg="invalid bit length repeat",Q.mode=x0;break}n=Q.lens[Q.have-1],M=3+(V&3),V>>>=2,U-=2}else if(N===17){P=D+3;while(U>>=D,U-=D,n=0,M=3+(V&7),V>>>=3,U-=3}else{P=D+7;while(U>>=D,U-=D,n=0,M=11+(V&127),V>>>=7,U-=7}if(Q.have+M>Q.nlen+Q.ndist){$.msg="invalid bit length repeat",Q.mode=x0;break}while(M--)Q.lens[Q.have++]=n}}if(Q.mode===x0)break;if(Q.lens[256]===0){$.msg="invalid code -- missing end-of-block",Q.mode=x0;break}if(Q.lenbits=9,X={bits:Q.lenbits},d=q8(Bq,Q.lens,0,Q.nlen,Q.lencode,0,Q.work,X),Q.lenbits=X.bits,d){$.msg="invalid literal/lengths set",Q.mode=x0;break}if(Q.distbits=6,Q.distcode=Q.distdyn,X={bits:Q.distbits},d=q8(zq,Q.lens,Q.nlen,Q.ndist,Q.distcode,0,Q.work,X),Q.distbits=X.bits,d){$.msg="invalid distances set",Q.mode=x0;break}if(Q.mode=l8,q===a8)break $;case l8:Q.mode=r8;case r8:if(W>=6&&B>=258){if($.next_out=G,$.avail_out=B,$.next_in=Z,$.avail_in=W,Q.hold=V,Q.bits=U,TZ($,F),G=$.next_out,J=$.output,B=$.avail_out,Z=$.next_in,K=$.input,W=$.avail_in,V=Q.hold,U=Q.bits,Q.mode===p2)Q.back=-1;break}Q.back=0;for(;;){if(L=Q.lencode[V&(1<>>24,z=L>>>16&255,N=L&65535,D<=U)break;if(W===0)break $;W--,V+=K[Z++]<>H)],D=L>>>24,z=L>>>16&255,N=L&65535,H+D<=U)break;if(W===0)break $;W--,V+=K[Z++]<>>=H,U-=H,Q.back+=H}if(V>>>=D,U-=D,Q.back+=D,Q.length=N,z===0){Q.mode=Vq;break}if(z&32){Q.back=-1,Q.mode=p2;break}if(z&64){$.msg="invalid literal/length code",Q.mode=x0;break}Q.extra=z&15,Q.mode=Qq;case Qq:if(Q.extra){P=Q.extra;while(U>>=Q.extra,U-=Q.extra,Q.back+=Q.extra}Q.was=Q.length,Q.mode=qq;case qq:for(;;){if(L=Q.distcode[V&(1<>>24,z=L>>>16&255,N=L&65535,D<=U)break;if(W===0)break $;W--,V+=K[Z++]<>H)],D=L>>>24,z=L>>>16&255,N=L&65535,H+D<=U)break;if(W===0)break $;W--,V+=K[Z++]<>>=H,U-=H,Q.back+=H}if(V>>>=D,U-=D,Q.back+=D,z&64){$.msg="invalid distance code",Q.mode=x0;break}Q.offset=N,Q.extra=z&15,Q.mode=Kq;case Kq:if(Q.extra){P=Q.extra;while(U>>=Q.extra,U-=Q.extra,Q.back+=Q.extra}if(Q.offset>Q.dmax){$.msg="invalid distance too far back",Q.mode=x0;break}Q.mode=Jq;case Jq:if(B===0)break $;if(M=F-B,Q.offset>M){if(M=Q.offset-M,M>Q.whave){if(Q.sane){$.msg="invalid distance too far back",Q.mode=x0;break}}if(M>Q.wnext)M-=Q.wnext,k=Q.wsize-M;else k=Q.wnext-M;if(M>Q.length)M=Q.length;f=Q.window}else f=J,k=G-Q.offset,M=Q.length;if(M>B)M=B;B-=M,Q.length-=M;do J[G++]=f[k++];while(--M);if(Q.length===0)Q.mode=r8;break;case Vq:if(B===0)break $;J[G++]=Q.length,B--,Q.mode=r8;break;case _4:if(Q.wrap){while(U<32){if(W===0)break $;W--,V|=K[Z++]<{Hq.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}});var fq=N0((iz,vq)=>{function eZ(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}vq.exports=eZ});var Iq=N0((J8)=>{var B6=Lq(),K8=d2(),t8=y4(),E0=p4(),i4=_8(),$G=h4(),QG=fq(),Rq=Object.prototype.toString;function A1($){if(!(this instanceof A1))return new A1($);this.options=K8.assign({chunkSize:16384,windowBits:0,to:""},$||{});var q=this.options;if(q.raw&&q.windowBits>=0&&q.windowBits<16){if(q.windowBits=-q.windowBits,q.windowBits===0)q.windowBits=-15}if(q.windowBits>=0&&q.windowBits<16&&!($&&$.windowBits))q.windowBits+=32;if(q.windowBits>15&&q.windowBits<48){if((q.windowBits&15)===0)q.windowBits|=15}this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new $G,this.strm.avail_out=0;var Q=B6.inflateInit2(this.strm,q.windowBits);if(Q!==E0.Z_OK)throw Error(i4[Q]);if(this.header=new QG,B6.inflateGetHeader(this.strm,this.header),q.dictionary){if(typeof q.dictionary==="string")q.dictionary=t8.string2buf(q.dictionary);else if(Rq.call(q.dictionary)==="[object ArrayBuffer]")q.dictionary=new Uint8Array(q.dictionary);if(q.raw){if(Q=B6.inflateSetDictionary(this.strm,q.dictionary),Q!==E0.Z_OK)throw Error(i4[Q])}}}A1.prototype.push=function($,q){var Q=this.strm,K=this.options.chunkSize,J=this.options.dictionary,Z,G,W,B,V,U=!1;if(this.ended)return!1;if(G=q===~~q?q:q===!0?E0.Z_FINISH:E0.Z_NO_FLUSH,typeof $==="string")Q.input=t8.binstring2buf($);else if(Rq.call($)==="[object ArrayBuffer]")Q.input=new Uint8Array($);else Q.input=$;Q.next_in=0,Q.avail_in=Q.input.length;do{if(Q.avail_out===0)Q.output=new K8.Buf8(K),Q.next_out=0,Q.avail_out=K;if(Z=B6.inflate(Q,E0.Z_NO_FLUSH),Z===E0.Z_NEED_DICT&&J)Z=B6.inflateSetDictionary(this.strm,J);if(Z===E0.Z_BUF_ERROR&&U===!0)Z=E0.Z_OK,U=!1;if(Z!==E0.Z_STREAM_END&&Z!==E0.Z_OK)return this.onEnd(Z),this.ended=!0,!1;if(Q.next_out){if(Q.avail_out===0||Z===E0.Z_STREAM_END||Q.avail_in===0&&(G===E0.Z_FINISH||G===E0.Z_SYNC_FLUSH))if(this.options.to==="string"){if(W=t8.utf8border(Q.output,Q.next_out),B=Q.next_out-W,V=t8.buf2string(Q.output,W),Q.next_out=B,Q.avail_out=K-B,B)K8.arraySet(Q.output,Q.output,W,B,0);this.onData(V)}else this.onData(K8.shrinkBuf(Q.output,Q.next_out))}if(Q.avail_in===0&&Q.avail_out===0)U=!0}while((Q.avail_in>0||Q.avail_out===0)&&Z!==E0.Z_STREAM_END);if(Z===E0.Z_STREAM_END)G=E0.Z_FINISH;if(G===E0.Z_FINISH)return Z=B6.inflateEnd(this.strm),this.onEnd(Z),this.ended=!0,Z===E0.Z_OK;if(G===E0.Z_SYNC_FLUSH)return this.onEnd(E0.Z_OK),Q.avail_out=0,!0;return!0};A1.prototype.onData=function($){this.chunks.push($)};A1.prototype.onEnd=function($){if($===E0.Z_OK)if(this.options.to==="string")this.result=this.chunks.join("");else this.result=K8.flattenChunks(this.chunks);this.chunks=[],this.err=$,this.msg=this.strm.msg};function o4($,q){var Q=new A1(q);if(Q.push($,!0),Q.err)throw Q.msg||i4[Q.err];return Q.result}function qG($,q){return q=q||{},q.raw=!0,o4($,q)}J8.Inflate=A1;J8.inflate=o4;J8.inflateRaw=qG;J8.ungzip=o4});var gq=N0((az,jq)=>{var KG=d2().assign,JG=XQ(),VG=Iq(),UG=p4(),Cq={};KG(Cq,JG,VG,UG);jq.exports=Cq});var Xq=N0(($5)=>{var ZG=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Uint32Array<"u",GG=gq(),Aq=T0(),e8=V2(),WG=ZG?"uint8array":"array";$5.magic="\b\x00";function X1($,q){e8.call(this,"FlateWorker/"+$),this._pako=null,this._pakoAction=$,this._pakoOptions=q,this.meta={}}Aq.inherits(X1,e8);X1.prototype.processChunk=function($){if(this.meta=$.meta,this._pako===null)this._createPako();this._pako.push(Aq.transformTo(WG,$.data),!1)};X1.prototype.flush=function(){if(e8.prototype.flush.call(this),this._pako===null)this._createPako();this._pako.push([],!0)};X1.prototype.cleanUp=function(){e8.prototype.cleanUp.call(this),this._pako=null};X1.prototype._createPako=function(){this._pako=new GG[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var $=this;this._pako.onData=function(q){$.push({data:q,meta:$.meta})}};$5.compressWorker=function($){return new X1("Deflate",$)};$5.uncompressWorker=function(){return new X1("Inflate",{})}});var l4=N0((a4)=>{var yq=V2();a4.STORE={magic:"\x00\x00",compressWorker:function(){return new yq("STORE compression")},uncompressWorker:function(){return new yq("STORE decompression")}};a4.DEFLATE=Xq()});var r4=N0((y1)=>{y1.LOCAL_FILE_HEADER="PK\x03\x04";y1.CENTRAL_FILE_HEADER="PK\x01\x02";y1.CENTRAL_DIRECTORY_END="PK\x05\x06";y1.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK\x06\x07";y1.ZIP64_CENTRAL_DIRECTORY_END="PK\x06\x06";y1.DATA_DESCRIPTOR="PK\x07\b"});var Pq=N0((tz,Oq)=>{var z6=T0(),F6=V2(),s4=e1(),hq=T8(),Q5=r4(),A0=function($,q){var Q="",K;for(K=0;K>>8;return Q},BG=function($,q){var Q=$;if(!$)Q=q?16893:33204;return(Q&65535)<<16},zG=function($){return($||0)&63},xq=function($,q,Q,K,J,Z){var{file:G,compression:W}=$,B=Z!==s4.utf8encode,V=z6.transformTo("string",Z(G.name)),U=z6.transformTo("string",s4.utf8encode(G.name)),w=G.comment,F=z6.transformTo("string",Z(w)),M=z6.transformTo("string",s4.utf8encode(w)),k=U.length!==G.name.length,f=M.length!==w.length,L,D,z="",N="",H="",v=G.dir,j=G.date,n={crc32:0,compressedSize:0,uncompressedSize:0};if(!q||Q)n.crc32=$.crc32,n.compressedSize=$.compressedSize,n.uncompressedSize=$.uncompressedSize;var d=0;if(q)d|=8;if(!B&&(k||f))d|=2048;var _=0,X=0;if(v)_|=16;if(J==="UNIX")X=798,_|=BG(G.unixPermissions,v);else X=20,_|=zG(G.dosPermissions,v);if(L=j.getUTCHours(),L=L<<6,L=L|j.getUTCMinutes(),L=L<<5,L=L|j.getUTCSeconds()/2,D=j.getUTCFullYear()-1980,D=D<<4,D=D|j.getUTCMonth()+1,D=D<<5,D=D|j.getUTCDate(),k)N=A0(1,1)+A0(hq(V),4)+U,z+="up"+A0(N.length,2)+N;if(f)H=A0(1,1)+A0(hq(F),4)+M,z+="uc"+A0(H.length,2)+H;var P="";P+=` +\x00`,P+=A0(d,2),P+=W.magic,P+=A0(L,2),P+=A0(D,2),P+=A0(n.crc32,4),P+=A0(n.compressedSize,4),P+=A0(n.uncompressedSize,4),P+=A0(V.length,2),P+=A0(z.length,2);var g=Q5.LOCAL_FILE_HEADER+P+V+z,c=Q5.CENTRAL_FILE_HEADER+A0(X,2)+P+A0(F.length,2)+"\x00\x00\x00\x00"+A0(_,4)+A0(K,4)+V+z+F;return{fileRecord:g,dirRecord:c}},FG=function($,q,Q,K,J){var Z="",G=z6.transformTo("string",J(K));return Z=Q5.CENTRAL_DIRECTORY_END+"\x00\x00\x00\x00"+A0($,2)+A0($,2)+A0(q,4)+A0(Q,4)+A0(G.length,2)+G,Z},MG=function($){var q="";return q=Q5.DATA_DESCRIPTOR+A0($.crc32,4)+A0($.compressedSize,4)+A0($.uncompressedSize,4),q};function v2($,q,Q,K){F6.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=q,this.zipPlatform=Q,this.encodeFileName=K,this.streamFiles=$,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}z6.inherits(v2,F6);v2.prototype.push=function($){var q=$.meta.percent||0,Q=this.entriesCount,K=this._sources.length;if(this.accumulate)this.contentBuffer.push($);else this.bytesWritten+=$.data.length,F6.prototype.push.call(this,{data:$.data,meta:{currentFile:this.currentFile,percent:Q?(q+100*(Q-K-1))/Q:100}})};v2.prototype.openedSource=function($){this.currentSourceOffset=this.bytesWritten,this.currentFile=$.file.name;var q=this.streamFiles&&!$.file.dir;if(q){var Q=xq($,q,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:Q.fileRecord,meta:{percent:0}})}else this.accumulate=!0};v2.prototype.closedSource=function($){this.accumulate=!1;var q=this.streamFiles&&!$.file.dir,Q=xq($,q,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(Q.dirRecord),q)this.push({data:MG($),meta:{percent:100}});else{this.push({data:Q.fileRecord,meta:{percent:0}});while(this.contentBuffer.length)this.push(this.contentBuffer.shift())}this.currentFile=null};v2.prototype.flush=function(){var $=this.bytesWritten;for(var q=0;q{var wG=l4(),NG=Pq(),YG=function($,q){var Q=$||q,K=wG[Q];if(!K)throw Error(Q+" is not a valid compression method !");return K};Tq.generateWorker=function($,q,Q){var K=new NG(q.streamFiles,Q,q.platform,q.encodeFileName),J=0;try{$.forEach(function(Z,G){J++;var W=YG(G.options.compression,q.compression),B=G.options.compressionOptions||q.compressionOptions||{},V=G.dir,U=G.date;G._compressWorker(W,B).withStreamInfo("file",{name:Z,dir:V,date:U,comment:G.comment||"",unixPermissions:G.unixPermissions,dosPermissions:G.dosPermissions}).pipe(K)}),K.entriesCount=J}catch(Z){K.error(Z)}return K}});var Eq=N0(($F,Sq)=>{var kG=T0(),q5=V2();function V8($,q){q5.call(this,"Nodejs stream input adapter for "+$),this._upstreamEnded=!1,this._bindStream(q)}kG.inherits(V8,q5);V8.prototype._bindStream=function($){var q=this;this._stream=$,$.pause(),$.on("data",function(Q){q.push({data:Q,meta:{percent:0}})}).on("error",function(Q){if(q.isPaused)this.generatedError=Q;else q.error(Q)}).on("end",function(){if(q.isPaused)q._upstreamEnded=!0;else q.end()})};V8.prototype.pause=function(){if(!q5.prototype.pause.call(this))return!1;return this._stream.pause(),!0};V8.prototype.resume=function(){if(!q5.prototype.resume.call(this))return!1;if(this._upstreamEnded)this.end();else this._stream.resume();return!0};Sq.exports=V8});var aq=N0((QF,oq)=>{var DG=e1(),U8=T0(),nq=V2(),LG=q4(),dq=K4(),_q=u8(),HG=c$(),vG=uq(),cq=T6(),fG=Eq(),mq=function($,q,Q){var K=U8.getTypeOf(q),J,Z=U8.extend(Q||{},dq);if(Z.date=Z.date||new Date,Z.compression!==null)Z.compression=Z.compression.toUpperCase();if(typeof Z.unixPermissions==="string")Z.unixPermissions=parseInt(Z.unixPermissions,8);if(Z.unixPermissions&&Z.unixPermissions&16384)Z.dir=!0;if(Z.dosPermissions&&Z.dosPermissions&16)Z.dir=!0;if(Z.dir)$=pq($);if(Z.createFolders&&(J=RG($)))iq.call(this,J,!0);var G=K==="string"&&Z.binary===!1&&Z.base64===!1;if(!Q||typeof Q.binary>"u")Z.binary=!G;var W=q instanceof _q&&q.uncompressedSize===0;if(W||Z.dir||!q||q.length===0)Z.base64=!1,Z.binary=!0,q="",Z.compression="STORE",K="string";var B=null;if(q instanceof _q||q instanceof nq)B=q;else if(cq.isNode&&cq.isStream(q))B=new fG($,q);else B=U8.prepareContent($,q,Z.binary,Z.optimizedBinaryString,Z.base64);var V=new HG($,B,Z);this.files[$]=V},RG=function($){if($.slice(-1)==="/")$=$.substring(0,$.length-1);var q=$.lastIndexOf("/");return q>0?$.substring(0,q):""},pq=function($){if($.slice(-1)!=="/")$+="/";return $},iq=function($,q){if(q=typeof q<"u"?q:dq.createFolders,$=pq($),!this.files[$])mq.call(this,$,null,{dir:!0,createFolders:q});return this.files[$]};function bq($){return Object.prototype.toString.call($)==="[object RegExp]"}var IG={load:function(){throw Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function($){var q,Q,K;for(q in this.files)if(K=this.files[q],Q=q.slice(this.root.length,q.length),Q&&q.slice(0,this.root.length)===this.root)$(Q,K)},filter:function($){var q=[];return this.forEach(function(Q,K){if($(Q,K))q.push(K)}),q},file:function($,q,Q){if(arguments.length===1)if(bq($)){var K=$;return this.filter(function(Z,G){return!G.dir&&K.test(Z)})}else{var J=this.files[this.root+$];if(J&&!J.dir)return J;else return null}else $=this.root+$,mq.call(this,$,q,Q);return this},folder:function($){if(!$)return this;if(bq($))return this.filter(function(J,Z){return Z.dir&&$.test(J)});var q=this.root+$,Q=iq.call(this,q),K=this.clone();return K.root=Q.name,K},remove:function($){$=this.root+$;var q=this.files[$];if(!q){if($.slice(-1)!=="/")$+="/";q=this.files[$]}if(q&&!q.dir)delete this.files[$];else{var Q=this.filter(function(J,Z){return Z.name.slice(0,$.length)===$});for(var K=0;K{var CG=T0();function lq($){this.data=$,this.length=$.length,this.index=0,this.zero=0}lq.prototype={checkOffset:function($){this.checkIndex(this.index+$)},checkIndex:function($){if(this.length=this.index;Q--)q=(q<<8)+this.byteAt(Q);return this.index+=$,q},readString:function($){return CG.transformTo("string",this.readData($))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var $=this.readInt(4);return new Date(Date.UTC(($>>25&127)+1980,($>>21&15)-1,$>>16&31,$>>11&31,$>>5&63,($&31)<<1))}};rq.exports=lq});var e4=N0((KF,tq)=>{var sq=t4(),jG=T0();function M6($){sq.call(this,$);for(var q=0;q=0;--Z)if(this.data[Z]===q&&this.data[Z+1]===Q&&this.data[Z+2]===K&&this.data[Z+3]===J)return Z-this.zero;return-1};M6.prototype.readAndCheckSignature=function($){var q=$.charCodeAt(0),Q=$.charCodeAt(1),K=$.charCodeAt(2),J=$.charCodeAt(3),Z=this.readData(4);return q===Z[0]&&Q===Z[1]&&K===Z[2]&&J===Z[3]};M6.prototype.readData=function($){if(this.checkOffset($),$===0)return[];var q=this.data.slice(this.zero+this.index,this.zero+this.index+$);return this.index+=$,q};tq.exports=M6});var QK=N0((JF,$K)=>{var eq=t4(),gG=T0();function w6($){eq.call(this,$)}gG.inherits(w6,eq);w6.prototype.byteAt=function($){return this.data.charCodeAt(this.zero+$)};w6.prototype.lastIndexOfSignature=function($){return this.data.lastIndexOf($)-this.zero};w6.prototype.readAndCheckSignature=function($){var q=this.readData(4);return $===q};w6.prototype.readData=function($){this.checkOffset($);var q=this.data.slice(this.zero+this.index,this.zero+this.index+$);return this.index+=$,q};$K.exports=w6});var Q7=N0((VF,KK)=>{var qK=e4(),AG=T0();function $7($){qK.call(this,$)}AG.inherits($7,qK);$7.prototype.readData=function($){if(this.checkOffset($),$===0)return new Uint8Array(0);var q=this.data.subarray(this.zero+this.index,this.zero+this.index+$);return this.index+=$,q};KK.exports=$7});var UK=N0((UF,VK)=>{var JK=Q7(),XG=T0();function q7($){JK.call(this,$)}XG.inherits(q7,JK);q7.prototype.readData=function($){this.checkOffset($);var q=this.data.slice(this.zero+this.index,this.zero+this.index+$);return this.index+=$,q};VK.exports=q7});var K7=N0((ZF,GK)=>{var K5=T0(),ZK=n2(),yG=e4(),hG=QK(),xG=UK(),OG=Q7();GK.exports=function($){var q=K5.getTypeOf($);if(K5.checkSupport(q),q==="string"&&!ZK.uint8array)return new hG($);if(q==="nodebuffer")return new xG($);if(ZK.uint8array)return new OG(K5.transformTo("uint8array",$));return new yG(K5.transformTo("array",$))}});var FK=N0((GF,zK)=>{var J7=K7(),G1=T0(),PG=u8(),WK=T8(),J5=e1(),V5=l4(),TG=n2(),uG=0,SG=3,EG=function($){for(var q in V5){if(!Object.prototype.hasOwnProperty.call(V5,q))continue;if(V5[q].magic===$)return V5[q]}return null};function BK($,q){this.options=$,this.loadOptions=q}BK.prototype={isEncrypted:function(){return(this.bitFlag&1)===1},useUTF8:function(){return(this.bitFlag&2048)===2048},readLocalPart:function($){var q,Q;if($.skip(22),this.fileNameLength=$.readInt(2),Q=$.readInt(2),this.fileName=$.readData(this.fileNameLength),$.skip(Q),this.compressedSize===-1||this.uncompressedSize===-1)throw Error("Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)");if(q=EG(this.compressionMethod),q===null)throw Error("Corrupted zip : compression "+G1.pretty(this.compressionMethod)+" unknown (inner file : "+G1.transformTo("string",this.fileName)+")");this.decompressed=new PG(this.compressedSize,this.uncompressedSize,this.crc32,q,$.readData(this.compressedSize))},readCentralPart:function($){this.versionMadeBy=$.readInt(2),$.skip(2),this.bitFlag=$.readInt(2),this.compressionMethod=$.readString(2),this.date=$.readDate(),this.crc32=$.readInt(4),this.compressedSize=$.readInt(4),this.uncompressedSize=$.readInt(4);var q=$.readInt(2);if(this.extraFieldsLength=$.readInt(2),this.fileCommentLength=$.readInt(2),this.diskNumberStart=$.readInt(2),this.internalFileAttributes=$.readInt(2),this.externalFileAttributes=$.readInt(4),this.localHeaderOffset=$.readInt(4),this.isEncrypted())throw Error("Encrypted zip are not supported");$.skip(q),this.readExtraFields($),this.parseZIP64ExtraField($),this.fileComment=$.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var $=this.versionMadeBy>>8;if(this.dir=this.externalFileAttributes&16?!0:!1,$===uG)this.dosPermissions=this.externalFileAttributes&63;if($===SG)this.unixPermissions=this.externalFileAttributes>>16&65535;if(!this.dir&&this.fileNameStr.slice(-1)==="/")this.dir=!0},parseZIP64ExtraField:function(){if(!this.extraFields[1])return;var $=J7(this.extraFields[1].value);if(this.uncompressedSize===G1.MAX_VALUE_32BITS)this.uncompressedSize=$.readInt(8);if(this.compressedSize===G1.MAX_VALUE_32BITS)this.compressedSize=$.readInt(8);if(this.localHeaderOffset===G1.MAX_VALUE_32BITS)this.localHeaderOffset=$.readInt(8);if(this.diskNumberStart===G1.MAX_VALUE_32BITS)this.diskNumberStart=$.readInt(4)},readExtraFields:function($){var q=$.index+this.extraFieldsLength,Q,K,J;if(!this.extraFields)this.extraFields={};while($.index+4{var _G=K7(),i2=T0(),f2=r4(),cG=FK(),bG=n2();function MK($){this.files=[],this.loadOptions=$}MK.prototype={checkSignature:function($){if(!this.reader.readAndCheckSignature($)){this.reader.index-=4;var q=this.reader.readString(4);throw Error("Corrupted zip or bug: unexpected signature ("+i2.pretty(q)+", expected "+i2.pretty($)+")")}},isSignature:function($,q){var Q=this.reader.index;this.reader.setIndex($);var K=this.reader.readString(4),J=K===q;return this.reader.setIndex(Q),J},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2);var $=this.reader.readData(this.zipCommentLength),q=bG.uint8array?"uint8array":"array",Q=i2.transformTo(q,$);this.zipComment=this.loadOptions.decodeFileName(Q)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.reader.skip(4),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};var $=this.zip64EndOfCentralSize-44,q=0,Q,K,J;while(q<$)Q=this.reader.readInt(2),K=this.reader.readInt(4),J=this.reader.readData(K),this.zip64ExtensibleData[Q]={id:Q,length:K,value:J}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var $,q;for($=0;$0)if(this.isSignature(Q,f2.CENTRAL_FILE_HEADER));else this.reader.zero=J;else if(J<0)throw Error("Corrupted zip: missing "+Math.abs(J)+" bytes.")},prepareReader:function($){this.reader=_G($)},load:function($){this.prepareReader($),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}};wK.exports=MK});var DK=N0((BF,kK)=>{var V7=T0(),U5=r1(),nG=e1(),dG=NK(),mG=U4(),YK=T6();function pG($){return new U5.Promise(function(q,Q){var K=$.decompressed.getContentWorker().pipe(new mG);K.on("error",function(J){Q(J)}).on("end",function(){if(K.streamInfo.crc32!==$.decompressed.crc32)Q(Error("Corrupted zip : CRC32 mismatch"));else q()}).resume()})}kK.exports=function($,q){var Q=this;if(q=V7.extend(q||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:nG.utf8decode}),YK.isNode&&YK.isStream($))return U5.Promise.reject(Error("JSZip can't accept a stream when loading a zip file."));return V7.prepareContent("the loaded zip file",$,!0,q.optimizedBinaryString,q.base64).then(function(K){var J=new dG(q);return J.load(K),J}).then(function(J){var Z=[U5.Promise.resolve(J)],G=J.files;if(q.checkCRC32)for(var W=0;W{function Y2(){if(!(this instanceof Y2))return new Y2;if(arguments.length)throw Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");this.files=Object.create(null),this.comment=null,this.root="",this.clone=function(){var $=new Y2;for(var q in this)if(typeof this[q]!=="function")$[q]=this[q];return $}}Y2.prototype=aq();Y2.prototype.loadAsync=DK();Y2.support=n2();Y2.defaults=K4();Y2.version="3.10.1";Y2.loadAsync=function($,q){return new Y2().loadAsync($,q)};Y2.external=r1();LK.exports=Y2});var Z8={};c1(Z8,{types:()=>QW,promisify:()=>jK,log:()=>RK,isUndefined:()=>N6,isSymbol:()=>KW,isString:()=>F5,isRegExp:()=>Z5,isPrimitive:()=>JW,isObject:()=>Y6,isNumber:()=>fK,isNullOrUndefined:()=>qW,isNull:()=>z5,isFunction:()=>W5,isError:()=>G5,isDate:()=>W7,isBuffer:()=>VW,isBoolean:()=>z7,isArray:()=>vK,inspect:()=>h1,inherits:()=>IK,format:()=>B7,deprecate:()=>oG,default:()=>GW,debuglog:()=>aG,callbackifyOnRejected:()=>w7,callbackify:()=>gK,_extend:()=>M7,TextEncoder:()=>AK,TextDecoder:()=>XK});function B7($,...q){if(!F5($)){var Q=[$];for(var K=0;K=J)return W;switch(W){case"%s":return String(q[K++]);case"%d":return Number(q[K++]);case"%j":try{return JSON.stringify(q[K++])}catch(B){return"[Circular]"}default:return W}});for(var G=q[K];K"u"||process?.noDeprecation===!0)return $;var Q=!1;function K(...J){if(!Q){if(process.throwDeprecation)throw Error(q);else if(process.traceDeprecation)console.trace(q);else console.error(q);Q=!0}return $.apply(this,...J)}return K}function lG($,q){var Q=h1.styles[q];if(Q)return"\x1B["+h1.colors[Q][0]+"m"+$+"\x1B["+h1.colors[Q][1]+"m";else return $}function rG($,q){return $}function sG($){var q={};return $.forEach(function(Q,K){q[Q]=!0}),q}function B5($,q,Q){if($.customInspect&&q&&W5(q.inspect)&&q.inspect!==h1&&!(q.constructor&&q.constructor.prototype===q)){var K=q.inspect(Q,$);if(!F5(K))K=B5($,K,Q);return K}var J=tG($,q);if(J)return J;var Z=Object.keys(q),G=sG(Z);if($.showHidden)Z=Object.getOwnPropertyNames(q);if(G5(q)&&(Z.indexOf("message")>=0||Z.indexOf("description")>=0))return U7(q);if(Z.length===0){if(W5(q)){var W=q.name?": "+q.name:"";return $.stylize("[Function"+W+"]","special")}if(Z5(q))return $.stylize(RegExp.prototype.toString.call(q),"regexp");if(W7(q))return $.stylize(Date.prototype.toString.call(q),"date");if(G5(q))return U7(q)}var B="",V=!1,U=["{","}"];if(vK(q))V=!0,U=["[","]"];if(W5(q)){var w=q.name?": "+q.name:"";B=" [Function"+w+"]"}if(Z5(q))B=" "+RegExp.prototype.toString.call(q);if(W7(q))B=" "+Date.prototype.toUTCString.call(q);if(G5(q))B=" "+U7(q);if(Z.length===0&&(!V||q.length==0))return U[0]+B+U[1];if(Q<0)if(Z5(q))return $.stylize(RegExp.prototype.toString.call(q),"regexp");else return $.stylize("[Object]","special");$.seen.push(q);var F;if(V)F=eG($,q,Q,G,Z);else F=Z.map(function(M){return G7($,q,Q,G,M,V)});return $.seen.pop(),$W(F,B,U)}function tG($,q){if(N6(q))return $.stylize("undefined","undefined");if(F5(q)){var Q="'"+JSON.stringify(q).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return $.stylize(Q,"string")}if(fK(q))return $.stylize(""+q,"number");if(z7(q))return $.stylize(""+q,"boolean");if(z5(q))return $.stylize("null","null")}function U7($){return"["+Error.prototype.toString.call($)+"]"}function eG($,q,Q,K,J){var Z=[];for(var G=0,W=q.length;G-1)if(Z)W=W.split(` +`).map(function(V){return" "+V}).join(` +`).slice(2);else W=` +`+W.split(` +`).map(function(V){return" "+V}).join(` +`)}else W=$.stylize("[Circular]","special");if(N6(G)){if(Z&&J.match(/^\d+$/))return W;if(G=JSON.stringify(""+J),G.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/))G=G.slice(1,-1),G=$.stylize(G,"name");else G=G.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),G=$.stylize(G,"string")}return G+": "+W}function $W($,q,Q){var K=0,J=$.reduce(function(Z,G){if(K++,G.indexOf(` +`)>=0)K++;return Z+G.replace(/\u001b\[\d\d?m/g,"").length+1},0);if(J>60)return Q[0]+(q===""?"":q+` + `)+" "+$.join(`, + `)+" "+Q[1];return Q[0]+q+" "+$.join(", ")+" "+Q[1]}function vK($){return Array.isArray($)}function z7($){return typeof $==="boolean"}function z5($){return $===null}function qW($){return $==null}function fK($){return typeof $==="number"}function F5($){return typeof $==="string"}function KW($){return typeof $==="symbol"}function N6($){return $===void 0}function Z5($){return Y6($)&&F7($)==="[object RegExp]"}function Y6($){return typeof $==="object"&&$!==null}function W7($){return Y6($)&&F7($)==="[object Date]"}function G5($){return Y6($)&&(F7($)==="[object Error]"||$ instanceof Error)}function W5($){return typeof $==="function"}function JW($){return $===null||typeof $==="boolean"||typeof $==="number"||typeof $==="string"||typeof $==="symbol"||typeof $>"u"}function VW($){return $ instanceof Buffer}function F7($){return Object.prototype.toString.call($)}function Z7($){return $<10?"0"+$.toString(10):$.toString(10)}function ZW(){var $=new Date,q=[Z7($.getHours()),Z7($.getMinutes()),Z7($.getSeconds())].join(":");return[$.getDate(),UW[$.getMonth()],q].join(" ")}function RK(...$){console.log("%s - %s",ZW(),B7.apply(null,$))}function IK($,q){if(q)$.super_=q,$.prototype=Object.create(q.prototype,{constructor:{value:$,enumerable:!1,writable:!0,configurable:!0}})}function M7($,q){if(!q||!Y6(q))return $;var Q=Object.keys(q),K=Q.length;while(K--)$[Q[K]]=q[Q[K]];return $}function CK($,q){return Object.prototype.hasOwnProperty.call($,q)}function w7($,q){if(!$){var Q=Error("Promise was rejected with a falsy value");Q.reason=$,$=Q}return q($)}function gK($){if(typeof $!=="function")throw TypeError('The "original" argument must be of type Function');function q(...Q){var K=Q.pop();if(typeof K!=="function")throw TypeError("The last argument must be of type Function");var J=this,Z=function(...G){return K.apply(J,...G)};$.apply(this,Q).then(function(G){process.nextTick(Z.bind(null,null,G))},function(G){process.nextTick(w7.bind(null,G,Z))})}return Object.setPrototypeOf(q,Object.getPrototypeOf($)),Object.defineProperties(q,Object.getOwnPropertyDescriptors($)),q}var iG,aG,h1,QW=()=>{},UW,jK,AK,XK,GW;var G8=b1(()=>{iG=/%[sdj%]/g;aG=(($={},q={},Q)=>((Q=typeof process<"u"&&!1)&&(Q=Q.replace(/[|\\{}()[\]^$+?.]/g,"\\$&").replace(/\*/g,".*").replace(/,/g,"$|^").toUpperCase()),q=new RegExp("^"+Q+"$","i"),(K)=>{if(K=K.toUpperCase(),!$[K])if(q.test(K))$[K]=function(...J){console.error("%s: %s",K,pid,B7.apply(null,...J))};else $[K]=function(){};return $[K]}))(),h1=(($)=>($.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},$.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},$.custom=Symbol.for("nodejs.util.inspect.custom"),$))(function($,q,...Q){var K={seen:[],stylize:rG};if(Q.length>=1)K.depth=Q[0];if(Q.length>=2)K.colors=Q[1];if(z7(q))K.showHidden=q;else if(q)M7(K,q);if(N6(K.showHidden))K.showHidden=!1;if(N6(K.depth))K.depth=2;if(N6(K.colors))K.colors=!1;if(K.colors)K.stylize=lG;return B5(K,$,K.depth)});UW=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];jK=(($)=>($.custom=Symbol.for("nodejs.util.promisify.custom"),$))(function($){if(typeof $!=="function")throw TypeError('The "original" argument must be of type Function');if(kCustomPromisifiedSymbol&&$[kCustomPromisifiedSymbol]){var q=$[kCustomPromisifiedSymbol];if(typeof q!=="function")throw TypeError('The "nodejs.util.promisify.custom" argument must be of type Function');return Object.defineProperty(q,kCustomPromisifiedSymbol,{value:q,enumerable:!1,writable:!1,configurable:!0}),q}function q(...Q){var K,J,Z=new Promise(function(G,W){K=G,J=W});Q.push(function(G,W){if(G)J(G);else K(W)});try{$.apply(this,Q)}catch(G){J(G)}return Z}if(Object.setPrototypeOf(q,Object.getPrototypeOf($)),kCustomPromisifiedSymbol)Object.defineProperty(q,kCustomPromisifiedSymbol,{value:q,enumerable:!1,writable:!1,configurable:!0});return Object.defineProperties(q,Object.getOwnPropertyDescriptors($))});({TextEncoder:AK,TextDecoder:XK}=globalThis),GW={TextEncoder:AK,TextDecoder:XK,promisify:jK,log:RK,inherits:IK,_extend:M7,callbackifyOnRejected:w7,callbackify:gK}});var H7={};c1(H7,{resolveObject:()=>SK,resolve:()=>uK,parse:()=>D6,format:()=>TK,default:()=>DW,Url:()=>Z2,URLSearchParams:()=>OK,URL:()=>D7});function L7($){return typeof $==="string"}function PK($){return typeof $==="object"&&$!==null}function M5($){return $===null}function WW($){return $==null}function Z2(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function D6($,q,Q){if($&&PK($)&&$ instanceof Z2)return $;var K=new Z2;return K.parse($,q,Q),K}function TK($){if(L7($))$=D6($);if(!($ instanceof Z2))return Z2.prototype.format.call($);return $.format()}function uK($,q){return D6($,!1,!0).resolve(q)}function SK($,q){if(!$)return q;return D6($,!1,!0).resolveObject(q)}var D7,OK,BW,zW,FW,MW,wW,N7,yK,hK,NW=255,xK,YW,kW,Y7,k6,k7,DW;var v7=b1(()=>{({URL:D7,URLSearchParams:OK}=globalThis);BW=/^([a-z0-9.+-]+:)/i,zW=/:[0-9]*$/,FW=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,MW=["<",">",'"',"`"," ","\r",` +`,"\t"],wW=["{","}","|","\\","^","`"].concat(MW),N7=["'"].concat(wW),yK=["%","/","?",";","#"].concat(N7),hK=["/","?","#"],xK=/^[+a-z0-9A-Z_-]{0,63}$/,YW=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,kW={javascript:!0,"javascript:":!0},Y7={javascript:!0,"javascript:":!0},k6={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},k7={parse($){var q=decodeURIComponent;return($+"").replace(/\+/g," ").split("&").filter(Boolean).reduce(function(Q,K,J){var Z=K.split("="),G=q(Z[0]||""),W=q(Z[1]||""),B=Q[G];return Q[G]=B===void 0?W:[].concat(B,W),Q},{})},stringify($){var q=encodeURIComponent;return Object.keys($||{}).reduce(function(Q,K){return[].concat($[K]).forEach(function(J){Q.push(q(K)+"="+q(J))}),Q},[]).join("&").replace(/\s/g,"+")}};Z2.prototype.parse=function($,q,Q){if(!L7($))throw TypeError("Parameter 'url' must be a string, not "+typeof $);var K=$.indexOf("?"),J=K!==-1&&K<$.indexOf("#")?"?":"#",Z=$.split(J),G=/\\/g;Z[0]=Z[0].replace(G,"/"),$=Z.join(J);var W=$;if(W=W.trim(),!Q&&$.split("#").length===1){var B=FW.exec(W);if(B){if(this.path=W,this.href=W,this.pathname=B[1],B[2])if(this.search=B[2],q)this.query=k7.parse(this.search.substr(1));else this.query=this.search.substr(1);else if(q)this.search="",this.query={};return this}}var V=BW.exec(W);if(V){V=V[0];var U=V.toLowerCase();this.protocol=U,W=W.substr(V.length)}if(Q||V||W.match(/^\/\/[^@\/]+@[^@\/]+/)){var w=W.substr(0,2)==="//";if(w&&!(V&&Y7[V]))W=W.substr(2),this.slashes=!0}if(!Y7[V]&&(w||V&&!k6[V])){var F=-1;for(var M=0;M127)v+="x";else v+=H[j];if(!v.match(xK)){var d=z.slice(0,M),_=z.slice(M+1),X=H.match(YW);if(X)d.push(X[1]),_.unshift(X[2]);if(_.length)W="/"+_.join(".")+W;this.hostname=d.join(".");break}}}}if(this.hostname.length>NW)this.hostname="";else this.hostname=this.hostname.toLowerCase();if(!D)this.hostname=new D7(`https://${this.hostname}`).hostname;var P=this.port?":"+this.port:"",g=this.hostname||"";if(this.host=g+P,this.href+=this.host,D){if(this.hostname=this.hostname.substr(1,this.hostname.length-2),W[0]!=="/")W="/"+W}}if(!kW[U])for(var M=0,N=N7.length;M0?Q.host.split("@"):!1;if(v)Q.auth=v.shift(),Q.host=Q.hostname=v.shift()}if(Q.search=$.search,Q.query=$.query,!M5(Q.pathname)||!M5(Q.search))Q.path=(Q.pathname?Q.pathname:"")+(Q.search?Q.search:"");return Q.href=Q.format(),Q}if(!z.length){if(Q.pathname=null,Q.search)Q.path="/"+Q.search;else Q.path=null;return Q.href=Q.format(),Q}var j=z.slice(-1)[0],n=(Q.host||$.host||z.length>1)&&(j==="."||j==="..")||j==="",d=0;for(var _=z.length;_>=0;_--)if(j=z[_],j===".")z.splice(_,1);else if(j==="..")z.splice(_,1),d++;else if(d)z.splice(_,1),d--;if(!L&&!D)for(;d--;d)z.unshift("..");if(L&&z[0]!==""&&(!z[0]||z[0].charAt(0)!=="/"))z.unshift("");if(n&&z.join("/").substr(-1)!=="/")z.push("");var X=z[0]===""||z[0]&&z[0].charAt(0)==="/";if(H){Q.hostname=Q.host=X?"":z.length?z.shift():"";var v=Q.host&&Q.host.indexOf("@")>0?Q.host.split("@"):!1;if(v)Q.auth=v.shift(),Q.host=Q.hostname=v.shift()}if(L=L||Q.host&&z.length,L&&!X)z.unshift("");if(!z.length)Q.pathname=null,Q.path=null;else Q.pathname=z.join("/");if(!M5(Q.pathname)||!M5(Q.search))Q.path=(Q.pathname?Q.pathname:"")+(Q.search?Q.search:"");return Q.auth=$.auth||Q.auth,Q.slashes=Q.slashes||$.slashes,Q.href=Q.format(),Q};Z2.prototype.parseHost=function(){var $=this.host,q=zW.exec($);if(q){if(q=q[0],q!==":")this.port=q.substr(1);$=$.substr(0,$.length-q.length)}if($)this.hostname=$};DW={parse:D6,resolve:uK,resolveObject:SK,format:TK,Url:Z2,URL:D7,URLSearchParams:OK}});var R7={};c1(R7,{request:()=>uW,globalAgent:()=>bW,get:()=>SW,default:()=>mW,STATUS_CODES:()=>nW,METHODS:()=>dW,IncomingMessage:()=>_W,ClientRequest:()=>EW,Agent:()=>cW});var LW,HW,EK,vW,fW,RW=($,q,Q)=>{Q=$!=null?LW(HW($)):{};let K=q||!$||!$.__esModule?EK(Q,"default",{value:$,enumerable:!0}):Q;for(let J of vW($))if(!fW.call(K,J))EK(K,J,{get:()=>$[J],enumerable:!0});return K},h0=($,q)=>()=>(q||$((q={exports:{}}).exports,q),q.exports),cK,IW,x1,CW,bK,O1,nK,jW,dK,L6,gW,_K,f7,AW,XW,mK,pK,yW,hW,iK,oK,xW,OW,PW,TW,aK,uW,SW,EW,_W,cW,bW,nW,dW,mW;var I7=b1(()=>{LW=Object.create,{getPrototypeOf:HW,defineProperty:EK,getOwnPropertyNames:vW}=Object,fW=Object.prototype.hasOwnProperty,cK=h0(($)=>{$.fetch=J(globalThis.fetch)&&J(globalThis.ReadableStream),$.writableStream=J(globalThis.WritableStream),$.abortController=J(globalThis.AbortController);var q;function Q(){if(q!==void 0)return q;if(globalThis.XMLHttpRequest){q=new globalThis.XMLHttpRequest;try{q.open("GET",globalThis.XDomainRequest?"/":"https://example.com")}catch(Z){q=null}}else q=null;return q}function K(Z){var G=Q();if(!G)return!1;try{return G.responseType=Z,G.responseType===Z}catch(W){}return!1}$.arraybuffer=$.fetch||K("arraybuffer"),$.msstream=!$.fetch&&K("ms-stream"),$.mozchunkedarraybuffer=!$.fetch&&K("moz-chunked-arraybuffer"),$.overrideMimeType=$.fetch||(Q()?J(Q().overrideMimeType):!1);function J(Z){return typeof Z==="function"}q=null}),IW=h0(($,q)=>{if(typeof Object.create==="function")q.exports=function(Q,K){if(K)Q.super_=K,Q.prototype=Object.create(K.prototype,{constructor:{value:Q,enumerable:!1,writable:!0,configurable:!0}})};else q.exports=function(Q,K){if(K){Q.super_=K;var J=function(){};J.prototype=K.prototype,Q.prototype=new J,Q.prototype.constructor=Q}}}),x1=h0(($,q)=>{try{if(Q=(G8(),X0(Z8)),typeof Q.inherits!=="function")throw"";q.exports=Q.inherits}catch(K){q.exports=IW()}var Q}),CW=h0(($,q)=>{function Q(L,D){var z=Object.keys(L);if(Object.getOwnPropertySymbols){var N=Object.getOwnPropertySymbols(L);D&&(N=N.filter(function(H){return Object.getOwnPropertyDescriptor(L,H).enumerable})),z.push.apply(z,N)}return z}function K(L){for(var D=1;D0)this.tail.next=z;else this.head=z;this.tail=z,++this.length}},{key:"unshift",value:function(D){var z={data:D,next:this.head};if(this.length===0)this.tail=z;this.head=z,++this.length}},{key:"shift",value:function(){if(this.length===0)return;var D=this.head.data;if(this.length===1)this.head=this.tail=null;else this.head=this.head.next;return--this.length,D}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(D){if(this.length===0)return"";var z=this.head,N=""+z.data;while(z=z.next)N+=D+z.data;return N}},{key:"concat",value:function(D){if(this.length===0)return w.alloc(0);var z=w.allocUnsafe(D>>>0),N=this.head,H=0;while(N)f(N.data,z,H),H+=N.data.length,N=N.next;return z}},{key:"consume",value:function(D,z){var N;if(Dv.length?v.length:D;if(j===v.length)H+=v;else H+=v.slice(0,D);if(D-=j,D===0){if(j===v.length)if(++N,z.next)this.head=z.next;else this.head=this.tail=null;else this.head=z,z.data=v.slice(j);break}++N}return this.length-=N,H}},{key:"_getBuffer",value:function(D){var z=w.allocUnsafe(D),N=this.head,H=1;N.data.copy(z),D-=N.data.length;while(N=N.next){var v=N.data,j=D>v.length?v.length:D;if(v.copy(z,z.length-D,0,j),D-=j,D===0){if(j===v.length)if(++H,N.next)this.head=N.next;else this.head=this.tail=null;else this.head=N,N.data=v.slice(j);break}++H}return this.length-=H,z}},{key:k,value:function(D,z){return M(this,K(K({},z),{},{depth:0,customInspect:!1}))}}]),L}()}),bK=h0(($,q)=>{function Q(B,V){var U=this,w=this._readableState&&this._readableState.destroyed,F=this._writableState&&this._writableState.destroyed;if(w||F){if(V)V(B);else if(B){if(!this._writableState)process.nextTick(G,this,B);else if(!this._writableState.errorEmitted)this._writableState.errorEmitted=!0,process.nextTick(G,this,B)}return this}if(this._readableState)this._readableState.destroyed=!0;if(this._writableState)this._writableState.destroyed=!0;return this._destroy(B||null,function(M){if(!V&&M)if(!U._writableState)process.nextTick(K,U,M);else if(!U._writableState.errorEmitted)U._writableState.errorEmitted=!0,process.nextTick(K,U,M);else process.nextTick(J,U);else if(V)process.nextTick(J,U),V(M);else process.nextTick(J,U)}),this}function K(B,V){G(B,V),J(B)}function J(B){if(B._writableState&&!B._writableState.emitClose)return;if(B._readableState&&!B._readableState.emitClose)return;B.emit("close")}function Z(){if(this._readableState)this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1;if(this._writableState)this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1}function G(B,V){B.emit("error",V)}function W(B,V){var{_readableState:U,_writableState:w}=B;if(U&&U.autoDestroy||w&&w.autoDestroy)B.destroy(V);else B.emit("error",V)}q.exports={destroy:Q,undestroy:Z,errorOrDestroy:W}}),O1=h0(($,q)=>{var Q={};function K(B,V,U){if(!U)U=Error;function w(M,k,f){if(typeof V==="string")return V;else return V(M,k,f)}class F extends U{constructor(M,k,f){super(w(M,k,f))}}F.prototype.name=U.name,F.prototype.code=B,Q[B]=F}function J(B,V){if(Array.isArray(B)){let U=B.length;if(B=B.map((w)=>String(w)),U>2)return`one of ${V} ${B.slice(0,U-1).join(", ")}, or `+B[U-1];else if(U===2)return`one of ${V} ${B[0]} or ${B[1]}`;else return`of ${V} ${B[0]}`}else return`of ${V} ${String(B)}`}function Z(B,V,U){return B.substr(!U||U<0?0:+U,V.length)===V}function G(B,V,U){if(U===void 0||U>B.length)U=B.length;return B.substring(U-V.length,U)===V}function W(B,V,U){if(typeof U!=="number")U=0;if(U+V.length>B.length)return!1;else return B.indexOf(V,U)!==-1}K("ERR_INVALID_OPT_VALUE",function(B,V){return'The value "'+V+'" is invalid for option "'+B+'"'},TypeError),K("ERR_INVALID_ARG_TYPE",function(B,V,U){let w;if(typeof V==="string"&&Z(V,"not "))w="must not be",V=V.replace(/^not /,"");else w="must be";let F;if(G(B," argument"))F=`The ${B} ${w} ${J(V,"type")}`;else{let M=W(B,".")?"property":"argument";F=`The "${B}" ${M} ${w} ${J(V,"type")}`}return F+=`. Received type ${typeof U}`,F},TypeError),K("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF"),K("ERR_METHOD_NOT_IMPLEMENTED",function(B){return"The "+B+" method is not implemented"}),K("ERR_STREAM_PREMATURE_CLOSE","Premature close"),K("ERR_STREAM_DESTROYED",function(B){return"Cannot call "+B+" after a stream was destroyed"}),K("ERR_MULTIPLE_CALLBACK","Callback called multiple times"),K("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable"),K("ERR_STREAM_WRITE_AFTER_END","write after end"),K("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError),K("ERR_UNKNOWN_ENCODING",function(B){return"Unknown encoding: "+B},TypeError),K("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event"),$.codes=Q}),nK=h0(($,q)=>{var Q=O1().codes.ERR_INVALID_OPT_VALUE;function K(Z,G,W){return Z.highWaterMark!=null?Z.highWaterMark:G?Z[W]:null}function J(Z,G,W,B){var V=K(G,B,W);if(V!=null){if(!(isFinite(V)&&Math.floor(V)===V)||V<0){var U=B?W:"highWaterMark";throw new Q(U,V)}return Math.floor(V)}return Z.objectMode?16:16384}q.exports={getHighWaterMark:J}}),jW=h0(($,q)=>{q.exports=(G8(),X0(Z8)).deprecate}),dK=h0(($,q)=>{q.exports=X;function Q(S){var b=this;this.next=null,this.entry=null,this.finish=function(){w0(b,S)}}var K;X.WritableState=d;var J={deprecate:jW()},Z=a1(),G=(t0(),X0(K2)).Buffer,W=(typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof self<"u"?self:{}).Uint8Array||function(){};function B(S){return G.from(S)}function V(S){return G.isBuffer(S)||S instanceof W}var U=bK(),w=nK(),F=w.getHighWaterMark,M=O1().codes,k=M.ERR_INVALID_ARG_TYPE,f=M.ERR_METHOD_NOT_IMPLEMENTED,L=M.ERR_MULTIPLE_CALLBACK,D=M.ERR_STREAM_CANNOT_PIPE,z=M.ERR_STREAM_DESTROYED,N=M.ERR_STREAM_NULL_VALUES,H=M.ERR_STREAM_WRITE_AFTER_END,v=M.ERR_UNKNOWN_ENCODING,j=U.errorOrDestroy;x1()(X,Z);function n(){}function d(S,b,O){if(K=K||L6(),S=S||{},typeof O!=="boolean")O=b instanceof K;if(this.objectMode=!!S.objectMode,O)this.objectMode=this.objectMode||!!S.writableObjectMode;this.highWaterMark=F(this,S,"writableHighWaterMark",O),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var E=S.decodeStrings===!1;this.decodeStrings=!E,this.defaultEncoding=S.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(a){Z0(b,a)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=S.emitClose!==!1,this.autoDestroy=!!S.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new Q(this)}d.prototype.getBuffer=function(){var S=this.bufferedRequest,b=[];while(S)b.push(S),S=S.next;return b},function(){try{Object.defineProperty(d.prototype,"buffer",{get:J.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(S){}}();var _;if(typeof Symbol==="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==="function")_=Function.prototype[Symbol.hasInstance],Object.defineProperty(X,Symbol.hasInstance,{value:function(S){if(_.call(this,S))return!0;if(this!==X)return!1;return S&&S._writableState instanceof d}});else _=function(S){return S instanceof this};function X(S){K=K||L6();var b=this instanceof K;if(!b&&!_.call(X,this))return new X(S);if(this._writableState=new d(S,this,b),this.writable=!0,S){if(typeof S.write==="function")this._write=S.write;if(typeof S.writev==="function")this._writev=S.writev;if(typeof S.destroy==="function")this._destroy=S.destroy;if(typeof S.final==="function")this._final=S.final}Z.call(this)}X.prototype.pipe=function(){j(this,new D)};function P(S,b){var O=new H;j(S,O),process.nextTick(b,O)}function g(S,b,O,E){var a;if(O===null)a=new N;else if(typeof O!=="string"&&!b.objectMode)a=new k("chunk",["string","Buffer"],O);if(a)return j(S,a),process.nextTick(E,a),!1;return!0}X.prototype.write=function(S,b,O){var E=this._writableState,a=!1,K0=!E.objectMode&&V(S);if(K0&&!G.isBuffer(S))S=B(S);if(typeof b==="function")O=b,b=null;if(K0)b="buffer";else if(!b)b=E.defaultEncoding;if(typeof O!=="function")O=n;if(E.ending)P(this,O);else if(K0||g(this,E,S,O))E.pendingcb++,a=h(this,E,K0,S,b,O);return a},X.prototype.cork=function(){this._writableState.corked++},X.prototype.uncork=function(){var S=this._writableState;if(S.corked){if(S.corked--,!S.writing&&!S.corked&&!S.bufferProcessing&&S.bufferedRequest)W0(this,S)}},X.prototype.setDefaultEncoding=function(S){if(typeof S==="string")S=S.toLowerCase();if(!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((S+"").toLowerCase())>-1))throw new v(S);return this._writableState.defaultEncoding=S,this},Object.defineProperty(X.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function c(S,b,O){if(!S.objectMode&&S.decodeStrings!==!1&&typeof b==="string")b=G.from(b,O);return b}Object.defineProperty(X.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function h(S,b,O,E,a,K0){if(!O){var R=c(b,E,a);if(E!==R)O=!0,a="buffer",E=R}var Y=b.objectMode?1:E.length;b.length+=Y;var C=b.length{var Q=Object.keys||function(w){var F=[];for(var M in w)F.push(M);return F};q.exports=B;var K=mK(),J=dK();x1()(B,K);{Z=Q(J.prototype);for(W=0;W{/*! safe-buffer. MIT License. Feross Aboukhadijeh */var Q=(t0(),X0(K2)),K=Q.Buffer;function J(G,W){for(var B in G)W[B]=G[B]}if(K.from&&K.alloc&&K.allocUnsafe&&K.allocUnsafeSlow)q.exports=Q;else J(Q,$),$.Buffer=Z;function Z(G,W,B){return K(G,W,B)}Z.prototype=Object.create(K.prototype),J(K,Z),Z.from=function(G,W,B){if(typeof G==="number")throw TypeError("Argument must not be a number");return K(G,W,B)},Z.alloc=function(G,W,B){if(typeof G!=="number")throw TypeError("Argument must be a number");var V=K(G);if(W!==void 0)if(typeof B==="string")V.fill(W,B);else V.fill(W);else V.fill(0);return V},Z.allocUnsafe=function(G){if(typeof G!=="number")throw TypeError("Argument must be a number");return K(G)},Z.allocUnsafeSlow=function(G){if(typeof G!=="number")throw TypeError("Argument must be a number");return Q.SlowBuffer(G)}}),_K=h0(($)=>{var q=gW().Buffer,Q=q.isEncoding||function(z){switch(z=""+z,z&&z.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function K(z){if(!z)return"utf8";var N;while(!0)switch(z){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return z;default:if(N)return;z=(""+z).toLowerCase(),N=!0}}function J(z){var N=K(z);if(typeof N!=="string"&&(q.isEncoding===Q||!Q(z)))throw Error("Unknown encoding: "+z);return N||z}$.StringDecoder=Z;function Z(z){this.encoding=J(z);var N;switch(this.encoding){case"utf16le":this.text=F,this.end=M,N=4;break;case"utf8":this.fillLast=V,N=4;break;case"base64":this.text=k,this.end=f,N=3;break;default:this.write=L,this.end=D;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=q.allocUnsafe(N)}Z.prototype.write=function(z){if(z.length===0)return"";var N,H;if(this.lastNeed){if(N=this.fillLast(z),N===void 0)return"";H=this.lastNeed,this.lastNeed=0}else H=0;if(H>5===6)return 2;else if(z>>4===14)return 3;else if(z>>3===30)return 4;return z>>6===2?-1:-2}function W(z,N,H){var v=N.length-1;if(v=0){if(j>0)z.lastNeed=j-1;return j}if(--v=0){if(j>0)z.lastNeed=j-2;return j}if(--v=0){if(j>0)if(j===2)j=0;else z.lastNeed=j-3;return j}return 0}function B(z,N,H){if((N[0]&192)!==128)return z.lastNeed=0,"�";if(z.lastNeed>1&&N.length>1){if((N[1]&192)!==128)return z.lastNeed=1,"�";if(z.lastNeed>2&&N.length>2){if((N[2]&192)!==128)return z.lastNeed=2,"�"}}}function V(z){var N=this.lastTotal-this.lastNeed,H=B(this,z,N);if(H!==void 0)return H;if(this.lastNeed<=z.length)return z.copy(this.lastChar,N,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);z.copy(this.lastChar,N,0,z.length),this.lastNeed-=z.length}function U(z,N){var H=W(this,z,N);if(!this.lastNeed)return z.toString("utf8",N);this.lastTotal=H;var v=z.length-(H-this.lastNeed);return z.copy(this.lastChar,0,v),z.toString("utf8",N,v)}function w(z){var N=z&&z.length?this.write(z):"";if(this.lastNeed)return N+"�";return N}function F(z,N){if((z.length-N)%2===0){var H=z.toString("utf16le",N);if(H){var v=H.charCodeAt(H.length-1);if(v>=55296&&v<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=z[z.length-2],this.lastChar[1]=z[z.length-1],H.slice(0,-1)}return H}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=z[z.length-1],z.toString("utf16le",N,z.length-1)}function M(z){var N=z&&z.length?this.write(z):"";if(this.lastNeed){var H=this.lastTotal-this.lastNeed;return N+this.lastChar.toString("utf16le",0,H)}return N}function k(z,N){var H=(z.length-N)%3;if(H===0)return z.toString("base64",N);if(this.lastNeed=3-H,this.lastTotal=3,H===1)this.lastChar[0]=z[z.length-1];else this.lastChar[0]=z[z.length-2],this.lastChar[1]=z[z.length-1];return z.toString("base64",N,z.length-H)}function f(z){var N=z&&z.length?this.write(z):"";if(this.lastNeed)return N+this.lastChar.toString("base64",0,3-this.lastNeed);return N}function L(z){return z.toString(this.encoding)}function D(z){return z&&z.length?this.write(z):""}}),f7=h0(($,q)=>{var Q=O1().codes.ERR_STREAM_PREMATURE_CLOSE;function K(W){var B=!1;return function(){if(B)return;B=!0;for(var V=arguments.length,U=Array(V),w=0;w{var Q;function K(v,j,n){if(j=J(j),j in v)Object.defineProperty(v,j,{value:n,enumerable:!0,configurable:!0,writable:!0});else v[j]=n;return v}function J(v){var j=Z(v,"string");return typeof j==="symbol"?j:String(j)}function Z(v,j){if(typeof v!=="object"||v===null)return v;var n=v[Symbol.toPrimitive];if(n!==void 0){var d=n.call(v,j||"default");if(typeof d!=="object")return d;throw TypeError("@@toPrimitive must return a primitive value.")}return(j==="string"?String:Number)(v)}var G=f7(),W=Symbol("lastResolve"),B=Symbol("lastReject"),V=Symbol("error"),U=Symbol("ended"),w=Symbol("lastPromise"),F=Symbol("handlePromise"),M=Symbol("stream");function k(v,j){return{value:v,done:j}}function f(v){var j=v[W];if(j!==null){var n=v[M].read();if(n!==null)v[w]=null,v[W]=null,v[B]=null,j(k(n,!1))}}function L(v){process.nextTick(f,v)}function D(v,j){return function(n,d){v.then(function(){if(j[U]){n(k(void 0,!0));return}j[F](n,d)},d)}}var z=Object.getPrototypeOf(function(){}),N=Object.setPrototypeOf((Q={get stream(){return this[M]},next:function(){var v=this,j=this[V];if(j!==null)return Promise.reject(j);if(this[U])return Promise.resolve(k(void 0,!0));if(this[M].destroyed)return new Promise(function(X,P){process.nextTick(function(){if(v[V])P(v[V]);else X(k(void 0,!0))})});var n=this[w],d;if(n)d=new Promise(D(n,this));else{var _=this[M].read();if(_!==null)return Promise.resolve(k(_,!1));d=new Promise(this[F])}return this[w]=d,d}},K(Q,Symbol.asyncIterator,function(){return this}),K(Q,"return",function(){var v=this;return new Promise(function(j,n){v[M].destroy(null,function(d){if(d){n(d);return}j(k(void 0,!0))})})}),Q),z),H=function(v){var j,n=Object.create(N,(j={},K(j,M,{value:v,writable:!0}),K(j,W,{value:null,writable:!0}),K(j,B,{value:null,writable:!0}),K(j,V,{value:null,writable:!0}),K(j,U,{value:v._readableState.endEmitted,writable:!0}),K(j,F,{value:function(d,_){var X=n[M].read();if(X)n[w]=null,n[W]=null,n[B]=null,d(k(X,!1));else n[W]=d,n[B]=_},writable:!0}),j));return n[w]=null,G(v,function(d){if(d&&d.code!=="ERR_STREAM_PREMATURE_CLOSE"){var _=n[B];if(_!==null)n[w]=null,n[W]=null,n[B]=null,_(d);n[V]=d;return}var X=n[W];if(X!==null)n[w]=null,n[W]=null,n[B]=null,X(k(void 0,!0));n[U]=!0}),v.on("readable",L.bind(null,n)),n};q.exports=H}),XW=h0(($,q)=>{function Q(w,F,M,k,f,L,D){try{var z=w[L](D),N=z.value}catch(H){M(H);return}if(z.done)F(N);else Promise.resolve(N).then(k,f)}function K(w){return function(){var F=this,M=arguments;return new Promise(function(k,f){var L=w.apply(F,M);function D(N){Q(L,k,f,D,z,"next",N)}function z(N){Q(L,k,f,D,z,"throw",N)}D(void 0)})}}function J(w,F){var M=Object.keys(w);if(Object.getOwnPropertySymbols){var k=Object.getOwnPropertySymbols(w);F&&(k=k.filter(function(f){return Object.getOwnPropertyDescriptor(w,f).enumerable})),M.push.apply(M,k)}return M}function Z(w){for(var F=1;F{q.exports=g;var Q;g.ReadableState=P;var K=(i1(),X0(p1)).EventEmitter,J=function(R,Y){return R.listeners(Y).length},Z=a1(),G=(t0(),X0(K2)).Buffer,W=(typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof self<"u"?self:{}).Uint8Array||function(){};function B(R){return G.from(R)}function V(R){return G.isBuffer(R)||R instanceof W}var U=(G8(),X0(Z8)),w;if(U&&U.debuglog)w=U.debuglog("stream");else w=function(){};var F=CW(),M=bK(),k=nK(),f=k.getHighWaterMark,L=O1().codes,D=L.ERR_INVALID_ARG_TYPE,z=L.ERR_STREAM_PUSH_AFTER_EOF,N=L.ERR_METHOD_NOT_IMPLEMENTED,H=L.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,v,j,n;x1()(g,Z);var d=M.errorOrDestroy,_=["error","close","destroy","pause","resume"];function X(R,Y,C){if(typeof R.prependListener==="function")return R.prependListener(Y,C);if(!R._events||!R._events[Y])R.on(Y,C);else if(Array.isArray(R._events[Y]))R._events[Y].unshift(C);else R._events[Y]=[C,R._events[Y]]}function P(R,Y,C){if(Q=Q||L6(),R=R||{},typeof C!=="boolean")C=Y instanceof Q;if(this.objectMode=!!R.objectMode,C)this.objectMode=this.objectMode||!!R.readableObjectMode;if(this.highWaterMark=f(this,R,"readableHighWaterMark",C),this.buffer=new F,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=R.emitClose!==!1,this.autoDestroy=!!R.autoDestroy,this.destroyed=!1,this.defaultEncoding=R.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,R.encoding){if(!v)v=_K().StringDecoder;this.decoder=new v(R.encoding),this.encoding=R.encoding}}function g(R){if(Q=Q||L6(),!(this instanceof g))return new g(R);var Y=this instanceof Q;if(this._readableState=new P(R,this,Y),this.readable=!0,R){if(typeof R.read==="function")this._read=R.read;if(typeof R.destroy==="function")this._destroy=R.destroy}Z.call(this)}Object.defineProperty(g.prototype,"destroyed",{enumerable:!1,get:function(){if(this._readableState===void 0)return!1;return this._readableState.destroyed},set:function(R){if(!this._readableState)return;this._readableState.destroyed=R}}),g.prototype.destroy=M.destroy,g.prototype._undestroy=M.undestroy,g.prototype._destroy=function(R,Y){Y(R)},g.prototype.push=function(R,Y){var C=this._readableState,u;if(!C.objectMode){if(typeof R==="string"){if(Y=Y||C.defaultEncoding,Y!==C.encoding)R=G.from(R,Y),Y="";u=!0}}else u=!0;return c(this,R,Y,!1,u)},g.prototype.unshift=function(R){return c(this,R,null,!0,!1)};function c(R,Y,C,u,e){w("readableAddChunk",Y);var r=R._readableState;if(Y===null)r.reading=!1,F0(R,r);else{var s;if(!e)s=x(r,Y);if(s)d(R,s);else if(r.objectMode||Y&&Y.length>0){if(typeof Y!=="string"&&!r.objectMode&&Object.getPrototypeOf(Y)!==G.prototype)Y=B(Y);if(u)if(r.endEmitted)d(R,new H);else h(R,r,Y,!0);else if(r.ended)d(R,new z);else if(r.destroyed)return!1;else if(r.reading=!1,r.decoder&&!C)if(Y=r.decoder.write(Y),r.objectMode||Y.length!==0)h(R,r,Y,!1);else y(R,r);else h(R,r,Y,!1)}else if(!u)r.reading=!1,y(R,r)}return!r.ended&&(r.length=l)R=l;else R--,R|=R>>>1,R|=R>>>2,R|=R>>>4,R|=R>>>8,R|=R>>>16,R++;return R}function Z0(R,Y){if(R<=0||Y.length===0&&Y.ended)return 0;if(Y.objectMode)return 1;if(R!==R)if(Y.flowing&&Y.length)return Y.buffer.head.data.length;else return Y.length;if(R>Y.highWaterMark)Y.highWaterMark=$0(R);if(R<=Y.length)return R;if(!Y.ended)return Y.needReadable=!0,0;return Y.length}g.prototype.read=function(R){w("read",R),R=parseInt(R,10);var Y=this._readableState,C=R;if(R!==0)Y.emittedReadable=!1;if(R===0&&Y.needReadable&&((Y.highWaterMark!==0?Y.length>=Y.highWaterMark:Y.length>0)||Y.ended)){if(w("read: emitReadable",Y.length,Y.ended),Y.length===0&&Y.ended)E(this);else p(this);return null}if(R=Z0(R,Y),R===0&&Y.ended){if(Y.length===0)E(this);return null}var u=Y.needReadable;if(w("need readable",u),Y.length===0||Y.length-R0)e=O(R,Y);else e=null;if(e===null)Y.needReadable=Y.length<=Y.highWaterMark,R=0;else Y.length-=R,Y.awaitDrain=0;if(Y.length===0){if(!Y.ended)Y.needReadable=!0;if(C!==R&&Y.ended)E(this)}if(e!==null)this.emit("data",e);return e};function F0(R,Y){if(w("onEofChunk"),Y.ended)return;if(Y.decoder){var C=Y.decoder.end();if(C&&C.length)Y.buffer.push(C),Y.length+=Y.objectMode?1:C.length}if(Y.ended=!0,Y.sync)p(R);else if(Y.needReadable=!1,!Y.emittedReadable)Y.emittedReadable=!0,W0(R)}function p(R){var Y=R._readableState;if(w("emitReadable",Y.needReadable,Y.emittedReadable),Y.needReadable=!1,!Y.emittedReadable)w("emitReadable",Y.flowing),Y.emittedReadable=!0,process.nextTick(W0,R)}function W0(R){var Y=R._readableState;if(w("emitReadable_",Y.destroyed,Y.length,Y.ended),!Y.destroyed&&(Y.length||Y.ended))R.emit("readable"),Y.emittedReadable=!1;Y.needReadable=!Y.flowing&&!Y.ended&&Y.length<=Y.highWaterMark,b(R)}function y(R,Y){if(!Y.readingMore)Y.readingMore=!0,process.nextTick(i,R,Y)}function i(R,Y){while(!Y.reading&&!Y.ended&&(Y.length1&&K0(u.pipes,R)!==-1)&&!G0)w("false write response, pause",u.awaitDrain),u.awaitDrain++;C.pause()}}function I0(O0){if(w("onerror",O0),q2(),R.removeListener("error",I0),J(R,"error")===0)d(R,O0)}X(R,"error",I0);function m0(){R.removeListener("finish",p0),q2()}R.once("close",m0);function p0(){w("onfinish"),R.removeListener("close",m0),q2()}R.once("finish",p0);function q2(){w("unpipe"),C.unpipe(R)}if(R.emit("pipe",C),!u.flowing)w("pipe resume"),C.resume();return R};function U0(R){return function(){var Y=R._readableState;if(w("pipeOnDrain",Y.awaitDrain),Y.awaitDrain)Y.awaitDrain--;if(Y.awaitDrain===0&&J(R,"data"))Y.flowing=!0,b(R)}}g.prototype.unpipe=function(R){var Y=this._readableState,C={hasUnpiped:!1};if(Y.pipesCount===0)return this;if(Y.pipesCount===1){if(R&&R!==Y.pipes)return this;if(!R)R=Y.pipes;if(Y.pipes=null,Y.pipesCount=0,Y.flowing=!1,R)R.emit("unpipe",this,C);return this}if(!R){var{pipes:u,pipesCount:e}=Y;Y.pipes=null,Y.pipesCount=0,Y.flowing=!1;for(var r=0;r0,u.flowing!==!1)this.resume()}else if(R==="readable"){if(!u.endEmitted&&!u.readableListening){if(u.readableListening=u.needReadable=!0,u.flowing=!1,u.emittedReadable=!1,w("on readable",u.length,u.reading),u.length)p(this);else if(!u.reading)process.nextTick(V0,this)}}return C},g.prototype.addListener=g.prototype.on,g.prototype.removeListener=function(R,Y){var C=Z.prototype.removeListener.call(this,R,Y);if(R==="readable")process.nextTick(m,this);return C},g.prototype.removeAllListeners=function(R){var Y=Z.prototype.removeAllListeners.apply(this,arguments);if(R==="readable"||R===void 0)process.nextTick(m,this);return Y};function m(R){var Y=R._readableState;if(Y.readableListening=R.listenerCount("readable")>0,Y.resumeScheduled&&!Y.paused)Y.flowing=!0;else if(R.listenerCount("data")>0)R.resume()}function V0(R){w("readable nexttick read 0"),R.read(0)}g.prototype.resume=function(){var R=this._readableState;if(!R.flowing)w("resume"),R.flowing=!R.readableListening,w0(this,R);return R.paused=!1,this};function w0(R,Y){if(!Y.resumeScheduled)Y.resumeScheduled=!0,process.nextTick(S,R,Y)}function S(R,Y){if(w("resume",Y.reading),!Y.reading)R.read(0);if(Y.resumeScheduled=!1,R.emit("resume"),b(R),Y.flowing&&!Y.reading)R.read(0)}g.prototype.pause=function(){if(w("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1)w("pause"),this._readableState.flowing=!1,this.emit("pause");return this._readableState.paused=!0,this};function b(R){var Y=R._readableState;w("flow",Y.flowing);while(Y.flowing&&R.read()!==null);}if(g.prototype.wrap=function(R){var Y=this,C=this._readableState,u=!1;R.on("end",function(){if(w("wrapped end"),C.decoder&&!C.ended){var s=C.decoder.end();if(s&&s.length)Y.push(s)}Y.push(null)}),R.on("data",function(s){if(w("wrapped data"),C.decoder)s=C.decoder.write(s);if(C.objectMode&&(s===null||s===void 0))return;else if(!C.objectMode&&(!s||!s.length))return;var T=Y.push(s);if(!T)u=!0,R.pause()});for(var e in R)if(this[e]===void 0&&typeof R[e]==="function")this[e]=function(s){return function(){return R[s].apply(R,arguments)}}(e);for(var r=0;r<_.length;r++)R.on(_[r],this.emit.bind(this,_[r]));return this._read=function(s){if(w("wrapped _read",s),u)u=!1,R.resume()},this},typeof Symbol==="function")g.prototype[Symbol.asyncIterator]=function(){if(j===void 0)j=AW();return j(this)};Object.defineProperty(g.prototype,"readableHighWaterMark",{enumerable:!1,get:function(){return this._readableState.highWaterMark}}),Object.defineProperty(g.prototype,"readableBuffer",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}}),Object.defineProperty(g.prototype,"readableFlowing",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(R){if(this._readableState)this._readableState.flowing=R}}),g._fromList=O,Object.defineProperty(g.prototype,"readableLength",{enumerable:!1,get:function(){return this._readableState.length}});function O(R,Y){if(Y.length===0)return null;var C;if(Y.objectMode)C=Y.buffer.shift();else if(!R||R>=Y.length){if(Y.decoder)C=Y.buffer.join("");else if(Y.buffer.length===1)C=Y.buffer.first();else C=Y.buffer.concat(Y.length);Y.buffer.clear()}else C=Y.buffer.consume(R,Y.decoder);return C}function E(R){var Y=R._readableState;if(w("endReadable",Y.endEmitted),!Y.endEmitted)Y.ended=!0,process.nextTick(a,Y,R)}function a(R,Y){if(w("endReadableNT",R.endEmitted,R.length),!R.endEmitted&&R.length===0){if(R.endEmitted=!0,Y.readable=!1,Y.emit("end"),R.autoDestroy){var C=Y._writableState;if(!C||C.autoDestroy&&C.finished)Y.destroy()}}}if(typeof Symbol==="function")g.from=function(R,Y){if(n===void 0)n=XW();return n(g,R,Y)};function K0(R,Y){for(var C=0,u=R.length;C{q.exports=V;var Q=O1().codes,K=Q.ERR_METHOD_NOT_IMPLEMENTED,J=Q.ERR_MULTIPLE_CALLBACK,Z=Q.ERR_TRANSFORM_ALREADY_TRANSFORMING,G=Q.ERR_TRANSFORM_WITH_LENGTH_0,W=L6();x1()(V,W);function B(F,M){var k=this._transformState;k.transforming=!1;var f=k.writecb;if(f===null)return this.emit("error",new J);if(k.writechunk=null,k.writecb=null,M!=null)this.push(M);f(F);var L=this._readableState;if(L.reading=!1,L.needReadable||L.length{q.exports=K;var Q=pK();x1()(K,Q);function K(J){if(!(this instanceof K))return new K(J);Q.call(this,J)}K.prototype._transform=function(J,Z,G){G(null,J)}}),hW=h0(($,q)=>{var Q;function K(k){var f=!1;return function(){if(f)return;f=!0,k.apply(void 0,arguments)}}var J=O1().codes,Z=J.ERR_MISSING_ARGS,G=J.ERR_STREAM_DESTROYED;function W(k){if(k)throw k}function B(k){return k.setHeader&&typeof k.abort==="function"}function V(k,f,L,D){D=K(D);var z=!1;if(k.on("close",function(){z=!0}),Q===void 0)Q=f7();Q(k,{readable:f,writable:L},function(H){if(H)return D(H);z=!0,D()});var N=!1;return function(H){if(z)return;if(N)return;if(N=!0,B(k))return k.abort();if(typeof k.destroy==="function")return k.destroy();D(H||new G("pipe"))}}function U(k){k()}function w(k,f){return k.pipe(f)}function F(k){if(!k.length)return W;if(typeof k[k.length-1]!=="function")return W;return k.pop()}function M(){for(var k=arguments.length,f=Array(k),L=0;L0;return V(H,j,n,function(d){if(!z)z=d;if(d)N.forEach(U);if(j)return;N.forEach(U),D(z)})});return f.reduce(w)}q.exports=M}),iK=h0(($,q)=>{var Q=a1();$=q.exports=mK(),$.Stream=Q||$,$.Readable=$,$.Writable=dK(),$.Duplex=L6(),$.Transform=pK(),$.PassThrough=yW(),$.finished=f7(),$.pipeline=hW()}),oK=h0(($)=>{var q=cK(),Q=x1(),K=iK(),J=$.readyStates={UNSENT:0,OPENED:1,HEADERS_RECEIVED:2,LOADING:3,DONE:4},Z=$.IncomingMessage=function(G,W,B,V){var U=this;if(K.Readable.call(U),U._mode=B,U.headers={},U.rawHeaders=[],U.trailers={},U.rawTrailers=[],U.on("end",function(){process.nextTick(function(){U.emit("close")})}),B==="fetch"){let D=function(){M.read().then(function(z){if(U._destroyed)return;if(V(z.done),z.done){U.push(null);return}U.push(Buffer.from(z.value)),D()}).catch(function(z){if(V(!0),!U._destroyed)U.emit("error",z)})};var w=D;if(U._fetchResponse=W,U.url=W.url,U.statusCode=W.status,U.statusMessage=W.statusText,W.headers.forEach(function(z,N){U.headers[N.toLowerCase()]=z,U.rawHeaders.push(N,z)}),q.writableStream){var F=new WritableStream({write:function(z){return V(!1),new Promise(function(N,H){if(U._destroyed)H();else if(U.push(Buffer.from(z)))N();else U._resumeFetch=N})},close:function(){if(V(!0),!U._destroyed)U.push(null)},abort:function(z){if(V(!0),!U._destroyed)U.emit("error",z)}});try{W.body.pipeTo(F).catch(function(z){if(V(!0),!U._destroyed)U.emit("error",z)});return}catch(z){}}var M=W.body.getReader();D()}else{U._xhr=G,U._pos=0,U.url=G.responseURL,U.statusCode=G.status,U.statusMessage=G.statusText;var k=G.getAllResponseHeaders().split(/\r?\n/);if(k.forEach(function(D){var z=D.match(/^([^:]+):\s*(.*)/);if(z){var N=z[1].toLowerCase();if(N==="set-cookie"){if(U.headers[N]===void 0)U.headers[N]=[];U.headers[N].push(z[2])}else if(U.headers[N]!==void 0)U.headers[N]+=", "+z[2];else U.headers[N]=z[2];U.rawHeaders.push(z[1],z[2])}}),U._charset="x-user-defined",!q.overrideMimeType){var f=U.rawHeaders["mime-type"];if(f){var L=f.match(/;\s*charset=([^;])(;|$)/);if(L)U._charset=L[1].toLowerCase()}if(!U._charset)U._charset="utf-8"}}};Q(Z,K.Readable),Z.prototype._read=function(){var G=this,W=G._resumeFetch;if(W)G._resumeFetch=null,W()},Z.prototype._onXHRProgress=function(G){var W=this,B=W._xhr,V=null;switch(W._mode){case"text":if(V=B.responseText,V.length>W._pos){var U=V.substr(W._pos);if(W._charset==="x-user-defined"){var w=Buffer.alloc(U.length);for(var F=0;FW._pos)W.push(Buffer.from(new Uint8Array(M.result.slice(W._pos)))),W._pos=M.result.byteLength},M.onload=function(){G(!0),W.push(null)},M.readAsArrayBuffer(V);break}if(W._xhr.readyState===J.DONE&&W._mode!=="ms-stream")G(!0),W.push(null)}}),xW=h0(($,q)=>{var Q=cK(),K=x1(),J=oK(),Z=iK(),G=J.IncomingMessage,W=J.readyStates;function B(F,M){if(Q.fetch&&M)return"fetch";else if(Q.mozchunkedarraybuffer)return"moz-chunked-arraybuffer";else if(Q.msstream)return"ms-stream";else if(Q.arraybuffer&&F)return"arraybuffer";else return"text"}var V=q.exports=function(F){var M=this;if(Z.Writable.call(M),M._opts=F,M._body=[],M._headers={},F.auth)M.setHeader("Authorization","Basic "+Buffer.from(F.auth).toString("base64"));Object.keys(F.headers).forEach(function(L){M.setHeader(L,F.headers[L])});var k,f=!0;if(F.mode==="disable-fetch"||"requestTimeout"in F&&!Q.abortController)f=!1,k=!0;else if(F.mode==="prefer-streaming")k=!1;else if(F.mode==="allow-wrong-content-type")k=!Q.overrideMimeType;else if(!F.mode||F.mode==="default"||F.mode==="prefer-fast")k=!0;else throw Error("Invalid value for opts.mode");M._mode=B(k,f),M._fetchTimer=null,M._socketTimeout=null,M._socketTimer=null,M.on("finish",function(){M._onFinish()})};K(V,Z.Writable),V.prototype.setHeader=function(F,M){var k=this,f=F.toLowerCase();if(w.indexOf(f)!==-1)return;k._headers[f]={name:F,value:M}},V.prototype.getHeader=function(F){var M=this._headers[F.toLowerCase()];if(M)return M.value;return null},V.prototype.removeHeader=function(F){var M=this;delete M._headers[F.toLowerCase()]},V.prototype._onFinish=function(){var F=this;if(F._destroyed)return;var M=F._opts;if("timeout"in M&&M.timeout!==0)F.setTimeout(M.timeout);var k=F._headers,f=null;if(M.method!=="GET"&&M.method!=="HEAD")f=new Blob(F._body,{type:(k["content-type"]||{}).value||""});var L=[];if(Object.keys(k).forEach(function(H){var v=k[H].name,j=k[H].value;if(Array.isArray(j))j.forEach(function(n){L.push([v,n])});else L.push([v,j])}),F._mode==="fetch"){var D=null;if(Q.abortController){var z=new AbortController;if(D=z.signal,F._fetchAbortController=z,"requestTimeout"in M&&M.requestTimeout!==0)F._fetchTimer=globalThis.setTimeout(function(){if(F.emit("requestTimeout"),F._fetchAbortController)F._fetchAbortController.abort()},M.requestTimeout)}globalThis.fetch(F._opts.url,{method:F._opts.method,headers:L,body:f||void 0,mode:"cors",credentials:M.withCredentials?"include":"same-origin",signal:D}).then(function(H){F._fetchResponse=H,F._resetTimers(!1),F._connect()},function(H){if(F._resetTimers(!0),!F._destroyed)F.emit("error",H)})}else{var N=F._xhr=new globalThis.XMLHttpRequest;try{N.open(F._opts.method,F._opts.url,!0)}catch(H){process.nextTick(function(){F.emit("error",H)});return}if("responseType"in N)N.responseType=F._mode;if("withCredentials"in N)N.withCredentials=!!M.withCredentials;if(F._mode==="text"&&"overrideMimeType"in N)N.overrideMimeType("text/plain; charset=x-user-defined");if("requestTimeout"in M)N.timeout=M.requestTimeout,N.ontimeout=function(){F.emit("requestTimeout")};if(L.forEach(function(H){N.setRequestHeader(H[0],H[1])}),F._response=null,N.onreadystatechange=function(){switch(N.readyState){case W.LOADING:case W.DONE:F._onXHRProgress();break}},F._mode==="moz-chunked-arraybuffer")N.onprogress=function(){F._onXHRProgress()};N.onerror=function(){if(F._destroyed)return;F._resetTimers(!0),F.emit("error",Error("XHR error"))};try{N.send(f)}catch(H){process.nextTick(function(){F.emit("error",H)});return}}};function U(F){try{var M=F.status;return M!==null&&M!==0}catch(k){return!1}}V.prototype._onXHRProgress=function(){var F=this;if(F._resetTimers(!1),!U(F._xhr)||F._destroyed)return;if(!F._response)F._connect();F._response._onXHRProgress(F._resetTimers.bind(F))},V.prototype._connect=function(){var F=this;if(F._destroyed)return;F._response=new G(F._xhr,F._fetchResponse,F._mode,F._resetTimers.bind(F)),F._response.on("error",function(M){F.emit("error",M)}),F.emit("response",F._response)},V.prototype._write=function(F,M,k){var f=this;f._body.push(F),k()},V.prototype._resetTimers=function(F){var M=this;if(globalThis.clearTimeout(M._socketTimer),M._socketTimer=null,F)globalThis.clearTimeout(M._fetchTimer),M._fetchTimer=null;else if(M._socketTimeout)M._socketTimer=globalThis.setTimeout(function(){M.emit("timeout")},M._socketTimeout)},V.prototype.abort=V.prototype.destroy=function(F){var M=this;if(M._destroyed=!0,M._resetTimers(!0),M._response)M._response._destroyed=!0;if(M._xhr)M._xhr.abort();else if(M._fetchAbortController)M._fetchAbortController.abort();if(F)M.emit("error",F)},V.prototype.end=function(F,M,k){var f=this;if(typeof F==="function")k=F,F=void 0;Z.Writable.prototype.end.call(f,F,M,k)},V.prototype.setTimeout=function(F,M){var k=this;if(M)k.once("timeout",M);k._socketTimeout=F,k._resetTimers(!1)},V.prototype.flushHeaders=function(){},V.prototype.setNoDelay=function(){},V.prototype.setSocketKeepAlive=function(){};var w=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","date","dnt","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","via"]}),OW=h0(($,q)=>{q.exports=K;var Q=Object.prototype.hasOwnProperty;function K(){var J={};for(var Z=0;Z{q.exports=(I7(),X0(R7)).STATUS_CODES}),TW=h0(($)=>{var q=xW(),Q=oK(),K=OW(),J=PW(),Z=(v7(),X0(H7)),G=$;G.request=function(W,B){if(typeof W==="string")W=Z.parse(W);else W=K(W);var V=globalThis.location.protocol.search(/^https?:$/)===-1?"http:":"",U=W.protocol||V,w=W.hostname||W.host,F=W.port,M=W.path||"/";if(w&&w.indexOf(":")!==-1)w="["+w+"]";W.url=(w?U+"//"+w:"")+(F?":"+F:"")+M,W.method=(W.method||"GET").toUpperCase(),W.headers=W.headers||{};var k=new q(W);if(B)k.on("response",B);return k},G.get=function(W,B){var V=G.request(W,B);return V.end(),V},G.ClientRequest=q,G.IncomingMessage=Q.IncomingMessage,G.Agent=function(){},G.Agent.defaultMaxSockets=4,G.globalAgent=new G.Agent,G.STATUS_CODES=J,G.METHODS=["CHECKOUT","CONNECT","COPY","DELETE","GET","HEAD","LOCK","M-SEARCH","MERGE","MKACTIVITY","MKCOL","MOVE","NOTIFY","OPTIONS","PATCH","POST","PROPFIND","PROPPATCH","PURGE","PUT","REPORT","SEARCH","SUBSCRIBE","TRACE","UNLOCK","UNSUBSCRIBE"]}),aK=RW(TW(),1),{request:uW,get:SW,ClientRequest:EW,IncomingMessage:_W,Agent:cW,globalAgent:bW,STATUS_CODES:nW,METHODS:dW}=aK.default,mW=aK.default});var sK={};c1(sK,{validateHeaderValue:()=>MB,validateHeaderName:()=>FB,setMaxIdleHTTPParsers:()=>zB,request:()=>BB,maxHeaderSize:()=>WB,globalAgent:()=>GB,get:()=>ZB,default:()=>wB,createServer:()=>UB,ServerResponse:()=>VB,Server:()=>JB,STATUS_CODES:()=>KB,OutgoingMessage:()=>qB,METHODS:()=>QB,IncomingMessage:()=>$B,ClientRequest:()=>eW,Agent:()=>tW});var pW,iW,lK,oW,aW,lW=($,q,Q)=>{Q=$!=null?pW(iW($)):{};let K=q||!$||!$.__esModule?lK(Q,"default",{value:$,enumerable:!0}):Q;for(let J of oW($))if(!aW.call(K,J))lK(K,J,{get:()=>$[J],enumerable:!0});return K},rW=($,q)=>()=>(q||$((q={exports:{}}).exports,q),q.exports),sW,rK,tW,eW,$B,QB,qB,KB,JB,VB,UB,ZB,GB,WB,BB,zB,FB,MB,wB;var tK=b1(()=>{pW=Object.create,{getPrototypeOf:iW,defineProperty:lK,getOwnPropertyNames:oW}=Object,aW=Object.prototype.hasOwnProperty,sW=rW(($,q)=>{var Q=(I7(),X0(R7)),K=(v7(),X0(H7)),J=$;for(Z in Q)if(Q.hasOwnProperty(Z))J[Z]=Q[Z];var Z;J.request=function(W,B){return W=G(W),Q.request.call(this,W,B)},J.get=function(W,B){return W=G(W),Q.get.call(this,W,B)};function G(W){if(typeof W==="string")W=K.parse(W);if(!W.protocol)W.protocol="https:";if(W.protocol!=="https:")throw Error('Protocol "'+W.protocol+'" not supported. Expected "https:"');return W}}),rK=lW(sW(),1),{Agent:tW,ClientRequest:eW,IncomingMessage:$B,METHODS:QB,OutgoingMessage:qB,STATUS_CODES:KB,Server:JB,ServerResponse:VB,createServer:UB,get:ZB,globalAgent:GB,maxHeaderSize:WB,request:BB,setMaxIdleHTTPParsers:zB,validateHeaderName:FB,validateHeaderValue:MB}=rK,wB=rK});var V9=globalThis;if(typeof V9.global>"u")V9.global=globalThis;t0();var Uz=K9(h9(),1);var _7=K9(HK(),1);function W2($,q,Q,K){function J(Z){return Z instanceof Q?Z:new Q(function(G){G(Z)})}return new(Q||(Q=Promise))(function(Z,G){function W(U){try{V(K.next(U))}catch(w){G(w)}}function B(U){try{V(K.throw(U))}catch(w){G(w)}}function V(U){U.done?Z(U.value):J(U.value).then(W,B)}V((K=K.apply($,q||[])).next())})}var L0=914400,w8=12700,n0=`\r +`,NB=2147483649,C7=/^[0-9a-fA-F]{6}$/,YB=1.67,kB=27,H6={type:"solid",color:"666666",pt:1},JJ=[0.05,0.1,0.05,0.1],v6={color:"363636",pt:1},u1={color:"888888",style:"solid",size:1,cap:"flat"},Q2="000000",k2=12,DB=18,f6="LAYOUT_16x9",h7="DEFAULT",VJ="333333",P1={type:"outer",blur:3,offset:1.811023622047244,angle:90,color:"000000",opacity:0.35,rotateWithShape:!0},M8=[0.5,0.5,0.5,0.5],eK={color:"000000"},LB={size:8,color:"FFFFFF",opacity:0.75},o2="2094734552",N5="2094734553",B8="2094734554",x7="2094734555",UJ="2094734556",W8="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""),z8=["C0504D","4F81BD","9BBB59","8064A2","4BACC6","F79646","628FC6","C86360","C0504D","4F81BD","9BBB59","8064A2","4BACC6","F79646","628FC6","C86360"],HB=["5DA5DA","FAA43A","60BD68","F17CB0","B2912F","B276B2","DECF3F","F15854","A7A7A7","5DA5DA","FAA43A","60BD68","F17CB0","B2912F","B276B2","DECF3F","F15854","A7A7A7"],R6;(function($){$.left="left",$.center="center",$.right="right",$.justify="justify"})(R6||(R6={}));var I6;(function($){$.b="b",$.ctr="ctr",$.t="t"})(I6||(I6={}));var ZJ="{F7021451-1387-4CA6-816F-3879F97B5CBC}",O7;(function($){$.arraybuffer="arraybuffer",$.base64="base64",$.binarystring="binarystring",$.blob="blob",$.nodebuffer="nodebuffer",$.uint8array="uint8array"})(O7||(O7={}));var P7;(function($){$.area="area",$.bar="bar",$.bar3d="bar3D",$.bubble="bubble",$.bubble3d="bubble3D",$.doughnut="doughnut",$.line="line",$.pie="pie",$.radar="radar",$.scatter="scatter"})(P7||(P7={}));var T7;(function($){$.accentBorderCallout1="accentBorderCallout1",$.accentBorderCallout2="accentBorderCallout2",$.accentBorderCallout3="accentBorderCallout3",$.accentCallout1="accentCallout1",$.accentCallout2="accentCallout2",$.accentCallout3="accentCallout3",$.actionButtonBackPrevious="actionButtonBackPrevious",$.actionButtonBeginning="actionButtonBeginning",$.actionButtonBlank="actionButtonBlank",$.actionButtonDocument="actionButtonDocument",$.actionButtonEnd="actionButtonEnd",$.actionButtonForwardNext="actionButtonForwardNext",$.actionButtonHelp="actionButtonHelp",$.actionButtonHome="actionButtonHome",$.actionButtonInformation="actionButtonInformation",$.actionButtonMovie="actionButtonMovie",$.actionButtonReturn="actionButtonReturn",$.actionButtonSound="actionButtonSound",$.arc="arc",$.bentArrow="bentArrow",$.bentUpArrow="bentUpArrow",$.bevel="bevel",$.blockArc="blockArc",$.borderCallout1="borderCallout1",$.borderCallout2="borderCallout2",$.borderCallout3="borderCallout3",$.bracePair="bracePair",$.bracketPair="bracketPair",$.callout1="callout1",$.callout2="callout2",$.callout3="callout3",$.can="can",$.chartPlus="chartPlus",$.chartStar="chartStar",$.chartX="chartX",$.chevron="chevron",$.chord="chord",$.circularArrow="circularArrow",$.cloud="cloud",$.cloudCallout="cloudCallout",$.corner="corner",$.cornerTabs="cornerTabs",$.cube="cube",$.curvedDownArrow="curvedDownArrow",$.curvedLeftArrow="curvedLeftArrow",$.curvedRightArrow="curvedRightArrow",$.curvedUpArrow="curvedUpArrow",$.custGeom="custGeom",$.decagon="decagon",$.diagStripe="diagStripe",$.diamond="diamond",$.dodecagon="dodecagon",$.donut="donut",$.doubleWave="doubleWave",$.downArrow="downArrow",$.downArrowCallout="downArrowCallout",$.ellipse="ellipse",$.ellipseRibbon="ellipseRibbon",$.ellipseRibbon2="ellipseRibbon2",$.flowChartAlternateProcess="flowChartAlternateProcess",$.flowChartCollate="flowChartCollate",$.flowChartConnector="flowChartConnector",$.flowChartDecision="flowChartDecision",$.flowChartDelay="flowChartDelay",$.flowChartDisplay="flowChartDisplay",$.flowChartDocument="flowChartDocument",$.flowChartExtract="flowChartExtract",$.flowChartInputOutput="flowChartInputOutput",$.flowChartInternalStorage="flowChartInternalStorage",$.flowChartMagneticDisk="flowChartMagneticDisk",$.flowChartMagneticDrum="flowChartMagneticDrum",$.flowChartMagneticTape="flowChartMagneticTape",$.flowChartManualInput="flowChartManualInput",$.flowChartManualOperation="flowChartManualOperation",$.flowChartMerge="flowChartMerge",$.flowChartMultidocument="flowChartMultidocument",$.flowChartOfflineStorage="flowChartOfflineStorage",$.flowChartOffpageConnector="flowChartOffpageConnector",$.flowChartOnlineStorage="flowChartOnlineStorage",$.flowChartOr="flowChartOr",$.flowChartPredefinedProcess="flowChartPredefinedProcess",$.flowChartPreparation="flowChartPreparation",$.flowChartProcess="flowChartProcess",$.flowChartPunchedCard="flowChartPunchedCard",$.flowChartPunchedTape="flowChartPunchedTape",$.flowChartSort="flowChartSort",$.flowChartSummingJunction="flowChartSummingJunction",$.flowChartTerminator="flowChartTerminator",$.folderCorner="folderCorner",$.frame="frame",$.funnel="funnel",$.gear6="gear6",$.gear9="gear9",$.halfFrame="halfFrame",$.heart="heart",$.heptagon="heptagon",$.hexagon="hexagon",$.homePlate="homePlate",$.horizontalScroll="horizontalScroll",$.irregularSeal1="irregularSeal1",$.irregularSeal2="irregularSeal2",$.leftArrow="leftArrow",$.leftArrowCallout="leftArrowCallout",$.leftBrace="leftBrace",$.leftBracket="leftBracket",$.leftCircularArrow="leftCircularArrow",$.leftRightArrow="leftRightArrow",$.leftRightArrowCallout="leftRightArrowCallout",$.leftRightCircularArrow="leftRightCircularArrow",$.leftRightRibbon="leftRightRibbon",$.leftRightUpArrow="leftRightUpArrow",$.leftUpArrow="leftUpArrow",$.lightningBolt="lightningBolt",$.line="line",$.lineInv="lineInv",$.mathDivide="mathDivide",$.mathEqual="mathEqual",$.mathMinus="mathMinus",$.mathMultiply="mathMultiply",$.mathNotEqual="mathNotEqual",$.mathPlus="mathPlus",$.moon="moon",$.noSmoking="noSmoking",$.nonIsoscelesTrapezoid="nonIsoscelesTrapezoid",$.notchedRightArrow="notchedRightArrow",$.octagon="octagon",$.parallelogram="parallelogram",$.pentagon="pentagon",$.pie="pie",$.pieWedge="pieWedge",$.plaque="plaque",$.plaqueTabs="plaqueTabs",$.plus="plus",$.quadArrow="quadArrow",$.quadArrowCallout="quadArrowCallout",$.rect="rect",$.ribbon="ribbon",$.ribbon2="ribbon2",$.rightArrow="rightArrow",$.rightArrowCallout="rightArrowCallout",$.rightBrace="rightBrace",$.rightBracket="rightBracket",$.round1Rect="round1Rect",$.round2DiagRect="round2DiagRect",$.round2SameRect="round2SameRect",$.roundRect="roundRect",$.rtTriangle="rtTriangle",$.smileyFace="smileyFace",$.snip1Rect="snip1Rect",$.snip2DiagRect="snip2DiagRect",$.snip2SameRect="snip2SameRect",$.snipRoundRect="snipRoundRect",$.squareTabs="squareTabs",$.star10="star10",$.star12="star12",$.star16="star16",$.star24="star24",$.star32="star32",$.star4="star4",$.star5="star5",$.star6="star6",$.star7="star7",$.star8="star8",$.stripedRightArrow="stripedRightArrow",$.sun="sun",$.swooshArrow="swooshArrow",$.teardrop="teardrop",$.trapezoid="trapezoid",$.triangle="triangle",$.upArrow="upArrow",$.upArrowCallout="upArrowCallout",$.upDownArrow="upDownArrow",$.upDownArrowCallout="upDownArrowCallout",$.uturnArrow="uturnArrow",$.verticalScroll="verticalScroll",$.wave="wave",$.wedgeEllipseCallout="wedgeEllipseCallout",$.wedgeRectCallout="wedgeRectCallout",$.wedgeRoundRectCallout="wedgeRoundRectCallout"})(T7||(T7={}));var G2;(function($){$.text1="tx1",$.text2="tx2",$.background1="bg1",$.background2="bg2",$.accent1="accent1",$.accent2="accent2",$.accent3="accent3",$.accent4="accent4",$.accent5="accent5",$.accent6="accent6"})(G2||(G2={}));var u7;(function($){$.left="left",$.center="center",$.right="right",$.justify="justify"})(u7||(u7={}));var S7;(function($){$.top="top",$.middle="middle",$.bottom="bottom"})(S7||(S7={}));var B1;(function($){$.ACTION_BUTTON_BACK_OR_PREVIOUS="actionButtonBackPrevious",$.ACTION_BUTTON_BEGINNING="actionButtonBeginning",$.ACTION_BUTTON_CUSTOM="actionButtonBlank",$.ACTION_BUTTON_DOCUMENT="actionButtonDocument",$.ACTION_BUTTON_END="actionButtonEnd",$.ACTION_BUTTON_FORWARD_OR_NEXT="actionButtonForwardNext",$.ACTION_BUTTON_HELP="actionButtonHelp",$.ACTION_BUTTON_HOME="actionButtonHome",$.ACTION_BUTTON_INFORMATION="actionButtonInformation",$.ACTION_BUTTON_MOVIE="actionButtonMovie",$.ACTION_BUTTON_RETURN="actionButtonReturn",$.ACTION_BUTTON_SOUND="actionButtonSound",$.ARC="arc",$.BALLOON="wedgeRoundRectCallout",$.BENT_ARROW="bentArrow",$.BENT_UP_ARROW="bentUpArrow",$.BEVEL="bevel",$.BLOCK_ARC="blockArc",$.CAN="can",$.CHART_PLUS="chartPlus",$.CHART_STAR="chartStar",$.CHART_X="chartX",$.CHEVRON="chevron",$.CHORD="chord",$.CIRCULAR_ARROW="circularArrow",$.CLOUD="cloud",$.CLOUD_CALLOUT="cloudCallout",$.CORNER="corner",$.CORNER_TABS="cornerTabs",$.CROSS="plus",$.CUBE="cube",$.CURVED_DOWN_ARROW="curvedDownArrow",$.CURVED_DOWN_RIBBON="ellipseRibbon",$.CURVED_LEFT_ARROW="curvedLeftArrow",$.CURVED_RIGHT_ARROW="curvedRightArrow",$.CURVED_UP_ARROW="curvedUpArrow",$.CURVED_UP_RIBBON="ellipseRibbon2",$.CUSTOM_GEOMETRY="custGeom",$.DECAGON="decagon",$.DIAGONAL_STRIPE="diagStripe",$.DIAMOND="diamond",$.DODECAGON="dodecagon",$.DONUT="donut",$.DOUBLE_BRACE="bracePair",$.DOUBLE_BRACKET="bracketPair",$.DOUBLE_WAVE="doubleWave",$.DOWN_ARROW="downArrow",$.DOWN_ARROW_CALLOUT="downArrowCallout",$.DOWN_RIBBON="ribbon",$.EXPLOSION1="irregularSeal1",$.EXPLOSION2="irregularSeal2",$.FLOWCHART_ALTERNATE_PROCESS="flowChartAlternateProcess",$.FLOWCHART_CARD="flowChartPunchedCard",$.FLOWCHART_COLLATE="flowChartCollate",$.FLOWCHART_CONNECTOR="flowChartConnector",$.FLOWCHART_DATA="flowChartInputOutput",$.FLOWCHART_DECISION="flowChartDecision",$.FLOWCHART_DELAY="flowChartDelay",$.FLOWCHART_DIRECT_ACCESS_STORAGE="flowChartMagneticDrum",$.FLOWCHART_DISPLAY="flowChartDisplay",$.FLOWCHART_DOCUMENT="flowChartDocument",$.FLOWCHART_EXTRACT="flowChartExtract",$.FLOWCHART_INTERNAL_STORAGE="flowChartInternalStorage",$.FLOWCHART_MAGNETIC_DISK="flowChartMagneticDisk",$.FLOWCHART_MANUAL_INPUT="flowChartManualInput",$.FLOWCHART_MANUAL_OPERATION="flowChartManualOperation",$.FLOWCHART_MERGE="flowChartMerge",$.FLOWCHART_MULTIDOCUMENT="flowChartMultidocument",$.FLOWCHART_OFFLINE_STORAGE="flowChartOfflineStorage",$.FLOWCHART_OFFPAGE_CONNECTOR="flowChartOffpageConnector",$.FLOWCHART_OR="flowChartOr",$.FLOWCHART_PREDEFINED_PROCESS="flowChartPredefinedProcess",$.FLOWCHART_PREPARATION="flowChartPreparation",$.FLOWCHART_PROCESS="flowChartProcess",$.FLOWCHART_PUNCHED_TAPE="flowChartPunchedTape",$.FLOWCHART_SEQUENTIAL_ACCESS_STORAGE="flowChartMagneticTape",$.FLOWCHART_SORT="flowChartSort",$.FLOWCHART_STORED_DATA="flowChartOnlineStorage",$.FLOWCHART_SUMMING_JUNCTION="flowChartSummingJunction",$.FLOWCHART_TERMINATOR="flowChartTerminator",$.FOLDED_CORNER="folderCorner",$.FRAME="frame",$.FUNNEL="funnel",$.GEAR_6="gear6",$.GEAR_9="gear9",$.HALF_FRAME="halfFrame",$.HEART="heart",$.HEPTAGON="heptagon",$.HEXAGON="hexagon",$.HORIZONTAL_SCROLL="horizontalScroll",$.ISOSCELES_TRIANGLE="triangle",$.LEFT_ARROW="leftArrow",$.LEFT_ARROW_CALLOUT="leftArrowCallout",$.LEFT_BRACE="leftBrace",$.LEFT_BRACKET="leftBracket",$.LEFT_CIRCULAR_ARROW="leftCircularArrow",$.LEFT_RIGHT_ARROW="leftRightArrow",$.LEFT_RIGHT_ARROW_CALLOUT="leftRightArrowCallout",$.LEFT_RIGHT_CIRCULAR_ARROW="leftRightCircularArrow",$.LEFT_RIGHT_RIBBON="leftRightRibbon",$.LEFT_RIGHT_UP_ARROW="leftRightUpArrow",$.LEFT_UP_ARROW="leftUpArrow",$.LIGHTNING_BOLT="lightningBolt",$.LINE_CALLOUT_1="borderCallout1",$.LINE_CALLOUT_1_ACCENT_BAR="accentCallout1",$.LINE_CALLOUT_1_BORDER_AND_ACCENT_BAR="accentBorderCallout1",$.LINE_CALLOUT_1_NO_BORDER="callout1",$.LINE_CALLOUT_2="borderCallout2",$.LINE_CALLOUT_2_ACCENT_BAR="accentCallout2",$.LINE_CALLOUT_2_BORDER_AND_ACCENT_BAR="accentBorderCallout2",$.LINE_CALLOUT_2_NO_BORDER="callout2",$.LINE_CALLOUT_3="borderCallout3",$.LINE_CALLOUT_3_ACCENT_BAR="accentCallout3",$.LINE_CALLOUT_3_BORDER_AND_ACCENT_BAR="accentBorderCallout3",$.LINE_CALLOUT_3_NO_BORDER="callout3",$.LINE_CALLOUT_4="borderCallout4",$.LINE_CALLOUT_4_ACCENT_BAR="accentCallout3=4",$.LINE_CALLOUT_4_BORDER_AND_ACCENT_BAR="accentBorderCallout4",$.LINE_CALLOUT_4_NO_BORDER="callout4",$.LINE="line",$.LINE_INVERSE="lineInv",$.MATH_DIVIDE="mathDivide",$.MATH_EQUAL="mathEqual",$.MATH_MINUS="mathMinus",$.MATH_MULTIPLY="mathMultiply",$.MATH_NOT_EQUAL="mathNotEqual",$.MATH_PLUS="mathPlus",$.MOON="moon",$.NON_ISOSCELES_TRAPEZOID="nonIsoscelesTrapezoid",$.NOTCHED_RIGHT_ARROW="notchedRightArrow",$.NO_SYMBOL="noSmoking",$.OCTAGON="octagon",$.OVAL="ellipse",$.OVAL_CALLOUT="wedgeEllipseCallout",$.PARALLELOGRAM="parallelogram",$.PENTAGON="homePlate",$.PIE="pie",$.PIE_WEDGE="pieWedge",$.PLAQUE="plaque",$.PLAQUE_TABS="plaqueTabs",$.QUAD_ARROW="quadArrow",$.QUAD_ARROW_CALLOUT="quadArrowCallout",$.RECTANGLE="rect",$.RECTANGULAR_CALLOUT="wedgeRectCallout",$.REGULAR_PENTAGON="pentagon",$.RIGHT_ARROW="rightArrow",$.RIGHT_ARROW_CALLOUT="rightArrowCallout",$.RIGHT_BRACE="rightBrace",$.RIGHT_BRACKET="rightBracket",$.RIGHT_TRIANGLE="rtTriangle",$.ROUNDED_RECTANGLE="roundRect",$.ROUNDED_RECTANGULAR_CALLOUT="wedgeRoundRectCallout",$.ROUND_1_RECTANGLE="round1Rect",$.ROUND_2_DIAG_RECTANGLE="round2DiagRect",$.ROUND_2_SAME_RECTANGLE="round2SameRect",$.SMILEY_FACE="smileyFace",$.SNIP_1_RECTANGLE="snip1Rect",$.SNIP_2_DIAG_RECTANGLE="snip2DiagRect",$.SNIP_2_SAME_RECTANGLE="snip2SameRect",$.SNIP_ROUND_RECTANGLE="snipRoundRect",$.SQUARE_TABS="squareTabs",$.STAR_10_POINT="star10",$.STAR_12_POINT="star12",$.STAR_16_POINT="star16",$.STAR_24_POINT="star24",$.STAR_32_POINT="star32",$.STAR_4_POINT="star4",$.STAR_5_POINT="star5",$.STAR_6_POINT="star6",$.STAR_7_POINT="star7",$.STAR_8_POINT="star8",$.STRIPED_RIGHT_ARROW="stripedRightArrow",$.SUN="sun",$.SWOOSH_ARROW="swooshArrow",$.TEAR="teardrop",$.TRAPEZOID="trapezoid",$.UP_ARROW="upArrow",$.UP_ARROW_CALLOUT="upArrowCallout",$.UP_DOWN_ARROW="upDownArrow",$.UP_DOWN_ARROW_CALLOUT="upDownArrowCallout",$.UP_RIBBON="ribbon2",$.U_TURN_ARROW="uturnArrow",$.VERTICAL_SCROLL="verticalScroll",$.WAVE="wave"})(B1||(B1={}));var q0;(function($){$.AREA="area",$.BAR="bar",$.BAR3D="bar3D",$.BUBBLE="bubble",$.BUBBLE3D="bubble3D",$.DOUGHNUT="doughnut",$.LINE="line",$.PIE="pie",$.RADAR="radar",$.SCATTER="scatter"})(q0||(q0={}));var D5;(function($){$.TEXT1="tx1",$.TEXT2="tx2",$.BACKGROUND1="bg1",$.BACKGROUND2="bg2",$.ACCENT1="accent1",$.ACCENT2="accent2",$.ACCENT3="accent3",$.ACCENT4="accent4",$.ACCENT5="accent5",$.ACCENT6="accent6"})(D5||(D5={}));var W1;(function($){$.chart="chart",$.image="image",$.line="line",$.rect="rect",$.text="text",$.placeholder="placeholder"})(W1||(W1={}));var D0;(function($){$.chart="chart",$.hyperlink="hyperlink",$.image="image",$.media="media",$.online="online",$.placeholder="placeholder",$.table="table",$.tablecell="tablecell",$.text="text",$.notes="notes"})(D0||(D0={}));var F8;(function($){$.title="title",$.body="body",$.image="pic",$.chart="chart",$.table="tbl",$.media="media"})(F8||(F8={}));var C6;(function($){$.DEFAULT="•",$.CHECK="✓",$.STAR="★",$.TRIANGLE="▶"})(C6||(C6={}));var j6="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAB3CAYAAAD1oOVhAAAGAUlEQVR4Xu2dT0xcRRzHf7tAYSsc0EBSIq2xEg8mtTGebVzEqOVIolz0siRE4gGTStqKwdpWsXoyGhMuyAVJOHBgqyvLNgonDkabeCBYW/8kTUr0wsJC+Wfm0bfuvn37Znbem9mR9303mJnf/Pb7ed95M7PDI5JIJPYJV5EC7e3t1N/fT62trdqViQCIu+bVgpIHEo/Hqbe3V/sdYVKHyWSSZmZm8ilVA0oeyNjYmEnaVC2Xvr6+qg5fAOJAz4DU1dURGzFSqZRVqtMpAFIGyMjICC0vL9PExIRWKADiAYTNshYWFrRCARAOEFZcCKWtrY0GBgaUTYkBRACIE4rKZwqACALR5RQAqQCIDqcASIVAVDsFQCSAqHQKgEgCUeUUAPEBRIVTAMQnEBvK5OQkbW9vk991CoAEAMQJxc86BUACAhKUUwAkQCBBOAVAAgbi1ykAogCIH6cAiCIgsk4BEIVAZJwCIIqBVLqiBxANQFgXS0tLND4+zl08AogmIG5OSSQS1gGKwgtANAIRcQqAaAbCe6YASBWA2E6xDyeyDUl7+AKQMkDYYevm5mZHabA/Li4uUiaTsYLau8QA4gLE/hU7wajyYtv1hReDAiAOxQcHBymbzark4BkbQKom/X8dp9Npmpqasn4BIAYAYSnYp+4BBEAMUcCwNOCQsAKZnp62NtQOw8WmwT09PUo+ijaHsOMx7GppaaH6+nolH0Z10K2tLVpdXbW6UfV3mNqBdHd3U1NTk2rtlMRfW1uj2dlZAFGirkRQAJEQTWUTAFGprkRsAJEQTWUTAFGprkRsAJEQTWUTAFGprkRsAJEQTWUTAFGprkRsAJEQTWUTAFGprkRsAJEQTWUTAGHqrm8caPzQ0WC1logbeiC7X3xJm0PvUmRzh45cuki1588FAmVn9BO6P3yF9utrqGH0MtW82S8UN9RA9v/4k7InjhcJFTs/TLVXLwmJV67S7vD7tHF5pKi46fYdosdOcOOGG8j1OcqefbFEJD9Q3GCwDhqT31HklS4A8VRgfYM2Op6k3bt/BQJl58J7lPvwg5JYNccepaMry0LPqFA7hCm39+NNyp2J0172b19QysGINj5CsRtpij57musOViH0QPJQXn6J9u7dlYJSFkbrMYolrwvDAJAC+WWdEpQz7FTgECeUCpzi6YxvvqXoM6eEhqnCSgDikEzUKUE7Aw7xuHctKB5OYU3dZlNR9syQdAaAcAYTC0pXF+39c09o2Ik+3EqxVKqiB7hbYAxZkk4pbBaEM+AQofv+wTrFwylBOQNABIGwavdfe4O2pg5elO+86l99nY58/VUF0byrYsjiSFluNlXYrOHcBar7+EogUADEQ0YRGHbzoKAASBkg2+9cpM1rV0tK2QOcXW7bLEFAARAXIF4w2DrDWoeUWaf4hQIgDiA8GPZ2iNfi0Q8UACkAIgrDbrJ385eDxaPLLrEsFAB5oG6lMPJQPLZZZKAACBGVhcG2Q+bmuLu2nk55e4jqPv1IeEoceiBeX7s2zCa5MAqdstl91vfXwaEGsv/rb5TtOFk6tWXOuJGh6KmnhO9sayrMninPx103JBtXblHkice58cINZP4Hyr5wpkgkdiChEmc4FWazLzenNKa/p0jncwDiqcD6BuWePk07t1asatZGoYQzSqA4nFJ7soNiP/+EUyfc25GI2GG53dHPrKo1g/1Cw4pIXLrzO+1c+/wg7tBbFDle/EbQcjFCPWQJCau5EoBoFpzXHYDwFNJcDiCaBed1ByA8hTSXA4hmwXndAQhPIc3lAKJZcF53AMJTSHM5gGgWnNcdgPAU0lwOIJoF53UHIDyFNJcfSiCdnZ0Ui8U0SxlMd7lcjubn561gh+Y1scFIU/0o/3sgeLO12E2k7UXKYumgFoAYdg8ACIAYpoBh6cAhAGKYAoalA4cAiGEKGJYOHAIghilgWDpwCIAYpoBh6cAhAGKYAoalA4cAiGEKGJYOHAIghilgWDpwCIAYpoBh6ZQ4JB6PKzviYthnNy4d9h+1M5mMlVckkUjsG5dhiBMCEMPg/wuOfrZZ/RSywQAAAABJRU5ErkJggg==",vB="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAB4AAAAVnCAYAAACzfHDVAAAAYHpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjaVcjJDYAwDEXBu6ughBfH+YnLQSwSHVA+Yrkwx7HtPHabHuEWrQ+lBBAZ6TMweBWoCwUH8quZH6VWFXVT696zxp12ARkVFEqn8wB8AAAACXBIWXMAAC4jAAAuIwF4pT92AADZLklEQVR42uzdd5hV9Z0/8M+dmcsUZmDovYOhKCiKYhR7JJuoSTCWGFI0WUxijBoTTXazVlyza4maYm9rTRSJigVsqCDNQhHBAogKCEgRMjMMU+7vj93sL8kqClLmnPt6PY+PeXZM9vP9vO8jZ+Y955xMfJLjorBrRMuSgmiViyjN1Ee2oSCyucbIBAAAAAAAAADbXaYgcoWNUZcrirpMbdRsysa69wbF+rggGrf439vSF7seF12aFUTnxvoosGIAAAAAAACAXacgoqEgF++/VRgr4r5o+Kh/pvD//F8uiII+LaPrum/EXzqui2b1ddHGKgEAAAAAAAB2rVxEQWMmWrQtjHZlA6N2w2tR84//zP8pgHu3ib6NBdG+zdqorK6KVUXZaB85j3sGAAAAAAAAaAoaG6OwIBdtyneP2PBabPzbr/1dAdx3VHRtyESHiIhcYzQrLo7WmVzkcjmPgAYAAAAAAABoSgpy0eIfS+D/LYD7fy3abC6Inn/7X2hsjELlLwAAAAAAAEDT9D8lcM1fHwddFBFxyAVR9M686PVp/gfqayKiJiLqLBMAAAAAAABgh8hGRGlEUekn/6PFEb3ikNgQk6O+KCJi6dzoksv83/cB/1X9xoiaJdmoWxlRV1dk2QAAAAAAAAA7QTZbH9muERX96v7n9t7/q6Exinq3i86LI94pjOOisHUu+uYykfmof7h+Y8Sa6aVRt74gGhs9DRoAAAAAAABgZ2lsLIi69QWxeUUmSjs0/vedwR8hk4uydSfE+wVd6qOyMfMx7/mtj9jwUtbjngEAAAAAAAB2obrqolg7IxtR/9Ffb4wo7P5GtCwobRaVH/c/UvNmNuqqPfIZAAAAAAAAYFerqy6KmjezH/v1ktpoVZBr/PgCeMN7yl8AAAAAAACApmJLHW5jUVQWNDSP+Q3ZeLco4i9/+8X6teHRzwAAAAAAAABNSd3/dLn/oLAoqqIuVhXFxhhSGB/xqGjlLwAAAAAAAECTU1eTjaK/KXSLIv7SWB+bc5ko9YxnAAAAAAAAgATJFv393bz1EeV//c8F1gMAAAAAAACQDgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKSEAhgAAAAAAAAgJRTAAAAAAAAAACmhAAYAAAAAAABICQUwAAAAAAAAQEoogAEAAAAAAABSQgEMAAAAAAAAkBIKYAAAAAAAAICUUAADAAAAAAAApIQCGAAAAAAAACAlFMAAAAAAAAAAKaEABgAAAAAAAEgJBTAAAAAAAABASiiAAQAAAAAAAFJCAQwAAAAAAACQEgpgAAAAAAAAgJRQAAMAAAAAAACkhAIYAAAAAAAAICUUwAAAAAAAAAApoQAGAAAAAAAASAkFMAAAAAAAAEBKKIABAAAAAAAAUkIBDAAAAAAAAJASCmAAAAAAAACAlFAAAwAAAAAAAKREkRUAAACwrUpLSwuGDRvWfMCAAS26du3avKysrLiioqKkZcuWzZs1a1bcvHnz0tLS0rJsNtusuLi4ebNmzUoLCgo+8/eijY2N9Zs3b66pra2tqqur21xTU1NdVVVVs2nTptqNGzdWbdiwoeYvf/nL5hUrVlQtWLBgw6xZs6pqamoaJQYAAEDaKYABAACIiIghQ4aUHnTQQW379u3bql27dq3at2/fpkWLFq2bN29eWVpa2qpZs2bNCwsLm2ez2fLCwsLyoqKi8sLCwtKknK+hoaG6vr6+qqGh4S91dXV/aWhoqNq8eXNVTU3NuqqqqvUbNmxYu2rVqjWrV69e99Zbb6177rnnPpgzZ06NTwYAAABJogAGAADIA8OGDWt+xBFHdBwwYECnLl26dGjdunXHFi1adCgtLe1YUlLSvlmzZq0KCgqK07yDwsLCssLCwrKIaPdp/zuNjY21mzdvXrdp06ZVNTU172/YsGHl2rVr31+2bNnKBQsWrHjyySffnzVrVpVPGAAAAE1Fpuexsd9HfaF+ZcSal0ptCAAAIAE6deqUPf744zvtueeeXbp3796lbdu2XSorKzuXlpZ2KS0t7VBYWFhhSztGQ0PDxpqampU1NTXL169fv+yDDz5Y9s477yybPXv2sj/96U8rVqxYUWdLAAAAbE9t9q6Jog4f/TUFMAAAQEJks9nMt7/97Y4jRozo1bdv397t2rXrXl5e3rWsrKxzcXFx+4gosKUmp7G2tnZVTU3Nso0bNy5btWrV0tdff/2tJ598cvG999672noAAADYFgpgAACAhPne977X6a9Fb/v27Xu1bNmyV1lZWa8kvXOXLauvr9/wl7/8ZdG6desWL1u2bNHChQsX/fGPf1w8derUjbYDAADAliiAAQAAmqhsNps59dRTuxx66KH9+/Tp87n27dv3Ly8v719UVOSRzXlq06ZNKzZu3Pj6+++//8abb775xqOPPvrG3XffvcpmAAAA+CsFMAAAQBNx6qmndvniF784qHfv3v3btWv3uYqKis8VFhaW2wxbUl9fv37Dhg1vfPDBB68vXrz4jccee2z+jTfeuNxmAAAA8pMCGAAAYBc45phjWn/rW9/aq3///kPatGnTv6Kiop9HOLO9NDQ0VG/cuPGtNWvWLFy4cOGcO+6445WHHnporc0AAACknwIYAABgJzjjjDO6f+lLX9qrV69eg1u3bj2orKysR0RkbIadJFddXb103bp18xcvXjz30UcffeXqq69+x1oAAADSRwEMAACwnZWWlhb86le/2u3QQw8d1r17931btmw5qLCwsMxmaEoaGhqqP/zww/nvvPPOzGeeeWbW2LFj36ipqWm0GQAAgGRTAAMAAGwHP/7xj7t+9atf3bdXr15D27Ztu1c2m21jKyRJXV3dmg8++OCVRYsWvfznP/95xh/+8IdltgIAAJA8CmAAAIBtcOKJJ7Y75ZRTDujXr9+w1q1bD81ms61shTSpq6tbt3bt2pfffPPNWbfccsvUe++9d7WtAAAANH0KYAAAgE+hoqKi4IILLhg0YsSI/bp27bpfy5YtB2YymUKbIR/kcrmGDz/8cP6777474/nnn59x4YUXvrZx40aPiwYAAGiCFMAAAAAf4/jjj2/7/e9//8D+/fsf2Lp1630KCgpKbAUiGhsbN61fv37eW2+9NeWGG2545u67715lKwAAAE2DAhgAAOB/ZLPZzAUXXPC5I4888sDu3bsfWFFRsVtEFNgMbFl1dfWSd999d8qsWbNmnnvuuS+vW7euwVYAAAB2DQUwAACQ10pLSwsuvfTSQYcccsjBXbt2HVFWVtbDVmDb1dbWrnr//fdfmDp16uRf/vKXL65evbreVgAAAHYeBTAAAJB3Bg0aVHrBBRd8fs899zywQ4cOBxQVFbWwFdj+Ghsba9euXTtrzpw5T59//vmTX3755WpbAQAA2LEUwAAAQF4YNmxY8/POO+/gIUOGHOZ9vrDz/W0ZfNFFFz07a9asKlsBAADY/hTAAABAarVq1arwyiuv3HfEiBEjO3TocFBhYWGZrcCu19DQUP3+++8/O2XKlIk/+clPZm7cuLHRVgAAALYPBTAAAJAqrVq1Kvztb3+7/3777Xd4x44dRxQWFpbbCjRdDQ0NG99///0pM2bMeOqHP/zhC8pgAACAz0YBDAAApMJZZ53V45vf/OaRvXr1GllaWtrVRiB5ampq3l28ePHEO++8c9LVV1/9jo0AAABsPQUwAACQWMOHDy+/6KKLvjB48OCjW7RoMdBGID0+/PDDV+fNmzfhvPPOe3L69Ol/sREAAIBPRwEMAAAkSqtWrQpvuOGGQ/bbb79/atOmzX6ZTCZrK5BeuVyubs2aNTNmzJjx2JgxYyavW7euwVYAAAA+ngIYAABIhB//+Mddv/e9732lZ8+e/1RcXNzWRiD/1NbWfvD2228/dssttzz029/+9l0bAQAA+L8UwAAAQJNVUVFRcO21137+4IMPPrZ169b7ZTKZAlsBIqJxzZo1M59//vnxp5122hR3BQMAAPx/CmAAAKDJOeWUUzqefvrpx/bu3ftL2Wy2jY0AH6e+vn7j0qVLH/vd7373x+uvv36ZjQAAAPlOAQwAADQJ2Ww2c+uttx5wyCGHnNC6deu9I8LdvsDWaFy7du1L06ZN+/OPfvSjZ1evXl1vJQAAQD5SAAMAALtU//79S6655pp/2nPPPY8tLy/vayPAZ1VTU7NswYIF488999wHp06dutFGAACAfKIABgAAdomf//znPU855ZQTu3btemRhYWGZjQDbW2NjY92KFSuevOWWW+689NJLF9kIAACQDxTAAADATuMxz8Cusn79+rlPP/30f5188slT6+rqcjYCAACklQIYAADY4fr27Vv8hz/84a+Pee5nI8CuUlNT8+68efPu/8EPfvDgwoULN9kIAACQNgpgAABghxkyZEjpNddc89XBgwefWFxc3MFGgKaitrZ21dy5c+/5yU9+8uc5c+bU2AgAAJAWWyqAPYoNAADYJqNHj+4wb968n06ZMuXRYcOGnaH8BZqa4uLi9sOGDTtjypQpj86bN++nJ510UntbAQAA0s4dwAAAwFY599xze33/+9//dufOnY/IZDJZGwGSIpfL1S1fvvzJG2644fbLLrvsbRsBAACSyiOgAQCAz+y8887r+53vfOfbHTt2PDyTyRTaCJBUuVyuYcWKFU/cdNNN//XrX/96sY0AAABJowAGAAC22WWXXTboG9/4xg9at249zDaAtFm7du2su++++9pzzjnnNdsAAACSQgEMAABsNcUvkE8UwQAAQJIogAEAgE9N8Qvks7Vr18665557rvv5z38+3zYAAICmaksFcGHlwOj6UV9orIqoWZG1PQAAyBO/+MUvet9xxx3nHHrooT8pLS3tYiNAPiotLe2y7777HvP973+/X1lZ2ZIpU6assxUAAKCpKetcHwXlH/01BTAAAOS5M844o/u99957zpe//OWflZeX94qIjK0AeS5TXl7e8+CDDx71/e9/v3dEvDVjxowPrQUAAGgqFMAAAMD/ceKJJ7a77777fjJq1Kh/KS8v7xOKX4B/lCkvL+99+OGHj/rWt77VfvXq1Qvnz59fbS0AAMCutqUC2DuAAQAgzwwdOrTs+uuvP6l///4nFRYWltkI20NjY2Ns2rQpqquro6amJurr62PTpk2xefPmqK+vj+rq6qivr4/NmzfHpk2boqGhYZv/fxUWFkZJSUk0a9YsioqKoqysLIqKiqJZs2ZRUlISRUVFUVpa+r9/FRQUCIjtoqGhoeq11167a8yYMffMmTOnxkYAAIBdZUvvAFYAAwBAnujUqVP2nnvuGbXXXnudnM1mK22Ej9PQ0BAbN26MDRs2/J+/Nm7cGBs3boyamprYtGlTbNq0KWpqaqK2trbJnqe4uDhKSkqitLT0f/9eUVERFRUV0aJFi//zV0VFRRQWFvog8LHq6urWvvjii7eceOKJf169enW9jQAAADubAhgAAPLcXXfdddAXv/jF00tLS7vZRn7L5XKxYcOGWLt2baxbty7Wrl37d3+tW7cuNmzYkPd7atGiRbRu3TpatWoVrVu3jjZt2vzvf27dunW0aNHCh4morq5e+sgjj1zzne98Z6ptAAAAO5MCGAAA8tTVV189+MQTTzyzoqJioG3kj8bGxli5cmUsX748Pvjgg1i9evX//n3t2rXR2NhoSZ9RYWFhtGrVKtq1axdt27b937937tw5OnTo4LHTeWbDhg3z77333qvOPPPMebYBAADsDApgAADIM1/72tfaXHrppad27979qIjQRKVUQ0NDrFq1KlasWBHvv//+//595cqVTfqRzGlXXFwcHTp0iI4dO0bnzp2jY8eO0alTp2jXrp1HS6dYLpdrfOeddx76+c9/fv2ECRPW2QgAALAjKYABACBP9OrVq9ldd931jT322OM7hYWFZTaSHh9++GG88847sXTp0njvvfdixYoVsXr16mhoaLCchCgsLIz27dtHp06dolu3btG9e/fo3r27x0mnTENDQ9W8efNu++Y3v/nHJUuWbLYRAABgR1AAAwBAHrjrrrtG/NM//dOZJSUlXWwj2davXx9Lly6Nd955539L3w8//NBiUqqysvJ/y+C//tWqVSuLSbiamppljz322G9Gjx49xTYAAIDtTQEMAAAp9qtf/arPD3/4w5+1atVqL9tIno0bN8aSJUvirbfeikWLFsV7770XmzZtspg8V1JSEl27do0+ffpE3759o3fv3lFeXm4xCbRu3bqXr7322ivGjh27yDYAAIDtRQEMAAApNGjQoNI77rjju7vttttJBQUFWRtJhtWrV8ebb74ZixcvjiVLlsTy5cujsbHRYtiigoKC6Ny5c/Tu3Tt69+4d/fr1i7Zt21pMQjQ2Nta98cYbd33rW9+6ff78+TU2AgAAfFYKYAAASJHS0tKCBx988Jj99tvvn7PZbBsbaboaGhri7bffjrfeeisWLFgQS5YscXcv201FRUX06tUr+vbtG3379o2ePXtGYWGhxTRhdXV1a2bMmHHjV77ylYdqamr85gcAALDNFMAAAJASp59+erdf/vKX51ZWVu5jG03T6tWr47XXXouFCxfGm2++GRs3brQUdooWLVpE3759Y8CAATFw4EB3CDdh69evf/E//uM//vPqq69+xzYAAIBtoQAGAICEGzRoUOm99977w969ex+byWTc4teErF+/PubNmxcLFiyIN954Q+FLk9GiRYvo169fDBgwIPbYY4+orKy0lCYkl8s1LF68eNyJJ554rcdCAwAAW0sBDAAACXbNNdcMOemkk35RVlbWyzZ2vVwuF++++27MnTs3XnvttViyZIl3+NLkFRQURK9evWLQoEExePDg6Natm6U0EdXV1UvuvvvuX//kJz+ZYxsAAMCnpQAGAIAEOuqoo1r99re//VmHDh0Ot41da9OmTTF79uyYO3duLFy4MKqqqiyFRGvevHn0798/Bg8eHHvuuWeUlJRYyi62cuXKp04//fTLJ0yYsM42AACAT6IABgCAhBk3btwRRxxxxFnZbLaNbewaVVVVMXfu3Jg7d27Mnz8/amtrLYVUKi4ujoEDB8bgwYNj8ODBUV5ebim7SF1d3ZqnnnrqqlGjRj1hGwAAwJYogAEAICFOOeWUjhdddNEvW7duvZ9t7HwrV66MWbNmxdy5c+Odd96JXC5nKeSdzp07x9577x3Dhg2LDh06WMgusHbt2hnnnXfepbfccsv7tgEAAHwUBTAAADRxpaWlBU899dQ3Bw8e/L2CggLPYt2JVqxYES+99FK89NJLsXz5cguBv/HXMnjvvfeOTp06WchO1NjYuGnu3Lk3H3744XfV1NR40TgAAPB3FMAAANCEjR49usOll176yzZt2gy3jZ1j/fr18eKLL8bMmTNj6dKlFgKfQs+ePWPfffeNYcOGRYsWLSxkJ1mzZs0L55577q/vvvvuVbYBAAD8lQIYAACaoIqKioKJEyd+c/Dgwd8vKCgotpEda8OGDfHiiy/G9OnTlb7wGfXo0SOGDx8ew4YNi4qKCgvZwdwNDAAA/CMFMAAANDGnnHJKx7Fjx/5rZWXlMNvYcerr6+PVV1+NGTNmxLx586Kurs5SYDvKZrMxZMiQ2HfffWP33XePwsJCS9mB1q5dO+MXv/jFv995550rbQMAAPKbAhgAAJqIbDabeeKJJ47fZ599fuSu3x0jl8vFwoULY/r06TF79uzYtGmTpcBOUFpaGkOGDInhw4fHgAEDLGQHaWhoqJ42bdo1Rx555J9tAwAA8pcCGAAAmoDjjz++7ZVXXvmr1q1be9fvDrBmzZqYNm1azJw5M1audHMc7EodO3aMz3/+87H//vt7X/CO+3fetDPPPPOScePGfWAbAACQfxTAAACwi9100037HXvssf9WXFzc1ja2n1wuF6+99lo8//zzMW/evKivr7cUaEKKiopizz33jBEjRsTnPve5yGQylrId1dbWrvrjH/948Q9+8INZtgEAAPlFAQwAALvIkCFDSu+///5zunTp8k+2sf2sXbs2Jk+eHNOnT48PP/zQQiABKisrY8SIEXHIIYdEeXm5hWxHy5Yte+zrX//6f86ZM6fGNgAAID9sqQAurBwYXT/qC41VETUrsrYHAADb6IILLtjt97///VVt2rQZZhvbx+LFi2P8+PFx9913xxtvvBG1tbWWAgmxadOmeOONN+LZZ5+NtWvXRps2bTweejtp0aJFv5NOOumg0tLSuc8+++xaGwEAgPQr61wfBR/zu7XuAAYAgO0sm81mJk2a9PVhw4b9pKCgwG9VfkZ1dXUxY8aMeOaZZ+K9996zEEiRfv36xSGHHBJDhw6NgoICC/mMGhsbN8+YMeOaL37xi+Pq6upyNgIAAOnlEdAAALCTHH/88W2vuuqqCyorK/exjc9mzZo18dRTT8XUqVNj06ZNFgIpVlFREZ///OfjsMMOi8rKSgv5jNavXz/r9NNPv3DcuHEf2AYAAKSTAhgAAHaC22677fNf+9rXzstms5W2se0WLVoUjz/+eMybNy9yOTewQT4pKiqKIUOGxBFHHBG9e/e2kM+grq5u3QMPPHDRySefPM02AAAgfRTAAACwA1VUVBQ8/fTTpwwcOPCUTCbjGabbIJfLxauvvhpPPvlkLFy40EIgz2UymRgwYEAcccQRMWjQIAvZ9n+3Ns6fP/+Www8//JaNGzc22ggAAKTHlgrgwsqB0fWjvtBYFVGzwuvKAABgS0488cR2EyZMuLx79+5fzmQyGRvZOo2NjTFr1qy49dZb48knn4wPPvC0UuC/rV69OmbMmBFz5syJ0tLS6NSpU/jX7NbJZDKZ9u3bD/3+978/dPny5TNfffXValsBAIB0KOtcHwXlH/O9gDuAAQBg29x66637H3vssRcWFRW1sI2tU1NTE0899VQ8++yzsWHDBgsBPlGLFi3i4IMPjsMPPzxKS/28YmvV19d/OG7cuPNPPvnk6bYBAADJ5xHQAACwHWWz2cyzzz77rSFDhvzAI5+3zqZNm2Ly5Mnx1FNPKX6BbdKiRYs47LDD4pBDDlEEb6VcLtfwyiuvXHfooYfeWVdX5yXrAACQYApgAADYTo455pjW11133cWVlZV728ant2HDhnj88cdjypQpUVtbayHAZ1ZcXBwHHnhgfPGLX4wWLTyIYWusWbNm2re//e3zn3nmGb+JAwAACeUdwAAAsB1cfvnlu1900UW/LS8v72cbn05VVVVMmDAhbrnllnjzzTejoaHBUoDtoqGhIZYsWRLPPfdc1NTURI8ePSKb9XOMT6OsrKzb17/+9SPbtm0774knnlhtIwAAkMDreu8ABgCAz+bhhx/+8qGHHnpOQUFBsW18sk2bNsUzzzwTTzzxRFRVVVkIsMOVl5fHkUceGYccckgUF/tX9afR2Ni46emnn/71Mccc87htAABAsngENAAAbKN27doVTZ48+YxevXodZxufrK6uLp5++umYOHGi4hfYJSoqKuKLX/xiHHzwwe4I/pQWLVr0x4MOOuiadevWeUwDAAAkhEdAAwDANjj22GPbPvzww7/p2LHjobaxZXV1dfHkk0/GddddF3Pnzo26ujpLAXaJzZs3x2uvvRbPPfdcRET06NEjCgsLLWYLWrduvfv3vve9fd9+++1pCxYsqLYRAABo+rb0CGgFMAAAfITLL7989wsuuOB3zZs372UbH6+xsTGmTJkS119/fbzyyiuKX6DJ2Lx5cyxYsCCmT58excXF0a1bt8hkMhbzMUpKSjp8+ctfPrJt27ZzvBcYAACaPu8ABgCArTB+/Pgjv/CFL/xLQUFBiW18vAULFsT48eNj6dKllgE0eT169IivfOUrMWjQIMvYgsbGxpqJEydecuyxxz5pGwAA0HR5BzAAAHwK7dq1K3ruued+1qNHj6/axsdbtGhR3H///bF48WLLABKnV69ecdxxx0WfPn0sYwuWLl3654MOOujy1atX19sGAAA0Pd4BDAAAn2DYsGHNn3766V936tTpC7bx0TZs2BD33Xdf/PGPf4y1a9daCJBI69evj2nTpsW6deuiZ8+eUVLiYQ8fpbKysv+3v/3t/lOmTJmyfPlyz/cHAIAmxjuAAQBgC372s5/1uP76669t0aKF54J+hJqamhg/fnzcfPPN8fbbb0cul7MUINFyuVy888478cwzz0RVVVX07t07slk/A/lHZWVl3U488cTD6+rqZkyfPv1DGwEAgCZ0va4ABgCAj3bFFVfscdZZZ11dXFzcwTb+Xi6XixkzZsR1110XCxYsiMbGRksBUqWxsTGWLFkSM2bMiPLy8ujSpUtkMhmL+RvZbLbFQQcddHibNm1mP/HEE6ttBAAAmoYtFcDeAQwAQN6aNGnSqAMOOODsTCZTaBt/b9GiRXHPPffEu+++axlA3ujWrVucdNJJ0bt3b8v4B7lcrm7y5Mm//vKXv/yIbQAAwK63pXcAK4ABAMg7paWlBTNnzjyzT58+x9vG39uwYUOMGzcuZsyY4VHPQF7KZDKx3377xde//vWoqKiwkH+waNGiP+27775X1dTUeCwEAADsQgpgAAD4H926dctOnjz5V506dRppG/9fLpeLqVOnxp///OfYuHGjhQB5r6KiIkaNGhX777+/x0L/g+XLlz9+6KGHXvLuu+/W2QYAAOwaWyqAvQMYAIC8MXz48PInnnjiynbt2o2wjf/vnXfeiWuvvTaee+652Lx5s4UARMTmzZtjzpw58dprr0XPnj2jRYsWlvI/Kioq+n7rW98aMnXq1Ofee+89f3AAAMAusKV3ACuAAQDIC9/+9rc73n777X9o0aLFANv4b1VVVXHXXXfFvffeG+vXr7cQgI+wbt26eP7552P9+vWx2267RVFRkaVERElJSefjjjvuoA8++GDKK6+88hcbAQCAnUsBDABAXjv//PP7XXzxxX8oKSnpbBv/bfr06XHttdfGokWLLAPgU3jnnXdi2rRp0bp16+jc2R8nERHZbLbyC1/4whElJSUvTp48eY2NAADAzqMABgAgb/3ud7/b60c/+tFVRUVFrWwjYs2aNXHzzTfHpEmTora21kIAtkJtbW289NJL8c4770Tfvn2jtLQ073dSWFhYNnz48C/26dNn4UMPPbTMpwQAAHYOBTAAAHnp1ltv3f+b3/zmfxYWFjbP913kcrl4/vnn4/rrr4/ly5f7cAB8BitXroxp06ZFRUVFdOvWLTKZTF7vo6CgIDto0KBDBw0atOiBBx54xycEAAB2vC0VwJmex8Z+H/WF+pURa17ym6wAACTTww8//KXDDjvsXzKZTN6/rPGDDz6I22+/Pd544w0fDIDtbMCAAfGtb30r2rRpk/e7yOVyjVOmTPn1yJEjH/LJAACAHavN3jVR1OGjv6YABgAgdV555ZXTPve5z30r3/fQ0NAQjz32WDz++ONRV1fngwGwg2Sz2Tj66KPjC1/4QhQUFOT9Pl5//fU79tprr9/7ZAAAwI6jAAYAIC9ks9nMyy+/fFafPn2Oz/ddvPvuu3HbbbfFe++954MBsJN069YtvvOd70S3bt3yfhdLliy5f5999rmypqam0ScDAAC2PwUwAACpV1paWjBr1qyzevfufVw+7yGXy8WTTz4ZDz74oLt+AXaBbDYbxxxzTBxxxBF5fzfw0qVLHxg6dOjlSmAAANj+FMAAAKRar169mk2ePHlsu3btDsrnPaxcuTJuueWWePvtt30oAHaxnj17ximnnBIdOnTI6z2sXr16yiGHHPIvS5Ys2exTAQAA28+WCuDCyoHR9aO+0FgVUbMia3sAADRpQ4cOLXvqqacub9Omzf75uoNcLhfPPPNMXH/99bF27VofCoAmYP369TFlypQoKSmJnj17RiaTycs9NG/evPtJJ500ZPLkyc+sWLHCoykAAGA7KetcHwXlH/01BTAAAIk1ZMiQ0kceeeSKVq1a7Z2vO6iuro7bb789nnjiiWhs9IRNgKaksbEx5s+fH++//34MGDAgstn8/DlLaWlpp6997WuDn3rqqadXrlxZ75MBAACfnQIYAIDUOfTQQ1s8+OCDv2/ZsuUe+bqDOXPmxNVXX+2RzwBN3PLly+OFF16Ijh075u0joUtLSzudcMIJ+7/00ktPv/3227U+FQAA8NkogAEASJVhw4Y1v++++37TsmXLQfl4/vr6+hg/fnz88Y9/jNpaP0MHSILNmzfHiy++GJs3b47ddtstCgoK8m4HxcXFbY866qg9n3vuuaeXL1/ucdAAAPAZKIABAEiNI488snLcuHG/b9GixcB8PP97770XV111VcyZM8eHASCBFi1aFC+//HL069cvWrRokXfnLykp6XDcccftP2fOnGcWLVq0yScCAAC2jQIYAIBUOPLIIyvvvPPO35aXl++Wj+d/+umn48Ybb4wPP/zQhwEgwf7yl7/ECy+8ECUlJdGrV6+8O3+zZs3aHHXUUfspgQEAYNspgAEASLxjjz227W233faH5s2b98m3s1dVVcXNN98cTz31VDQ2NvowAKRAY2NjzJ8/P5YtWxYDBgyIZs2a5dX5mzVr1uaYY4458M0333xm4cKFNT4RAACwdRTAAAAk2qGHHtritttuuzofy9+33347rrnmmli8eLEPAkAKvf/++/HKK69Enz59orKyMq/Ons1mK4888sh9Zs6c+dTSpUs3+zQAAMCnpwAGACCxjjjiiJb33nvvteXl5f3y6dy5XC4mTZoUN998c1RVVfkgAKRYVVVVTJ06NbLZbPTp0ycymUzenL24uLjtV7/61c+/8sorTy1evLjWpwEAAD4dBTAAAIl06KGHtrj33nt/l2/lb3V1ddx0000xefLkyOVyPggAeSCXy8WCBQvi3Xffjd133z2y2fz5mUyzZs1aH3300fvNmDHjSXcCAwDAp6MABgAgcYYOHVo2fvz4qysqKgbk07mXLVsWV111lUc+A+SplStXxiuvvBKf+9znoqKiIm/O3axZszZHH3300GeeeebJFStW1PkkAADAlimAAQBIlCFDhpQ++uij17Rs2XL3fDr31KlT49prr42NGzf6EADksaqqqpg+fXq0bds2unTpkjfnLikpaT9q1KihTz755JMrV66s90kAAICPt6UCuMB6AABoSjp16pSdMGHCv1dWVu6RL2dubGyMcePGxR133BF1dW56AiCitrY2br755hg/fnw0NjbmzbkrKyv3mDBhwr9369bNXQkAALCNFMAAADQZrVq1Kpw+ffolbdq02T9fzlxdXR2/+93vYtKkSd73C8DfyeVy8fjjj8fvf//7qK6uzptzt2nTZv8pU6Zc0qpVq0KfAgAA2HoKYAAAmoSKioqC2bNnX9KuXbuD8uXMS5cujYsuuijmz5/vAwDAx3r11VfjoosuiqVLl+bNmdu1a3fQ7Nmz/72iosLPrgAAYCu5iAYAoEmYOXPmz9q1a3dIvpz35ZdfjiuuuCLWrVsnfAA+0bp16+KKK66Il19+OW/O3K5du4Nnzpz5M+kDAMDWUQADALDLvfjii2N69OgxKh/Omsvl4oEHHogbbrghamtrhQ/Ap1ZbWxs33HBDPPDAA3nz2oAePXqMevHFF8dIHwAAPj0FMAAAu9SkSZO+NnDgwFPy4ax1dXVx8803x8SJE73vF4BtksvlYuLEiXHLLbdEXV1dXpx54MCBJ0+aNOlr0gcAgE9HAQwAwC7z6KOPHnXggQeekw9nXbduXfz617+OWbNmCR6Az2zmzJnx61//Ol9eJZA58MADz3n00UePkjwAAHyywsqB0fWjvtBYFVGzImtDAADsEDfeeOO+Rx999EWZTKYw7Wddvnx5XHXVVbFy5UrBA7DdbNiwIWbPnh0DBw6MioqKtB8307179/179uz56sMPP7xc+gAA5LuyzvVRUP7RX1MAAwCw011xxRV7fPe7372qoKCgWdrPOmfOnPjtb38bGzduFDwA2111dXVMmzYtOnfuHB07dkz1WTOZTOHuu+9+eJs2bV6aNGnSKukDAJDPFMAAADQZZ5xxRvef/exnvy0sLCxP+1knTJgQd999d9TX1wsegB2moaEhXnrppchms9G3b99UnzWTyRTttddeB/3lL395dubMmRukDwBAvlIAAwDQJBx00EEVf/jDH64pLi7ulOZz5nK5eOCBB+Kxxx4TOgA77c+eBQsWRF1dXfTv3z8ymUxqz1pQUFBywAEHDJs+ffqkpUuXbpY+AAD5aEsFcIH1AACwMwwaNKj0vvvuu7qsrKxXms9ZV1cX1113XUyaNEnoAOx0EydOjOuvvz7q6upSfc6ysrJef/rTn67u379/idQBAODvKYABANjhKioqCh577LGLKyoqBqb5nNXV1XHNNdfE7NmzhQ7ALvPKK6/ElVdeGVVVVak+Z4sWLQZOnDhxbEVFhZ9vAQDA33CBDADADjdz5syftW3b9sA0n3HdunVx2WWXxRtvvCFwAHa5xYsXx2WXXRZr165N9TnbtWt34MyZM38mcQAA+P8UwAAA7FBPPvnkqB49eoxK8xlXrVoVV1xxRSxfvlzgADQZK1asiCuuuCJWrlyZ6nP26NFj1KRJk0ZJHAAA/lth5cDo+lFfaKyKqFmRtSEAALbZjTfeuO+XvvSlCzOZTGp/8fDdd9+NK6+8MtatWydwAJqc6urqmDVrVvTv3z8qKytTe85u3boN79mz57yHH37Yb2MBAJAXyjrXR0H5R39NAQwAwA5x3nnn9T311FOvLigoKE7rGV977bW45pprorq6WuAANFmbN2+OGTNmRI8ePaJ9+/apPGMmkykYNGjQIYWFhVOee+45v5UFAEDqKYABANipjjrqqFb/8R//8YdmzZq1SusZX3755bj++uujrq5O4AA0eQ0NDfHSSy9Fp06dolOnTqk8Y0FBQXbYsGGfnz9//qQ33nhjk9QBAEizLRXA3gEMAMB21a1bt+wNN9zwnyUlJR3TesYpU6bEjTfeGPX19QIHIDHq6+vjxhtvjKlTp6b2jCUlJZ1uuOGG/+jWrZu7GgAAyFsKYAAAtqunn376XyorK/dI6/kmTZoUd955ZzQ2NgobgMRpbGyMO+64I5588snUnrGysnLw008//UtpAwCQrxTAAABsN88///w3unTp8k9pPd/EiRNj3LhxkcvlhA1AYuVyubj//vtTXQJ36dLlS88+++yJ0gYAIB95BzAAANvFTTfdNPzII488L5PJZNJ4vsceeyzGjx8vaABS47XXXotmzZpF3759U3m+zp0779urV695Dz/88DJpAwCQNlt6B7ACGACAz+wXv/hF7x/+8IdXFxQUNEvj+R544IF45JFHBA1A6ixYsCDq6upiwIABqTtbJpPJDBo06ODGxsbnpk6dul7aAACkiQIYAIAd5oADDqj43e9+99tmzZq1TeP5xo0bF5MmTRI0AKm1aNGi2Lx5cwwcODB1ZysoKMjut99+w5577rnH33vvvc3SBgAgLbZUAHsHMAAA2yybzWbuvPPOfyktLe2exvNNmDBB+QtAXpg0aVI89NBDqTxbaWlpj3vuuedfstlsRtIAAOQDBTAAANvs+eef/06HDh0OTePZHn744Xj44YeFDEDeeOSRR+LPf/5zKs/WoUOHw5599tlvSxkAgHygAAYAYJvcd999hw8ePPjUNJ7t/vvvjwkTJggZgLzz2GOPxX333ZfKs+25554/+NOf/nSYlAEASDvvAAYAYKudccYZ3ceMGXN5QUFBcdrONnHixHjkkUeEDEDeWrx4cWSz2ejbt2/ajpbp06fPvn/5y18mz5w5c4OkAQBIsi29A1gBDADAVhk2bFjzG2+88Q/NmjVrl7azPfroo6l99CUAbI2FCxdGUVFR9OvXL1XnKigoKD7wwAP3e/LJJx9dsWJFnaQBAEiqLRXAHgENAMBWuffee39ZWlraPW3nevzxx+PBBx8UMAD8jz//+c8xceLE1J2rtLS0x3333fdLCQMAkFYKYAAAPrVJkyaN6tSp0xEpPFeMHz9ewADwD8aPHx+TJ09O3bk6der0hUmTJn1VwgAApJFHQAMA8Kmcd955fU888cR/z2QyRWk618yZM+Puu+8WMAB8jNdeey06duwYnTt3TtW5unbtuk9BQcHzzz333DopAwCQNN4BDADAZ3LEEUe0vOKKK67NZrOVaTrXyy+/HDfffHPkcjkhA8DHyOVyMXv27OjSpUt06tQpNefKZDJF++yzz/CpU6c+9u67726WNAAASeIdwAAAbLNsNpu55ZZb/q2kpKRjms61YMGCuPnmm6OxsVHIAPAJGhsb4+abb44333wzVecqLS3tcvfdd5+fzWYzUgYAIC0UwAAAbNGkSZO+3rZt2wPTdKZly5bFDTfcEPX19QIGgE+prq4urr322li+fHmqztWuXbsDH3/88VESBgAgLTwCGgCAj3XZZZcN+upXvzo2k8mk5hcH33///bjyyiujqqpKwACwlerq6uLll1+OIUOGRHl5eWrO1aVLl31LS0unPvPMM2ukDABAEngENAAAW61///4lJ5988q8ymUxRWs60YcOG+P3vfx8bN24UMABso40bN8bvfve7VP15WlBQkP3hD394ft++fYslDABA4q9vrQAAgI/y4IMPnl1WVtYrLeeprq6O3/zmN7Fq1SrhAsBntGrVqrjyyiujuro6NWcqKyvr8/DDD58lXQAAkk4BDADA/zF+/Pgju3XrdnRazlNfX5/KdxYCwK60fPnyuO6666K+vj41Z+rRo8dXx40bd4R0AQBIMgUwAAB/53vf+16nI4444py0nCeXy8Vtt90Wb7zxhnABYDt7/fXX47bbbotcLpeaMx155JHnfvvb3+4oXQAAkkoBDADA/6qoqCi4+OKLLywsLCxPy5nGjx8fs2bNEi4A7CCzZs2Khx56KDXnKSwsrPj1r399QUVFhZ+bAQCQSC5kAQD4XxMnThxdWVk5OC3nef7552PixImCBYAd7LHHHosXXnghNeeprKzc89FHHz1RsgAAJFFh5cDo+lFfaKyKqFmRtSEAgDxxwQUX7DZq1KgLM5lMYRrO8+qrr8Ytt9ySqkdSAkBT/7O3d+/e0a5du1Scp2PHjkNzudxzU6ZMWSddAACamrLO9VHwMc/wcwcwAADRt2/f4h//+McXZzKZVPwG4HvvvRc33HBDNDY2ChcAdpKGhoa47rrrYtmyZak4T0FBQfbss88e27dv32LpAgCQqGtZKwAAYPz48T8qKyvrkYazbNiwIX7/+99HbW2tYAFgJ9u0aVP8/ve/j40bN6biPGVlZb3GjRs3RrIAACSJAhgAIM/ddNNNw/v06XN8Gs5SX18f1157baxdu1awALCLrFmzJq699tqor69PxXn69ev3jd///vdDJQsAQFIogAEA8thBBx1Uceyxx/5rRGTScJ477rgjFi9eLFgA2MUWLVoUd955Z1qOU/CNb3zj34YNG9ZcsgAAJOIC1goAAPLXzTfffFZxcXG7NJxl4sSJMX36dKECQBMxbdq0mDRpUirOUlJS0unOO+88Q6oAACSBAhgAIE/913/914FdunT5UhrO8tprr8Wf//xnoQJAEzN+/PhYsGBBKs7SrVu3o2+66abhUgUAoKlTAAMA5KEvfelLlV/5yld+lYazrFixIq6//vpobGwULAA0MY2NjXHdddfFihUr0nCczHHHHfergw46qEKyAAA0ZQpgAIA8dPXVV5+ezWYrk36OmpqauPbaa2PTpk1CBYAmatOmTXHttddGTU1N4s+SzWbb3njjjT+RKgAATZkCGAAgz9x6663Du3Tp8uWknyOXy8Utt9wSK1euFCoANHErV66MW2+9NXK5XOLP4lHQAAA0dQpgAIA8MnTo0LKvfvWrv0jDWSZMmBBz584VKgAkxJw5c+Kxxx5LxVlGjRr1i6FDh5ZJFQCApkgBDACQR+64444fFRcXd0z6OV5++eV45JFHBAoACfPQQw+l4he4SkpKOt5xxx0/lCgAAE2RAhgAIE9cfvnlu/fs2XNU0s/xwQcfxB133JGKR0gCQL7J5XJx2223xZo1axJ/lp49ex57+eWX7y5VAACaGgUwAEAe6NatW/a73/3uv2YymURf/9XX18cNN9wQ1dXVQgWAhKqqqoobb7wx6uvrE32OTCZT8N3vfvdX3bp1y0oVAICmRAEMAJAHxo8ff0pZWVmvpJ/jnnvuiaVLlwoUABJuyZIlcd999yX+HGVlZT3Hjx9/ikQBAGhKFMAAACn385//vOeAAQNGJ/0c06dPjylTpggUAFJi8uTJMWPGjMSfY8CAAaN//vOf95QoAABNhQIYACDFstls5qyzzjo3k8kk+tGEK1asiLvvvlugAJAyd911V6xYsSLRZ8hkMtmzzjrr3Gw2m5EoAABNgQIYACDFxo0b98XKysq9knyG2trauOGGG6K2tlagAJAyf/1zfvPmzYk+R2Vl5V7jxo0bKVEAAJoCBTAAQEoNHz68/OCDDz4t6ee4//77Y/ny5QIFgJRavnx5jBs3LvHnGDFixI+HDRvWXKIAAOxqCmAAgJS69dZbT8tms22TfIYZM2bEc889J0wASLnJkyfHzJkzE32G4uLitrfffvtp0gQAYFdTAAMApNBVV121R48ePb6S5DOsXLky7rrrLmECQJ64++6744MPPkj0GXr27PnVK664Yg9pAgCwKymAAQBSprS0tOAb3/jGT5N8rdfY2Bi333679/4CQB6pqamJ2267LRobG5N8jIJvfvObZ5aWlvqZGwAAu+6i1AoAANJlwoQJX6uoqBiQ5DOMHz8+Fi1aJEwAyDNvvvlmPPjgg4k+Q4sWLQY9+OCDx0gTAIBdRQEMAJAiRx55ZOWwYcN+kOQzzJ07N5544glhAkCemjhxYixYsCDRZxg+fPiPjjjiiJbSBABgV1AAAwCkyBVXXHFyUVFRRVLnr6qqijvvvDNyuZwwASBP5XK5uP3226O6ujqxZygqKmrxm9/85mRpAgCwKyiAAQBS4vzzz+/Xu3fv45J8httvvz0+/PBDYQJAnlu3bl3cfvvtiT5D7969jz///PP7SRMAgJ1NAQwAkALZbDZz6qmn/jyTyST2+m769OkxZ84cYQIAERExe/bsmDFjRmLnz2QyBaeeeurPs9lsRpoAAOxMCmAAgBT44x//eERlZeXgpM6/du3auPfeewUJAPyde+65J9atW5fY+SsrKwf/6U9/+oIkAQDYmRTAAAAJ17dv3+JDDjnkR0k+w9133x01NTXCBAD+Tk1NTdx9992JPsPBBx/8o759+xZLEwCAnUUBDACQcHfdddc3S0pKOiV1/smTJ8e8efMECQB8pLlz58azzz6b2PlLSko63nPPPd+SJAAAO4sCGAAgwb70pS9VDhw48KSkzr9mzZoYP368IAGALXrggQdizZo1iZ2/f//+Jx111FGtJAkAwM6gAAYASLArrrji1MLCwvIkzp7L5eK2226LTZs2CRIA2KJNmzbFbbfdFrlcLpHzFxYWll1++eU/kCQAADuDAhgAIKF+8Ytf9O7evftXkjr/s88+G2+88YYgAYBP5Y033ojnn38+sfN369bt6F/96ld9JAkAwI6mAAYASKgf/vCHP8pkMom8nvvggw/igQceECIAsFXGjRsX69atS+TsmUym4NRTT/2xFAEA2NEUwAAACXTdddcNa9eu3YFJnD2Xy8Udd9wRtbW1ggQAtsqmTZvizjvvTOz8bdq02f+mm27aT5IAAOxICmAAgIQpLS0t+NrXvnZ6Uud/4YUXYuHChYIEALbJq6++GjNmzEjs/Mccc8zpFRUVfiYHAMAO42ITACBhbr/99oMrKip2S+LsGzZsiHHjxgkRAPhM7r///qiqqkrk7OXl5X3/67/+6wgpAgCwoyiAAQASpKKiouCwww47Nanz33vvvYn9YS0A0HRs2LAh7r///sTOf9BBB/1zq1atCiUJAMCOoAAGAEiQ+++//+iysrKeSZx9zpw58dJLLwkRANguXnjhhViwYEEiZy8tLe32xz/+8StSBABgR1AAAwAkRN++fYv33Xfff07i7LW1tXHvvfcKEQDYru6+++6oq6tL5Oz77bffKf379y+RIgAA25sCGAAgIW6++eZRxcXFbZM4+yOPPBJr164VIgCwXa1atSoee+yxRM6ezWbb3njjjV+TIgAA25sCGAAgAYYOHVq21157fSeJs7/33nvxxBNPCBEA2CEmTpwYK1asSOTsQ4YM+c7QoUPLpAgAwPakAAYASIBrr732xKKiosqkzZ3L5eKee+6JxsZGIQIAO0R9fX3cddddkcvlEjd7UVFR5bXXXnuCFAEA2J4UwAAATdwBBxxQMWDAgG8kcfYZM2bEW2+9JUQAYId6880348UXX0zk7AMGDPjG8OHDy6UIAMD2ogAGAGjirrrqqhOKiooqkjb3pk2b4oEHHhAgALBT3H///VFbW5u4uYuKilpcffXV7gIGAGC7UQADADRhBx10UEX//v0Teffvww8/HB9++KEQAYCdYv369TFhwoREzj5w4MBvHHDAARVSBABge1AAAwA0Yf/5n/95bGFhYfOkzb1q1aqYPHmyAAGAnerpp5+O1atXJ27uwsLC8ssuu2yUBAEA2B4UwAAATdQBBxxQMWjQoNFJnP3uu++O+vp6IQIAO1V9fX3cddddiZx99913/+bQoUPLpAgAwGelAAYAaKIuv/zyYwsLC8uTNvfcuXNjwYIFAgQAdokFCxbE3LlzEzd3UVFRi9/97ndflyAAAJ+VAhgAoAkaOnRo2aBBgxL37t+6urr405/+JEAAYJf605/+FHV1dYmbe/fdd//mkCFDSiUIAMBnoQAGAGiCfvOb33ylqKioZdLmfu655xL53j0AIF1Wr14dzz33XOLmLioqann11VcfLUEAAD4LBTAAQBPTq1evZoMHD/5m0uaurq6ORx55RIAAQJPwyCOPRHV1deLmHjJkyLe6deuWlSAAANtKAQwA0MTcdNNNxxQXF7dN2twTJkyIqqoqAQIATUJVVVUifzmtuLi43a233uouYAAAtpkCGACgCWnVqlXhXnvtdVLS5l61alU8++yzAgQAmpTJkyfHqlWrEjf30KFDR7dq1apQggAAbAsFMABAE3LLLbccXlJS0jlpcz/44INRX18vQACgSamvr48HH3wwcXOXlJR0vummmw6VIAAA20IBDADQRGSz2cwBBxzw7aTNvWjRonjppZcECAA0SS+99FIsXrw4cXOPGDHiO9lsNiNBAAC2lgIYAKCJuOaaa/YuLy/vm7S5H3roocjlcgIEAJqkXC6XyLuAy8vL+1111VV7SRAAgK2lAAYAaCK+8pWvfDdpM8+bNy8WLlwoPACgSVu4cGG8+uqrrg8BAMgLCmAAgCbgsssuG1RZWblPkmbO5XIxfvx44QEAifDAAw8k7qklrVu33veSSy7pLz0AALaGAhgAoAkYNWrUCUmbefbs2bFs2TLhAQCJsGzZsnjllVcSN/cJJ5xwovQAANgaCmAAgF3sn//5nzt37NjxiCTN3NjYGA888IDwAIBEGT9+fDQ0NCRq5k6dOn1h9OjRHaQHAMCnpQAGANjFfvSjH30tk8kk6rps2rRpsWrVKuEBAImyatWqeOGFFxI1cyaTKfzpT386SnoAAHxaCmAAgF1o0KBBpX369Plqkmaur6+PCRMmCA8ASKQJEyZEXV1dombu27fvV/r27VssPQAAPg0FMADALnTZZZcdXlRUVJGkmadOnRpr164VHgCQSOvXr48pU6YkauaioqLK3/zmN0dIDwCAT0MBDACwi2Sz2cy+++57UpJmrqurc/cvAJB4jz76aOLuAt5///1PymazGekBAPBJFMAAALvI1VdfPbSsrKx3kmaeMmVKbNiwQXgAQKJt2LAhnn/++UTNXFZW1ueqq67aS3oAAHwSBTAAwC7y5S9/+bgkzVtfXx8TJ04UHACQCo8//nji7gL+0pe+dLzkAAD4JApgAIBdYPTo0R3atm07IkkzT5s2LdatWyc8ACAVPvzww5g+fXqiZm7fvv2I0aNHd5AeAABbogAGANgFfvrTn47KZDKFSZm3vr4+HnnkEcEBAKnyyCOPRH19fWLmzWQyhT/96U+/JjkAALZEAQwAsJN16tQp26dPn6OTNLO7fwGANFq3bl1MmzYtUTP36dPnmE6dOmWlBwDAx1EAAwDsZFddddUB2Wy2dVLmbWxsjEmTJgmOVOvYsWN06OCJmgD5aNKkSdHY2JiYebPZbOurrrrqAMkBAPBxFMAAADvZiBEjvp6keV988cVYtWqV4Ei1Ll26xIUXXhinnXZadO3a1UIA8siqVavipZdecj0JAEBqKIABAHaiM844o3tlZeXeSZk3l8vFxIkTBUdeyGQyMXjw4PjVr34VY8aMcUcwQB55/PHHI5fLJWbeysrKvc8444zukgMA4KMogAEAdqJTTjnlqxGRScq8CxYsiPfee09w5JVMJhN77713XHjhhTFmzJho3769pQCk3HvvvRcLFy5M1B9X/3NdCQAA/4cCGABgJ+nVq1ezXr16fTlJM3v3L/nsr0XwBRdcECeffHK0bdvWUgBSLGnXPb169fpyr169mkkOAIB/pAAGANhJrrjiioOLiopaJmXeBN4JAztEYWFhDB8+PC688MIYPXp0VFZWWgpACi1YsCCWLVuWmHmLiopaXnnllYdIDgCAf6QABgDYSYYPH/6VJM2btHfhwY5WVFQUI0aMiEsuuSRGjx4dLVu2tBSAFMnlcvH4448naub99tvvK5IDAOAfKYABAHaC0aNHd6isrByalHnXrl0bL7/8suDgI/y1CL744ovjhBNOiBYtWlgKQEq89NJLsW7dusTMW1lZudfo0aM7SA4AgL+lAAYA2AlOP/30o5J07fXMM89EQ0OD4GALiouL47DDDouxY8fGqFGjoqyszFIAEq6hoSGeeeaZJI1c8D/XmQAA8P8vEq0AAGDHymazmX79+n05KfPW1tbGlClTBAefUnFxcYwcOTIuvfTSGDVqVJSWlloKQII9//zzUVtbm5h5+/Xr9+VsNpuRHAAAf6UABgDYwX7zm9/sWVJS0jkp886YMSOqq6sFB1uppKQkRo4cGZdcckkcffTRUVJSYikACVRdXR0zZ85M0p8/na+44orBkgMA4K8UwAAAO9gXvvCFLyVl1lwuF08//bTQ4DNo3rx5HHXUUXHJJZfEyJEjI5vNWgpAwjz11FORy+USM++RRx75ZakBAPBXCmAAgB1oyJAhpZ07dz4iKfO+/vrrsWLFCsHBdlBeXh6jRo2KSy+9VBEMkDArVqyI119/PTHzdunS5fD+/ft79AQAABGhAAYA2KHGjh17aGFhYWJeCOruX9j+KioqYtSoUXHxxRfH4YcfHkVFRZYC4LpouyosLGz+H//xHwdLDQCACAUwAMAOteeeex6ZlFnXrl0b8+bNExrsIK1atYrjjz8+LrroohgxYkQUFPh2DKApmzdvXqxZsyYx8+61115HSg0AgAgFMADADnPMMce0bt269b5Jmfe5556LxsZGwcEO1qZNmxg9enRcfPHFimCAJqyxsTGee+65JP35MvyYY45pLTkAAPykAQBgBznzzDMPz2Qyibjeqq+vj6lTpwoNdqK2bdvG6NGj47zzzovhw4crggGaoBdeeCHq6+sTMWsmkyk844wzDpUaAAB+wgAAsIP079//C0mZdc6cObFhwwahwS7QqVOnOPnkk+Pf/u3fYu+9945MJmMpAE3Ehg0bYvbs2YmZd8CAAR4DDQCAAhgAYEf43ve+16mysnKPpMybpMcbQlp17tw5xowZE7/61a8UwQBNyPPPP5+YWSsrKwd/73vf6yQ1AID8pgAGANgBTj755CMiIhHtzcqVK+P1118XGjQRXbt2jTFjxsQ555wTgwcPthCAXez111+PlStXJmXczMknn3y41AAA8psCGABgB+jXr19iHv88ZcqUyOVyQoMmpnfv3nHaaafFOeecE/3797cQgF0kl8vFlClTknQd6jHQAAB5TgEMALCdnX766d0qKip2S8Ks9fX1MW3aNKFBE9anT58466yz4pxzzonddtvNQgB2gWnTpkV9fX0iZq2oqNjt9NNP7yY1AID8pQAGANjORo8efURSZp03b15s3LhRaJAAffr0ibPPPjvOPPPM6Nmzp4UA7EQbN26MefPmuR4FACARFMAAANtZr169EvPetSQ9zhD4bwMGDIhf/vKXceaZZ0b37t0tBGAnmTp1apKuRw+TGABA/lIAAwBsR2eccUb38vLyvkmYdf369fHaa68JDRJqwIAB8S//8i9x2mmnRbdunvQJsKPNnz8/Pvzww0TMWl5e3u9HP/pRF6kBAOQnBTAAwHZ03HHHHZSUWWfMmBGNjY1CgwTLZDIxePDg+Nd//dcYM2ZMdOjQwVIAdpDGxsaYMWNGYub9xje+cYjUAADykwIYAGA76tOnz8FJmDOXyyXqMYbAlmUymdh7773jwgsvjDFjxkT79u0tBWAHeOGFF5J0XXqIxAAA8pMCGABgOznppJPat2zZcvckzLpkyZJYuXKl0CBl/loEX3DBBXHyySdH27ZtLQVgO1qxYkW8/fbbiZi1srJy0PHHH+8PAgCAPKQABgDYTr773e8eGBGZJMyapMcXAluvsLAwhg8fHhdeeGGMHj06KisrLQVgO5k+fXpSRi34/ve/f6DEAADyjwIYAGA72X333Q9Nwpz19fUxc+ZMgUEeKCoqihEjRsQll1wSo0ePjpYtW1oKwGc0c+bMqK+vT8SsAwcOPFRiAAD5RwEMALAdHHTQQRUtW7bcKwmzLly4MKqrq4UGeeSvRfDFF18cJ5xwQrRo0cJSALZRVVVVvP7664mYtVWrVkOHDx9eLjUAgPyiAAYA2A7OPvvsz2cymaIkzOrxz5C/iouL47DDDouxY8fGqFGjoqyszFIAtkFSnqaSyWSy55577uclBgCQXxTAAADbwe67735AEuasra2NOXPmCAzyXHFxcYwcOTIuvfRSRTDANpg9e3bU1dUlYtY99tjjAIkBAOQXBTAAwGfUqlWrwnbt2u2fhFnnzZsXtbW1QgMiIqKkpCRGjhwZY8eOjaOPPjpKSkosBeBT2LRpU8ybNy8Rs7Zv337/iooKPwMEAMgjLv4AAD6jCy+8cPeioqKKJMz64osvCgz4P5o3bx5HHXVUXHLJJTFy5MjIZrOWAvAJZs2alYg5i4qKWlx88cWDJAYAkD8UwAAAn9GBBx6YiMfqVVdXJ+ZOFWDXKC8vj1GjRsWll16qCAb4BPPmzYuamppEzHrQQQd5DDQAQB5RAAMAfEZdu3YdnoQ5582bF/X19QIDPlFFRUWMGjUqLr744jj88MOjqKjIUgD+QV1dXbz66quJmLVLly77SwwAIH8ogAEAPoNTTjmlY3l5+W5JmPXll18WGLBVWrVqFccff3xcdNFFMWLEiCgo8C0kwN966aWXEjFnRUXFbieddFJ7iQEA5AffvQMAfAYnnnji55MwZ21tbcyfP19gwDZp06ZNjB49OsaOHasIBvgb8+fPj9ra2iSMmvnud7/7eYkBAOQH37UDAHwGn/vc5/ZLwpwLFy6Muro6gQGfyV+L4PPOOy+GDx+uCAby3ubNm2PhwoWJmLVfv37DJQYAkB98tw4AsI1atWpV2Lp1672TMKvHPwPbU6dOneLkk0+Oc889NwYNGmQhQF6bPXt2IuZs06bN3hUVFX4WCACQB1z0AQBso/PPP39gYWFheVOfs76+PubMmSMwYLvr2bNn/OQnP4nzzjsv9t5778hkMpYC5J3Zs2dHfX19k5+zqKio4vzzzx8oMQCA9FMAAwBso/3333/fJMz5+uuvR01NjcCAHaZLly4xZsyYOOecc2Lw4MEWAuSV6urqeOONNxIx64EHHriPxAAA0k8BDACwjbp27ZqIxz/PnTtXWMBO0bt37zjttNPinHPOif79+1sIkDeScr3VvXv3vaUFAJB+CmAAgG0wZMiQ0srKyj2a+py5XM7jn4Gdrk+fPnHWWWfFOeecE7vttpuFAKk3e/bsyOVyTX7Oli1b7jlo0KBSiQEApJsCGABgG5x55pl7ZjKZbFOfc9myZbFu3TqBAbtEnz594uyzz44zzzwzevbsaSFAaq1bty6WL1/e5OfMZDLZs846a4jEAADSrcgKAAC23tChQ4clYc558+YJC9jlBgwYEAMGDIgFCxbE+PHjY+nSpZYCpM68efOiS5cuTX7OffbZZ5+ImC4xAID0cgcwAMA26Nix4z5JmHP+/PnCApqMAQMGxC9/+cs47bTTolu3bhYCpEpSrrs6deq0j7QAANJNAQwAsJWOOOKIlhUVFf2a+pxVVVWxaNEigQFNSiaTicGDB8e//uu/xpgxY6JDhw6WAqTCW2+9FVVVVU1+zoqKis8deuihLSQGAJBeCmAAgK108sknD46ITFOfc/78+dHY2CgwoEnKZDKx9957x4UXXhhjxoyJ9u3bWwqQaI2NjbFgwYJE/Cv4u9/97h4SAwBILwUwAMBW2n333fdMwpze/wskwV+L4AsuuCBOPvnkaNu2raUAiZWU66/BgwfvKS0AgPQqsgIAgK3Trl27wU19xlwul5Q7UAAiIqKwsDCGDx8e++yzT0ybNi0mTJgQ69evtxggURYsWBC5XC4ymab9sJgOHToMlhYAQHq5AxgAYCsMGjSotGXLlgOa+pzvvfdebNy4UWBA4hQVFcWIESPikksuidGjR0fLli0tBUiMDz/8MJYtW9bk52zZsuXA/v37l0gMACCdFMAAAFvhxz/+8aBMJtPkn6Li7l8g6f5aBI8dOzZOOOGEaNGihaUAibBw4cImP2Mmk8n+5Cc/GSAtAIB0UgADAGyFvffee88kzJmEHzwCfBrNmjWLww47LMaOHRujRo2KsrIySwGatKT8Il5SrmsBANh63gEMALAVunbtOqSpz1hfXx9vvvmmsIBUKS4ujpEjR8bBBx8czz77bDz++ONRXV1tMUCT8+abb0Z9fX0UFTXtH7t16dJlT2kBAKSTO4ABAD6lioqKgoqKikFNfc4lS5bE5s2bBQakUklJSYwcOTLGjh0bRx99dJSUeIUl0LTU1tbG0qVLm/ycLVu2HFRaWupngwAAKeQiDwDgUzr77LP7FhYWNvlnj7722mvCAlKvefPmcdRRR8Ull1wSI0eOjGbNmlkK4HpsKxQWFpafffbZvaQFAJA+CmAAgE9p//3375+EOV9//XVhAXmjvLw8Ro0aFf/+7/8eI0eOjGw2aymA67FP6fOf//xAaQEApI8CGADgU+rRo8fuTX3G2traePvtt4UF5J2KiooYNWpUXHzxxXH44Yc3+XdvAum2ePHiRLySo1evXoOkBQCQPgpgAIBPqXXr1k3+DoklS5ZEQ0ODsIC81apVqzj++OPj4osvjhEjRkRBgW97gZ2voaEhlixZ0uTnbNOmjQIYACCFfCcMAPApDBkypLR58+a9m/qcb775prAAIqJ169YxevToGDt2rCIYcF32MZo3b95n0KBBpdICAEgX3wEDAHwKp556av9MJtPkr53eeustYQH8jTZt2sTo0aPjvPPOi+HDhyuCAddlfyOTyRT84Ac/+Jy0AADSxXe+AACfwuDBg5v84/Hq6+tj0aJFwgL4CJ06dYqTTz45/u3f/i323nvvyGQylgLsUIsXL07Eqzn23HPPgdICAEgXBTAAwKfQpUuXAU19xnfeeSfq6uqEBbAFnTt3jjFjxiiCgR2utrY23n333SRc53oPMABAyiiAAQA+hZYtW/Zv6jN6/DPAp9elS5cYM2ZMnHvuuTF48GALAfL2+iwJ17kAAGwdBTAAwCcYPnx4eUlJSeemPqfHPwNsvV69esVpp50W55xzTvTvrwMB8u/6rLS0tPPw4cPLpQUAkB4KYACAT/Ctb31rt4ho8s8IXbx4sbAAtlGfPn3irLPOinPOOSd22203CwG2i4T8gl7m29/+dj9pAQCkhwIYAOAT7L777k2+CVi7dm1s2LBBWACfUZ8+feLss8+OM888M3r27GkhwGfy4Ycfxrp165r8nAMHDlQAAwCkSJEVAABsWadOnZr8D8TefvttQQFsRwMGDIgBAwbEggULYvz48bF06VJLAbb5Oq1Vq1audwEA2GkUwAAAn6CyslIBDJCnBgwYEP3794958+bFQw89FO+++66lAFtlyZIlsddeezX1613PvgcASBEFMADAFnTq1CnbvHnzXk19ziVLlggLYAfJZDIxePDg2GOPPeLll1+OBx98MFauXGkxQGqu05o3b967Xbt2RatXr66XGABA8nkHMADAFowZM6ZnJpPJNuUZGxsbPZoUYCfIZDKx9957x4UXXhhjxoyJ9u3bWwrwiZYuXRqNjY1NesaCgoLsqaee2kNaAADp4A5gAIAt2Hvvvfs29RlXrlwZtbW1wgLYSf5aBO+5554xa9asmDBhQqxevdpigI9UW1sb77//fnTu3LlJzzls2LC+EbFIYgAAyecOYACALejRo0eTL4DfeecdQQHsAoWFhTF8+PC48MILY/To0VFZWWkpQGKv15Jw3QsAwKejAAYA2ILWrVs3+ff/vvvuu4IC2IUKCwtjxIgRcckll8To0aOjZcuWlgIk7notCde9AAB8Oh4BDQCwBc2bN+/Z1GdUAAM0kW+wi4pixIgRsd9++8WUKVPiscceiw0bNlgMEO+9914SrnsVwAAAKeEOYACAj9G/f/+SkpKSjk19TgUwQNPSrFmzOOyww2Ls2LExatSoKCsrsxTIc0m4XistLe3Ut2/fYmkBACSfAhgA4GOccMIJ3Zr69dK6deuiqqpKWABNUHFxcYwcOTJ+/etfK4Ihz1VVVcX69eub+pgF3/zmN7tLCwAg+RTAAAAfY8iQIT2b+oxJeJwgQL77axE8duzYOProo6OkpMRSIA8l4botCde/AAB8MgUwAMDH6N69e8+mPqPHPwMkR/PmzeOoo46KSy65JEaOHBnNmjWzFMgjSbhuS8L1LwAAn0wBDADwMVq1atWjqc+4bNkyQQEkTHl5eYwaNSr+/d//PUaOHBnZbNZSIA8k4botCde/AAB8MgUwAMDHqKio6NXUZ1y+fLmgAJL750yMGjUqLr744jj88MOjqKjIUiDFknDd1rJly16SAgBIPgUwAMBHyGazmbKysq5NecbGxsZYtWqVsAASrlWrVnH88cfHxRdfHCNGjIiCAt+qQxqtWrUqGhsbm/SMJSUlXbPZbEZaAADJ5rtKAICPcNxxx7UrKCgobsozrl69Ourr64UFkBKtW7eO0aNHx9ixYxXBkEJ1dXXxwQcfNOkZCwoKio877rh20gIASDbfTQIAfITPf/7zXZr6jO+//76gAFKoTZs2MXr06Dj//PNj+PDhimBIkRUrVrgOBgBgh/NdJP+PvTuPr7I888d/nSwEkhD2HUQEUVRAoIiouCtq64Jabd1arVorbqO2tlXbaavTOu38Rqffdmpbu9rWpYogsqgFRXCttAIKArJDgAAJBLKQ5JzfH8WO4+DOcp6T9/v18jWvTv657ut6hNvnk/t+AICd2G+//bL+xVcSXiAC8PF17do1Lr300rj99ttj2LBhkUq5lRWSLgn7tyTsgwEAeH8FWgAA8H917txZAAxAVujevXtceeWVsXr16njiiSdi9uzZkclkNAYSKAn7tyTsgwEAeH8CYACAnWjXrp0roAHIKj169Igrr7wyli5dGpMmTYo5c+ZoCiRMEvZvSdgHAwDw/gTAAAA7UVxc3D3baxQAAzRPffr0ibFjx8aSJUti/PjxsWDBAk2BhEjC/i0J+2AAAN6fbwADAOxESUlJz2yur7q6Ourq6gwKoBnbb7/94l/+5V/ia1/7WhxwwAEaAglQV1cX1dXV9sEAAOxWAmAAgHc5/PDDSwsKCtpmc40VFRUGBUBERPTt2zduvPHGuOGGG2LffffVEMhy2b6PKygoaDt8+PASkwIASC4BMADAu5x44oldsr3GDRs2GBQA/8uAAQPiG9/4Rtxwww3Ru3dvDQH7uE+yH+5qUgAAyeUbwAAA79KvX7+sD4DXr19vUADs1IABA+LAAw+MuXPnxoQJE2LlypWaAlkkCTe5HHDAAV0i4i3TAgBIJgEwAMC7dO/evXO21+gEMADvJ5VKxaBBg2LgwIExe/bsGD9+fKxbt05jwD4uZ/bDAAC8NwEwAMC7tG/fvlO21ygABuDDSKVSMWzYsBg6dGjMnj07HnvsMbdIwF6WhBPASdgPAwDw3gTAAADv0rp166w/8ZCEF4cAZI+3g+BDDz00XnnllZg4caK/S8A+LtH7YQAA3psAGADgXUpKSrL6xENjY2Ns3rzZoAD4yPLz8+Pwww+P4cOHx/PPPx8TJ06MqqoqjYE9aPPmzdHY2BgFBdn7Wi7b98MAALw/ATAAwLu0bNmySzbXV1lZGZlMxqAA+Njy8/Nj1KhRMXLkyHjhhRcEwbAHZTKZqKqqio4dO9oPAwCwWwiAAQDepaioKKuvvKusrDQkAHaJgoKCGDVqVIwYMSJmzpwZkydPji1btmgM7IH9XDYHwNm+HwYA4P3laQEAwP8YPnx4SX5+fkk21ygABmBXa9GiRRx//PFxxx13xNlnnx0lJSWaAs14P5efn18yfPhwfxAAACSUABgA4B2OOOKIDtleo+//ArC7FBUVxejRo+P73/9+nH322VFcXKwpsBsk4cr1JOyLAQDYOQEwAMA79O3bt1221+gEMAC729tB8B133BGnn356tGrVSlOgme3n9ttvv7YmBQCQTAJgAIB36NSpkwAYAHYoKSmJz3zmM3HnnXfG6NGjo0WLFpoCzWQ/l4R9MQAAOycABgB4hw4dOrTN9hqTcGUgALmlpKQkzj777PjOd74To0aNivz8fE2BHN/PJWFfDADAzgmAAQDeoaysrG221ygABmBvad++fVx00UVx5513xgknnBCFhYWaAjm6nysrK3MCGAAgoQTAAADvUFJS0j6b68tkMlFdXW1QAOxV7dq1i/POOy+++93vxqhRoyIvz+sF+CiSsJ8rLS0VAAMAJJT/QgMAeIfi4uK22VxfXV1dNDY2GhQAWeHtE8F33HGHIBg+gsbGxqirq7MvBgBgt/BfZgAA79CqVausPung9C8A2ahDhw5x0UUXxbe//e04/PDDBcGQA/u6oqIiJ4ABABLKf5EBALxDQUGBABgAPqauXbvGpZdeGt/61rdi2LBhkUqlNAUSuq9r0aJFW1MCAEimAi0AAPgfhYWFZdlc39atWw0JgKzXrVu3uPLKK2P16tXxxBNPxOzZsyOTyWgMJGhfl+37YgAA3psAGADgnZujgoLW2VyfE8AAJEmPHj3iyiuvjKVLl8akSZNizpw5mgIJ2ddl+74YAID35gpoAIAdWrdunZefn98ym2sUAAOQRH369ImxY8fGLbfcEgMGDNAQSMC+Lj8/v1WrVq28OwQASCCbOACAHQYNGlQSEVn9scJt27YZFACJtd9++8UNN9wQX/va1+KAAw7QEJq1BOzr8gYPHlxsUgAAySMABgDY4YADDijJ9hpramoMCoDE69u3b9x4441xww03xL777qshNEu1tbVZX2P//v1LTQoAIHl8AxgAYIeePXtm/QuuJLwoBIAPa8CAATFgwICYP39+jBs3LpYvX64pNBtJ2Nf16NGjxKQAAJJHAAwAsEOnTp0EwACwFwwYMCAOPPDAmDt3bkyYMCFWrlypKeS8JOzrunbtKgAGAEggATAAwA5lZWVZ/4Krrq7OoADISalUKgYNGhQDBw6M2bNnx4QJE2Lt2rUaQ85KQgDcpk0bV0ADACSQABgAYIeysjIngAFgL0ulUjFs2LAYOnRozJ49O8aPHx/r1q3TGHKOABgAgN1FAAwAsENJSUlxttfoBDAAzcXbQfCQIUPi5ZdfjokTJ0ZFRYXGkDOSEAAnYX8MAMD/JQAGANihqKioKNtrrKmpMSgAmpW8vLw4/PDDY/jw4fH888/HE088EZWVlRpD4iUhAG7RokWRSQEAJI8AGABgh8LCwhbZXF86nY7t27cbFADNUn5+fowaNSpGjhwZL7zwQkycODGqqqo0hsTavn17ZDKZSKVSWVtjixYtWpgUAEDyCIABAHbI9gC4oaHBkABo9goKCmLUqFExYsSImDlzZkyePDm2bNmiMSROJpOJhoaGyOaMtbCw0AlgAIAk/neTFgAA7NgYFRRk9QuuxsZGQwKAHVq0aBHHH398HHnkkfHMM8/E1KlTY9u2bRpDomR7AJzt+2MAAN5jH6cFAAA7NkZZ/oLL9c8A8H8VFRXF6NGj49hjj41nnnkmpkyZEjU1NRpDImT7DS8FBQWugAYASCABMADA2xujLH/B5QpoAHhvbwfBRx11VEyfPj2efvrpqK2t1RiymgAYAIDdIU8LAAD+QQAMAMlXUlISn/nMZ+LOO++M0aNHZ/X1uiAABgBgdxAAAwDskO1XQAuAAeDDKykpibPPPjv+7d/+LUaPHh2FhYWagv3dR5Sfn9/SlAAAkkcADADw9sYoL88JYADIMa1bt46zzz47vve978UJJ5wgCMb+7iPIz8/3LwwAQAIJgAEAdkilUlm9N2psbDQkAPiY2rVrF+edd15897vfjRNOOCEKCgo0Bfu7D94f55sSAEDyCIABAHbI9gA4nU4bEgB8Qu3bt/9nEDxq1KjIy/NqBPu799kfp0wJACB5/FcOAMAOXnABQPPRoUOHuOiii+J73/ueIJi9JpPJZHuJ/sUAAEggmzgAgP+R1QFwAl4QAkDidOzYMS666KL41re+FYcffnj4fTDs796xOc7yG3IAANg5mzgAgITsjQTAALD7dOvWLS699NL41re+FcOGDRMEs0dk+xXQeXl5/kUAAEigAi0AAPiHbH/BJQAGgN2ve/fuceWVV8ayZcviiSeeiDlz5mgKzXl/5/AIAEACCYABAHbIZDJOAAMAERGx7777xtixY2PJkiUxYcKEmD9/vqZgfwwAQCIIgAEA/ocr7gCA/2W//faLG264Id56660YP358vPnmm5rCLpPtV0Cn3IUOAJBIAmAAgB2y/QVXtr8gBIBc1rdv37jxxhvjrbfeinHjxsWiRYs0hU/MFdAAANjEAQDsXln9Bs4BDADY+/r27Rs333xz3HDDDdG7d28NIdf3d75BAgCQQE4AAwDskO0nMATAAJA9BgwYEAMGDIj58+fHI488EitXrtQUcnF/5woaAIAEcgIYAGCHVCqVzvL6DAkAssyAAQPi1ltvjbFjx0bPnj01hJza32UScEc1AAD/lxPAAAD/QwAMAHysv6MHDRoUBx98cDz//PMxadKk2LRpk8aQ+P1dtv+CJAAAO+cEMADADul0dr/fEgADQHarr6+PioqK2LZtm2aQE/u7dDrtBDAAQAI5AQwA8D+cAAYAPrK6urp4+umnY9q0acJfcm1/5wQwAEACCYABAP6HEw4AwIfW0NAQ06ZNiyeffDK2bt2qIXxkCfgGsAAYACCBBMAAADtkMpmsDoDz8ny9AwCywdvB71NPPRXV1dUaQs7u7wTAAADJJAAGANgh219wCYABYO9qbGyMGTNmxJNPPhmVlZUawieWn5+f9VtkUwIASB4BMADADplMpiGb6yssLDQkANgL0ul0zJo1KyZPnhwbN27UEHaZgoLsfjXX1NTUaEoAAAncZ2oBAMA/NDY2bs/m+gTAALBnpdPpePnll2Py5Mmxdu1aDWGXa9GiRbb/O1BvSgAAySMABgDYoampSQAMAEQmk4nZs2fH448/HuXl5RpCs93fNTY2CoABABJIAAwAsENDQ0NWv+ASAAPA7vV28PvEE0/E6tWrNYTdLtuvgM72G3IAAHiPfaYWAAD8gyugAaD5mjNnTkyaNCmWLl2qGewx2X4FtAAYACCZBMAAADs0NTU5AQwAzcyCBQtiwoQJ8dZbb2kG9nfv0tDQIAAGAEggATAAwA7Z/oJLAAwAu87ChQtj/PjxsXjxYs1gr8n2K6Cz/RckAQB4j32mFgAA/EO2B8AFBQWRl5cX6XTasADgY1q+fHmMGzcu5s+frxnsVXl5eVkfAG/fvt0JYACABBIAAwDs0NDQkPUnHFq1ahXbtm0zLAD4iFauXBmPPPKI4Jes2tclYH8sAAYASCABMADADrW1tXXZXqMAGAA+mnXr1sX48eNj9uzZkclkNISs2tdlu7q6ulqTAgBIHgEwAMAOW7du3ZrtNSbhRSEAZIP169fHY489JvjFvu4TqK6u3mpSAADJIwAGANihqqpKAAwACbdhw4Z4/PHH45VXXommpiYNwb7uE6isrHT1DABAAgmAAQB22LRpU9a/4GrZsqVBAcBOVFVVxcSJE+OFF16IxsZGDSHrJSEA3rRpkxPAAAAJJAAGANhh3bp1WR8AOwEMAP/bli1bYsKECYJfEicJ+7ry8nIBMABAAgmAAQB2WLZsmSugASAhqqurY/LkyTFz5syor6/XEBInCfu6pUuXCoABABJIAAwAsMP8+fOz/gRwcXGxQQHQrNXU1MSUKVPimWeeEfySaEnY173++uu+AQwAkEACYACAHRYsWFCXyWQaUqlUYbbW2Lp1a4MCoFmqq6uLp59+OqZNmxbbtsmkSL5s39el0+mGpUuXbjcpAIDkEQADALxDU1PTtoKCgrbZWp8AGIDmZvv27TF9+vR48sknY+tWt9GSO7J9X9fU1ORfOACAhBIAAwC8Q0NDw9ZsDoBLS0sNCYDm8ndyTJs2LZ566qmorq7WEHJOtu/rGhsb/YsHAJBQAmAAgHeor6+vbNWqVc9src8JYAByXWNjY8yYMSOefPLJqKys1BByVrbv6+rr66tMCQAgmQTAAADv0NDQkNVvmgXAAOSqdDods2bNismTJ8fGjRs1hJyX7fu6bN8XAwDw3gTAAADvUFdXV5XN9ZWWlkYqlYpMJmNYAOSETCYTr732Wjz++OOxatUqDaFZSKVSUVJSktU11tbWVpkUAEAyCYABAN5h27Ztm7K5vvz8/GjVqlXU1NQYFgCJlslkYvbs2fH4449HeXm5htCstGrVKvLz87O6xq1btzoBDACQUAJgAIB3qK6u3pztNZaVlQmAAUist4PfiRMnxpo1azSEZqmsrCzra9y2bVuVSQEAJJMAGADgHaqqqjZle43t2rWLtWvXGhYAiTNnzpyYNGlSLF26VDNo1tq1a5f1NW7atMkJYACALNbQWBgFjQ0REZFKRSavMJre/pkAGADgHSoqKqqyvcYkvDAEgHdasGBBTJgwId566y3NgITs5zZs2CAABgDIYoUFDf9MejMRqab0/+S+AmAAgHdYtWpV1r/oatu2rUEBkAgLFy6M8ePHx+LFizUD3iEJAfDq1aurTAoAIJkEwAAA77BgwYKsD4CdAAYg2y1fvjzGjRsX8+fP1wzYiST8Ql8S9sUAAOycABgA4B2eeOKJjZlMpimVSuVna41OAAOQrVauXBmPPPKI4Bc+QLb/Ql8mk2l64oknNpoUAEAyCYABAN6huro6vX379g1FRUVdsrVGJ4AByDZr166NCRMmxOzZsyOTyWgIJHw/t3379g3V1dVpkwIASCYBMADAu9TV1a0XAAPAB1u/fn089thjgl/Isf1cXV3delMCAEguATAAwLvU1dVVtGnTJmvrKykpiRYtWsT27dsNC4C9oqKiIiZOnBivvPJKNDU1aQh8BEVFRVFcXJz1+2GTAgBILgEwAMC7bN26dV2XLll7ADhSqVR07Ngx1qxZY1gA7FFVVVUxceLEeP755wW/8DF17NgxUqlU1u+HTQoAILkEwAAA71JVVZX1Jx46deokAAZgj9m8eXM8/vjj8cILL0RjY6OGwCfcx9kPAwCwOwmAAQDeZf369Vn/zbMkvDgEIPm2bNkSU6ZMiZkzZ0Z9fb2GwC7QsWNH+2EAAHYrATAAwLusXr066088JOHFIQDJVVNTE1OmTIlnnnlG8Au7WBJ+kW/VqlUCYACABBMAAwC8y9///ves/+aZABiA3aG2tjYmT54czz77bNTV1WkINNN93KuvvioABgBIMAEwAMC7PPzww+t//OMfN6RSqcJsrbFz584GBcAus3379pg+fXpMnTo1tm3bpiGwG2X7CeB0Ot3w8MMPC4ABABJMAAwA8C7V1dXpurq68latWu2TrTV26NAh8vLyIp1OGxgAH1tDQ0NMmzYtnnrqqaiurtYQ2M3y8vKiQ4cOWV1jfX39mtraWptMAIAEEwADAOxEbW3tmmwOgAsKCqJdu3axceNGwwLgI2tsbIwZM2bEk08+GZWVlRoCe0j79u2joCC7X8fV1NSUmxQAQLIJgAEAdmLz5s2r2rdvn9U1duvWTQAMwEeSTqdj1qxZMXnyZH+HwF7av2W7LVu2rDQpAIBkEwADAOzEpk2bVvfp0yera+zWrVvMmzfPsAD4QG8Hv1OmTIkNGzZoCOzF/Vu227BhwxqTAgBINgEwAMBOrFixYvWwYcOyusYkvEAEYO/KZDLx0ksvxZQpU6K83K2usLd17do162tctWrVKpMCAEg2ATAAwE7Mnz9/9ZgxY7K6xiS8QARg78hkMjF79uyYOHFirFnjMB9kiyT8At+8efP8oQEAkHACYACAnRg3btyab37zm5mISGVrjU4AA7Azc+bMiSeeeCKWLVumGZBlEvALfJlx48atNikAgGQTAAMA7MTrr79e29DQsKmwsLBDttZYXFwcZWVlsWXLFgMDIBYsWBDjx4+PJUuWaAZkobKysiguLs7qGhsaGjYuWLCgzrQAAJJNAAwA8B62bt26vF27dh2yucauXbsKgAGauYULF8b48eNj8eLFmgFZLAm3t2zbtm25SQEAJJ8AGADgPVRVVS1t167d0GyusWfPnrFw4ULDAmiGli1bFo899ljMnz9fMyABevbsmfU1VlZWLjUpAIDkEwADALyHdevWLevTp09W15iEF4kA7ForVqyIRx99VPALCZOEfdvatWuXmRQAQPIJgAEA3sPChQuXHX744VldY69evQwKoJlYtWpVjB8/PubOnRuZTEZDIGGSsG9buHDhMpMCAEg+ATAAwHuYNm3a0ksuuSSra+zevXvk5+dHU1OTgQHkqHXr1sX48eNj9uzZgl9IqIKCgkR8A/jpp59eZloAADmw/9QCAICde+ihhzbcd999W/Pz80uzdjNXUBBdunSJNWvWGBhAjqmoqIiJEyfGyy+/HOl0WkMgwbp27RoFBdn9Gq6xsbH6kUce2WBaAADJJwAGAHgf27ZtW15WVnZwNtfYq1cvATBADqmqqoqJEyfG888/74YHyBFJ+P7vtm3blpsUAEBuEAADALyPLVu2LMv2ALhnz57x0ksvGRZAwm3evDkef/zxeOGFF6KxsVFDIIck4fu/W7ZsWWpSAAC5QQAMAPA+1q9fvyzbT2z06NHDoAASbMuWLTFlypSYOXNm1NfXawjkoCTs19avX7/MpAAAcoMAGADgfSxYsGDh0KFDs7rGfffdN1KpVGQyGQMDSJCampqYMmVKPPPMM4JfyGGpVCr23XffrK9z/vz5C00LACA3CIABAN7Ho48++uYFF1yQ1TWWlJRE586dY926dQYGkAC1tbUxefLkePbZZ6Ourk5DIMd17do1WrVqlfV1/vnPf15kWgAAuUEADADwPiZNmlRVX1+/oaioqGM217nvvvsKgAGy3Pbt22P69OkxderU2LZtm4ZAM9GnT5+sr7G+vr7iySefrDItAIDcIAAGAPgAW7duXZTtAXCfPn3ipZdeMiyALNTQ0BDTpk2Lp556KqqrqzUEmpkkXP+8detWp38BAHKIABgA4ANUVFQs7NChw8hsrjEJLxYBmpvGxsaYMWNGPPnkk1FZWakh0EwlYZ9WUVHh+78AADlEAAwA8AGWLl266MADD8zqGnv16hUFBQXR2NhoYAB7WTqdjlmzZsWkSZNi06ZNGgLNWGFhYfTs2TMR+13TAgDIHQJgAIAPMHPmzEWnnnpqdm/qCgqiZ8+esWzZMgMD2EveDn4nT54cGzdu1BAg9tlnn8jPz0/CfnexaQEA5I48LQAAeH+//OUvV6bT6bpsr7NPnz6GBbAXZDKZePHFF+O73/1u3H///cJf4J+ScP1zOp2u++Uvf7nStAAAcocTwAAAH6C6ujpdXV29uE2bNodkc539+vWL6dOnGxjAHpLJZGL27NkxceLEWLNmjYYAO92fJWCvu7i6ujptWgAAuUMADADwIWzYsGFetgfA/fv3NyiAPeTVV1+NSZMmxapVqzQD2KlUKpWI/dmGDRvmmhYAQG4RAAMAfAiLFy9+o2/fvlldY1lZWXTu3DnWr19vYAC7yYIFC2L8+PGxZMkSzQDeV5cuXaK0tDQJ+9z5pgUAkFsEwAAAH8JTTz31+ujRo7O+zv33318ADLAbLFy4MMaPHx+LFy/WDOBD78uSYMqUKa+bFgBAbsnTAgCAD/aLX/xiTWNjY1W215mUF40ASbFs2bK4++674z/+4z+Ev8BHkoTv/zY0NFTee++9q00LACC3OAEMAPAhNDQ0ZDZv3jy/Q4cOI7O5TgEwwK6xYsWKePTRR2P+fDejArm7L9uyZYs/5AAAcpAAGADgQ1q3bl3WB8AdO3aMNm3axObNmw0M4GNYtWpVjB8/PubOnRuZTEZDgI+lbdu20aFDh0Tsb00LACD3CIABAD6kefPmzTvooIOyvs4DDzwwXnrpJQMD+AjWrVsX48ePj9mzZwt+gV2yH0uCuXPnzjMtAIDcIwAGAPiQ/vznP88/77zzsr7OAw44QAAM8CFVVFTEuHHjBL/ALt+PJcHDDz/sBDAAQA4SAAMAfEgTJ06srK2tXdGqVat9srnOgw8+2LAAPkBVVVVMnDgxnn/++WhqatIQYJdKwq0xNTU1yydNmlRlWgAAuUcADADwEWzYsOHvvXr1yuoAuG3bttG1a9dYu3atgQG8y+bNm+Pxxx+PF154IRobGzUE2OW6desWbdu2TcS+1rQAAHKTABgA4CNYuHDha7169Toj2+scMGCAABjgHbZs2RJTpkyJ5557LrZv364hwG6TlO//Lly48O+mBQCQmwTAAAAfwcSJE/9+wgknZH2dBx54YEyfPt3AgGavpqYmpkyZEs8880zU19drCLDbDRgwIBF1jh8//u+mBQCQmwTAAAAfwb333rv6Bz/4wfqioqLO2VznAQccEHl5eZFOpw0NaJZqa2tj8uTJ8eyzz0ZdXZ2GAHtEXl5e9O/fP+vrrK+vX3ffffeVmxgAQG4SAAMAfESVlZVzu3btmtXHgFu1ahX77LNPLFu2zMCAZqWuri6efvrpmDZtWmzbtk1DgD1qn332iVatWmV9nZs2bZpjWgAAuUsADADwES1dunR2tgfAERGDBg0SAAPNRkNDQ0ybNi2eeuqpqK6u1hBgr+2/kuCtt976m2kBAOQuATAAwEc0ffr0v48cOTLr6xw4cGBMmDDBwICc1tDQEM8991w8+eSTUVlZqSHAXt9/JcG0adP+bloAALlLAAwA8BH9x3/8x9JbbrmlOj8/v3U219mrV68oKyuLLVu2GBqQc9LpdMyaNSsmTZoUmzZt0hBgrysrK4tevXplfZ2NjY1b7rnnnmUmBgCQuwTAAAAfUW1tbXrDhg1/7dKly3HZXGcqlYqBAwfGrFmzDA3IGW8Hv5MnT46NGzdqCJA1Bg4cGKlUKuvr3Lhx4yu1tbVpEwMAyF0CYACAj+Gtt956JdsD4IgQAAM5I51Ox8svvxxTpkyJ8vJyDQGyct+VBIsWLXrFtAAAcpsAGADgYxg/fvwrRxxxRNbXedBBB0VBQUE0NjYaGpBImUwmZs+eHRMnTow1a9ZoCJCVCgoK4qCDDkpErY888ogAGAAgx+VpAQDAR/fjH/94ZX19/fpsr7OoqCj69etnYEAivfrqq3HHHXfEz3/+c+EvkNX69esXRUVFWV9nXV1d+b333rvaxAAAcpsTwAAAH9OGDRte6dGjx6ezvc5BgwbFggULDAxIjCVLlsSECRNi/vz5mgEkwuDBgxNR5/r1653+BQBoBgTAAAAf07x5815OQgA8bNiwePjhhyOTyRgakNXefPPNmDBhQixevFgzgMRIpVIxdOjQRNQ6d+7cl0wMACD3CYABAD6m++677+XRo0dnIiKVzXW2bds2evfuHcuWLTM0ICstW7YsHnvsMSd+gUTq06dPtG3bNgmlpu+9996/mhgAQO4TAAMAfEwTJ06s3Lp165LS0tK+2V7rkCFDBMBA1lmxYkU8+uijgl8g0YYMGZKIOqurqxc+/fTTm00MACD3CYABAD6B8vLyl/fff/+sD4AHDx4c48aNMzAgK6xcuTImTJgQc+fOdT09kHhJ+f7vmjVrfP8XAKCZEAADAHwCM2fOfG7//ff/fLbX2a1bt+jWrVuUl5cbGrDXrFu3LsaPHx+zZ88W/AI5oWfPntGlS5dE1DpjxoznTAwAoHkQAAMAfAK33Xbba5dcckl1fn5+62yvdciQIQJgYK9Yv359PPbYY4JfIOck5frnxsbGzbfddts8EwMAaB4EwAAAn0BlZWXThg0b/tqlS5fjsr3WQw89NCZNmmRowJ78MzKeeOKJeP7556OpqUlDgJxz6KGHJqLOioqKV6qrq9MmBgDQPAiAAQA+oXnz5s1MQgDcu3dv10ADe0RVVVVMnDgxXnjhhWhsbNQQICd17949evbsmZT9quufAQCakTwtAAD4ZP77v/97VkQk4kTFpz71KQMDdpstW7bEQw89FLfffns899xzwl8gpw0fPjwRdWYymfTdd9/9gokBADQfTgADAHxCkyZNqtqyZcuCsrKyg7K91uHDh8fjjz9uaMAuVVNTE1OmTIlnnnkm6uvrNQTIealUKg477LBE1Lply5bXp0+fvsXUAACaDwEwAMAusHz58lkDBw7M+gC4S5cu0atXr1i5cqWhAZ9YbW1tTJ48OZ599tmoq6vTEKDZ6N27d3Ts2DEx+1QTAwBoXgTAAAC7wLPPPvvCwIEDr0hCrcOGDRMAA59IXV1dPP300zFt2rTYtm2bhgDNzrBhwxJT61/+8pcXTQwAoHnxDWAAgF3g1ltvnV9fX782CbUefvjhkUqlDA34yBoaGmLq1Klx6623xuOPPy78BZqlJF3/XFdXt/rWW29dYGoAAM2LE8AAALtAQ0NDZs2aNc/16dPns9lea7t27aJPnz6xZMkSgwM+7J9xMW3atHjqqaeiurpaQ4Bmbb/99ou2bdsmotbVq1fPNDEAgOZHAAwAsIs8++yz05IQAEdEHHHEEQJg4AOl0+mYNWtWTJo0KTZt2qQhABFx5JFHJqbW6dOnTzMxAIDmxxXQAAC7yC233PJaQ0NDZRJqHT58eLRo0cLQgJ1Kp9Px3HPPxW233Rb333+/8Bdgh6KiovjUpz6ViFobGho23HLLLXNNDQCg+XECGABgF6murk6Xl5c/t88++5yR7bW2bNkyDj300Hj55ZcNDvindDodL7/8ckyZMiXKy8s1BOBdhgwZEkVFRYmodc2aNc/V1tamTQ0AoPkRAAMA7EIvvvjiM0kIgCMiRo4cKQAGIiIik8nE7NmzY+LEibFmzRoNAXif/VNSzJo161kTAwBongTAAAC70O233/7KOeecszU/P78022sdMGBAtG/f3tWu0My9+uqrMWnSpFi1apVmALyPjh07xgEHHJCIWhsbG6u/8Y1v/NXUAACaJwEwAMAutHLlyob169fP6tat2+hsrzWVSsXhhx8ekyZNMjhohubMmROTJ0+OJUuWaAbAh3D44YdHKpVKRK3r16+fVVFR0WhqAADNU54WAADsWq+++mpirts77LDDDAyamTfffDP+/d//PX7yk58IfwE+pFQqFSNGjEhMva+88sozpgYA0Hw5AQwAsIvddNNNz5166qnV+fn5rbO91m7dukX//v1j4cKFBgc5btmyZfHYY4/F/PnzNQPgIzrggAOic+fOiai1sbFxy4033jjL1AAAmi8BMADALrZy5cqG8vLyGT179vx0Euo9+uijBcCQw5YvXx7jxo0T/AJ8wv1SUpSXlz9TXl7eYGoAAM2XABgAYDeYMWPGUxdccEEiAuAhQ4ZE69ato7q62uAgh6xcuTImTJgQc+fOjUwmoyEAH1ObNm3i0EMPTUy9zz777FOmBgDQvPkGMADAbvDVr371lYaGhk1JqLWgoCCOOOIIQ4McsW7duvj5z38ed955Z8yZM0f4C/AJjRw5MvLz8xNRa0NDw8abbrrpVVMDAGjenAAGANgNKisrm1atWjW9T58+5ySh3qOPPjqefPJJQREk2Pr16+Oxxx6L2bNn+3cZYBdJpVIxatSoxNS7cuXKadXV1WmTAwBo3pwABgDYTaZNm5aY6/c6duwYAwYMMDRIoA0bNsSvf/3r+Nd//dd49dVXhb8Au9CAAQOiY8eOian36aefftLUAAAQAAMA7CZf+9rX5tTX11ckpd6jjjrK0CBBqqqq4v77749vf/vb8eKLL0ZTU5OmAOxiRx55ZGJqra+vX/eNb3zjdVMDAMAV0AAAu0ltbW16xYoVT++///6fT0K9hx56aLRt2zaqqqoMD7LYli1bYsqUKfHcc8/F9u3bNQRgN2nbtm0MGTIkMfUuX778qdraWtc/AwDgBDAAwO70xz/+cUJSas3Pz4/jjjvO0CBL1dTUxKOPPhq33XZb/OUvfxH+Auxmxx57bOTn5yel3Myvf/3rCaYGAECEABgAYLe66667llZXV89PSr1HH310tGjRwuAgi7wd/H7jG9+IqVOnRn19vaYA7GYtWrSIo48+OjH1btmy5Y177rlnhckBABDhCmgAgN3u9ddfn3T44YcPSEKtxcXFcdhhh8XMmTMNDvayurq6ePrpp2PatGmxbds2DQHYgw477LAoKSlJTL3z5s17wtQAAHibE8AAALvZ9773vanpdLohKfWecMIJkUqlDA72koaGhpg6dWrceuut8fjjjwt/AfawVCoVJ5xwQmLqTafT27/73e8+ZXIAALzNCWAAgN1s+vTpWyoqKmZ26dIlER/Y7d69e/Tv3z/efPNNw4M9qKGhIaZNmxZPPfVUVFdXawjAXnLAAQdE9+7dE1NvRUXFczNmzPAXBwAA/+QEMADAHjBr1qxEXcuXpFMvkHTpdDqee+65uP322+PRRx8V/gLsZccff3yi6p0xY8YkUwMA4J2cAAYA2AO++tWvvnT66adXFRYWtk1CvQMHDoyOHTvGhg0bDA92k3Q6HbNmzYrJkyfHxo0bNQQgC3Ts2DEGDhyYmHobGhoqb7755pdMDgCAd3ICGABgDygvL29YsWLF1MRsEvPy4sQTTzQ42A3S6XS8+OKL8Z3vfCfuv/9+4S9AFjnppJMiLy85r8tWrFgxpaKiotHkAAB4JwEwAMAe8qtf/erRiMgkpd6jjjoqysrKDA52kUwmE6+++mp873vfi1//+texdu1aTQHIImVlZXHUUUcl6q+W//7v//6zyQEA8G4CYACAPeQ///M/l1dWVv4tKfUWFhbGMcccY3CwC7wd/P785z+PNWvWaAhAFjruuOOioCA5X0urqqqa/dOf/nS1yQEA8G4CYACAPeill14al6R6jzvuuCgqKjI4+JjmzJkTd911V/z85z+P1au9owfIVkVFRYn7xbcXXnhhnMkBALAzBVoAALDnjB079pkFCxZUFhYWtktCvSUlJXHEEUfE9OnTDQ8+gjfffDPGjx8fb731lmYAJMCRRx4ZJSUliam3oaFh0zXXXPOsyQEAsDMCYACAPai8vLxh6dKlE/v3739xUmo+8cQT49lnn410Om2A8AEWLVoUjz32WCxevFgzABIiLy8vTjzxxETVvGTJkifKy8sbTA8AgJ3ucbUAAGDP+u1vfzsxIjJJqbdjx44xdOhQg4P3sXz58rj77rvjRz/6kfAXIGGGDRsWHTp0SFLJmd/85jePmxwAAO9FAAwAsIf953/+5/JNmza9kqSaTz/99EilUoYH77Jy5cr4yU9+Et///vdj/vz5GgKQMHl5eXHGGWckquZNmza9fM8996wwPQAA3osroAEA9oKXXnpp/KmnnnpYUurt2rVrDBkyJGbPnm14EBHr1q2L8ePHx+zZsyOTyWgIQEINHTo0OnfunKiaX3jhhQkmBwDA+xEAAwDsBZdffvkzS5YsWVdUVNQlKTWfccYZ8be//U3YRbO2fv36eOyxxwS/ADkglUrF6aefnqia6+rq1lx22WXTTQ8AgPcjAAYA2AsqKyub5s+f/8ihhx56dVJq7tatm1PANFsbNmyIxx9/PF555ZVoamrSEIAc8KlPfSq6du2aqJrfeOONcdXV1WnTAwDg/fgGMADAXvL1r399XDqdrktSzb4FTHNTVVUV999/f3z729+OF198UfgLkCNSqVR8+tOfTlTN6XS69pvf/OZjpgcAwAdxAhgAYC+ZMWNG9Zo1a/7Ss2fPxLx97N69ewwcODDmzJljgOS0LVu2xIQJE+KFF16IxsZGDQHIMYceemh069YtUTWvXr36qRkzZlSbHgAAH8QJYACAvejXv/71HyMiUR8SPeuss5wCJmdt27YtHn300bjtttviueeeE/4C5KC8vLwYM2ZM0srO/OpXv/qT6QEA8KH2vFoAALD3fP/733+rqqoqUR/V7dGjR3zqU58yPHJKfX19TJ06Nb71rW/F1KlTo76+XlMActSIESOiS5cuiap506ZNf73rrruWmh4AAB+GABgAYC975plnHkpazWeccUbk5dlKkjvmzZsXjz76aGzdulUzAHJYQUFBnH766Ymre9q0aQ+aHgAAH5a3dgAAe9nYsWNn1tfXr01SzZ07d47DDjvM8ACARBk5cmR06NAhUTXX1dWtHjt27POmBwDAhyUABgDYyyorK5tee+21Pyat7jPPPDMKCgoMEABIhBYtWiTy9O/s2bP/UF1dnTZBAAA+LAEwAEAWuOqqqyY0NjZWJanm9u3bx9FHH214AEAiHHfccdGmTZtE1dzQ0LDxiiuumGh6AAB8FAJgAIAssGDBgrqFCxc+lrS6R48eHYWFhQYIAGS1li1bxsknn5y4uhcuXDhu6dKl200QAICPQgAMAJAlvv71r/8pnU7XJqnmtm3bximnnGJ4AEBWO+2006K0tDRRNTc1NdV+7Wtfe8j0AAD4qATAAABZ4umnn968fPnyxF3xN3r06GjXrp0BAgBZqUOHDnH88ccnru5ly5ZNmD59+hYTBADgoxIAAwBkkbvvvvtPmUymKUk1FxYWxumnn254AEBWOvPMMxP3yYpMJtN41113/dH0AAD4OATAAABZ5Be/+MWatWvXTkta3UcccUT06tXLAAGArNK7d+847LDDEld3eXn5X+6///51JggAwMchAAYAyDIPP/zwn5JWcyqVijPPPNPwAICsMmbMmEilUomr+8EHH/yT6QEA8HEJgAEAsszXv/71NzZs2DAraXUPHDgwDj74YAMEALLCoEGDYsCAAYmru6KiYuatt966wAQBAPi4BMAAAFlo3Lhxv01i3WPGjIm8PFtMAGDvysvLizFjxiSy9j//+c+/NUEAAD7RflgLAACyz/XXXz+nqqrqr0mru1evXnHUUUcZIACwVx1zzDHRvXv3xNW9adOmV2666aa5JggAwCchAAYAyFJ/+tOf7k1i3WPGjInS0lIDBAD2ijZt2sRZZ52VyNofeOCBe00QAIBPSgAMAJClbrrpprlJPAVcXFwcZ555pgECAHvFWWedFS1btkxc3Zs2bXrl5ptvnmeCAAB8UgJgAIAsNm7cuF8lse5Ro0ZF7969DRAA2KP69OkTI0eOTGTtjz322K9MEACAXUEADACQxcaOHTu7qqrqb0mrO5VKxfnnnx+pVMoQAYA9tv/4/Oc/n8j9R2Vl5d+uueaav5kiAAC7ggAYACDLTZ069bdJrLtv374xZMgQAwQA9ojDDjsssTeQTJ48+TcmCADAriIABgDIcpdeeumLVVVVryax9s9//vNRXFxsiADAblVaWhrnn39+Imuvqqr66+WXX/6SKQIAsKsIgAEAEuChhx76WRLrLisri9NPP90AAYDd6qyzzoqSkpIklp753e9+91MTBABgVxIAAwAkwA033DB3w4YNs5JY+3HHHRd9+vQxRABgt+jbt28cddRRiay9oqJi1te//vU3TBEAgF1JAAwAkBA///nPfxoR6aTVnUql4vOf/3zk5dl6AgC7Vn5+flx00UWRSqWSWH76F7/4xX+bIgAAu5q3cAAACXHHHXe8tW7duulJrL13795xzDHHGCIAsEudcMIJ0b1790TWXl5e/pc77rjjLVMEAGBXEwADACTI3XfffW8mk2lKYu1nnXVWtG3b1hABgF2iQ4cOcfrppyey9kwm03T33Xf/3BQBANgdBMAAAAlyzz33rCgvL386ibW3bNkyzj33XEMEAHaJc889N1q0aJHI2tesWTP1xz/+8UpTBABgdxAAAwAkzA9/+MOfZzKZhiTWPnz48Bg0aJAhAgCfyKGHHhpDhw5NZO3pdLrhBz/4wS9MEQCA3UUADACQMPfee+/qRYsWPZDU+i+++OIoKSkxSADgY2ndunVcfPHFia1/4cKFf7jvvvvKTRIAgN1FAAwAkECXXXbZrxsaGjYlsfaysjJXQQMAH9u5554bpaWliay9oaFh4+WXX/47UwQAYHcSAAMAJNDs2bNrXn311V8ntf4jjjgiDj74YIMEAD6SwYMHx+GHH57Y+l955ZX7Zs+eXWOSAADsTgJgAICEOueccx6tqalZmtT6L7roomjZsqVBAgAfSsuWLeNzn/tcYuuvqalZMmbMmMdMEgCA3U0ADACQUJWVlU3Tpk37RVLrb9++fZx++ukGCQB8KGeccUa0b98+sfU/+eST91ZXV6dNEgCA3U0ADACQYOedd960qqqqV5Ja/wknnOAqaADgAx188MFx/PHHJ7b+TZs2vXzBBRc8a5IAAOwJAmAAgIT74x//eG9EZJJYeyqVigsuuMBV0ADAe2rZsmVccMEFkUqlkrqEzP333/8zkwQAYE8RAAMAJNzNN988b9WqVU8ktf6OHTsm+nt+AMDudcEFF0THjh0TW/+KFSse//rXv/6GSQIAsKcIgAEAcsCNN974k6ampq1JrX/kyJExdOhQgwQA/pdPfepTMWLEiMTW39TUVH3zzTf/t0kCALAnCYABAHLAxIkTK//+97//KslruPDCC6OsrMwwAYCIiGjTpk18/vOfT/QaZs+efd/EiRMrTRMAgD1JAAwAkCPOPvvsh2pqapYntf7S0tK46KKLDBIAiFQqFV/84hejtLQ0sWuoqal566yzznrYNAEA2NMEwAAAOaKioqJx0qRJP07yGgYPHhwjR440TABo5o444og46KCDEr2GJ5544qeVlZVNpgkAwJ4mAAYAyCGXXHLJzIqKihlJXsMFF1wQ3bp1M0wAaKZ69uyZ+KufKyoqZnzhC1+YZZoAAOwNAmAAgBzzb//2b/ek0+ntSa2/RYsWceWVV0ZhYaFhAkAzU1hYGF/60pcSvQ9Ip9Pb/+3f/u0e0wQAYG8RAAMA5Jh777139aJFix5M8hq6d+8eZ555pmECQDNzxhlnRPfu3RO9hsWLFz947733rjZNAAD2FgEwAEAO+uxnP/vL2traRL94PPHEE2Pw4MGGCQDNxKBBg+Kkk05K9Bpqa2tXn3vuub80TQAA9iYBMABADlq8eHH9uHHj/j3Ja0ilUnHJJZdE27ZtDRQAclybNm3ikksuiVQqleh1jBs37t8XL15cb6IAAOxNAmAAgBx1+eWXv1RRUTEjyWsoLS2NL3zhC4l/GQwAvLe3f+mrdevWiV5HRUXFM5dffvlLJgoAwN4mAAYAyGE33HDDXU1NTVuTvIaDDjrI94ABIId95jOfiUMOOSTRa2hqaqq+4YYbfmiaAABkAwEwAEAOGzdu3MbZs2cn/jt0p5xyiu8BA0AOOuSQQ+LTn/504tfx17/+9efjxo3baKIAAGQDATAAQI77zGc+81B1dfXCJK8hlUrFF7/4xejQoYOBAkCO6NixY3zpS19K/KceNm/ePO+00057xEQBAMgWAmAAgBxXXV2dfuCBB34UEekkr6O4uDguvfTSyMuzhQWApMvPz4/LLrssiouLk76U9P333/+ftbW1aVMFACBbeHsGANAMXH/99XMWLVr0YNLXsf/++8e5555roACQcOedd1707ds38etYuHDhH7/61a++bqIAAGQTATAAQDNxySWX/Lyurq486es4/vjjfQ8YABJs2LBhccwxxyR+HXV1dWsuvPDC+0wUAIBsIwAGAGgmXnvttdoHHnjguxGRSfI6UqlUfOlLX4oePXoYKgAkTO/evePSSy9N/Hd/IyLzwAMPfO/111+vNVUAALKNABgAoBm5+uqr/7Z06dJHk76OoqKiGDt2bJSWlhoqACRE69at46qrrorCwsLEr2X58uXjrr766r+ZKgAA2UgADADQzJx33nn/r66ubnXS19GhQ4e4/PLLIy/PlhYAsl1eXl5cfvnl0b59+8Svpb6+ft0ll1zyE1MFACBr999aAADQvLz++uu1Dz744Pcj4VdBR0QMGDAgzjrrLEMFgCw3ZsyYOPDAA3NiLY899tgPXnnllW2mCgBAthIAAwA0Q1/5ylf+umbNmqm5sJaTTz45Dj30UEMFgCw1ZMiQOOmkk3JiLWvXrv3LpZde+oKpAgCQzQTAAADN1GWXXfYf9fX1FUlfRyqViksvvTS6d+9uqACQZXr06BFf/OIXI5VKJX4tDQ0Nm6655pofmioAANlOAAwA0EzNmDGj+oEHHvhO5MBV0C1btozrr78+2rZta7AAkCXatWsX1113XbRs2TIXlpN56KGH/nXSpElVJgsAQLYTAAMANGNf+cpX/rpkyZI/58Ja2rZtG1dffXW0aNHCYAFgL2vRokVcffXVOfPLWUuXLn30iiuueNlkAQBIAgEwAEAzd+655/6ktrZ2eS6spXfv3jlzzSQAJNXbn2fYZ599cmI9tbW1y88555wfmywAAEkhAAYAaOYWLFhQ97Of/ezbmUymMRfWM2zYsDjllFMMFgD2kk9/+tMxdOjQnFhLJpNp/NnPfvbtBQsW1JksAABJIQAGACBuvfXWBfPnz78/V9Zz5plnxuDBgw0WAPaw4cOHx2c+85mcWc/8+fN/d+utty4wWQAAkkQADABARESMGTPmvpqamrdyYS2pVCouu+yy6Nmzp8ECwB7Su3fvuPjii3PmUwxbt25ddPrpp//aZAEASBoBMAAAERGxcuXKhh/+8Ie3pdPpnLjisGXLlvEv//Iv0aVLF8MFgN2sS5cucf3110dRUVFOrKepqanmu9/97jfKy8sbTBcAgKQRAAMA8E933XXX0ueff/6eXFlPaWlpXHvttVFWVma4ALCblJWVxXXXXRclJSU5s6aZM2fe/f/+3/9bZboAACSRABgAgP/l5JNPHldeXv50rqynU6dOMXbs2Jw5kQQA2aSoqCiuueaa6NixY86sqby8/MlTTz11gukCAJBUAmAAAP6PSy655K66urq1ubKefffdN6644orIy7P9BYBdJS8vL6688sro3bt3zqyprq6u/JJLLvmh6QIAkOi9uhYAAPBus2bNqn7ooYfujIh0rqxp4MCBcd555xkuAOwi559/fhxyyCG5tKT0gw8+eOesWbOqTRcAgCTLb3tQ9NzpjndbRG15oQ4BADRTEydOXDNmzJi8Tp06Dc2VNfXp0yfy8/PjzTffNGAA+ATOOuusOOmkk3JqTa+//vp9Z5555kTTBQAgCYq7N0Ze6c5/5gQwAADv6dRTT/31li1bXs+lNZ122mlx9NFHGy4AfEzHHntsnHrqqTm1pi1btrxx2mmn/cZ0AQDIBQJgAADeU0VFReONN974jcbGxqpcWtcFF1wQRx55pAEDwEd05JFHxuc+97mcWlNjY2PVzTff/I2KiopGEwYAIBcIgAEAeF9//OMf1z/yyCPfiRz6HnAqlYqLLroohgwZYsAA8CENHTo0LrrookilUrm0rPQjjzzynfvvv3+dCQMAkCsEwAAAfKBLL730hQULFvwupzbCeXnxpS99Kfbff38DBoAPcNBBB8WXvvSlyMvLrVdJCxYs+N2ll176ggkDAJBLBMAAAHwoo0eP/mVVVdXcXFpTYWFhfOUrX4kePXoYMAC8h169esUVV1wRBQUFObWuqqqqOaNHj/6lCQMAkGsEwAAAfCgVFRWNV1111S0NDQ0bcmldJSUlcfPNN8c+++xjyADwLr17946bbropiouLc2pdDQ0NG6666qqv++4vAAC5SAAMAMCHNmHChE3333//tzKZTDqX1lVcXBzXXXdddO/e3ZABYIfu3bvHtddeG61atcqpdWUymfT999//rQkTJmwyZQAAcpEAGACAj2Ts2LGz58+f/9tcW1fr1q3juuuuiw4dOhgyAM1ehw4d4rrrrovWrVvn3Nrmz5//m7Fjx842ZQAAcpUAGACAj+y44477xaZNm17MtXW1a9cubrzxxmjXrp0hA9BstW3bNmf/Pty4ceOLxx13nO/+AgCQ0wTAAAB8ZNXV1emLL774W3V1datzbW0dO3aMG2+8Mdq0aWPQADQ7ZWVlceONN0bHjh1zbm21tbWrL7zwwturq6vTJg0AQC7Lb3tQ9NzZD9LbImrLC3UIAICdWrZsWf327dtfOvbYY0/Ny8trkUtrKykpiaFDh8Zrr70WNTU1hg1As9ChQ4f42te+Fp06dcq5tTU1NW39zne+M/bBBx9cb9IAAOSC4u6NkVe6858JgAEA+NhefPHFzYcccsiyAQMGnBgRqZzaRBcXx5AhQ4TAADQLHTt2jJtuuik6dOiQi8tLjx8//ravfvWrc0waAIBc8X4BsCugAQD4RC688MIZb7zxxm9ycW3t27ePm266KSdPQgHA2zp16pTL4W+88cYbv77wwgufM2kAAJoLATAAAJ/YqFGjfrFhw4aZubi2t0Pgzp07GzQAOadz585x0003Rfv27XNyfRs2bJg5atSo+0waAIDmRAAMAMAnVltbm77sssu+V1dXtzoX19euXbu44YYbomPHjoYNQM7o0KFDXH/99dGuXbtc3Z+s/sIXvvDd2tratGkDANCc+AYwAAC7xJIlS+oj4pVRo0admpeX1yLX1ldcXBxDhw6NuXPnxrZt2wwcgETr0qVL3HjjjTl77XNTU1P1nXfeec0f/vCHdaYNAEAuer9vAAuAAQDYZWbNmlXVo0ePuYceeujoVCqVn2vra9WqVYwYMSIWLVoUlZWVBg5AIu23335x0003RVlZWU6uL51ON/z617++4fbbb3/TtAEAyFUCYAAA9phJkyatPeqoozbsu+++R+fi+goLC2P48OGxbNmy2LBhg4EDkCgDBgyIa6+9Nlq1apWza5w2bdq/XXLJJc+ZNgAAuez9AmDfAAYAYJc77bTTHn/rrbcezNX1FRUVxTXXXBNDhgwxbAASY8iQIXHNNddEUVFRzq5xwYIFvzv99NOfMG0AAJozATAAALvFEUcccc+GDRtm5ur6CgoK4sorr4wjjjjCsAFIwt/LceWVV0ZBQUHOrrG8vPypESNG/LdpAwDQ3AmAAQDYLaqrq9MXXXTRd2pra1fk7GY6Ly8uvvjiOPLIIw0cgKw1atSouPjiiyMvL3dfA23dunXxZz/72e83NDRkTBwAgObON4ABANhtli9fvr2mpuaFY4899uT8/PyWubjGVCoVgwYNikwmE4sWLTJ0ALLK6aefHueee26kUqmcXWN9fX3FDTfccM3UqVOrTBwAgObi/b4BLAAGAGC3evnll7cUFBS8cMQRR4zOy8trkYtrTKVSccABB0SnTp1i7ty5kck4fATA3lVYWBhXXHFFHHPMMTm9zsbGxuo777zzKz/72c9WmzoAAM2JABgAgL1qxowZlb169Xp98ODBJ6dSqfxcXWfPnj2jb9++8fe//z0aGxsNHoC9olWrVnH11VfHwIEDc3qd6XS64be//e2Nt9122wJTBwCguREAAwCw1z3xxBPlw4cPX9OvX79jIyJn76Hs2LFjDBw4MObMmRN1dXUGD8Ae1a5du7jxxhujT58+ub7U9JQpU779xS9+8XlTBwCgOXq/ADhPewAA2FPGjBkz9Y033vh1rq+zZ8+eceONN0bHjh0NHYA9pkuXLnHTTTdF9+7dc36tc+fO/eU555zzF1MHAID/SwAMAMAe9alPfernS5cufTjX19mlS5e49dZb48ADDzR0AHa7gQMHxje/+c3o1KlTzq/1rbfeemjEiBG/MnUAANg5ATAAAHvcsccee8/GjRtfyPV1FhcXx7XXXhsjRowwdAB2m8MPPzyuuuqqaNmyZc6vdePGjc8fffTR95g6AAC8NwEwAAB7XEVFReNxxx339crKyr/l+loLCgrisssui/PPPz9SqZThA7DLpFKpOP/88+PSSy+NgoKCnF/vpk2bXj7ssMNuqaysbDJ9AAB4bwJgAAD2isWLF9efddZZN1dXV7/ZHNZ7/PHHx5e//OUoKioyfAA+sRYtWsSXv/zlOP7445vFequrq98cM2bMN8rLyxtMHwAA3l9+24Oi585+kN4WUVteqEMAAOw2a9asaVi1atWs0aNHH1dQUNA619fbrVu3OOCAA2LevHlRX1/vAQDgYykrK4trrrkmDjrooGax3rq6uvKxY8de89RTT202fQAA+Ifi7o2RV7rznwmAAQDYq+bNm1ezevXqZ04++eTjCwoKSnN9ve3atYuRI0fG8uXLY+PGjR4AAD6S/v37x0033RRdu3ZtFuutr69fd9111335T3/6U4XpAwDA/xAAAwCQ1ebMmbMtlUq9fOSRR56Ul5eX83ckt2jRIkaMGBG1tbWxdOlSDwAAH8rxxx8fX/rSl5rN5wQaGxu33HXXXdf99Kc/XWn6AADwvwmAAQDIejNnzqzs2bPn64MHDz4plUrl5/p6U6lUHHLIIdGqVatYsGBBZDIZDwEAO5WXlxef/exn4/TTT49UKtUs1pxOp7f//ve//+o3vvGN1z0BAADwfwmAAQBIhEmTJpXvs88+8wYOHHhCKpUqaA5r3m+//WLAgAExd+5c3wUG4P8oKyuL6667LoYNG9Zs1pxOp7f/8Y9/vOmqq676qycAAAB2TgAMAEBiTJw4cc3BBx+85MADDzwulUrlNYc1t2/fPoYOHRqLFi2KLVu2eAgAiIiIffbZJ66//vro2bNns1lzJpNpnDBhwm1f/OIXn/cEAADAexMAAwCQKI8++ujy/fff/42DDjrohOZwHXRERHFxcRx11FHR2NgYb731locAoJkbPXp0XHHFFVFSUtJs1pxOpxsefvjhr15yySWzPAEAAPD+BMAAACTO+PHjVw0cOHDpAQcccGxzOQmcSqViwIAB0aVLl3jjjTeiqanJgwDQzBQVFcWll14aJ554YrP53m/EP07+Pv7447dffPHFMz0FAADwwQTAAAAk0iOPPLLs0EMPXbb//vs3mxA4IqJHjx4xZMiQePPNN2Pr1q0eBIBmonv37vEv//IvccABBzSrdWcymaYnnnji9s997nPPeAoAAODDEQADAJBYDz/88NJjjjlmY+/evY+KiGZzFKq0tDSGDx8eq1evjvXr13sQAHLcwIED45prrol27do1t6VnZsyY8YOzzjprqqcAAAA+PAEwAACJdv/99795zDHHVO6zzz5HRDMKgVu0aBGHHXZYtGzZMhYuXBjpdNrDAJBjCgoK4pxzzonzzz8/WrRo0dyWn37uuefuOuWUUyZ4EgAA4KMRAAMAkHi///3v5w8bNmxF3759j2lO10GnUqno27dvDB06NBYvXhxbtmzxMADkiJ49e8YNN9wQgwcPblbf+434x7XPU6ZM+fbpp58+2ZMAAAAfnQAYAICc8OCDDy4ZNmzYin79+jWrEDgionXr1nHEEUdEfX19LF261MMAkGCpVCpOOOGEuOKKK6JNmzbNbv07wt9vnXPOOX/xNAAAwMcjAAYAIGc89NBDS4YNG7a8X79+xza3EDg/Pz8OPvjg6NWrV8yfPz8aGho8EAAJU1JSEpdffnmccMIJkZ+f3+zWn8lkGp944olvffazn53maQAAgI9PAAwAQE556KGHlo4cOXJdnz59RqWa252ZEdG1a9cYNmxYLFu2LCorKz0QAAnRt2/fuO6662K//fZrluvPZDLpp59++rvnnHPO054GAAD4ZATAAADknD/96U+LDj300KX7779/s7sOOiKiuLg4jjzyyCgpKYk333wz0um0hwIgSxUUFMRnP/vZuPDCC6OkpKRZ9iCdTjc88sgjt5x//vnTPREAAPDJCYABAMhJDz/88NId3wQelUqlmt09mqlUKvr06RMHH3xwLFy4MLZt2+ahAMgynTt3jrFjx8bQoUOjGV5aERH/CH+feOKJ2y+88MLnPBEAALBrCIABAMhZDz300JIePXq8NmjQoGPz8vJaNMcetG3bNkaNGhVNTU2xZMkSDwVAFkilUjF69Oi48soro0OHDs22D01NTdt++9vf/stll132oqcCAAB2HQEwAAA5bdKkSeXdu3efM3jw4GYbAufn58eAAQOiV69esWDBgti+fbsHA2Avad26dVx66aVx/PHHR35+frPtQ2NjY/WvfvWrf7nuuute81QAAMCuJQAGACDnTZ48eW1jY+OMI4444uiCgoKS5tqHrl27xqhRo2Lbtm2xcuVKDwbAHpRKpWLUqFExduzY6NWrV7PuRX19/fo77rjjK9/61rcWejIAAGDXEwADANAsPP/881UbNmx45rjjjjuqsLCwrLn2obCwMAYNGhT77bdfLF68OGpraz0cALtZ+/bt44orrogTTzwxCgub9/uU2tralTfffPPVP/nJT1Z7MgAAYPcQAAMA0Gz87W9/27p27doZJ5xwwsjCwsK2zbkXnTp1ipEjR0Z1dbXTwAC70ciRI+Pqq6+OHj16NPte1NTULL/hhhuu/e1vf7vOkwEAALuPABgAgGbltdde2zpv3rynTznllKFFRUWdmnMvCgsL49BDD4399tsvFi1a5DQwwC709qnfk08+udmf+o2I2Lx587yLL774unHjxm30dAAAwO71fgFwat9zYsTOftC4LmLjq610DwCAxOrVq1fhs88++69du3Y9QTciGhoaYurUqTF58uRobGzUEICPqaCgIE499dQYPXq04HeH8vLyp4499tjvrly5skE3AABg9+swrDYKuuz8ZwJgAAByWuvWrfNeeumlm/fdd9+zdeMfVq9eHffff38sWbJEMwA+ov322y8uuugi1z2/w8KFC38/fPjwnzY0NGR0AwAA9gwBMAAAzd7zzz9/8aGHHnp1RKR0IyKTycTMmTPjz3/+c9TV1WkIwAcoKSmJ8847L0aMGBGplL9Kdki//PLL9xx77LEPagUAAOxZ7xcA+wYwAADNwn333Tfn+OOP39yrV6/DQwgcqVQqevfuHcOHD49169ZFRUWFhwTgPRxyyCExduzY6N+/v/B3h0wm0/jMM8/828knnzxONwAAYM97v28AC4ABAGg2fve7370xePDgJf369Ts6lUrl60hEcXFxjBgxInr06BFLly6N2tpaTQHYoUOHDvGFL3whzjzzzCguLtaQHZqammoeeOCBWz73uc9N1w0AANg7BMAAALDDww8/vKygoOC54cOHH1FQUFCqI//QrVu3OO6446K0tDQWL14cTU1NmgI0Wy1btoxzzjknLr300ujevbuGvENtbe2K22677arbbrvtDd0AAIC9RwAMAADv8Oyzz25avHjx0yeddNKQoqKiTjryD3l5edGnT58YOXJkbN26NVatWqUpQLNz+OGHx1e+8pUYMGBA5OXlacg7VFVV/e3CCy+8/oEHHvDdAAAA2MsEwAAA8C7z58+vefbZZ58+44wz+hcXF/fSkf/RsmXLGDJkSOyzzz6xdOnSqKmp0RQg53Xs2DG++MUvximnnBItW7bUkHdZt27dMyeffPI3Xn755W26AQAAe9/7BcCpfc+JETv7QeO6iI2vttI9AAByWmFhYer555//0sEHH3y5bvxfTU1N8fzzz8f48eOjurpaQ4Cc07p16zjzzDPjyCOPdOJ35zJ///vff3rMMcfc39DQkNEOAADIDh2G1UZBl53/TAAMAAARMWnSpM8cc8wxt6RSKdfg7ERNTU1MmTIlpk2bFg0NDRoCJF5hYWGccsopcdJJJ0VRUZGG7EQ6na6fOnXqd88555y/6AYAAGSX9wuAXQENAAAR8Yc//GHhfvvt98aAAQOOysvLkwS8S2FhYQwYMCCGDh0amzZtinXr1mkKkFiDBw+Oq666KoYOHRoFBQUashONjY1Vv//972/5whe+MEs3AAAg+/gGMAAAfAgTJkxYXV1dPf3II4/8VGFhYTsd+b9KS0vjsMMOi/79+8eaNWti8+bNmgIkRu/evePyyy+PU045JUpLSzXkPWzdunXxLbfccs33vve9hboBAADZyTeAAQDgI+jTp0+LJ5988us9evQ4TTfe3/z58+ORRx6JlStXagaQtXr16hXnnHNODBgwQDM+wKpVq5444YQTfrBy5Ur3/QMAQBbzDWAAAPgYnnnmmfOHDx9+fSqVytON95bJZGL27Nkxbty4qKio0BAga3Tu3DnOOuusGDp0aKRSKQ15/z/Lm2bNmvXDk08++THdAACA7OcbwAAA8DH85je/eX3//fd//cADDzzSd4HfWyqViu7du8cxxxwT7dq1i2XLlkV9fb3GAHtN27Zt49xzz42LL744evToIfz9AI2NjdUPPvjgLZ/97Gf/ohsAAJAMvgEMAAAf0/jx41dFxPOHHXbYiMLCwjIdeW95eXnRu3fvOOqoo6KgoCBWrlwZjY2NGgPsMcXFxXHKKafEl770pejbt2/k5bnA4YPU1tau+MEPfnD9LbfcMk83AAAgQf/94xvAAADwyQwePLjVo48++s1u3bqdpBsfTn19fTzzzDMxderU2LZtm4YAu01ZWVmceuqpceSRR0ZRkQsbPqyVK1c+/ulPf/pHixcvdm0DAAAkjG8AAwDALvLkk0+edeSRR96USqVcl/MhCYKB3eXtE7/HHnus4PcjyGQyDbNmzfoP3/sFAIDk8g1gAADYRX7/+98v6NGjx2uHHHLIyPz8fL8x+SEUFBREv3794qijjoq8vLxYtWqVq6GBT6Rly5ZxwgknxBVXXBEHHXRQFBQUaMqH1NDQsOG3v/3t1z7/+c8/oxsAAJBcroAGAIBd7Lzzzut4991339m2bdvBuvHR1NTUxLPPPhvTpk2LLVu2aAjwoZWVlcXxxx8fxxxzTBQXF2vIR1RVVfW3a6+99vZHHnlkg24AAECyuQIaAAB2g06dOhVMmzZtbN++fT8XESkd+WgaGhri+eefjyeffDI2bJBFAO/7522cdNJJccQRR0RhodvKPobMokWL/nTsscf+pLKyskk7AAAg+QTAAACwG/3hD38Ydfrpp99WUFDQRjc+unQ6Ha+++mpMnTo1Vq5cqSHAP/Xq1StOOeWUGDp0aOTl5WnIx9DY2Fg1YcKEOy666KKZugEAALlDAAwAALvZaaed1vbee+/9docOHUbqxse3fPnymDZtWrz88suRTqc1BJqhvLy8OOyww+L444+P3r17a8gnsHHjxue//OUvf3fSpElVugEAALlFAAwAAHtAYWFh6qmnnjpv+PDh16RSKXeUfgIbNmyIGTNmxHPPPRc1NTUaAs1AcXFxjBo1Ko4++ujo2LGjhnwCmUym4ZVXXvl/J5100kMNDQ0ZHQEAgNzzfgFwftuDoufOfpDeFlFb7p0VAAB8WOl0On7zm9+8Xlpa+uLgwYM/VVhYWKYrH09xcXEMGDAgjj322GjTpk2sXbs2amtrNQZyUIcOHeKMM86ISy+9NAYOHBjFxcWa8gnU1tau+slPfnLjxRdf/IybFAAAIHcVd2+MvNKd/8wJYAAA2A1OPPHENvfdd9+tnTp1Olo3PrnGxsb429/+Fs8++2wsWrRIQyAH9OvXL44++ugYNmxYFBQUaMguUFFR8cwXv/jFf5s+ffoW3QAAgNzmCmgAANhLHn744RNGjx799YKCgta6sWusX78+Zs6cGc8//3xUV1drCCRIaWlpHHnkkXHUUUdF586dNWQXaWxs3DJ16tS7PvvZz/5FNwAAoHkQAAMAwF50ySWXdP3+97//rXbt2g3VjV2nsbExXnvttXjuuedi/vz5GgJZbMCAATFq1KgYPHiw0767WFVV1atf//rXv/e73/1urW4AAEDzIQAGAIC9rF27dvlTp0699OCDD740lUrl68iutXz58nj++efj5ZdfjpqaGg2BLFBSUhLDhw+PI444Inr37q0hu1gmk2mcN2/efSeeeOJvq6urfewXAACaGQEwAABkia9//ev73Xjjjf9aWlraXzd2vXQ6HW+++WY899xz8dprr0VjY6OmwB5UUFAQgwcPjlGjRsUBBxwQeXl5mrIbVFdXL/zP//zPf/3BD36wRDcAAKB5EgADAEAWOfjgg1v9+c9/vrZ3795jIiKlI7tHZWVlvPjii/HCCy/EunXrNAR2o65du8bIkSPj8MMPj7Zt22rI7pNZunTpn88888z/t3jx4nrtAACA5ksADAAAWejuu+8eePHFF9/WqlUrd6PuZuXl5fHqq6/GSy+9FOvXr9cQ2AU6d+4cI0aMiGHDhkW3bt00ZDerqalZ9tvf/vbOm266aa5uAAAAAmAAAMhS/fr1K3r44Ycv79+//4WpVMpdqXvA8uXL46WXXoqXX345qqurNQQ+grKyshg+fHiMGDHCd333kEwmk164cOEfzj777F8sXbp0u44AAAARAmAAAMh6P/3pT4d97nOf+2bLli176Mae0dDQEHPnzo2//vWvMXfu3Ni+Xa4CO9OyZcsYNGhQDBs2LA455JAoKCjQlD2ktrZ21R//+Mc7rr322r/rBgAA8E4CYAAASIA+ffq0ePTRR69wGnjPS6fTsXTp0nj11VedDIaIaNu2bQwbNiyGDRsWffr0ibw8fyTtSZlMpuG11177+ZlnnvmnioqKRh0BAADeTQAMAAAJ8uMf//jQCy644JutWrXaRzf2vLdPBs+ePTvmzp0bdXV1mkKzUFZWFoMHD45hw4ZF//79Iz8/X1P2gpqammX333//nTfccINv/QIAAO9JAAwAAAnTrl27/HHjxp37qU996qq8vDwb870kk8nEihUrYu7cuTFnzpxYsWJFZDIZjSEnpFKp6Nu3bwwbNiwGDRoUHTt21JS9qKmpqfbVV1/92ZgxY/5cWVnZpCMAAMD7EQADAEBCffnLX+5x++23f7V9+/aH68bet2XLlnjjjTdizpw5MW/evKivr9cUEqVly5Zx8MEHx6BBg+KQQw6J0tJSTckCGzdufPG73/3uv//iF79YoxsAAMCHIQAGAIAEKywsTE2cOPGMkSNHXlNQUNBaR7JDXV1dvPnmm/HGG2/EG2+8EevXr9cUslKXLl3ioIMOioMOOigOOOCAKCoq0pQs0djYuGXmzJk/PvPMMyc2NDS4XgAAAPjQBMAAAJADjjzyyNY/+9nPrujbt++5EZGnI9mluro6Fi5cGPPnz4958+ZFZWWlprBXtGvXLg455JAYMGBA9O/fP1q39nsjWSj91ltv/fmqq676xaxZs6q1AwAA+KgEwAAAkEN++ctfjhgzZsyNrVq16q0b2SmdTsfKlStj0aJFsXDhwli8eHFs27ZNY9gtSkpKol+/ftG/f//Yf//9o1evXpGX53dEslVNTc3yRx999EdXXnnlK7oBAAB8XAJgAADIMd26dSt8+OGHPzd48ODL8vPzbdyzXCaTiTVr1sTChQtj0aJFsWjRotiyZYvG8LGUlZVF//79/xn6du/ePVKplMZkuaampprXXnvtV2PGjHmgoqKiUUcAAIBPQgAMAAA56rjjjiv7r//6r8tdC508mzdvjuXLl8eKFSti+fLlsXjx4qipqdEY/pfi4uLo169f9O7dO/bZZ5/Yd999o6ysTGMSJJPJpJcsWfLn66677pfTp0/3mx8AAMAuIQAGAIAc99Of/nTIueeee3NpaWlf3UimxsbGWLlyZSxdujSWLVsWy5cvj3Xr1kUmk9GcZiKVSkWXLl1in332iT59+kSfPn2iV69eUVBQoDkJtXXr1sUPPvjgj6699tq/6wYAALArCYABAKAZaNeuXf64cePOGTp06BUFBQWtdST56uvrY+XKlf88KbxixYpYu3ZtpNNpzUm4vLy86Nq1a+yzzz7//KdXr17RsmVLzckBjY2NW/7617/+4pxzznm0srKySUcAAIBdTQAMAADNyIknntjmnnvuuXzfffcdk0qlHB3MMdu3b481a9bEmjVrYu3atbF27dooLy+PDRs2CIazUF5eXnTs2DG6desWXbt2jW7dukW3bt2iR48eUVhYqEE5JpPJNC5ZsuRR1z0DAAC7mwAYAACaoa9+9av7Xnfdddd16NDhCN3IfY2Njf8MhNetWxfr1q2LioqKWLduXWzbtk2DdrPS0tLo3LnzP//p0qVLdO3aNbp27eoK52Ziw4YNM//rv/7rxz/60Y+W6wYAALC7CYABAKAZ++UvfznirLPOuq64uNj3gZupmpqaWL9+/T//qaioiMrKyqisrIxNmzZFY2OjJn2AgoKCaN++fbRr1y7at28fHTt2jC5dukSnTp2ic+fOUVxcrEnN1NatW98aP378PVdcccXLugEAAOwpAmAAAGjm2rVrl//ggw+eOWLEiCsLCwvb6gjvtHnz5n+GwZs2bYrKysqorq6OLVu2xJYtW6K6ujqqq6sjk8nk3NpTqVS0bt06WrduHWVlZdGmTZsoLS39X2Fvu3btok2bNh4U/peGhobKl1566efnnHPO+OrqavevAwAAe5QAGAAAiIiIoUOHFt97770XHHjggRfk5+c7ssiHlk6n/xkEV1dXR01Nzfv+k8lkora2NtLpdNTX10dTU1PU1dXt0u8U5+XlRcuWLSM/Pz+KiooiLy8vWrVqFalUKoqLi3f6T0lJSbRq1eqfgW9paWnk5eUZMB9aU1NTzYIFC/745S9/+Y+zZ8+u0REAAGBvEAADAAD/y2mnndb2rrvuurRPnz5n5+XlFeoIe9LbgfDbtm/f/r7XUBcUFESLFi3++b/fDnxhT8pkMg1LliwZd8stt/xq0qRJVToCAADsTQJgAABgp0477bS2d95554X777//5wTBAP9XJpNpWLhw4QO33nrrHwS/AABAtni/ADi/7UHRc2c/SG+LqC33/gcAAHLZokWL6u69995X0un0swcddFCnkpKS3roC8A8VFRUz/7//7/+77aKLLpq6aNGiOh0BAACyRXH3xsgr3fnPBMAAAEDMnDmz8u67736qqalpWr9+/Ypbt27dN5VKpXQGaG4ymUx6zZo1U+65555/Peeccx6cOXNmpa4AAADZRgAMAAB8KDNnzqz88Y9//Gw6nZ4uCAaak7eD37vvvvtfzz///McEvwAAQDYTAAMAAB+JIBhoLgS/AABAEgmAAQCAj+XtILisrOyFvn37diwuLu4VEYJgIBdkKioqnrv33nu/PWbMmEcEvwAAQJK8XwCc2vecGLGzHzSui9j4aivdAwAA/unqq6/u8ZWvfOX8Pn36nJWXl9dCR4CkSafT9UuXLh3/X//1Xw/84he/WKMjAABAEnUYVhsFXXb+MwEwAADwkZ1xxhntb7/99rMPPPDA8/Pz81vrCJDtmpqaqhcsWPDgd77znUcmTpzotC8AAJBoAmAAAGC3GD58eMkPf/jDzwwePPjioqKijjoCZJv6+voNr7322u9vvPHGx2fPnl2jIwAAQC4QAAMAALvV0KFDi++5556zDjnkkPOKioq66giwt9XV1a19/fXXH7z++uvHC34BAIBcIwAGAAD2iFatWuXdc889w0455ZTzO3bseJSOAHtYZsOGDbOmTJny4PXXX/9qbW1tWksAAIBcJAAGAAD2uH/913/tf/7555/dq1ev0/Ly8lroCLC7pNPp+pUrV05+4IEHHvnOd76zSEcAAIBcJwAGAAD2mjPOOKP97bfffvYBBxzw2YKCgjY6AuwqjY2NVW+++eafv/e97z06YcKETToCAAA0FwJgAABgrxs+fHjJ97///dGDBg0aU1paur+OAB9XdXX1wtdee+3Rr371q1Nfe+21Wh0BAACaGwEwAACQVb761a/ue8EFF3y6b9++ZxUUFLTWEeCDNDY2bnnrrbfG/+EPf5j4ox/9aLmOAAAAzZkAGAAAyEpDhw4t/sEPfnDy4MGDz27dunV/HQHerbq6+s2XX375weuuu+7ppUuXbtcRAAAAATAAAJDlCgsLU3ffffeQ0aNHn9G1a9fj8vLyinQFmq90Ol1XXl4+bcqUKROuvfbav+sIAADA/yYABgAAEqNPnz4t/v3f/33UyJEjz2rfvv2nIiKlK9AsZDZt2vTXF1544bGvfe1rzzntCwAA8N4EwAAAQCJddNFFXa6++uqTDzzwwLNbtmzZTUcg99TV1a1ZsGDBuJ/+9KdP3n///et0BAAA4IMJgAEAgETr1q1b4d13333k4YcffmqHDh2OyMvLK9QVSK50Ot2wcePGWbNmzZp8/fXXz6qoqGjUFQAAgA9PAAwAAOSMo48+uvWtt956/CGHHHJKu3btBkdEnq5AIqQrKytfmzdv3uQ777xz+owZM6q1BAAA4OMRAAMAADnpuOOOK/vGN75x/CGHHHJa27ZtB4bvBUO2yVRVVc2dN2/epO9///vTpk+fvkVLAAAAPjkBMAAAkPNuu+22vmedddZJffr0Oa5Vq1a9dQT2ntra2uXLly+f/uijjz51xx13vKUjAAAAu5YAGAAAaFa+9KUvdbv44ouP7t+//wlOBsMekamqqpq7cOHCv/z+97+fcd9995VrCQAAwO4jAAYAAJqtSy65pOtll112jDAYdrl0VVXVvIULF/7lV7/61bO/+93v1moJAADAniEABgAAiIirr766x/nnnz9q//33P7JNmzZDUqlUga7Ah5fJZBoqKyv/vnjx4uf+9Kc/zbr33ntX6woAAMCeJwAGAAB4l379+hV97WtfGzRy5MhRPXv2PLaoqKizrsD/VV9fv37VqlXPvPDCC8/9+7//+5zFixfX6woAAMDeJQAGAAB4H61bt8678847Bx599NFHde/efURpaen+4apomq/M1q1bF69Zs+bF5557btY3v/nNOdXV1WltAQAAyB4CYAAAgI9g8ODBrcaOHXvI8OHDD+vevfvw1q1bHxACYXJXprq6+s01a9a88sorr7z8k5/8ZN5rr71Wqy0AAADZSwAMAADwCVx//fX7nHHGGYf169dvePv27Yfm5+e31hWSrLGxsXrjxo2vvvXWWy+PHz/+lR//+McrdQUAACA5BMAAAAC70Je//OUe55xzzvA+ffoM7tix45CioqKuukI2q6+vX7t27doXFy9ePGfixImv3Xvvvat1BQAAILkEwAAAALvRl7/85R6f+cxnBvfr129Qly5dDm/ZsqVAmL2qrq5u7bp16wS+AAAAOUoADAAAsIe0atUq75prrtnn2GOPPXi//fY7uH379oeUlpb2TaVS+brDbpKuqalZtnHjxnlvvfXW3GeffXbef/3Xfy2vra1Naw0AAEBuEgADAADsRQceeGDLq6+++oAhQ4Yc3LNnz4Pbtm17sGuj+biampqqq6qqXi8vL583Z86ceb/85S/nvfjii1t1BgAAoPkQAAMAAGSZoUOHFn/xi1/cf9CgQQf26NHjwHbt2h3YqlWr3qlUKk932CFdU1OzvLKycsHq1asXzJkzZ8Gf//znJTNmzKjWGgAAgOZNAAwAAJAAxx13XNkFF1xw4MEHH3xA165dDywtLd23pKRkn1QqVag7uS2TyTRs27ZtRXV19dJ169YtfOONNxZOmDBh4YQJEzbpDgAAAO8mAAYAAEiw8847r+OJJ57Yp3///vt16dKlT5s2bfZr3bp1v/z8/GLdSZampqaa6urqxZs3b16ybt26pQsXLlzy9NNPL33ooYc26A4AAAAflgAYAAAgx7Rr1y7/kksu6TFkyJCe++67b89OnTr1Kisr61VcXNyzZcuW3VKpVL4u7R2ZTKaprq6uvKamZtWWLVtWVlRUrFy6dOnK2bNnr7r//vvXVFZWNukSAAAAn4QAGAAAoBnp1KlTwec+97luQ4cO7bnPPvv0aNeuXafWrVt3Li4u7tqyZcvORUVFnfLy8lro1MeTTqe319fXr6+rq6uoqalZW11dvb6ysnL9ihUrVr/66qurHnzwwbUVFRWNOgUAAMDuIgAGAADgfznjjDPaH3bYYZ369OnTuUuXLp3Kysral5SUtC0uLu5YVFTUrqioqG2LFi065OfnlzaXnjQ1NW3dvn37xvr6+qr6+vrKmpqaDdu2bavasmXLpnXr1lUsXbp0/Ysvvrh+4sSJlZ4gAAAA9iYBMAAAAB9Lr169CkeNGtXuoIMOatexY8ey9u3bl7Zp06Z1SUlJWXFxcetWrVq1btGiRVlRUVHrwsLC1hGRX1hYWBoR+QUFBSV5eXkFeXl5u/0/LtPpdG06nW5sbGzcFhFNDQ0NW3f83+r6+vrq7du3b6mtra2uqamp3rZtW/XmzZurN23aVL1hw4YtCxYsqJo1a1bl0qVLt5s4AAAASSAABgAAYK/q169fUffu3Vvss88+xSUlJQVv//8LCwtT3bp1+8BTxuXl5VsbGhoyb//vbdu2Na5YsaJmzZo12xcvXlyvwwAAADQn7xcAF2gPAAAAu9vixYvrdwS11boBAAAAu0+eFgAAAAAAAADkBgEwAAAAAAAAQI4QAAMAAAAAAADkCAEwAAAAAAAAQI4QAAMAAAAAAADkCAEwAAAAAAAAQI4QAAMAAAAAAADkCAEwAAAAAAAAQI4QAAMAAAAAAADkCAEwAAAAAAAAQI4QAAMAAAAAAADkCAEwAAAAAAAAQI4QAAMAAAAAAADkCAEwAAAAAAAAQI4o0AIAAAAAAACA5GhoLIyCxoaIiEilIpNXGE1v/0wADAAAAAAAAJAghQUN/0x6MxGppvT/5L6ugAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAAYAAAAAAADIEQJgAAAAAAAAgBwhAIb/v5272ZHiusM4/FZ1NUkz9sQwOF4EyZJtpJCwysa5jSy4n1xPEqRIuQFvvfGSgIwBOzGRQAQERnx0d1UW0cgWGvKxsMGvnmfVdc7/1OJsf+oCAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoIQADAAAAAAAAlBCAAQAAAAAAAEoIwAAAAAAAAAAlBGAAAAAAAACAEgIwAAAAAAAAQAkBGAAAAAAAAKCEAAwAAAAAAABQQgAGAAAAAAAAKCEAAwAAAAAAAJQQgAEAAAAAAABKCMAAAAAAAAAAJQRgAAAAAAAAgBICMAAAAAAAAEAJARgAAAAAAACghAAMAAAAAAAAUEIABgAAAAAAACghAAMAAAAAAACUEIABAAAAAAAASgjAAAAAAAAAACUEYAAAAAAAAIASAjAAAAAAAABACQEYAAAAAAAAoIQADAAAAAAAAFBCAAYAAAAAAAAoMY3JP//9K8My551lzpAk293a7QAAAAAAAAD8iIw3r+SL7TpPxuSt4/ibJJuz20QDBgAAAAAAAHhzrJPp6NvHYcyyjLl7dJTPbl/Jp6sPLufSsM+5ec7q5YOrF0OeP/SVaAAAAAAAAIA3weH7u6zfm79dWDIMSw6225w785vsx3XyzasOby5ssz69c4sAAAAAAAAAr9n69C6bC9sT93a7rKdnORin5Otxynzi1JQcfiwCAwAAAAAAALxO69O7HH68TaaT98cp85R8vbp3Nfszv8q0LHn7xMF1sjk/ZzUPmZ/MmWefhAYAAAAAAAD4oayPdjn7223Gn7x6ZrXPnetX8mBKkpv3cufDd/Pufn5FL56SzcVtNheT3dNt8tQlAwAAAAAAAHyv1sm0ySv/9XtsNWZ3I/lHkgzHi7/4XY7WYz5yiwAAAAAAAAA/Ivtcv/3nPEyS1fHa42t5+vNLyX7JoRsCAAAAAAAAePPt1/nbV3/KvePn1Xc371/NYxEYAAAAAAAA4M0yTHk2rvNo2WdzvHZqzN9v/SF3vju3evng/at5fPDLPDu1yuGyZHSVAAAAAAAAAK/XOGe4ueSvZ4e8M8xZbVe5ceuPufvy3Oqkw4+v5emDX+fuuTlLhhwsEYIBAAAAAAAAXpclGR8OuXP0TR4cPM/9z/+SRyfNDf/1TZezOp/87KdjzizJZkhO7edMy/w/nAUAAAAAAADg/zaMWcZkP8/ZLsmLacr2/MV8+cnvs/tP5/4FmLjAq1ifcioAAAAASUVORK5CYII=";function H0($,q,Q){if(typeof $==="string"&&!isNaN(Number($)))$=Number($);if(typeof $==="number"&&$<100)return v0($);if(typeof $==="number"&&$>=100)return $;if(typeof $==="string"&&$.includes("%")){if(q&&q==="X")return Math.round(parseFloat($)/100*Q.width);if(q&&q==="Y")return Math.round(parseFloat($)/100*Q.height);return Math.round(parseFloat($)/100*Q.width)}return 0}function Y5($){return $.replace(/[xy]/g,function(q){let Q=Math.random()*16|0;return(q==="x"?Q:Q&3|8).toString(16)})}function k0($){if(typeof $>"u"||$==null)return"";return $.toString().replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function v0($){if(typeof $==="number"&&$>100)return $;if(typeof $==="string")$=Number($.replace(/in*/gi,""));return Math.round(L0*$)}function Y0($){let q=Number($)||0;return isNaN(q)?0:Math.round(q*w8)}function S1($){return $=$||0,Math.round(($>360?$-360:$)*60000)}function j7($){let q=$.toString(16);return q.length===1?"0"+q:q}function g7($,q,Q){return(j7($)+j7(q)+j7(Q)).toUpperCase()}function R0($,q){let Q=($||"").replace("#","");if(!C7.test(Q)&&Q!==G2.background1&&Q!==G2.background2&&Q!==G2.text1&&Q!==G2.text2&&Q!==G2.accent1&&Q!==G2.accent2&&Q!==G2.accent3&&Q!==G2.accent4&&Q!==G2.accent5&&Q!==G2.accent6)console.warn(`"${Q}" is not a valid scheme color or hex RGB! "${Q2}" used instead. Only provide 6-digit RGB or 'pptx.SchemeColor' values!`),Q=Q2;let K=C7.test(Q)?"srgbClr":"schemeClr",J='val="'+(C7.test(Q)?Q.toUpperCase():Q)+'"';return q?`${q}`:``}function fB($,q){let Q="",K=Object.assign(Object.assign({},q),$),J=Math.round(K.size*w8),Z=K.color,G=Math.round(K.opacity*1e5);return Q+=``,Q+=R0(Z,``),Q+="",Q}function B2($){let q="solid",Q="",K="",J="";if($){if(typeof $==="string")Q=$;else{if($.type)q=$.type;if($.color)Q=$.color;if($.alpha)K+=``;if($.transparency)K+=``}switch(q){case"solid":J+=`${R0(Q,K)}`;break;default:J+="";break}}return J}function a2($){return $._rels.length+$._relsChart.length+$._relsMedia.length+1}function c7($){if(!$||typeof $!=="object")return;if($.type!=="outer"&&$.type!=="inner"&&$.type!=="none")console.warn("Warning: shadow.type options are `outer`, `inner` or `none`."),$.type="outer";if($.angle){if(isNaN(Number($.angle))||$.angle<0||$.angle>359)console.warn("Warning: shadow.angle can only be 0-359"),$.angle=270;$.angle=Math.round(Number($.angle))}if($.opacity){if(isNaN(Number($.opacity))||$.opacity<0||$.opacity>1)console.warn("Warning: shadow.opacity can only be 0-1"),$.opacity=0.75;$.opacity=Number($.opacity)}if($.color){if($.color.startsWith("#"))console.warn('Warning: shadow.color should not include hash (#) character, , e.g. "FF0000"'),$.color=$.color.replace("#","")}return $}function RB($,q,Q){var K,J;let Z=2.3+(((K=$.options)===null||K===void 0?void 0:K.autoPageCharWeight)?$.options.autoPageCharWeight:0),G=Math.floor(q/w8*L0)/((((J=$.options)===null||J===void 0?void 0:J.fontSize)?$.options.fontSize:k2)/Z),W=[],B=[],V=[],U=[];if($.text&&$.text.toString().trim().length===0)B.push({_type:D0.tablecell,text:" "});else if(typeof $.text==="number"||typeof $.text==="string")B.push({_type:D0.tablecell,text:($.text||"").toString().trim()});else if(Array.isArray($.text))B=$.text;let w=[];return B.forEach((F)=>{var M;if(typeof F.text==="string"){if(F.text.split(` `).length>1)F.text.split(` -`).forEach((v)=>{N.push({_type:D0.tablecell,text:v,options:Object.assign(Object.assign({},F.options),{breakLine:!0})})});else N.push({_type:D0.tablecell,text:F.text.trim(),options:F.options});if((M=F.options)===null||M===void 0?void 0:M.breakLine)U.push(N),N=[]}if(N.length>0)U.push(N),N=[]}),U.forEach((F)=>{F.forEach((M)=>{let v=[],y=String(M.text).split(" ");y.forEach((D,z)=>{let Y=Object.assign({},M.options);if(Y===null||Y===void 0?void 0:Y.breakLine)Y.breakLine=z+1===y.length;v.push({_type:D0.tablecell,text:D+(z+1{let M=[],v="";if(F.forEach((x)=>{if(v.length+x.text.length>G)B.push(M),M=[],v="";M.push(x),v+=x.text.toString()}),M.length>0)B.push(M)}),B}function gJ(Q=[],$={},q,K){let J=P8,Z=H0*1,G=H0*1,B=0,W=0,U=[],V=v0($.x,"X",q),N=v0($.y,"Y",q),F=v0($.w,"X",q),M=v0($.h,"Y",q),v=F;function x(){let D=0;if(U.length===0)D=N||C0(J[0]);if(U.length>0)D=C0($.autoPageSlideStartY||$.newSlideStartY||J[0]);if(G=(M||q.height)-D-C0(J[2]),U.length>1){if(typeof $.autoPageSlideStartY==="number")G=(M||q.height)-C0($.autoPageSlideStartY+J[2]);else if(typeof $.newSlideStartY==="number")G=(M||q.height)-C0($.newSlideStartY+J[2]);else if(N){if(G=(M||q.height)-C0((N/H0{if(!z)z={_type:D0.tablecell};let Y=z.options||null;W+=Number((Y===null||Y===void 0?void 0:Y.colspan)?Y.colspan:1)}),$.verbose)console.log(`| numCols ......................................... = ${W}`);if(!F&&$.colW){if(v=Array.isArray($.colW)?$.colW.reduce((D,z)=>D+z)*H0:$.colW*W||0,$.verbose)console.log(`| tableCalcW ...................................... = ${v/H0}`)}if(Z=v||C0((V?V/H0:J[1])+J[3]),$.verbose)console.log(`| emuSlideTabW .................................... = ${(Z/H0).toFixed(1)}`);if(!$.colW||!Array.isArray($.colW))if($.colW&&!isNaN(Number($.colW))){let D=[];(Q[0]||[]).forEach(()=>D.push($.colW)),$.colW=[],D.forEach((Y)=>{if(Array.isArray($.colW))$.colW.push(Y)})}else{$.colW=[];for(let D=0;D{let Y=[],H=0,R=0,c=[];if(D.forEach((g)=>{var O,h,f,A;if(c.push({_type:D0.tablecell,text:[],options:g.options}),g.options.margin&&g.options.margin[0]>=1){if(((O=g.options)===null||O===void 0?void 0:O.margin)&&g.options.margin[0]&&Y0(g.options.margin[0])>H)H=Y0(g.options.margin[0]);else if(($===null||$===void 0?void 0:$.margin)&&$.margin[0]&&Y0($.margin[0])>H)H=Y0($.margin[0]);if(((h=g.options)===null||h===void 0?void 0:h.margin)&&g.options.margin[2]&&Y0(g.options.margin[2])>R)R=Y0(g.options.margin[2]);else if(($===null||$===void 0?void 0:$.margin)&&$.margin[2]&&Y0($.margin[2])>R)R=Y0($.margin[2])}else{if(((f=g.options)===null||f===void 0?void 0:f.margin)&&g.options.margin[0]&&C0(g.options.margin[0])>H)H=C0(g.options.margin[0]);else if(($===null||$===void 0?void 0:$.margin)&&$.margin[0]&&C0($.margin[0])>H)H=C0($.margin[0]);if(((A=g.options)===null||A===void 0?void 0:A.margin)&&g.options.margin[2]&&C0(g.options.margin[2])>R)R=C0(g.options.margin[2]);else if(($===null||$===void 0?void 0:$.margin)&&$.margin[2]&&C0($.margin[2])>R)R=C0($.margin[2])}}),x(),B+=H+R,$.verbose&&z===0)console.log(`| SLIDE [${U.length}]: emuSlideTabH ...... = ${(G/H0).toFixed(1)} `);if(D.forEach((g,O)=>{var h;let f={_type:D0.tablecell,_lines:null,_lineHeight:C0((((h=g.options)===null||h===void 0?void 0:h.fontSize)?g.options.fontSize:$.fontSize?$.fontSize:f1)*(sW+($.autoPageLineWeight?$.autoPageLineWeight:0))/100),text:[],options:g.options};if(f.options.rowspan)f._lineHeight=0;f.options.autoPageCharWeight=$.autoPageCharWeight?$.autoPageCharWeight:null;let A=$.colW[O];if(g.options.colspan&&Array.isArray($.colW))A=$.colW.filter((I,n)=>n>=O&&nI+n);f._lines=Jz(g,A),Y.push(f)}),$.verbose)console.log(` -| SLIDE [${U.length}]: ROW [${z}]: START...`);let m=0,$0=0,_=!1;while(!_){let g=Y[m],O=c[m];if(Y.forEach((A)=>{if(A._lineHeight>=$0)$0=A._lineHeight}),B+$0>G){if($.verbose)console.log(` -|-----------------------------------------------------------------------|`),console.log(`|-- NEW SLIDE CREATED (currTabH+currLineH > maxH) => ${(B/H0).toFixed(2)} + ${(g._lineHeight/H0).toFixed(2)} > ${G/H0}`),console.log(`|-----------------------------------------------------------------------| +`).forEach((k)=>{w.push({_type:D0.tablecell,text:k,options:Object.assign(Object.assign({},F.options),{breakLine:!0})})});else w.push({_type:D0.tablecell,text:F.text.trim(),options:F.options});if((M=F.options)===null||M===void 0?void 0:M.breakLine)V.push(w),w=[]}if(w.length>0)V.push(w),w=[]}),V.forEach((F)=>{F.forEach((M)=>{let k=[],L=String(M.text).split(" ");L.forEach((D,z)=>{let N=Object.assign({},M.options);if(N===null||N===void 0?void 0:N.breakLine)N.breakLine=z+1===L.length;k.push({_type:D0.tablecell,text:D+(z+1{let M=[],k="";if(F.forEach((f)=>{if(k.length+f.text.length>G)W.push(M),M=[],k="";M.push(f),k+=f.text.toString()}),M.length>0)W.push(M)}),W}function GJ($=[],q={},Q,K){let J=M8,Z=L0*1,G=L0*1,W=0,B=0,V=[],U=H0(q.x,"X",Q),w=H0(q.y,"Y",Q),F=H0(q.w,"X",Q),M=H0(q.h,"Y",Q),k=F;function f(){let D=0;if(V.length===0)D=w||v0(J[0]);if(V.length>0)D=v0(q.autoPageSlideStartY||q.newSlideStartY||J[0]);if(G=(M||Q.height)-D-v0(J[2]),V.length>1){if(typeof q.autoPageSlideStartY==="number")G=(M||Q.height)-v0(q.autoPageSlideStartY+J[2]);else if(typeof q.newSlideStartY==="number")G=(M||Q.height)-v0(q.newSlideStartY+J[2]);else if(w){if(G=(M||Q.height)-v0((w/L0{if(!z)z={_type:D0.tablecell};let N=z.options||null;B+=Number((N===null||N===void 0?void 0:N.colspan)?N.colspan:1)}),q.verbose)console.log(`| numCols ......................................... = ${B}`);if(!F&&q.colW){if(k=Array.isArray(q.colW)?q.colW.reduce((D,z)=>D+z)*L0:q.colW*B||0,q.verbose)console.log(`| tableCalcW ...................................... = ${k/L0}`)}if(Z=k||v0((U?U/L0:J[1])+J[3]),q.verbose)console.log(`| emuSlideTabW .................................... = ${(Z/L0).toFixed(1)}`);if(!q.colW||!Array.isArray(q.colW))if(q.colW&&!isNaN(Number(q.colW))){let D=[];($[0]||[]).forEach(()=>D.push(q.colW)),q.colW=[],D.forEach((N)=>{if(Array.isArray(q.colW))q.colW.push(N)})}else{q.colW=[];for(let D=0;D{let N=[],H=0,v=0,j=[];if(D.forEach((X)=>{var P,g,c,h;if(j.push({_type:D0.tablecell,text:[],options:X.options}),X.options.margin&&X.options.margin[0]>=1){if(((P=X.options)===null||P===void 0?void 0:P.margin)&&X.options.margin[0]&&Y0(X.options.margin[0])>H)H=Y0(X.options.margin[0]);else if((q===null||q===void 0?void 0:q.margin)&&q.margin[0]&&Y0(q.margin[0])>H)H=Y0(q.margin[0]);if(((g=X.options)===null||g===void 0?void 0:g.margin)&&X.options.margin[2]&&Y0(X.options.margin[2])>v)v=Y0(X.options.margin[2]);else if((q===null||q===void 0?void 0:q.margin)&&q.margin[2]&&Y0(q.margin[2])>v)v=Y0(q.margin[2])}else{if(((c=X.options)===null||c===void 0?void 0:c.margin)&&X.options.margin[0]&&v0(X.options.margin[0])>H)H=v0(X.options.margin[0]);else if((q===null||q===void 0?void 0:q.margin)&&q.margin[0]&&v0(q.margin[0])>H)H=v0(q.margin[0]);if(((h=X.options)===null||h===void 0?void 0:h.margin)&&X.options.margin[2]&&v0(X.options.margin[2])>v)v=v0(X.options.margin[2]);else if((q===null||q===void 0?void 0:q.margin)&&q.margin[2]&&v0(q.margin[2])>v)v=v0(q.margin[2])}}),f(),W+=H+v,q.verbose&&z===0)console.log(`| SLIDE [${V.length}]: emuSlideTabH ...... = ${(G/L0).toFixed(1)} `);if(D.forEach((X,P)=>{var g;let c={_type:D0.tablecell,_lines:null,_lineHeight:v0((((g=X.options)===null||g===void 0?void 0:g.fontSize)?X.options.fontSize:q.fontSize?q.fontSize:k2)*(YB+(q.autoPageLineWeight?q.autoPageLineWeight:0))/100),text:[],options:X.options};if(c.options.rowspan)c._lineHeight=0;c.options.autoPageCharWeight=q.autoPageCharWeight?q.autoPageCharWeight:null;let h=q.colW[P];if(X.options.colspan&&Array.isArray(q.colW))h=q.colW.filter((x,l)=>l>=P&&lx+l);c._lines=RB(X,h),N.push(c)}),q.verbose)console.log(` +| SLIDE [${V.length}]: ROW [${z}]: START...`);let n=0,d=0,_=!1;while(!_){let X=N[n],P=j[n];if(N.forEach((h)=>{if(h._lineHeight>=d)d=h._lineHeight}),W+d>G){if(q.verbose)console.log(` +|-----------------------------------------------------------------------|`),console.log(`|-- NEW SLIDE CREATED (currTabH+currLineH > maxH) => ${(W/L0).toFixed(2)} + ${(X._lineHeight/L0).toFixed(2)} > ${G/L0}`),console.log(`|-----------------------------------------------------------------------| -`);if(c.length>0&&c.map((I)=>I.text.length).reduce((I,n)=>I+n)>0)y.rows.push(c);if(U.push(y),y={rows:[]},c=[],D.forEach((I)=>c.push({_type:D0.tablecell,text:[],options:I.options})),x(),B+=H+R,$.verbose)console.log(`| SLIDE [${U.length}]: emuSlideTabH ...... = ${(G/H0).toFixed(1)} `);if(B=0,($.addHeaderToEach||$.autoPageRepeatHeader)&&$._arrObjTabHeadRows)$._arrObjTabHeadRows.forEach((I)=>{let n=[],i=0;I.forEach((K0)=>{if(n.push(K0),K0._lineHeight>i)i=K0._lineHeight}),y.rows.push(n),B+=i});O=c[m]}let h=g._lines.shift();if(Array.isArray(O.text)){if(h)O.text=O.text.concat(h);else if(O.text.length===0)O.text=O.text.concat({_type:D0.tablecell,text:""})}if(m===Y.length-1)B+=$0;if(m=mA._lines.length).reduce((A,I)=>A+I)===0)_=!0}if(c.length>0)y.rows.push(c);if($.verbose)console.log(`- SLIDE [${U.length}]: ROW [${z}]: ...COMPLETE ...... emuTabCurrH = ${(B/H0).toFixed(2)} ( emuSlideTabH = ${(G/H0).toFixed(2)} )`)}),U.push(y),$.verbose)console.log(` -|================================================|`),console.log(`| FINAL: tableRowSlides.length = ${U.length}`),U.forEach((D)=>console.log(D)),console.log(`|================================================| +`);if(j.length>0&&j.map((x)=>x.text.length).reduce((x,l)=>x+l)>0)L.rows.push(j);if(V.push(L),L={rows:[]},j=[],D.forEach((x)=>j.push({_type:D0.tablecell,text:[],options:x.options})),f(),W+=H+v,q.verbose)console.log(`| SLIDE [${V.length}]: emuSlideTabH ...... = ${(G/L0).toFixed(1)} `);if(W=0,(q.addHeaderToEach||q.autoPageRepeatHeader)&&q._arrObjTabHeadRows)q._arrObjTabHeadRows.forEach((x)=>{let l=[],$0=0;x.forEach((Z0)=>{if(l.push(Z0),Z0._lineHeight>$0)$0=Z0._lineHeight}),L.rows.push(l),W+=$0});P=j[n]}let g=X._lines.shift();if(Array.isArray(P.text)){if(g)P.text=P.text.concat(g);else if(P.text.length===0)P.text=P.text.concat({_type:D0.tablecell,text:""})}if(n===N.length-1)W+=d;if(n=nh._lines.length).reduce((h,x)=>h+x)===0)_=!0}if(j.length>0)L.rows.push(j);if(q.verbose)console.log(`- SLIDE [${V.length}]: ROW [${z}]: ...COMPLETE ...... emuTabCurrH = ${(W/L0).toFixed(2)} ( emuSlideTabH = ${(G/L0).toFixed(2)} )`)}),V.push(L),q.verbose)console.log(` +|================================================|`),console.log(`| FINAL: tableRowSlides.length = ${V.length}`),V.forEach((D)=>console.log(D)),console.log(`|================================================| -`);return U}function Uz(Q,$,q={},K){let J=q||{};J.slideMargin=J.slideMargin||J.slideMargin===0?J.slideMargin:0.5;let Z=J.w||Q.presLayout.width,G=[],B=[],W=[],U=[],V=[],N=[0.5,0.5,0.5,0.5],F=0;if(!document.getElementById($))throw new Error('tableToSlides: Table ID "'+$+'" does not exist!');if(K===null||K===void 0?void 0:K._margin){if(Array.isArray(K._margin))N=K._margin;else if(!isNaN(K._margin))N=[K._margin,K._margin,K._margin,K._margin];J.slideMargin=N}else if(J===null||J===void 0?void 0:J.slideMargin){if(Array.isArray(J.slideMargin))N=J.slideMargin;else if(!isNaN(J.slideMargin))N=[J.slideMargin,J.slideMargin,J.slideMargin,J.slideMargin]}if(Z=(J.w?C0(J.w):Q.presLayout.width)-C0(N[1]+N[3]),J.verbose)console.log("[[VERBOSE MODE]]"),console.log("|-- `tableToSlides` ----------------------------------------------------|"),console.log(`| tableProps.h .................................... = ${J.h}`),console.log(`| tableProps.w .................................... = ${J.w}`),console.log(`| pptx.presLayout.width ........................... = ${(Q.presLayout.width/H0).toFixed(1)}`),console.log(`| pptx.presLayout.height .......................... = ${(Q.presLayout.height/H0).toFixed(1)}`),console.log(`| emuSlideTabW .................................... = ${(Z/H0).toFixed(1)}`);let M=document.querySelectorAll(`#${$} tr:first-child th`);if(M.length===0)M=document.querySelectorAll(`#${$} tr:first-child td`);if(M.forEach((x)=>{let y=x;if(y.getAttribute("colspan"))for(let D=0;D{F+=x}),V.forEach((x,y)=>{let D=Number((Number(Z)*(x/F*100)/100/H0).toFixed(2)),z=0,Y=document.querySelector(`#${$} thead tr:first-child th:nth-child(${y+1})`);if(Y)z=Number(Y.getAttribute("data-pptx-min-width"));let H=document.querySelector(`#${$} thead tr:first-child th:nth-child(${y+1})`);if(H)z=Number(H.getAttribute("data-pptx-width"));U.push(z>D?z:D)}),J.verbose)console.log(`| arrColW ......................................... = [${U.join(", ")}]`);["thead","tbody","tfoot"].forEach((x)=>{document.querySelectorAll(`#${$} ${x} tr`).forEach((y)=>{let D=y,z=[];switch(Array.from(D.cells).forEach((Y)=>{let H=window.getComputedStyle(Y).getPropertyValue("color").replace(/\s+/gi,"").replace("rgba(","").replace("rgb(","").replace(")","").split(","),R=window.getComputedStyle(Y).getPropertyValue("background-color").replace(/\s+/gi,"").replace("rgba(","").replace("rgb(","").replace(")","").split(",");if(window.getComputedStyle(Y).getPropertyValue("background-color")==="rgba(0, 0, 0, 0)"||window.getComputedStyle(Y).getPropertyValue("transparent"))R=["255","255","255"];let c={align:null,bold:window.getComputedStyle(Y).getPropertyValue("font-weight")==="bold"||Number(window.getComputedStyle(Y).getPropertyValue("font-weight"))>=500,border:null,color:U9(Number(H[0]),Number(H[1]),Number(H[2])),fill:{color:U9(Number(R[0]),Number(R[1]),Number(R[2]))},fontFace:(window.getComputedStyle(Y).getPropertyValue("font-family")||"").split(",")[0].replace(/"/g,"").replace("inherit","").replace("initial","")||null,fontSize:Number(window.getComputedStyle(Y).getPropertyValue("font-size").replace(/[a-z]/gi,"")),margin:null,colspan:Number(Y.getAttribute("colspan"))||null,rowspan:Number(Y.getAttribute("rowspan"))||null,valign:null};if(["left","center","right","start","end"].includes(window.getComputedStyle(Y).getPropertyValue("text-align"))){let m=window.getComputedStyle(Y).getPropertyValue("text-align").replace("start","left").replace("end","right");c.align=m==="center"?"center":m==="left"?"left":m==="right"?"right":null}if(["top","middle","bottom"].includes(window.getComputedStyle(Y).getPropertyValue("vertical-align"))){let m=window.getComputedStyle(Y).getPropertyValue("vertical-align");c.valign=m==="top"?"top":m==="middle"?"middle":m==="bottom"?"bottom":null}if(window.getComputedStyle(Y).getPropertyValue("padding-left"))c.margin=[0,0,0,0],["padding-top","padding-right","padding-bottom","padding-left"].forEach(($0,_)=>{c.margin[_]=Math.round(Number(window.getComputedStyle(Y).getPropertyValue($0).replace(/\D/gi,"")))});if(window.getComputedStyle(Y).getPropertyValue("border-top-width")||window.getComputedStyle(Y).getPropertyValue("border-right-width")||window.getComputedStyle(Y).getPropertyValue("border-bottom-width")||window.getComputedStyle(Y).getPropertyValue("border-left-width"))c.border=[null,null,null,null],["top","right","bottom","left"].forEach(($0,_)=>{let g=Math.round(Number(window.getComputedStyle(Y).getPropertyValue("border-"+$0+"-width").replace("px",""))),O=[];O=window.getComputedStyle(Y).getPropertyValue("border-"+$0+"-color").replace(/\s+/gi,"").replace("rgba(","").replace("rgb(","").replace(")","").split(",");let h=U9(Number(O[0]),Number(O[1]),Number(O[2]));c.border[_]={pt:g,color:h}});z.push({_type:D0.tablecell,text:Y.innerText,options:c})}),x){case"thead":G.push(z);break;case"tbody":B.push(z);break;case"tfoot":W.push(z);break;default:console.log(`table parsing: unexpected table part: ${x}`);break}})}),J._arrObjTabHeadRows=G||null,J.colW=U,gJ([...G,...B,...W],J,Q.presLayout,K).forEach((x,y)=>{let D=Q.addSlide({masterName:J.masterSlideName||null});if(y===0)J.y=J.y||N[0];if(y>0)J.y=J.autoPageSlideStartY||J.newSlideStartY||N[0];if(J.verbose)console.log(`| opts.autoPageSlideStartY: ${J.autoPageSlideStartY} / arrInchMargins[0]: ${N[0]} => opts.y = ${J.y}`);if(D.addTable(x.rows,{x:J.x||N[3],y:J.y,w:Number(Z)/H0,colW:U,autoPage:!1}),J.addImage)if(J.addImage.options=J.addImage.options||{},!J.addImage.image||!J.addImage.image.path&&!J.addImage.image.data)console.warn("Warning: tableToSlides.addImage requires either `path` or `data`");else D.addImage({path:J.addImage.image.path,data:J.addImage.image.data,x:J.addImage.options.x,y:J.addImage.options.y,w:J.addImage.options.w,h:J.addImage.options.h});if(J.addShape)D.addShape(J.addShape.shapeName,J.addShape.options||{});if(J.addTable)D.addTable(J.addTable.rows,J.addTable.options||{});if(J.addText)D.addText(J.addText.text,J.addText.options||{})})}var Vz=0;function Zz(Q,$){if(Q.bkgd)$.bkgd=Q.bkgd;if(Q.objects&&Array.isArray(Q.objects)&&Q.objects.length>0)Q.objects.forEach((q,K)=>{let J=Object.keys(q)[0],Z=$;if(C2[J]&&J==="chart")XJ(Z,q[J].type,q[J].data,q[J].opts);else if(C2[J]&&J==="image")yJ(Z,q[J]);else if(C2[J]&&J==="line")Y9(Z,j2.LINE,q[J]);else if(C2[J]&&J==="rect")Y9(Z,j2.RECTANGLE,q[J]);else if(C2[J]&&J==="text")i5(Z,[{text:q[J].text}],q[J].options,!1);else if(C2[J]&&J==="placeholder")q[J].options.placeholder=q[J].options.name,delete q[J].options.name,q[J].options._placeholderType=q[J].options.type,delete q[J].options.type,q[J].options._placeholderIdx=100+K,i5(Z,[{text:q[J].text}],q[J].options,!0)});if(Q.slideNumber&&typeof Q.slideNumber==="object")$._slideNumberProps=Q.slideNumber}function XJ(Q,$,q,K){var J;function Z(N){if(!N||N.style==="none")return;if(N.size!==void 0&&(isNaN(Number(N.size))||N.size<=0))console.warn("Warning: chart.gridLine.size must be greater than 0."),delete N.size;if(N.style&&!["solid","dash","dot"].includes(N.style))console.warn("Warning: chart.gridLine.style options: `solid`, `dash`, `dot`."),delete N.style;if(N.cap&&!["flat","square","round"].includes(N.cap))console.warn("Warning: chart.gridLine.cap options: `flat`, `square`, `round`."),delete N.cap}let G=++Vz,B={_type:null,text:null,options:null,chartRid:null},W=null,U=[];if(Array.isArray($))$.forEach((N)=>{U=U.concat(N.data)}),W=q||K;else U=q,W=K;U.forEach((N,F)=>{if(N._dataIndex=F,N.labels!==void 0&&!Array.isArray(N.labels[0]))N.labels=[N.labels]});let V=W&&typeof W==="object"?W:{};if(V._type=$,V.x=typeof V.x!=="undefined"&&V.x!=null&&!isNaN(Number(V.x))?V.x:1,V.y=typeof V.y!=="undefined"&&V.y!=null&&!isNaN(Number(V.y))?V.y:1,V.w=V.w||"50%",V.h=V.h||"50%",V.objectName=V.objectName?L0(V.objectName):`Chart ${Q._slideObjects.filter((N)=>N._type===D0.chart).length}`,!["bar","col"].includes(V.barDir||""))V.barDir="col";if(V._type===F0.AREA){if(!["stacked","standard","percentStacked"].includes(V.barGrouping||""))V.barGrouping="standard"}if(V._type===F0.BAR){if(!["clustered","stacked","percentStacked"].includes(V.barGrouping||""))V.barGrouping="clustered"}if(V._type===F0.BAR3D){if(!["clustered","stacked","standard","percentStacked"].includes(V.barGrouping||""))V.barGrouping="standard"}if((J=V.barGrouping)===null||J===void 0?void 0:J.includes("tacked")){if(!V.barGapWidthPct)V.barGapWidthPct=50}if(V.dataLabelPosition){if(V._type===F0.AREA||V._type===F0.BAR3D||V._type===F0.DOUGHNUT||V._type===F0.RADAR)delete V.dataLabelPosition;if(V._type===F0.PIE){if(!["bestFit","ctr","inEnd","outEnd"].includes(V.dataLabelPosition))delete V.dataLabelPosition}if(V._type===F0.BUBBLE||V._type===F0.BUBBLE3D||V._type===F0.LINE||V._type===F0.SCATTER){if(!["b","ctr","l","r","t"].includes(V.dataLabelPosition))delete V.dataLabelPosition}if(V._type===F0.BAR){if(!["stacked","percentStacked"].includes(V.barGrouping||"")){if(!["ctr","inBase","inEnd"].includes(V.dataLabelPosition))delete V.dataLabelPosition}if(!["clustered"].includes(V.barGrouping||"")){if(!["ctr","inBase","inEnd","outEnd"].includes(V.dataLabelPosition))delete V.dataLabelPosition}}}if(V.dataLabelBkgrdColors=V.dataLabelBkgrdColors||!V.dataLabelBkgrdColors?V.dataLabelBkgrdColors:!1,!["b","l","r","t","tr"].includes(V.legendPos||""))V.legendPos="r";if(!["cone","coneToMax","box","cylinder","pyramid","pyramidToMax"].includes(V.bar3DShape||""))V.bar3DShape="box";if(!["circle","dash","diamond","dot","none","square","triangle"].includes(V.lineDataSymbol||""))V.lineDataSymbol="circle";if(!["gap","span"].includes(V.displayBlanksAs||""))V.displayBlanksAs="span";if(!["standard","marker","filled"].includes(V.radarStyle||""))V.radarStyle="standard";if(V.lineDataSymbolSize=V.lineDataSymbolSize&&!isNaN(V.lineDataSymbolSize)?V.lineDataSymbolSize:6,V.lineDataSymbolLineSize=V.lineDataSymbolLineSize&&!isNaN(V.lineDataSymbolLineSize)?Y0(V.lineDataSymbolLineSize):Y0(0.75),V.layout)["x","y","w","h"].forEach((N)=>{let F=V.layout[N];if(isNaN(Number(F))||F<0||F>1)console.warn("Warning: chart.layout."+N+" can only be 0-1"),delete V.layout[N]});if(V.catGridLine=V.catGridLine||(V._type===F0.SCATTER?{color:"D9D9D9",size:1}:{style:"none"}),V.valGridLine=V.valGridLine||(V._type===F0.SCATTER?{color:"D9D9D9",size:1}:{}),V.serGridLine=V.serGridLine||(V._type===F0.SCATTER?{color:"D9D9D9",size:1}:{style:"none"}),Z(V.catGridLine),Z(V.valGridLine),Z(V.serGridLine),D9(V.shadow),V.showDataTable=V.showDataTable||!V.showDataTable?V.showDataTable:!1,V.showDataTableHorzBorder=V.showDataTableHorzBorder||!V.showDataTableHorzBorder?V.showDataTableHorzBorder:!0,V.showDataTableVertBorder=V.showDataTableVertBorder||!V.showDataTableVertBorder?V.showDataTableVertBorder:!0,V.showDataTableOutline=V.showDataTableOutline||!V.showDataTableOutline?V.showDataTableOutline:!0,V.showDataTableKeys=V.showDataTableKeys||!V.showDataTableKeys?V.showDataTableKeys:!0,V.showLabel=V.showLabel||!V.showLabel?V.showLabel:!1,V.showLegend=V.showLegend||!V.showLegend?V.showLegend:!1,V.showPercent=V.showPercent||!V.showPercent?V.showPercent:!0,V.showTitle=V.showTitle||!V.showTitle?V.showTitle:!1,V.showValue=V.showValue||!V.showValue?V.showValue:!1,V.showLeaderLines=V.showLeaderLines||!V.showLeaderLines?V.showLeaderLines:!1,V.catAxisLineShow=typeof V.catAxisLineShow!=="undefined"?V.catAxisLineShow:!0,V.valAxisLineShow=typeof V.valAxisLineShow!=="undefined"?V.valAxisLineShow:!0,V.serAxisLineShow=typeof V.serAxisLineShow!=="undefined"?V.serAxisLineShow:!0,V.v3DRotX=!isNaN(V.v3DRotX)&&V.v3DRotX>=-90&&V.v3DRotX<=90?V.v3DRotX:30,V.v3DRotY=!isNaN(V.v3DRotY)&&V.v3DRotY>=0&&V.v3DRotY<=360?V.v3DRotY:30,V.v3DRAngAx=V.v3DRAngAx||!V.v3DRAngAx?V.v3DRAngAx:!0,V.v3DPerspective=!isNaN(V.v3DPerspective)&&V.v3DPerspective>=0&&V.v3DPerspective<=240?V.v3DPerspective:30,V.barGapWidthPct=!isNaN(V.barGapWidthPct)&&V.barGapWidthPct>=0&&V.barGapWidthPct<=1000?V.barGapWidthPct:150,V.barGapDepthPct=!isNaN(V.barGapDepthPct)&&V.barGapDepthPct>=0&&V.barGapDepthPct<=1000?V.barGapDepthPct:150,V.chartColors=Array.isArray(V.chartColors)?V.chartColors:V._type===F0.PIE||V._type===F0.DOUGHNUT?qz:x8,V.chartColorsOpacity=V.chartColorsOpacity&&!isNaN(V.chartColorsOpacity)?V.chartColorsOpacity:null,V.border=V.border&&typeof V.border==="object"?V.border:null,V.border&&(!V.border.pt||isNaN(V.border.pt)))V.border.pt=T6.pt;if(V.border&&(!V.border.color||typeof V.border.color!=="string"))V.border.color=T6.color;if(V.plotArea=V.plotArea||{},V.plotArea.border=V.plotArea.border&&typeof V.plotArea.border==="object"?V.plotArea.border:null,V.plotArea.border&&(!V.plotArea.border.pt||isNaN(V.plotArea.border.pt)))V.plotArea.border.pt=T6.pt;if(V.plotArea.border&&(!V.plotArea.border.color||typeof V.plotArea.border.color!=="string"))V.plotArea.border.color=T6.color;if(V.border)V.plotArea.border=V.border;if(V.plotArea.fill=V.plotArea.fill||{color:null,transparency:null},V.fill)V.plotArea.fill.color=V.fill;if(V.chartArea=V.chartArea||{},V.chartArea.border=V.chartArea.border&&typeof V.chartArea.border==="object"?V.chartArea.border:null,V.chartArea.border)V.chartArea.border={color:V.chartArea.border.color||T6.color,pt:V.chartArea.border.pt||T6.pt};if(V.chartArea.roundedCorners=typeof V.chartArea.roundedCorners==="boolean"?V.chartArea.roundedCorners:!0,V.dataBorder=V.dataBorder&&typeof V.dataBorder==="object"?V.dataBorder:null,V.dataBorder&&(!V.dataBorder.pt||isNaN(V.dataBorder.pt)))V.dataBorder.pt=0.75;if(V.dataBorder&&V.dataBorder.color){let N=typeof V.dataBorder.color==="string"&&V.dataBorder.color.length===6&&/^[0-9A-Fa-f]{6}$/.test(V.dataBorder.color),F=Object.values(p5).includes(V.dataBorder.color);if(!N&&!F)V.dataBorder.color="F9F9F9"}if(!V.dataLabelFormatCode&&V._type===F0.SCATTER)V.dataLabelFormatCode="General";if(!V.dataLabelFormatCode&&(V._type===F0.PIE||V._type===F0.DOUGHNUT))V.dataLabelFormatCode=V.showPercent?"0%":"General";if(V.dataLabelFormatCode=V.dataLabelFormatCode&&typeof V.dataLabelFormatCode==="string"?V.dataLabelFormatCode:"#,##0",!V.dataLabelFormatScatter&&V._type===F0.SCATTER)V.dataLabelFormatScatter="custom";if(V.lineSize=typeof V.lineSize==="number"?V.lineSize:2,V.valAxisMajorUnit=typeof V.valAxisMajorUnit==="number"?V.valAxisMajorUnit:null,V._type===F0.AREA||V._type===F0.BAR||V._type===F0.BAR3D||V._type===F0.LINE)V.catAxisMultiLevelLabels=!!V.catAxisMultiLevelLabels;else delete V.catAxisMultiLevelLabels;return B._type="chart",B.options=V,B.chartRid=G2(Q),Q._relsChart.push({rId:G2(Q),data:U,opts:V,type:V._type,globalId:G,fileName:`chart${G}.xml`,Target:`/ppt/charts/chart${G}.xml`}),Q._slideObjects.push(B),B}function yJ(Q,$){let q={_type:null,text:null,options:null,image:null,imageRid:null,hyperlink:null},K=$.x||0,J=$.y||0,Z=$.w||0,G=$.h||0,B=$.sizing||null,W=$.hyperlink||"",U=$.data||"",V=$.path||"",N=G2(Q),F=$.objectName?L0($.objectName):`Image ${Q._slideObjects.filter((v)=>v._type===D0.image).length}`;if(!V&&!U)return console.error("ERROR: addImage() requires either 'data' or 'path' parameter!"),null;else if(V&&typeof V!=="string")return console.error(`ERROR: addImage() 'path' should be a string, ex: {path:'/img/sample.png'} - you sent ${String(V)}`),null;else if(U&&typeof U!=="string")return console.error(`ERROR: addImage() 'data' should be a string, ex: {data:'image/png;base64,NMP[...]'} - you sent ${String(U)}`),null;else if(U&&typeof U==="string"&&!U.toLowerCase().includes("base64,"))return console.error("ERROR: Image `data` value lacks a base64 header! Ex: 'image/png;base64,NMP[...]')"),null;let M=(V.substring(V.lastIndexOf("/")+1).split("?")[0].split(".").pop().split("#")[0]||"png").toLowerCase();if(U&&/image\/(\w+);/.exec(U)&&/image\/(\w+);/.exec(U).length>0)M=/image\/(\w+);/.exec(U)[1];else if(U===null||U===void 0?void 0:U.toLowerCase().includes("image/svg+xml"))M="svg";if(q._type=D0.image,q.image=V||"preencoded.png",q.options={x:K||0,y:J||0,w:Z||1,h:G||1,altText:$.altText||"",rounding:typeof $.rounding==="boolean"?$.rounding:!1,sizing:B,placeholder:$.placeholder,rotate:$.rotate||0,flipV:$.flipV||!1,flipH:$.flipH||!1,transparency:$.transparency||0,objectName:F,shadow:D9($.shadow)},M==="svg")Q._relsMedia.push({path:V||U+"png",type:"image/png",extn:"png",data:U||"",rId:N,Target:`../media/image-${Q._slideNum}-${Q._relsMedia.length+1}.png`,isSvgPng:!0,svgSize:{w:v0(q.options.w,"X",Q._presLayout),h:v0(q.options.h,"Y",Q._presLayout)}}),q.imageRid=N,Q._relsMedia.push({path:V||U,type:"image/svg+xml",extn:M,data:U||"",rId:N+1,Target:`../media/image-${Q._slideNum}-${Q._relsMedia.length+1}.${M}`}),q.imageRid=N+1;else{let v=Q._relsMedia.filter((x)=>x.path&&x.path===V&&x.type==="image/"+M&&!x.isDuplicate)[0];Q._relsMedia.push({path:V||"preencoded."+M,type:"image/"+M,extn:M,data:U||"",rId:N,isDuplicate:!!(v===null||v===void 0?void 0:v.Target),Target:(v===null||v===void 0?void 0:v.Target)?v.Target:`../media/image-${Q._slideNum}-${Q._relsMedia.length+1}.${M}`}),q.imageRid=N}if(typeof W==="object")if(!W.url&&!W.slide)throw new Error("ERROR: `hyperlink` option requires either: `url` or `slide`");else N++,Q._rels.push({type:D0.hyperlink,data:W.slide?"slide":"dummy",rId:N,Target:W.url||W.slide.toString()}),W._rId=N,q.hyperlink=W;Q._slideObjects.push(q)}function Gz(Q,$){let q=$.x||0,K=$.y||0,J=$.w||2,Z=$.h||2,G=$.data||"",B=$.link||"",W=$.path||"",U=$.type||"audio",V="",N=$.cover||$z,F=$.objectName?L0($.objectName):`Media ${Q._slideObjects.filter((v)=>v._type===D0.media).length}`,M={_type:D0.media};if(!W&&!G&&U!=="online")throw new Error("addMedia() error: either `data` or `path` are required!");else if(G&&!G.toLowerCase().includes("base64,"))throw new Error("addMedia() error: `data` value lacks a base64 header! Ex: 'video/mpeg;base64,NMP[...]')");else if(!N.toLowerCase().includes("base64,"))throw new Error("addMedia() error: `cover` value lacks a base64 header! Ex: 'data:image/png;base64,iV[...]')");if(U==="online"&&!B)throw new Error("addMedia() error: online videos require `link` value");if(V=$.extn||(G?G.split(";")[0].split("/")[1]:W.split(".").pop())||"mp3",M.mtype=U,M.media=W||"preencoded.mov",M.options={},M.options.x=q,M.options.y=K,M.options.w=J,M.options.h=Z,M.options.objectName=F,U==="online"){let v=G2(Q);Q._relsMedia.push({path:W||"preencoded"+V,data:"dummy",type:"online",extn:V,rId:v,Target:B}),M.mediaRid=v,Q._relsMedia.push({path:"preencoded.png",data:N,type:"image/png",extn:"png",rId:G2(Q),Target:`../media/image-${Q._slideNum}-${Q._relsMedia.length+1}.png`})}else{let v=Q._relsMedia.filter((y)=>y.path&&y.path===W&&y.type===U+"/"+V&&!y.isDuplicate)[0],x=G2(Q);Q._relsMedia.push({path:W||"preencoded"+V,type:U+"/"+V,extn:V,data:G||"",rId:x,isDuplicate:!!(v===null||v===void 0?void 0:v.Target),Target:(v===null||v===void 0?void 0:v.Target)?v.Target:`../media/media-${Q._slideNum}-${Q._relsMedia.length+1}.${V}`}),M.mediaRid=x,Q._relsMedia.push({path:W||"preencoded"+V,type:U+"/"+V,extn:V,data:G||"",rId:G2(Q),isDuplicate:!!(v===null||v===void 0?void 0:v.Target),Target:(v===null||v===void 0?void 0:v.Target)?v.Target:`../media/media-${Q._slideNum}-${Q._relsMedia.length+0}.${V}`}),Q._relsMedia.push({path:"preencoded.png",type:"image/png",extn:"png",data:N,rId:G2(Q),Target:`../media/image-${Q._slideNum}-${Q._relsMedia.length+1}.png`})}Q._slideObjects.push(M)}function Bz(Q,$){Q._slideObjects.push({_type:D0.notes,text:[{text:$}]})}function Y9(Q,$,q){let K=typeof q==="object"?q:{};K.line=K.line||{type:"none"};let J={_type:D0.text,shape:$||j2.RECTANGLE,options:K,text:null};if(!$)throw new Error("Missing/Invalid shape parameter! Example: `addShape(pptxgen.shapes.LINE, {x:1, y:1, w:1, h:1});`");let Z={type:K.line.type||"solid",color:K.line.color||jJ,transparency:K.line.transparency||0,width:K.line.width||1,dashType:K.line.dashType||"solid",beginArrowType:K.line.beginArrowType||null,endArrowType:K.line.endArrowType||null};if(typeof K.line==="object"&&K.line.type!=="none")K.line=Z;if(K.x=K.x||(K.x===0?0:1),K.y=K.y||(K.y===0?0:1),K.w=K.w||(K.w===0?0:1),K.h=K.h||(K.h===0?0:1),K.objectName=K.objectName?L0(K.objectName):`Shape ${Q._slideObjects.filter((G)=>G._type===D0.text).length}`,typeof K.line==="string"){let G=Z;G.color=String(K.line),K.line=G}if(typeof K.lineSize==="number")K.line.width=K.lineSize;if(typeof K.lineDash==="string")K.line.dashType=K.lineDash;if(typeof K.lineHead==="string")K.line.beginArrowType=K.lineHead;if(typeof K.lineTail==="string")K.line.endArrowType=K.lineTail;b6(Q,J),Q._slideObjects.push(J)}function Wz(Q,$,q,K,J,Z,G){let B=[Q],W=q&&typeof q==="object"?q:{};W.objectName=W.objectName?L0(W.objectName):`Table ${Q._slideObjects.filter((F)=>F._type===D0.table).length}`;{if($===null||$.length===0||!Array.isArray($))throw new Error("addTable: Array expected! EX: 'slide.addTable( [rows], {options} );' (https://gitbrent.github.io/PptxGenJS/docs/api-tables.html)");if(!$[0]||!Array.isArray($[0]))throw new Error("addTable: 'rows' should be an array of cells! EX: 'slide.addTable( [ ['A'], ['B'], {text:'C',options:{align:'center'}} ] );' (https://gitbrent.github.io/PptxGenJS/docs/api-tables.html)")}let U=[];if($.forEach((F)=>{let M=[];if(Array.isArray(F))F.forEach((v)=>{let x={_type:D0.tablecell,text:"",options:typeof v==="object"&&v.options?v.options:{}};if(typeof v==="string"||typeof v==="number")x.text=v.toString();else if(v.text){if(typeof v.text==="string"||typeof v.text==="number")x.text=v.text.toString();else if(v.text)x.text=v.text;if(v.options&&typeof v.options==="object")x.options=v.options}x.options.border=x.options.border||W.border||[{type:"none"},{type:"none"},{type:"none"},{type:"none"}];let y=x.options.border;if(!Array.isArray(y)&&typeof y==="object")x.options.border=[y,y,y,y];if(!x.options.border[0])x.options.border[0]={type:"none"};if(!x.options.border[1])x.options.border[1]={type:"none"};if(!x.options.border[2])x.options.border[2]={type:"none"};if(!x.options.border[3])x.options.border[3]={type:"none"};[0,1,2,3].forEach((z)=>{x.options.border[z]={type:x.options.border[z].type||P6.type,color:x.options.border[z].color||P6.color,pt:typeof x.options.border[z].pt==="number"?x.options.border[z].pt:P6.pt}}),M.push(x)});else console.log("addTable: tableRows has a bad row. A row should be an array of cells. You provided:"),console.log(F);U.push(M)}),W.x=v0(W.x||(W.x===0?0:H0/2),"X",J),W.y=v0(W.y||(W.y===0?0:H0/2),"Y",J),W.h)W.h=v0(W.h,"Y",J);if(W.fontSize=W.fontSize||f1,W.margin=W.margin===0||W.margin?W.margin:CJ,typeof W.margin==="number")W.margin=[Number(W.margin),Number(W.margin),Number(W.margin),Number(W.margin)];if(JSON.stringify({arrRows:U}).indexOf("hyperlink")===-1){if(!W.color)W.color=W.color||z1}if(typeof W.border==="string")console.warn("addTable `border` option must be an object. Ex: `{border: {type:'none'}}`"),W.border=null;else if(Array.isArray(W.border))[0,1,2,3].forEach((F)=>{W.border[F]=W.border[F]?{type:W.border[F].type||P6.type,color:W.border[F].color||P6.color,pt:W.border[F].pt||P6.pt}:{type:"none"}});if(W.autoPage=typeof W.autoPage==="boolean"?W.autoPage:!1,W.autoPageRepeatHeader=typeof W.autoPageRepeatHeader==="boolean"?W.autoPageRepeatHeader:!1,W.autoPageHeaderRows=typeof W.autoPageHeaderRows!=="undefined"&&!isNaN(Number(W.autoPageHeaderRows))?Number(W.autoPageHeaderRows):1,W.autoPageLineWeight=typeof W.autoPageLineWeight!=="undefined"&&!isNaN(Number(W.autoPageLineWeight))?Number(W.autoPageLineWeight):0,W.autoPageLineWeight){if(W.autoPageLineWeight>1)W.autoPageLineWeight=1;else if(W.autoPageLineWeight<-1)W.autoPageLineWeight=-1}let V=P8;if(K&&typeof K._margin!=="undefined"){if(Array.isArray(K._margin))V=K._margin;else if(!isNaN(Number(K._margin)))V=[Number(K._margin),Number(K._margin),Number(K._margin),Number(K._margin)]}if(W.colW){let F=U[0].reduce((M,v)=>{var x;if(((x=v===null||v===void 0?void 0:v.options)===null||x===void 0?void 0:x.colspan)&&typeof v.options.colspan==="number")M+=v.options.colspan;else M+=1;return M},0);if(typeof W.colW==="string"||typeof W.colW==="number")W.w=Math.floor(Number(W.colW)*F),W.colW=null;else if(W.colW&&Array.isArray(W.colW)&&W.colW.length===1&&F>1)W.w=Math.floor(Number(W.colW)*F),W.colW=null;else if(W.colW&&Array.isArray(W.colW)&&W.colW.length!==F)console.warn("addTable: mismatch: (colW.length != data.length) Therefore, defaulting to evenly distributed col widths."),W.colW=null}else if(W.w)W.w=v0(W.w,"X",J);else W.w=Math.floor(J._sizeW/H0-V[1]-V[3]);if(W.x&&W.x<20)W.x=C0(W.x);if(W.y&&W.y<20)W.y=C0(W.y);if(W.w&&typeof W.w==="number"&&W.w<20)W.w=C0(W.w);if(W.h&&typeof W.h==="number"&&W.h<20)W.h=C0(W.h);U.forEach((F)=>{F.forEach((M,v)=>{if(typeof M==="number"||typeof M==="string")F[v]={_type:D0.tablecell,text:String(F[v]),options:W};else if(typeof M==="object"){if(typeof M.text==="number")F[v].text=F[v].text.toString();else if(typeof M.text==="undefined"||M.text===null)F[v].text="";F[v].options=M.options||{},F[v]._type=D0.tablecell}})});let N=[];if(W&&!W.autoPage)b6(Q,U),Q._slideObjects.push({_type:D0.table,arrTabRows:U,options:Object.assign({},W)});else{if(W.autoPageRepeatHeader)W._arrObjTabHeadRows=U.filter((F,M)=>M{if(!G(Q._slideNum+M))B.push(Z({masterName:(K===null||K===void 0?void 0:K._name)||null}));if(M>0)W.y=C0(W.autoPageSlideStartY||W.newSlideStartY||V[0]);{let v=G(Q._slideNum+M);if(W.autoPage=!1,b6(v,F.rows),v.addTable(F.rows,Object.assign({},W)),M>0)N.push(v)}})}return N}function i5(Q,$,q,K){let J={_type:K?D0.placeholder:D0.text,shape:(q===null||q===void 0?void 0:q.shape)||j2.RECTANGLE,text:!$||$.length===0?[{text:"",options:null}]:$,options:q||{}};function Z(G){{if(!G.placeholder)G.color=G.color||J.options.color||Q.color||z1;if(G.placeholder||K)G.bullet=G.bullet||!1;if(G.placeholder&&Q._slideLayout&&Q._slideLayout._slideObjects){let B=Q._slideLayout._slideObjects.filter((W)=>W._type==="placeholder"&&W.options&&W.options.placeholder&&W.options.placeholder===G.placeholder)[0];if(B===null||B===void 0?void 0:B.options)G=Object.assign(Object.assign({},G),B.options)}if(G.objectName=G.objectName?L0(G.objectName):`Text ${Q._slideObjects.filter((B)=>B._type===D0.text).length}`,G.shape===j2.LINE){let B={type:G.line.type||"solid",color:G.line.color||jJ,transparency:G.line.transparency||0,width:G.line.width||1,dashType:G.line.dashType||"solid",beginArrowType:G.line.beginArrowType||null,endArrowType:G.line.endArrowType||null};if(typeof G.line==="object")G.line=B;if(typeof G.line==="string"){let W=B;if(typeof G.line==="string")W.color=G.line;G.line=W}if(typeof G.lineSize==="number")G.line.width=G.lineSize;if(typeof G.lineDash==="string")G.line.dashType=G.lineDash;if(typeof G.lineHead==="string")G.line.beginArrowType=G.lineHead;if(typeof G.lineTail==="string")G.line.endArrowType=G.lineTail}if(G.line=G.line||{},G.lineSpacing=G.lineSpacing&&!isNaN(G.lineSpacing)?G.lineSpacing:null,G.lineSpacingMultiple=G.lineSpacingMultiple&&!isNaN(G.lineSpacingMultiple)?G.lineSpacingMultiple:null,G._bodyProp=G._bodyProp||{},G._bodyProp.autoFit=G.autoFit||!1,G._bodyProp.anchor=!G.placeholder?u6.ctr:null,G._bodyProp.vert=G.vert||null,G._bodyProp.wrap=typeof G.wrap==="boolean"?G.wrap:!0,G.inset&&!isNaN(Number(G.inset))||G.inset===0)G._bodyProp.lIns=C0(G.inset),G._bodyProp.rIns=C0(G.inset),G._bodyProp.tIns=C0(G.inset),G._bodyProp.bIns=C0(G.inset);if(typeof G.underline==="boolean"&&G.underline===!0)G.underline={style:"sng"}}{if((G.align||"").toLowerCase().indexOf("c")===0)G._bodyProp.align=S6.center;else if((G.align||"").toLowerCase().indexOf("l")===0)G._bodyProp.align=S6.left;else if((G.align||"").toLowerCase().indexOf("r")===0)G._bodyProp.align=S6.right;else if((G.align||"").toLowerCase().indexOf("j")===0)G._bodyProp.align=S6.justify;if((G.valign||"").toLowerCase().indexOf("b")===0)G._bodyProp.anchor=u6.b;else if((G.valign||"").toLowerCase().indexOf("m")===0)G._bodyProp.anchor=u6.ctr;else if((G.valign||"").toLowerCase().indexOf("t")===0)G._bodyProp.anchor=u6.t}return D9(G.shadow),G}J.options=Z(J.options),J.text.forEach((G)=>G.options=Z(G.options||{})),b6(Q,J.text||""),Q._slideObjects.push(J)}function zz(Q){(Q._slideLayout._slideObjects||[]).forEach(($)=>{if($._type===D0.placeholder){if(Q._slideObjects.filter((q)=>q.options&&q.options.placeholder===$.options.placeholder).length===0)i5(Q,[{text:""}],$.options,!1)}})}function hJ(Q,$){var q;if($.bkgd){if(!$.background)$.background={};if(typeof $.bkgd==="string")$.background.color=$.bkgd;else{if($.bkgd.data)$.background.data=$.bkgd.data;if($.bkgd.path)$.background.path=$.bkgd.path;if($.bkgd.src)$.background.path=$.bkgd.src}}if((q=$.background)===null||q===void 0?void 0:q.fill)$.background.color=$.background.fill;if(Q&&(Q.path||Q.data)){Q.path=Q.path||"preencoded.png";let K=(Q.path.split(".").pop()||"png").split("?")[0];if(K==="jpg")K="jpeg";$._relsMedia=$._relsMedia||[];let J=$._relsMedia.length+1;$._relsMedia.push({path:Q.path,type:D0.image,extn:K,data:Q.data||null,rId:J,Target:`../media/${($._name||"").replace(/\s+/gi,"-")}-image-${$._relsMedia.length+1}.${K}`}),$._bkgdImgRid=J}}function b6(Q,$,q){let K=[];if(typeof $==="string"||typeof $==="number")return;else if(Array.isArray($))K=$;else if(typeof $==="object")K=[$];K.forEach((J,Z)=>{if(q&&q[Z]&&q[Z].hyperlink)J.options=Object.assign(Object.assign({},J.options),q[Z]);if(Array.isArray(J)){let G=[];J.forEach((B)=>{if(B.options&&!B.text.options)G.push(B.options)}),b6(Q,J,G)}else if(Array.isArray(J.text))b6(Q,J.text,q&&q[Z]?[q[Z]]:void 0);else if(J&&typeof J==="object"&&J.options&&J.options.hyperlink&&!J.options.hyperlink._rId)if(typeof J.options.hyperlink!=="object")console.log("ERROR: text `hyperlink` option should be an object. Ex: `hyperlink: {url:'https://github.com'}` ");else if(!J.options.hyperlink.url&&!J.options.hyperlink.slide)console.log("ERROR: 'hyperlink requires either: `url` or `slide`'");else{let G=G2(Q);Q._rels.push({type:D0.hyperlink,data:J.options.hyperlink.slide?"slide":"dummy",rId:G,Target:L0(J.options.hyperlink.url)||J.options.hyperlink.slide.toString()}),J.options.hyperlink._rId=G}else if(J&&typeof J==="object"&&J.options&&J.options.hyperlink&&J.options.hyperlink._rId){if(Q._rels.filter((G)=>G.rId===J.options.hyperlink._rId).length===0)Q._rels.push({type:D0.hyperlink,data:J.options.hyperlink.slide?"slide":"dummy",rId:J.options.hyperlink._rId,Target:L0(J.options.hyperlink.url)||J.options.hyperlink.slide.toString()})}})}class xJ{constructor(Q){var $;this.addSlide=Q.addSlide,this.getSlide=Q.getSlide,this._name=`Slide ${Q.slideNumber}`,this._presLayout=Q.presLayout,this._rId=Q.slideRId,this._rels=[],this._relsChart=[],this._relsMedia=[],this._setSlideNum=Q.setSlideNum,this._slideId=Q.slideId,this._slideLayout=Q.slideLayout||null,this._slideNum=Q.slideNumber,this._slideObjects=[],this._slideNumberProps=(($=this._slideLayout)===null||$===void 0?void 0:$._slideNumberProps)?this._slideLayout._slideNumberProps:null}set bkgd(Q){if(this._bkgd=Q,!this._background||!this._background.color){if(!this._background)this._background={};if(typeof Q==="string")this._background.color=Q}}get bkgd(){return this._bkgd}set background(Q){if(this._background=Q,Q)hJ(Q,this)}get background(){return this._background}set color(Q){this._color=Q}get color(){return this._color}set hidden(Q){this._hidden=Q}get hidden(){return this._hidden}set slideNumber(Q){this._slideNumberProps=Q,this._setSlideNum(Q)}get slideNumber(){return this._slideNumberProps}get newAutoPagedSlides(){return this._newAutoPagedSlides}addChart(Q,$,q){let K=q||{};return K._type=Q,XJ(this,Q,$,q),this}addImage(Q){return yJ(this,Q),this}addMedia(Q){return Gz(this,Q),this}addNotes(Q){return Bz(this,Q),this}addShape(Q,$){return Y9(this,Q,$),this}addTable(Q,$){return this._newAutoPagedSlides=Wz(this,Q,$,this._slideLayout,this._presLayout,this.addSlide,this.getSlide),this}addText(Q,$){return i5(this,typeof Q==="string"||typeof Q==="number"?[{text:Q,options:$}]:Q,$,!1),this}}function Fz(Q,$){return H1(this,void 0,void 0,function*(){let q=Q.data;return yield new Promise((K,J)=>{var Z,G;let B=new L9.default,W=(q.length-1)*2+1,U=((G=(Z=q[0])===null||Z===void 0?void 0:Z.labels)===null||G===void 0?void 0:G.length)>1;B.folder("_rels"),B.folder("docProps"),B.folder("xl/_rels"),B.folder("xl/tables"),B.folder("xl/theme"),B.folder("xl/worksheets"),B.folder("xl/worksheets/_rels"),B.file("[Content_Types].xml",' \n'),B.file("_rels/.rels",` -`),B.file("docProps/app.xml",`Microsoft Macintosh Excel0falseWorksheets1Sheet1falsefalsefalse16.0300 -`),B.file("docProps/core.xml",'PptxGenJSPptxGenJS'+new Date().toISOString()+''+new Date().toISOString()+""),B.file("xl/_rels/workbook.xml.rels",''),B.file("xl/styles.xml",'\n'),B.file("xl/theme/theme1.xml",''),B.file("xl/workbook.xml",` -`),B.file("xl/worksheets/_rels/sheet1.xml.rels",` -`);{let V='';if(Q.opts._type===F0.BUBBLE||Q.opts._type===F0.BUBBLE3D)V+=``;else if(Q.opts._type===F0.SCATTER)V+=``;else if(U){let N=q.length;q[0].labels.forEach((F)=>N+=F.filter((M)=>M&&M!=="").length),V+=``,V+=""}else{let N=q.length+q[0].labels.length*q[0].labels[0].length+q[0].labels.length,F=q.length+q[0].labels.length*q[0].labels[0].length+1;V+=``,V+=''}if(Q.opts._type===F0.BUBBLE||Q.opts._type===F0.BUBBLE3D)q.forEach((N,F)=>{if(F===0)V+="X-Axis";else V+=`${L0(N.name||`Y-Axis${F}`)}`,V+=`${L0(`Size${F}`)}`});else q.forEach((N)=>{V+=`${L0((N.name||" ").replace("X-Axis","X-Values"))}`});if(Q.opts._type!==F0.BUBBLE&&Q.opts._type!==F0.BUBBLE3D&&Q.opts._type!==F0.SCATTER)q[0].labels.slice().reverse().forEach((N)=>{N.filter((F)=>F&&F!=="").forEach((F)=>{V+=`${L0(F)}`})});V+=` -`,B.file("xl/sharedStrings.xml",V)}{let V='';if(Q.opts._type===F0.BUBBLE||Q.opts._type===F0.BUBBLE3D){V+=`
{isRenaming ? (
@@ -2796,20 +3265,47 @@ const ColumnHeaderMenu = React.memo(function ColumnHeaderMenu({
) : (
- + + + - + )}
e.stopPropagation()} onPointerDown={handleResizePointerDown} + onDoubleClick={(e) => { + e.preventDefault() + e.stopPropagation() + onAutoResize(column.name) + }} />
`,V+=``;let N=1;q.forEach((F,M)=>{if(M===0)V+=``;else V+=``,N++,V+=``})}else if(Q.opts._type===F0.SCATTER)V+=`
`,V+=``,q.forEach((N,F)=>{V+=``});else V+=`
`,V+=``,q[0].labels.forEach((N,F)=>{V+=``}),q.forEach((N,F)=>{V+=``});V+="",V+='',V+="
",B.file("xl/tables/table1.xml",V)}{let V='';if(V+='',Q.opts._type===F0.BUBBLE||Q.opts._type===F0.BUBBLE3D)V+=``;else if(Q.opts._type===F0.SCATTER)V+=``;else V+=``;if(V+='',V+='',Q.opts._type===F0.BUBBLE||Q.opts._type===F0.BUBBLE3D){V+="",V+=``,V+='0';for(let N=1;N${N}`;V+="",q[0].values.forEach((N,F)=>{V+=``,V+=`${N}`;let M=2;for(let v=1;v${q[v].values[F]||""}`,M++,V+=`${q[v].sizes[F]||""}`,M++;V+=""})}else if(Q.opts._type===F0.SCATTER){V+="",V+=``;for(let N=0;N${N}`;V+="",q[0].values.forEach((N,F)=>{V+=``,V+=`${N}`;for(let M=1;M${q[M].values[F]||q[M].values[F]===0?q[M].values[F]:""}`;V+=""})}else if(V+="",!U){V+=``,q[0].labels.forEach((N,F)=>{V+=`0`});for(let N=0;N${N+1}`;V+="",q[0].labels[0].forEach((N,F)=>{V+=``;for(let M=q[0].labels.length-1;M>=0;M--)V+=``,V+=`${q.length+F+1}`,V+="";for(let M=0;M${q[M].values[F]||""}`;V+=""})}else{V+=``;for(let v=0;v0`;for(let v=q[0].labels.length-1;v${v}`;V+="";let N=q.length,F=q[0].labels[0].length,M=q[0].labels.length;for(let v=0;v`;let x=N,y=q[0].labels.slice().reverse();y.forEach((D,z)=>{if(D[v]){let H=z===0?1:y[z-1].filter((R)=>R&&R!=="").length;x+=H,V+=`${x}`}});for(let D=0;D${q[D].values[v]||0}`;V+=""}}V+="",V+='',V+=` -`,B.file("xl/worksheets/sheet1.xml",V)}B.generateAsync({type:"base64"}).then((V)=>{$.file(`ppt/embeddings/Microsoft_Excel_Worksheet${Q.globalId}.xlsx`,V,{base64:!0}),$.file("ppt/charts/_rels/"+Q.fileName+".rels",``),$.file(`ppt/charts/${Q.fileName}`,Mz(Q)),K("")}).catch((V)=>{J(V)})})})}function Mz(Q){var $,q,K,J;let Z='',G=!1;{if(Z+='',Z+='',Z+=``,Z+="",Q.opts.showTitle)Z+=l5({title:Q.opts.title||"Chart Title",color:Q.opts.titleColor,fontFace:Q.opts.titleFontFace,fontSize:Q.opts.titleFontSize||eW,titleAlign:Q.opts.titleAlign,titleBold:Q.opts.titleBold,titlePos:Q.opts.titlePos,titleRotate:Q.opts.titleRotate},Q.opts.x,Q.opts.y),Z+='';else Z+='';if(Q.opts._type===F0.BAR3D)Z+=``;if(Z+="",Q.opts.layout)Z+="",Z+=" ",Z+=' ',Z+=' ',Z+=' ',Z+=' ',Z+=' ',Z+=' ',Z+=' ',Z+=" ",Z+="";else Z+=""}if(Array.isArray(Q.opts._type))Q.opts._type.forEach((B)=>{let W=Object.assign(Object.assign({},Q.opts),B.options),U=W.secondaryValAxis?d5:Z2,V=W.secondaryCatAxis?W9:h8;G=G||W.secondaryValAxis,Z+=kJ(B.type,B.data,W,U,V)});else Z+=kJ(Q.opts._type,Q.data,Q.opts,Z2,h8);if(Q.opts._type!==F0.PIE&&Q.opts._type!==F0.DOUGHNUT){if(Q.opts.valAxes&&Q.opts.valAxes.length>1&&!G)throw new Error("Secondary axis must be used by one of the multiple charts");if(Q.opts.catAxes){if(!Q.opts.valAxes||Q.opts.valAxes.length!==Q.opts.catAxes.length)throw new Error("There must be the same number of value and category axes.");Z+=V9(Object.assign(Object.assign({},Q.opts),Q.opts.catAxes[0]),h8,Z2)}else Z+=V9(Q.opts,h8,Z2);if(Q.opts.valAxes){if(Z+=Z9(Object.assign(Object.assign({},Q.opts),Q.opts.valAxes[0]),Z2),Q.opts.valAxes[1])Z+=Z9(Object.assign(Object.assign({},Q.opts),Q.opts.valAxes[1]),d5)}else if(Z+=Z9(Q.opts,Z2),Q.opts._type===F0.BAR3D)Z+=wz(Q.opts,fJ,Z2);if((($=Q.opts)===null||$===void 0?void 0:$.catAxes)&&((q=Q.opts)===null||q===void 0?void 0:q.catAxes[1]))Z+=V9(Object.assign(Object.assign({},Q.opts),Q.opts.catAxes[1]),W9,d5)}{if(Q.opts.showDataTable)Z+="",Z+=` `,Z+=` `,Z+=` `,Z+=` `,Z+=" ",Z+=" ",Z+=' ',Z+=" ",Z+=" ",Z+=" ",Z+=' ',Z+=" ",Z+=" ",Z+=' ',Z+=` `,Z+=' ',Z+=' ',Z+=' ',Z+=' ',Z+=" ",Z+=" ",Z+=' ',Z+=" ",Z+=" ",Z+="";if(Z+=" ",Z+=((K=Q.opts.plotArea.fill)===null||K===void 0?void 0:K.color)?k1(Q.opts.plotArea.fill):"",Z+=Q.opts.plotArea.border?`${k1(Q.opts.plotArea.border.color)}`:"",Z+=" ",Z+=" ",Z+="",Q.opts.showLegend){if(Z+="",Z+='',Z+='',Q.opts.legendFontFace||Q.opts.legendFontSize||Q.opts.legendColor){if(Z+="",Z+=" ",Z+=" ",Z+=" ",Z+=" ",Z+=Q.opts.legendFontSize?``:"",Q.opts.legendColor)Z+=k1(Q.opts.legendColor);if(Q.opts.legendFontFace)Z+='';if(Q.opts.legendFontFace)Z+='';Z+=" ",Z+=" ",Z+=' ',Z+=" ",Z+=""}Z+=""}}if(Z+=' ',Z+=' ',Q.opts._type===F0.SCATTER)Z+='';return Z+="",Z+="",Z+=((J=Q.opts.chartArea.fill)===null||J===void 0?void 0:J.color)?k1(Q.opts.chartArea.fill):"",Z+=Q.opts.chartArea.border?`${k1(Q.opts.chartArea.border.color)}`:"",Z+=" ",Z+="",Z+='',Z+="",Z}function kJ(Q,$,q,K,J,Z){let G=-1,B=1,W=null,U="";switch(Q){case F0.AREA:case F0.BAR:case F0.BAR3D:case F0.LINE:case F0.RADAR:if(U+=``,Q===F0.AREA&&q.barGrouping==="stacked")U+='';if(Q===F0.BAR||Q===F0.BAR3D)U+='',U+='';if(Q===F0.RADAR)U+='';U+='',$.forEach((V)=>{var N;G++,U+="",U+=` `,U+=" ",U+=" ",U+=" Sheet1!$"+h0(V._dataIndex+V.labels.length+1)+"$1",U+=' '+L0(V.name)+"",U+=" ",U+=" ";let F=q.chartColors?q.chartColors[G%q.chartColors.length]:null;if(U+=" ",F==="transparent")U+="";else if(q.chartColorsOpacity)U+=""+f0(F,``)+"";else U+=""+f0(F)+"";if(Q===F0.LINE||Q===F0.RADAR)if(q.lineSize===0)U+="";else U+=`${f0(F)}`,U+='';else if(q.dataBorder)U+=`${f0(q.dataBorder.color)}`;if(U+=q6(q.shadow,Q6),U+=" ",U+=' ',Q!==F0.RADAR){if(U+="",U+=``,q.dataLabelBkgrdColors)U+=`${f0(F)}`;if(U+="",U+=``,U+=`${f0(q.dataLabelColor||z1)}`,U+=``,U+="",q.dataLabelPosition)U+=``;U+='',U+=``,U+=``,U+=``,U+=""}if(Q===F0.LINE||Q===F0.RADAR){if(U+="",U+=' ',q.lineDataSymbolSize)U+=``;U+=" ",U+=` ${f0(q.chartColors[V._dataIndex+1>q.chartColors.length?Math.floor(Math.random()*q.chartColors.length):V._dataIndex])}`,U+=` ${f0(q.lineDataSymbolLineColor||F)}`,U+=" ",U+=" ",U+=""}if((Q===F0.BAR||Q===F0.BAR3D)&&$.length===1&&(q.chartColors&&q.chartColors!==x8&&q.chartColors.length>1||((N=q.invertedColors)===null||N===void 0?void 0:N.length)))V.values.forEach((M,v)=>{let x=M<0?q.invertedColors||q.chartColors||x8:q.chartColors||[];if(U+=" ",U+=` `,U+=' ',U+=' ',U+=" ",q.lineSize===0)U+="";else if(Q===F0.BAR)U+="",U+=' ',U+="";else U+="",U+=" ",U+=' ',U+=" ",U+="";U+=q6(q.shadow,Q6),U+=" ",U+=" "});{if(U+="",q.catLabelFormatCode)U+=" ",U+=` Sheet1!$A$2:$A$${V.labels[0].length+1}`,U+=" ",U+=" "+(q.catLabelFormatCode||"General")+"",U+=` `,V.labels[0].forEach((M,v)=>U+=`${L0(M)}`),U+=" ",U+=" ";else U+=" ",U+=` Sheet1!$A$2:$${h0(V.labels.length)}$${V.labels[0].length+1}`,U+=" ",U+=` `,V.labels.forEach((M)=>{U+="",M.forEach((v,x)=>U+=`${L0(v)}`),U+=""}),U+=" ",U+=" ";U+=""}if(U+="",U+=" ",U+=`Sheet1!$${h0(V._dataIndex+V.labels.length+1)}$2:$${h0(V._dataIndex+V.labels.length+1)}$${V.labels[0].length+1}`,U+=" ",U+=" "+(q.valLabelFormatCode||q.dataTableFormatCode||"General")+"",U+=` `,V.values.forEach((M,v)=>U+=`${M||M===0?M:""}`),U+=" ",U+=" ",U+="",Q===F0.LINE)U+='';U+=""});{if(U+=" ",U+=` `,U+=" ",U+=" ",U+=" ",U+=" ",U+=` `,U+=" "+f0(q.dataLabelColor||z1)+"",U+=' ',U+=" ",U+=" ",U+=" ",q.dataLabelPosition)U+=' ';U+=' ',U+=' ',U+=' ',U+=' ',U+=' ',U+=' ',U+=` `,U+=" "}if(Q===F0.BAR)U+=` `,U+=` `;else if(Q===F0.BAR3D)U+=` `,U+=` `,U+=' ';else if(Q===F0.LINE)U+=' ';U+=``,U+=``;break;case F0.SCATTER:U+="",U+='',U+='',G=-1,$.filter((V,N)=>N>0).forEach((V,N)=>{G++,U+="",U+=` `,U+=` `,U+=" ",U+=" ",U+=` Sheet1!$${h0(N+2)}$1`,U+=' '+L0(V.name)+"",U+=" ",U+=" ",U+=" ";{let F=q.chartColors[G%q.chartColors.length];if(F==="transparent")U+="";else if(q.chartColorsOpacity)U+=""+f0(F,'')+"";else U+=""+f0(F)+"";if(q.lineSize===0)U+="";else U+=`${f0(F)}`,U+=``;U+=q6(q.shadow,Q6)}U+=" ";{if(U+="",U+=' ',q.lineDataSymbolSize)U+=``;U+="",U+=`${f0(q.chartColors[N+1>q.chartColors.length?Math.floor(Math.random()*q.chartColors.length):N])}`,U+=`${f0(q.lineDataSymbolLineColor||q.chartColors[G%q.chartColors.length])}`,U+="",U+="",U+=""}if(q.showLabel){let F=m5("-xxxx-xxxx-xxxx-xxxxxxxxxxxx");if(V.labels[0]&&(q.dataLabelFormatScatter==="custom"||q.dataLabelFormatScatter==="customXY"))U+="",V.labels[0].forEach((M,v)=>{if(q.dataLabelFormatScatter==="custom"||q.dataLabelFormatScatter==="customXY"){if(U+=" ",U+=` `,U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=' ',U+=" "+L0(M)+"",U+=" ",q.dataLabelFormatScatter==="customXY"&&!/^ *$/.test(M))U+=" ",U+=' ',U+=" (",U+=" ",U+=' ',U+=' ',U+=" ",U+=" ",U+=" ",U+=" ["+L0(V.name)+"",U+=" ",U+=" ",U+=' ',U+=" , ",U+=" ",U+=' ',U+=' ',U+=" ",U+=" ",U+=" ",U+=" ["+L0(V.name)+"]",U+=" ",U+=" ",U+=' ',U+=" )",U+=" ",U+=' ';if(U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",q.dataLabelPosition)U+=' ';U+=' ',U+=' ',U+=' ',U+=' ',U+=' ',U+=' ',U+=' ',U+=" ",U+=' ',U+=' ',U+=` `,U+=" ",U+=" ",U+=""}}),U+="";if(q.dataLabelFormatScatter==="XY"){if(U+="",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=' ',U+=" ",U+=" ",q.dataLabelPosition)U+=' ';U+=' ',U+=` `,U+=` `,U+=` `,U+=' ',U+=' ',U+=" ",U+=' ',U+=' ',U+=" ",U+=" ",U+=""}}if($.length===1&&q.chartColors!==x8)V.values.forEach((F,M)=>{let v=F<0?q.invertedColors||q.chartColors||x8:q.chartColors||[];if(U+=" ",U+=` `,U+=' ',U+=' ',U+=" ",q.lineSize===0)U+="";else U+="",U+=' ',U+="";U+=q6(q.shadow,Q6),U+=" ",U+=" "});U+="",U+=" ",U+=` Sheet1!$A$2:$A$${$[0].values.length+1}`,U+=" ",U+=" General",U+=` `,$[0].values.forEach((F,M)=>{U+=`${F||F===0?F:""}`}),U+=" ",U+=" ",U+="",U+="",U+=" ",U+=` Sheet1!$${h0(N+2)}$2:$${h0(N+2)}$${$[0].values.length+1}`,U+=" ",U+=" General",U+=` `,$[0].values.forEach((F,M)=>{U+=`${V.values[M]||V.values[M]===0?V.values[M]:""}`}),U+=" ",U+=" ",U+="",U+='',U+=""});{if(U+=" ",U+=` `,U+=" ",U+=" ",U+=" ",U+=" ",U+=` `,U+=" "+f0(q.dataLabelColor||z1)+"",U+=' ',U+=" ",U+=" ",U+=" ",q.dataLabelPosition)U+=' ';U+=' ',U+=' ',U+=' ',U+=' ',U+=' ',U+=' ',U+=" "}U+=``,U+="";break;case F0.BUBBLE:case F0.BUBBLE3D:U+="",U+='',G=-1,$.filter((V,N)=>N>0).forEach((V,N)=>{G++,U+="",U+=` `,U+=` `,U+=" ",U+=" ",U+=" Sheet1!$"+h0(B+1)+"$1",U+=' '+L0(V.name)+"",U+=" ",U+=" ";{U+="";let F=q.chartColors[G%q.chartColors.length];if(F==="transparent")U+="";else if(q.chartColorsOpacity)U+=`${f0(F,'')}`;else U+=""+f0(F)+"";if(q.lineSize===0)U+="";else if(q.dataBorder)U+=`${f0(q.dataBorder.color)}`;else U+=`${f0(F)}`,U+=``;U+=q6(q.shadow,Q6),U+=""}U+="",U+=" ",U+=` Sheet1!$A$2:$A$${$[0].values.length+1}`,U+=" ",U+=" General",U+=` `,$[0].values.forEach((F,M)=>{U+=`${F||F===0?F:""}`}),U+=" ",U+=" ",U+="",U+="",U+=" ",U+=`Sheet1!$${h0(B+1)}$2:$${h0(B+1)}$${$[0].values.length+1}`,B++,U+=" ",U+=" General",U+=` `,$[0].values.forEach((F,M)=>{U+=`${V.values[M]||V.values[M]===0?V.values[M]:""}`}),U+=" ",U+=" ",U+="",U+=" ",U+=" ",U+=`Sheet1!$${h0(B+1)}$2:$${h0(B+1)}$${V.sizes.length+1}`,B++,U+=" ",U+=" General",U+=` `,V.sizes.forEach((F,M)=>{U+=`${F||""}`}),U+=" ",U+=" ",U+=" ",U+=' ',U+=""});{if(U+="",U+=``,U+="",U+=``,U+=`${f0(q.dataLabelColor||z1)}`,U+=``,U+="",q.dataLabelPosition)U+=``;U+='',U+=``,U+=``,U+="",U+=' ',U+=' ',U+=" ",U+="",U+=""}U+=``,U+="";break;case F0.DOUGHNUT:case F0.PIE:if(W=$[0],U+="",U+=' ',U+="",U+=' ',U+=' ',U+=" ",U+=" ",U+=" Sheet1!$B$1",U+=" ",U+=' ',U+=' '+L0(W.name)+"",U+=" ",U+=" ",U+=" ",U+=" ",U+=' ',U+=' ',q.dataNoEffects)U+="";else U+=q6(q.shadow,Q6);if(U+=" ",W.labels[0].forEach((V,N)=>{if(U+="",U+=` `,U+=' ',U+=" ",U+=`${f0(q.chartColors[N+1>q.chartColors.length?Math.floor(Math.random()*q.chartColors.length):N])}`,q.dataBorder)U+=`${f0(q.dataBorder.color)}`;U+=q6(q.shadow,Q6),U+=" ",U+=""}),U+="",W.labels[0].forEach((V,N)=>{if(U+="",U+=` `,U+=` `,U+=" ",U+=" ",U+=" ",U+=` `,U+=" "+f0(q.dataLabelColor||z1)+"",U+=` `,U+=" ",U+=" ",U+=" ",Q===F0.PIE&&q.dataLabelPosition)U+=``;U+=' ',U+=' ',U+=' ',U+=' ',U+=' ',U+=' ',U+=" "}),U+=` `,U+=" ",U+=" ",U+=" ",U+=" ",U+=" ",U+=` `,U+=' ',U+=" ",U+=" ",U+=" ",U+=" ",U+=Q===F0.PIE?'':"",U+=' ',U+=' ',U+=' ',U+=' ',U+=' ',U+=' ',U+=` `,U+="",U+="",U+=" ",U+=` Sheet1!$A$2:$A$${W.labels[0].length+1}`,U+=" ",U+=` `,W.labels[0].forEach((V,N)=>{U+=`${L0(V)}`}),U+=" ",U+=" ",U+="",U+=" ",U+=" ",U+=` Sheet1!$B$2:$B$${W.labels[0].length+1}`,U+=" ",U+=` `,W.values.forEach((V,N)=>{U+=`${V||V===0?V:""}`}),U+=" ",U+=" ",U+=" ",U+=" ",U+=` `,Q===F0.DOUGHNUT)U+=``;U+="";break;default:U+="";break}return U}function V9(Q,$,q){let K="";if(Q._type===F0.SCATTER||Q._type===F0.BUBBLE||Q._type===F0.BUBBLE3D)K+="";else K+="";if(K+=' ',K+=" ",K+='',Q.catAxisMaxVal||Q.catAxisMaxVal===0)K+=``;if(Q.catAxisMinVal||Q.catAxisMinVal===0)K+=``;if(K+="",K+=' ',K+=' ',K+=Q.catGridLine.style!=="none"?H9(Q.catGridLine):"",Q.showCatAxisTitle)K+=l5({color:Q.catAxisTitleColor,fontFace:Q.catAxisTitleFontFace,fontSize:Q.catAxisTitleFontSize,titleRotate:Q.catAxisTitleRotate,title:Q.catAxisTitle||"Axis Title"});if(Q._type===F0.SCATTER||Q._type===F0.BUBBLE||Q._type===F0.BUBBLE3D)K+=' ';else K+=' ';if(Q._type===F0.SCATTER)K+=' ',K+=' ',K+=' ';else K+=' ',K+=' ',K+=' ';if(K+=" ",K+=` `,K+=!Q.catAxisLineShow?"":""+f0(Q.catAxisLineColor||$6.color)+"",K+=' ',K+=" ",K+=" ",K+=" ",K+=" ",Q.catAxisLabelRotate)K+=``;else K+="";if(K+=" ",K+=" ",K+=" ",K+=` `,K+=" "+f0(Q.catAxisLabelColor||z1)+"",K+=' ',K+=" ",K+=" ",K+=' ',K+=" ",K+=" ",K+=' ',K+=` `,K+=' ',K+=' ',K+=` `,Q.catAxisLabelFrequency)K+=' ';if(Q.catLabelFormatCode||Q._type===F0.SCATTER||Q._type===F0.BUBBLE||Q._type===F0.BUBBLE3D){if(Q.catLabelFormatCode){if(["catAxisBaseTimeUnit","catAxisMajorTimeUnit","catAxisMinorTimeUnit"].forEach((J)=>{if(Q[J]&&(typeof Q[J]!=="string"||!["days","months","years"].includes(Q[J].toLowerCase())))console.warn(`"${J}" must be one of: 'days','months','years' !`),Q[J]=null}),Q.catAxisBaseTimeUnit)K+='';if(Q.catAxisMajorTimeUnit)K+='';if(Q.catAxisMinorTimeUnit)K+=''}if(Q.catAxisMajorUnit)K+=``;if(Q.catAxisMinorUnit)K+=``}if(Q._type===F0.SCATTER||Q._type===F0.BUBBLE||Q._type===F0.BUBBLE3D)K+="";else K+="";return K}function Z9(Q,$){let q=$===Z2?Q.barDir==="col"?"l":"b":Q.barDir!=="col"?"r":"t";if($===d5)q="r";let K=$===Z2?h8:W9,J="";if(J+="",J+=' ',J+=" ",Q.valAxisLogScaleBase)J+=``;if(J+='',Q.valAxisMaxVal||Q.valAxisMaxVal===0)J+=``;if(Q.valAxisMinVal||Q.valAxisMinVal===0)J+=``;if(J+=" ",J+=` `,J+=' ',Q.valGridLine.style!=="none")J+=H9(Q.valGridLine);if(Q.showValAxisTitle)J+=l5({color:Q.valAxisTitleColor,fontFace:Q.valAxisTitleFontFace,fontSize:Q.valAxisTitleFontSize,titleRotate:Q.valAxisTitleRotate,title:Q.valAxisTitle||"Axis Title"});if(J+=``,Q._type===F0.SCATTER)J+=' ',J+=' ',J+=' ';else J+=' ',J+=' ',J+=' ';if(J+=" ",J+=` `,J+=!Q.valAxisLineShow?"":""+f0(Q.valAxisLineColor||$6.color)+"",J+=' ',J+=" ",J+=" ",J+=" ",J+=" ",J+=` `,J+=" ",J+=" ",J+=" ",J+=` `,J+=" "+f0(Q.valAxisLabelColor||z1)+"",J+=' ',J+=" ",J+=" ",J+=' ',J+=" ",J+=" ",J+=' ',typeof Q.catAxisCrossesAt==="number")J+=` `;else if(typeof Q.catAxisCrossesAt==="string")J+=' ';else J+=' ';if(J+=' ',Q.valAxisMajorUnit)J+=` `;if(Q.valAxisDisplayUnit)J+=`${Q.valAxisDisplayUnitLabel?"":""}`;return J+="",J}function wz(Q,$,q){let K="";if(K+="",K+=' ',K+=' ',K+=' ',K+=' ',K+=Q.serGridLine.style!=="none"?H9(Q.serGridLine):"",Q.showSerAxisTitle)K+=l5({color:Q.serAxisTitleColor,fontFace:Q.serAxisTitleFontFace,fontSize:Q.serAxisTitleFontSize,titleRotate:Q.serAxisTitleRotate,title:Q.serAxisTitle||"Axis Title"});if(K+=` `,K+=' ',K+=' ',K+=` `,K+=" ",K+=' ',K+=!Q.serAxisLineShow?"":`${f0(Q.serAxisLineColor||$6.color)}`,K+=' ',K+=" ",K+=" ",K+=" ",K+=" ",K+=" ",K+=" ",K+=" ",K+=" ",K+=` `,K+=` ${f0(Q.serAxisLabelColor||z1)}`,K+=` `,K+=" ",K+=" ",K+=' ',K+=" ",K+=" ",K+=' ',K+=' ',Q.serAxisLabelFrequency)K+=' ';if(Q.serLabelFormatCode){if(["serAxisBaseTimeUnit","serAxisMajorTimeUnit","serAxisMinorTimeUnit"].forEach((J)=>{if(Q[J]&&(typeof Q[J]!=="string"||!["days","months","years"].includes(J.toLowerCase())))console.warn(`"${J}" must be one of: 'days','months','years' !`),Q[J]=null}),Q.serAxisBaseTimeUnit)K+=` `;if(Q.serAxisMajorTimeUnit)K+=` `;if(Q.serAxisMinorTimeUnit)K+=` `;if(Q.serAxisMajorUnit)K+=` `;if(Q.serAxisMinorUnit)K+=` `}return K+="",K}function l5(Q,$,q){let K=Q.titleAlign==="left"||Q.titleAlign==="right"?``:"",J=Q.titleRotate?``:"",Z=Q.fontSize?`sz="${Math.round(Q.fontSize*100)}"`:"",G=Q.titleBold?1:0,B="";if(Q.titlePos&&typeof Q.titlePos.x==="number"&&typeof Q.titlePos.y==="number"){let W=Q.titlePos.x+$,U=Q.titlePos.y+q,V=W===0?0:W*(W/5)/10;if(V>=1)V=V/10;if(V>=0.1)V=V/10;let N=U===0?0:U*(U/5)/10;if(N>=1)N=N/10;if(N>=0.1)N=N/10;B=``}return` +`);return V}function IB($,q,Q={},K){let J=Q||{};J.slideMargin=J.slideMargin||J.slideMargin===0?J.slideMargin:0.5;let Z=J.w||$.presLayout.width,G=[],W=[],B=[],V=[],U=[],w=[0.5,0.5,0.5,0.5],F=0;if(!document.getElementById(q))throw Error('tableToSlides: Table ID "'+q+'" does not exist!');if(K===null||K===void 0?void 0:K._margin){if(Array.isArray(K._margin))w=K._margin;else if(!isNaN(K._margin))w=[K._margin,K._margin,K._margin,K._margin];J.slideMargin=w}else if(J===null||J===void 0?void 0:J.slideMargin){if(Array.isArray(J.slideMargin))w=J.slideMargin;else if(!isNaN(J.slideMargin))w=[J.slideMargin,J.slideMargin,J.slideMargin,J.slideMargin]}if(Z=(J.w?v0(J.w):$.presLayout.width)-v0(w[1]+w[3]),J.verbose)console.log("[[VERBOSE MODE]]"),console.log("|-- `tableToSlides` ----------------------------------------------------|"),console.log(`| tableProps.h .................................... = ${J.h}`),console.log(`| tableProps.w .................................... = ${J.w}`),console.log(`| pptx.presLayout.width ........................... = ${($.presLayout.width/L0).toFixed(1)}`),console.log(`| pptx.presLayout.height .......................... = ${($.presLayout.height/L0).toFixed(1)}`),console.log(`| emuSlideTabW .................................... = ${(Z/L0).toFixed(1)}`);let M=document.querySelectorAll(`#${q} tr:first-child th`);if(M.length===0)M=document.querySelectorAll(`#${q} tr:first-child td`);if(M.forEach((f)=>{let L=f;if(L.getAttribute("colspan"))for(let D=0;D{F+=f}),U.forEach((f,L)=>{let D=Number((Number(Z)*(f/F*100)/100/L0).toFixed(2)),z=0,N=document.querySelector(`#${q} thead tr:first-child th:nth-child(${L+1})`);if(N)z=Number(N.getAttribute("data-pptx-min-width"));let H=document.querySelector(`#${q} thead tr:first-child th:nth-child(${L+1})`);if(H)z=Number(H.getAttribute("data-pptx-width"));V.push(z>D?z:D)}),J.verbose)console.log(`| arrColW ......................................... = [${V.join(", ")}]`);["thead","tbody","tfoot"].forEach((f)=>{document.querySelectorAll(`#${q} ${f} tr`).forEach((L)=>{let D=L,z=[];switch(Array.from(D.cells).forEach((N)=>{let H=window.getComputedStyle(N).getPropertyValue("color").replace(/\s+/gi,"").replace("rgba(","").replace("rgb(","").replace(")","").split(","),v=window.getComputedStyle(N).getPropertyValue("background-color").replace(/\s+/gi,"").replace("rgba(","").replace("rgb(","").replace(")","").split(",");if(window.getComputedStyle(N).getPropertyValue("background-color")==="rgba(0, 0, 0, 0)"||window.getComputedStyle(N).getPropertyValue("transparent"))v=["255","255","255"];let j={align:null,bold:window.getComputedStyle(N).getPropertyValue("font-weight")==="bold"||Number(window.getComputedStyle(N).getPropertyValue("font-weight"))>=500,border:null,color:g7(Number(H[0]),Number(H[1]),Number(H[2])),fill:{color:g7(Number(v[0]),Number(v[1]),Number(v[2]))},fontFace:(window.getComputedStyle(N).getPropertyValue("font-family")||"").split(",")[0].replace(/"/g,"").replace("inherit","").replace("initial","")||null,fontSize:Number(window.getComputedStyle(N).getPropertyValue("font-size").replace(/[a-z]/gi,"")),margin:null,colspan:Number(N.getAttribute("colspan"))||null,rowspan:Number(N.getAttribute("rowspan"))||null,valign:null};if(["left","center","right","start","end"].includes(window.getComputedStyle(N).getPropertyValue("text-align"))){let n=window.getComputedStyle(N).getPropertyValue("text-align").replace("start","left").replace("end","right");j.align=n==="center"?"center":n==="left"?"left":n==="right"?"right":null}if(["top","middle","bottom"].includes(window.getComputedStyle(N).getPropertyValue("vertical-align"))){let n=window.getComputedStyle(N).getPropertyValue("vertical-align");j.valign=n==="top"?"top":n==="middle"?"middle":n==="bottom"?"bottom":null}if(window.getComputedStyle(N).getPropertyValue("padding-left"))j.margin=[0,0,0,0],["padding-top","padding-right","padding-bottom","padding-left"].forEach((d,_)=>{j.margin[_]=Math.round(Number(window.getComputedStyle(N).getPropertyValue(d).replace(/\D/gi,"")))});if(window.getComputedStyle(N).getPropertyValue("border-top-width")||window.getComputedStyle(N).getPropertyValue("border-right-width")||window.getComputedStyle(N).getPropertyValue("border-bottom-width")||window.getComputedStyle(N).getPropertyValue("border-left-width"))j.border=[null,null,null,null],["top","right","bottom","left"].forEach((d,_)=>{let X=Math.round(Number(window.getComputedStyle(N).getPropertyValue("border-"+d+"-width").replace("px",""))),P=[];P=window.getComputedStyle(N).getPropertyValue("border-"+d+"-color").replace(/\s+/gi,"").replace("rgba(","").replace("rgb(","").replace(")","").split(",");let g=g7(Number(P[0]),Number(P[1]),Number(P[2]));j.border[_]={pt:X,color:g}});z.push({_type:D0.tablecell,text:N.innerText,options:j})}),f){case"thead":G.push(z);break;case"tbody":W.push(z);break;case"tfoot":B.push(z);break;default:console.log(`table parsing: unexpected table part: ${f}`);break}})}),J._arrObjTabHeadRows=G||null,J.colW=V,GJ([...G,...W,...B],J,$.presLayout,K).forEach((f,L)=>{let D=$.addSlide({masterName:J.masterSlideName||null});if(L===0)J.y=J.y||w[0];if(L>0)J.y=J.autoPageSlideStartY||J.newSlideStartY||w[0];if(J.verbose)console.log(`| opts.autoPageSlideStartY: ${J.autoPageSlideStartY} / arrInchMargins[0]: ${w[0]} => opts.y = ${J.y}`);if(D.addTable(f.rows,{x:J.x||w[3],y:J.y,w:Number(Z)/L0,colW:V,autoPage:!1}),J.addImage)if(J.addImage.options=J.addImage.options||{},!J.addImage.image||!J.addImage.image.path&&!J.addImage.image.data)console.warn("Warning: tableToSlides.addImage requires either `path` or `data`");else D.addImage({path:J.addImage.image.path,data:J.addImage.image.data,x:J.addImage.options.x,y:J.addImage.options.y,w:J.addImage.options.w,h:J.addImage.options.h});if(J.addShape)D.addShape(J.addShape.shapeName,J.addShape.options||{});if(J.addTable)D.addTable(J.addTable.rows,J.addTable.options||{});if(J.addText)D.addText(J.addText.text,J.addText.options||{})})}var CB=0;function jB($,q){if($.bkgd)q.bkgd=$.bkgd;if($.objects&&Array.isArray($.objects)&&$.objects.length>0)$.objects.forEach((Q,K)=>{let J=Object.keys(Q)[0],Z=q;if(W1[J]&&J==="chart")WJ(Z,Q[J].type,Q[J].data,Q[J].opts);else if(W1[J]&&J==="image")BJ(Z,Q[J]);else if(W1[J]&&J==="line")E7(Z,B1.LINE,Q[J]);else if(W1[J]&&J==="rect")E7(Z,B1.RECTANGLE,Q[J]);else if(W1[J]&&J==="text")L5(Z,[{text:Q[J].text}],Q[J].options,!1);else if(W1[J]&&J==="placeholder")Q[J].options.placeholder=Q[J].options.name,delete Q[J].options.name,Q[J].options._placeholderType=Q[J].options.type,delete Q[J].options.type,Q[J].options._placeholderIdx=100+K,L5(Z,[{text:Q[J].text}],Q[J].options,!0)});if($.slideNumber&&typeof $.slideNumber==="object")q._slideNumberProps=$.slideNumber}function WJ($,q,Q,K){var J;function Z(w){if(!w||w.style==="none")return;if(w.size!==void 0&&(isNaN(Number(w.size))||w.size<=0))console.warn("Warning: chart.gridLine.size must be greater than 0."),delete w.size;if(w.style&&!["solid","dash","dot"].includes(w.style))console.warn("Warning: chart.gridLine.style options: `solid`, `dash`, `dot`."),delete w.style;if(w.cap&&!["flat","square","round"].includes(w.cap))console.warn("Warning: chart.gridLine.cap options: `flat`, `square`, `round`."),delete w.cap}let G=++CB,W={_type:null,text:null,options:null,chartRid:null},B=null,V=[];if(Array.isArray(q))q.forEach((w)=>{V=V.concat(w.data)}),B=Q||K;else V=Q,B=K;V.forEach((w,F)=>{if(w._dataIndex=F,w.labels!==void 0&&!Array.isArray(w.labels[0]))w.labels=[w.labels]});let U=B&&typeof B==="object"?B:{};if(U._type=q,U.x=typeof U.x<"u"&&U.x!=null&&!isNaN(Number(U.x))?U.x:1,U.y=typeof U.y<"u"&&U.y!=null&&!isNaN(Number(U.y))?U.y:1,U.w=U.w||"50%",U.h=U.h||"50%",U.objectName=U.objectName?k0(U.objectName):`Chart ${$._slideObjects.filter((w)=>w._type===D0.chart).length}`,!["bar","col"].includes(U.barDir||""))U.barDir="col";if(U._type===q0.AREA){if(!["stacked","standard","percentStacked"].includes(U.barGrouping||""))U.barGrouping="standard"}if(U._type===q0.BAR){if(!["clustered","stacked","percentStacked"].includes(U.barGrouping||""))U.barGrouping="clustered"}if(U._type===q0.BAR3D){if(!["clustered","stacked","standard","percentStacked"].includes(U.barGrouping||""))U.barGrouping="standard"}if((J=U.barGrouping)===null||J===void 0?void 0:J.includes("tacked")){if(!U.barGapWidthPct)U.barGapWidthPct=50}if(U.dataLabelPosition){if(U._type===q0.AREA||U._type===q0.BAR3D||U._type===q0.DOUGHNUT||U._type===q0.RADAR)delete U.dataLabelPosition;if(U._type===q0.PIE){if(!["bestFit","ctr","inEnd","outEnd"].includes(U.dataLabelPosition))delete U.dataLabelPosition}if(U._type===q0.BUBBLE||U._type===q0.BUBBLE3D||U._type===q0.LINE||U._type===q0.SCATTER){if(!["b","ctr","l","r","t"].includes(U.dataLabelPosition))delete U.dataLabelPosition}if(U._type===q0.BAR){if(!["stacked","percentStacked"].includes(U.barGrouping||"")){if(!["ctr","inBase","inEnd"].includes(U.dataLabelPosition))delete U.dataLabelPosition}if(!["clustered"].includes(U.barGrouping||"")){if(!["ctr","inBase","inEnd","outEnd"].includes(U.dataLabelPosition))delete U.dataLabelPosition}}}if(U.dataLabelBkgrdColors=U.dataLabelBkgrdColors||!U.dataLabelBkgrdColors?U.dataLabelBkgrdColors:!1,!["b","l","r","t","tr"].includes(U.legendPos||""))U.legendPos="r";if(!["cone","coneToMax","box","cylinder","pyramid","pyramidToMax"].includes(U.bar3DShape||""))U.bar3DShape="box";if(!["circle","dash","diamond","dot","none","square","triangle"].includes(U.lineDataSymbol||""))U.lineDataSymbol="circle";if(!["gap","span"].includes(U.displayBlanksAs||""))U.displayBlanksAs="span";if(!["standard","marker","filled"].includes(U.radarStyle||""))U.radarStyle="standard";if(U.lineDataSymbolSize=U.lineDataSymbolSize&&!isNaN(U.lineDataSymbolSize)?U.lineDataSymbolSize:6,U.lineDataSymbolLineSize=U.lineDataSymbolLineSize&&!isNaN(U.lineDataSymbolLineSize)?Y0(U.lineDataSymbolLineSize):Y0(0.75),U.layout)["x","y","w","h"].forEach((w)=>{let F=U.layout[w];if(isNaN(Number(F))||F<0||F>1)console.warn("Warning: chart.layout."+w+" can only be 0-1"),delete U.layout[w]});if(U.catGridLine=U.catGridLine||(U._type===q0.SCATTER?{color:"D9D9D9",size:1}:{style:"none"}),U.valGridLine=U.valGridLine||(U._type===q0.SCATTER?{color:"D9D9D9",size:1}:{}),U.serGridLine=U.serGridLine||(U._type===q0.SCATTER?{color:"D9D9D9",size:1}:{style:"none"}),Z(U.catGridLine),Z(U.valGridLine),Z(U.serGridLine),c7(U.shadow),U.showDataTable=U.showDataTable||!U.showDataTable?U.showDataTable:!1,U.showDataTableHorzBorder=U.showDataTableHorzBorder||!U.showDataTableHorzBorder?U.showDataTableHorzBorder:!0,U.showDataTableVertBorder=U.showDataTableVertBorder||!U.showDataTableVertBorder?U.showDataTableVertBorder:!0,U.showDataTableOutline=U.showDataTableOutline||!U.showDataTableOutline?U.showDataTableOutline:!0,U.showDataTableKeys=U.showDataTableKeys||!U.showDataTableKeys?U.showDataTableKeys:!0,U.showLabel=U.showLabel||!U.showLabel?U.showLabel:!1,U.showLegend=U.showLegend||!U.showLegend?U.showLegend:!1,U.showPercent=U.showPercent||!U.showPercent?U.showPercent:!0,U.showTitle=U.showTitle||!U.showTitle?U.showTitle:!1,U.showValue=U.showValue||!U.showValue?U.showValue:!1,U.showLeaderLines=U.showLeaderLines||!U.showLeaderLines?U.showLeaderLines:!1,U.catAxisLineShow=typeof U.catAxisLineShow<"u"?U.catAxisLineShow:!0,U.valAxisLineShow=typeof U.valAxisLineShow<"u"?U.valAxisLineShow:!0,U.serAxisLineShow=typeof U.serAxisLineShow<"u"?U.serAxisLineShow:!0,U.v3DRotX=!isNaN(U.v3DRotX)&&U.v3DRotX>=-90&&U.v3DRotX<=90?U.v3DRotX:30,U.v3DRotY=!isNaN(U.v3DRotY)&&U.v3DRotY>=0&&U.v3DRotY<=360?U.v3DRotY:30,U.v3DRAngAx=U.v3DRAngAx||!U.v3DRAngAx?U.v3DRAngAx:!0,U.v3DPerspective=!isNaN(U.v3DPerspective)&&U.v3DPerspective>=0&&U.v3DPerspective<=240?U.v3DPerspective:30,U.barGapWidthPct=!isNaN(U.barGapWidthPct)&&U.barGapWidthPct>=0&&U.barGapWidthPct<=1000?U.barGapWidthPct:150,U.barGapDepthPct=!isNaN(U.barGapDepthPct)&&U.barGapDepthPct>=0&&U.barGapDepthPct<=1000?U.barGapDepthPct:150,U.chartColors=Array.isArray(U.chartColors)?U.chartColors:U._type===q0.PIE||U._type===q0.DOUGHNUT?HB:z8,U.chartColorsOpacity=U.chartColorsOpacity&&!isNaN(U.chartColorsOpacity)?U.chartColorsOpacity:null,U.border=U.border&&typeof U.border==="object"?U.border:null,U.border&&(!U.border.pt||isNaN(U.border.pt)))U.border.pt=v6.pt;if(U.border&&(!U.border.color||typeof U.border.color!=="string"))U.border.color=v6.color;if(U.plotArea=U.plotArea||{},U.plotArea.border=U.plotArea.border&&typeof U.plotArea.border==="object"?U.plotArea.border:null,U.plotArea.border&&(!U.plotArea.border.pt||isNaN(U.plotArea.border.pt)))U.plotArea.border.pt=v6.pt;if(U.plotArea.border&&(!U.plotArea.border.color||typeof U.plotArea.border.color!=="string"))U.plotArea.border.color=v6.color;if(U.border)U.plotArea.border=U.border;if(U.plotArea.fill=U.plotArea.fill||{color:null,transparency:null},U.fill)U.plotArea.fill.color=U.fill;if(U.chartArea=U.chartArea||{},U.chartArea.border=U.chartArea.border&&typeof U.chartArea.border==="object"?U.chartArea.border:null,U.chartArea.border)U.chartArea.border={color:U.chartArea.border.color||v6.color,pt:U.chartArea.border.pt||v6.pt};if(U.chartArea.roundedCorners=typeof U.chartArea.roundedCorners==="boolean"?U.chartArea.roundedCorners:!0,U.dataBorder=U.dataBorder&&typeof U.dataBorder==="object"?U.dataBorder:null,U.dataBorder&&(!U.dataBorder.pt||isNaN(U.dataBorder.pt)))U.dataBorder.pt=0.75;if(U.dataBorder&&U.dataBorder.color){let w=typeof U.dataBorder.color==="string"&&U.dataBorder.color.length===6&&/^[0-9A-Fa-f]{6}$/.test(U.dataBorder.color),F=Object.values(D5).includes(U.dataBorder.color);if(!w&&!F)U.dataBorder.color="F9F9F9"}if(!U.dataLabelFormatCode&&U._type===q0.SCATTER)U.dataLabelFormatCode="General";if(!U.dataLabelFormatCode&&(U._type===q0.PIE||U._type===q0.DOUGHNUT))U.dataLabelFormatCode=U.showPercent?"0%":"General";if(U.dataLabelFormatCode=U.dataLabelFormatCode&&typeof U.dataLabelFormatCode==="string"?U.dataLabelFormatCode:"#,##0",!U.dataLabelFormatScatter&&U._type===q0.SCATTER)U.dataLabelFormatScatter="custom";if(U.lineSize=typeof U.lineSize==="number"?U.lineSize:2,U.valAxisMajorUnit=typeof U.valAxisMajorUnit==="number"?U.valAxisMajorUnit:null,U._type===q0.AREA||U._type===q0.BAR||U._type===q0.BAR3D||U._type===q0.LINE)U.catAxisMultiLevelLabels=!!U.catAxisMultiLevelLabels;else delete U.catAxisMultiLevelLabels;return W._type="chart",W.options=U,W.chartRid=a2($),$._relsChart.push({rId:a2($),data:V,opts:U,type:U._type,globalId:G,fileName:`chart${G}.xml`,Target:`/ppt/charts/chart${G}.xml`}),$._slideObjects.push(W),W}function BJ($,q){let Q={_type:null,text:null,options:null,image:null,imageRid:null,hyperlink:null},K=q.x||0,J=q.y||0,Z=q.w||0,G=q.h||0,W=q.sizing||null,B=q.hyperlink||"",V=q.data||"",U=q.path||"",w=a2($),F=q.objectName?k0(q.objectName):`Image ${$._slideObjects.filter((k)=>k._type===D0.image).length}`;if(!U&&!V)return console.error("ERROR: addImage() requires either 'data' or 'path' parameter!"),null;else if(U&&typeof U!=="string")return console.error(`ERROR: addImage() 'path' should be a string, ex: {path:'/img/sample.png'} - you sent ${String(U)}`),null;else if(V&&typeof V!=="string")return console.error(`ERROR: addImage() 'data' should be a string, ex: {data:'image/png;base64,NMP[...]'} - you sent ${String(V)}`),null;else if(V&&typeof V==="string"&&!V.toLowerCase().includes("base64,"))return console.error("ERROR: Image `data` value lacks a base64 header! Ex: 'image/png;base64,NMP[...]')"),null;let M=(U.substring(U.lastIndexOf("/")+1).split("?")[0].split(".").pop().split("#")[0]||"png").toLowerCase();if(V&&/image\/(\w+);/.exec(V)&&/image\/(\w+);/.exec(V).length>0)M=/image\/(\w+);/.exec(V)[1];else if(V===null||V===void 0?void 0:V.toLowerCase().includes("image/svg+xml"))M="svg";if(Q._type=D0.image,Q.image=U||"preencoded.png",Q.options={x:K||0,y:J||0,w:Z||1,h:G||1,altText:q.altText||"",rounding:typeof q.rounding==="boolean"?q.rounding:!1,sizing:W,placeholder:q.placeholder,rotate:q.rotate||0,flipV:q.flipV||!1,flipH:q.flipH||!1,transparency:q.transparency||0,objectName:F,shadow:c7(q.shadow)},M==="svg")$._relsMedia.push({path:U||V+"png",type:"image/png",extn:"png",data:V||"",rId:w,Target:`../media/image-${$._slideNum}-${$._relsMedia.length+1}.png`,isSvgPng:!0,svgSize:{w:H0(Q.options.w,"X",$._presLayout),h:H0(Q.options.h,"Y",$._presLayout)}}),Q.imageRid=w,$._relsMedia.push({path:U||V,type:"image/svg+xml",extn:M,data:V||"",rId:w+1,Target:`../media/image-${$._slideNum}-${$._relsMedia.length+1}.${M}`}),Q.imageRid=w+1;else{let k=$._relsMedia.filter((f)=>f.path&&f.path===U&&f.type==="image/"+M&&!f.isDuplicate)[0];$._relsMedia.push({path:U||"preencoded."+M,type:"image/"+M,extn:M,data:V||"",rId:w,isDuplicate:!!(k===null||k===void 0?void 0:k.Target),Target:(k===null||k===void 0?void 0:k.Target)?k.Target:`../media/image-${$._slideNum}-${$._relsMedia.length+1}.${M}`}),Q.imageRid=w}if(typeof B==="object")if(!B.url&&!B.slide)throw Error("ERROR: `hyperlink` option requires either: `url` or `slide`");else w++,$._rels.push({type:D0.hyperlink,data:B.slide?"slide":"dummy",rId:w,Target:B.url||B.slide.toString()}),B._rId=w,Q.hyperlink=B;$._slideObjects.push(Q)}function gB($,q){let Q=q.x||0,K=q.y||0,J=q.w||2,Z=q.h||2,G=q.data||"",W=q.link||"",B=q.path||"",V=q.type||"audio",U="",w=q.cover||vB,F=q.objectName?k0(q.objectName):`Media ${$._slideObjects.filter((k)=>k._type===D0.media).length}`,M={_type:D0.media};if(!B&&!G&&V!=="online")throw Error("addMedia() error: either `data` or `path` are required!");else if(G&&!G.toLowerCase().includes("base64,"))throw Error("addMedia() error: `data` value lacks a base64 header! Ex: 'video/mpeg;base64,NMP[...]')");else if(!w.toLowerCase().includes("base64,"))throw Error("addMedia() error: `cover` value lacks a base64 header! Ex: 'data:image/png;base64,iV[...]')");if(V==="online"&&!W)throw Error("addMedia() error: online videos require `link` value");if(U=q.extn||(G?G.split(";")[0].split("/")[1]:B.split(".").pop())||"mp3",M.mtype=V,M.media=B||"preencoded.mov",M.options={},M.options.x=Q,M.options.y=K,M.options.w=J,M.options.h=Z,M.options.objectName=F,V==="online"){let k=a2($);$._relsMedia.push({path:B||"preencoded"+U,data:"dummy",type:"online",extn:U,rId:k,Target:W}),M.mediaRid=k,$._relsMedia.push({path:"preencoded.png",data:w,type:"image/png",extn:"png",rId:a2($),Target:`../media/image-${$._slideNum}-${$._relsMedia.length+1}.png`})}else{let k=$._relsMedia.filter((L)=>L.path&&L.path===B&&L.type===V+"/"+U&&!L.isDuplicate)[0],f=a2($);$._relsMedia.push({path:B||"preencoded"+U,type:V+"/"+U,extn:U,data:G||"",rId:f,isDuplicate:!!(k===null||k===void 0?void 0:k.Target),Target:(k===null||k===void 0?void 0:k.Target)?k.Target:`../media/media-${$._slideNum}-${$._relsMedia.length+1}.${U}`}),M.mediaRid=f,$._relsMedia.push({path:B||"preencoded"+U,type:V+"/"+U,extn:U,data:G||"",rId:a2($),isDuplicate:!!(k===null||k===void 0?void 0:k.Target),Target:(k===null||k===void 0?void 0:k.Target)?k.Target:`../media/media-${$._slideNum}-${$._relsMedia.length+0}.${U}`}),$._relsMedia.push({path:"preencoded.png",type:"image/png",extn:"png",data:w,rId:a2($),Target:`../media/image-${$._slideNum}-${$._relsMedia.length+1}.png`})}$._slideObjects.push(M)}function AB($,q){$._slideObjects.push({_type:D0.notes,text:[{text:q}]})}function E7($,q,Q){let K=typeof Q==="object"?Q:{};K.line=K.line||{type:"none"};let J={_type:D0.text,shape:q||B1.RECTANGLE,options:K,text:null};if(!q)throw Error("Missing/Invalid shape parameter! Example: `addShape(pptxgen.shapes.LINE, {x:1, y:1, w:1, h:1});`");let Z={type:K.line.type||"solid",color:K.line.color||VJ,transparency:K.line.transparency||0,width:K.line.width||1,dashType:K.line.dashType||"solid",beginArrowType:K.line.beginArrowType||null,endArrowType:K.line.endArrowType||null};if(typeof K.line==="object"&&K.line.type!=="none")K.line=Z;if(K.x=K.x||(K.x===0?0:1),K.y=K.y||(K.y===0?0:1),K.w=K.w||(K.w===0?0:1),K.h=K.h||(K.h===0?0:1),K.objectName=K.objectName?k0(K.objectName):`Shape ${$._slideObjects.filter((G)=>G._type===D0.text).length}`,typeof K.line==="string"){let G=Z;G.color=String(K.line),K.line=G}if(typeof K.lineSize==="number")K.line.width=K.lineSize;if(typeof K.lineDash==="string")K.line.dashType=K.lineDash;if(typeof K.lineHead==="string")K.line.beginArrowType=K.lineHead;if(typeof K.lineTail==="string")K.line.endArrowType=K.lineTail;g6($,J),$._slideObjects.push(J)}function XB($,q,Q,K,J,Z,G){let W=[$],B=Q&&typeof Q==="object"?Q:{};B.objectName=B.objectName?k0(B.objectName):`Table ${$._slideObjects.filter((F)=>F._type===D0.table).length}`;{if(q===null||q.length===0||!Array.isArray(q))throw Error("addTable: Array expected! EX: 'slide.addTable( [rows], {options} );' (https://gitbrent.github.io/PptxGenJS/docs/api-tables.html)");if(!q[0]||!Array.isArray(q[0]))throw Error("addTable: 'rows' should be an array of cells! EX: 'slide.addTable( [ ['A'], ['B'], {text:'C',options:{align:'center'}} ] );' (https://gitbrent.github.io/PptxGenJS/docs/api-tables.html)")}let V=[];if(q.forEach((F)=>{let M=[];if(Array.isArray(F))F.forEach((k)=>{let f={_type:D0.tablecell,text:"",options:typeof k==="object"&&k.options?k.options:{}};if(typeof k==="string"||typeof k==="number")f.text=k.toString();else if(k.text){if(typeof k.text==="string"||typeof k.text==="number")f.text=k.text.toString();else if(k.text)f.text=k.text;if(k.options&&typeof k.options==="object")f.options=k.options}f.options.border=f.options.border||B.border||[{type:"none"},{type:"none"},{type:"none"},{type:"none"}];let L=f.options.border;if(!Array.isArray(L)&&typeof L==="object")f.options.border=[L,L,L,L];if(!f.options.border[0])f.options.border[0]={type:"none"};if(!f.options.border[1])f.options.border[1]={type:"none"};if(!f.options.border[2])f.options.border[2]={type:"none"};if(!f.options.border[3])f.options.border[3]={type:"none"};[0,1,2,3].forEach((z)=>{f.options.border[z]={type:f.options.border[z].type||H6.type,color:f.options.border[z].color||H6.color,pt:typeof f.options.border[z].pt==="number"?f.options.border[z].pt:H6.pt}}),M.push(f)});else console.log("addTable: tableRows has a bad row. A row should be an array of cells. You provided:"),console.log(F);V.push(M)}),B.x=H0(B.x||(B.x===0?0:L0/2),"X",J),B.y=H0(B.y||(B.y===0?0:L0/2),"Y",J),B.h)B.h=H0(B.h,"Y",J);if(B.fontSize=B.fontSize||k2,B.margin=B.margin===0||B.margin?B.margin:JJ,typeof B.margin==="number")B.margin=[Number(B.margin),Number(B.margin),Number(B.margin),Number(B.margin)];if(JSON.stringify({arrRows:V}).indexOf("hyperlink")===-1){if(!B.color)B.color=B.color||Q2}if(typeof B.border==="string")console.warn("addTable `border` option must be an object. Ex: `{border: {type:'none'}}`"),B.border=null;else if(Array.isArray(B.border))[0,1,2,3].forEach((F)=>{B.border[F]=B.border[F]?{type:B.border[F].type||H6.type,color:B.border[F].color||H6.color,pt:B.border[F].pt||H6.pt}:{type:"none"}});if(B.autoPage=typeof B.autoPage==="boolean"?B.autoPage:!1,B.autoPageRepeatHeader=typeof B.autoPageRepeatHeader==="boolean"?B.autoPageRepeatHeader:!1,B.autoPageHeaderRows=typeof B.autoPageHeaderRows<"u"&&!isNaN(Number(B.autoPageHeaderRows))?Number(B.autoPageHeaderRows):1,B.autoPageLineWeight=typeof B.autoPageLineWeight<"u"&&!isNaN(Number(B.autoPageLineWeight))?Number(B.autoPageLineWeight):0,B.autoPageLineWeight){if(B.autoPageLineWeight>1)B.autoPageLineWeight=1;else if(B.autoPageLineWeight<-1)B.autoPageLineWeight=-1}let U=M8;if(K&&typeof K._margin<"u"){if(Array.isArray(K._margin))U=K._margin;else if(!isNaN(Number(K._margin)))U=[Number(K._margin),Number(K._margin),Number(K._margin),Number(K._margin)]}if(B.colW){let F=V[0].reduce((M,k)=>{var f;if(((f=k===null||k===void 0?void 0:k.options)===null||f===void 0?void 0:f.colspan)&&typeof k.options.colspan==="number")M+=k.options.colspan;else M+=1;return M},0);if(typeof B.colW==="string"||typeof B.colW==="number")B.w=Math.floor(Number(B.colW)*F),B.colW=null;else if(B.colW&&Array.isArray(B.colW)&&B.colW.length===1&&F>1)B.w=Math.floor(Number(B.colW)*F),B.colW=null;else if(B.colW&&Array.isArray(B.colW)&&B.colW.length!==F)console.warn("addTable: mismatch: (colW.length != data.length) Therefore, defaulting to evenly distributed col widths."),B.colW=null}else if(B.w)B.w=H0(B.w,"X",J);else B.w=Math.floor(J._sizeW/L0-U[1]-U[3]);if(B.x&&B.x<20)B.x=v0(B.x);if(B.y&&B.y<20)B.y=v0(B.y);if(B.w&&typeof B.w==="number"&&B.w<20)B.w=v0(B.w);if(B.h&&typeof B.h==="number"&&B.h<20)B.h=v0(B.h);V.forEach((F)=>{F.forEach((M,k)=>{if(typeof M==="number"||typeof M==="string")F[k]={_type:D0.tablecell,text:String(F[k]),options:B};else if(typeof M==="object"){if(typeof M.text==="number")F[k].text=F[k].text.toString();else if(typeof M.text>"u"||M.text===null)F[k].text="";F[k].options=M.options||{},F[k]._type=D0.tablecell}})});let w=[];if(B&&!B.autoPage)g6($,V),$._slideObjects.push({_type:D0.table,arrTabRows:V,options:Object.assign({},B)});else{if(B.autoPageRepeatHeader)B._arrObjTabHeadRows=V.filter((F,M)=>M{if(!G($._slideNum+M))W.push(Z({masterName:(K===null||K===void 0?void 0:K._name)||null}));if(M>0)B.y=v0(B.autoPageSlideStartY||B.newSlideStartY||U[0]);{let k=G($._slideNum+M);if(B.autoPage=!1,g6(k,F.rows),k.addTable(F.rows,Object.assign({},B)),M>0)w.push(k)}})}return w}function L5($,q,Q,K){let J={_type:K?D0.placeholder:D0.text,shape:(Q===null||Q===void 0?void 0:Q.shape)||B1.RECTANGLE,text:!q||q.length===0?[{text:"",options:null}]:q,options:Q||{}};function Z(G){{if(!G.placeholder)G.color=G.color||J.options.color||$.color||Q2;if(G.placeholder||K)G.bullet=G.bullet||!1;if(G.placeholder&&$._slideLayout&&$._slideLayout._slideObjects){let W=$._slideLayout._slideObjects.filter((B)=>B._type==="placeholder"&&B.options&&B.options.placeholder&&B.options.placeholder===G.placeholder)[0];if(W===null||W===void 0?void 0:W.options)G=Object.assign(Object.assign({},G),W.options)}if(G.objectName=G.objectName?k0(G.objectName):`Text ${$._slideObjects.filter((W)=>W._type===D0.text).length}`,G.shape===B1.LINE){let W={type:G.line.type||"solid",color:G.line.color||VJ,transparency:G.line.transparency||0,width:G.line.width||1,dashType:G.line.dashType||"solid",beginArrowType:G.line.beginArrowType||null,endArrowType:G.line.endArrowType||null};if(typeof G.line==="object")G.line=W;if(typeof G.line==="string"){let B=W;if(typeof G.line==="string")B.color=G.line;G.line=B}if(typeof G.lineSize==="number")G.line.width=G.lineSize;if(typeof G.lineDash==="string")G.line.dashType=G.lineDash;if(typeof G.lineHead==="string")G.line.beginArrowType=G.lineHead;if(typeof G.lineTail==="string")G.line.endArrowType=G.lineTail}if(G.line=G.line||{},G.lineSpacing=G.lineSpacing&&!isNaN(G.lineSpacing)?G.lineSpacing:null,G.lineSpacingMultiple=G.lineSpacingMultiple&&!isNaN(G.lineSpacingMultiple)?G.lineSpacingMultiple:null,G._bodyProp=G._bodyProp||{},G._bodyProp.autoFit=G.autoFit||!1,G._bodyProp.anchor=!G.placeholder?I6.ctr:null,G._bodyProp.vert=G.vert||null,G._bodyProp.wrap=typeof G.wrap==="boolean"?G.wrap:!0,G.inset&&!isNaN(Number(G.inset))||G.inset===0)G._bodyProp.lIns=v0(G.inset),G._bodyProp.rIns=v0(G.inset),G._bodyProp.tIns=v0(G.inset),G._bodyProp.bIns=v0(G.inset);if(typeof G.underline==="boolean"&&G.underline===!0)G.underline={style:"sng"}}{if((G.align||"").toLowerCase().indexOf("c")===0)G._bodyProp.align=R6.center;else if((G.align||"").toLowerCase().indexOf("l")===0)G._bodyProp.align=R6.left;else if((G.align||"").toLowerCase().indexOf("r")===0)G._bodyProp.align=R6.right;else if((G.align||"").toLowerCase().indexOf("j")===0)G._bodyProp.align=R6.justify;if((G.valign||"").toLowerCase().indexOf("b")===0)G._bodyProp.anchor=I6.b;else if((G.valign||"").toLowerCase().indexOf("m")===0)G._bodyProp.anchor=I6.ctr;else if((G.valign||"").toLowerCase().indexOf("t")===0)G._bodyProp.anchor=I6.t}return c7(G.shadow),G}J.options=Z(J.options),J.text.forEach((G)=>G.options=Z(G.options||{})),g6($,J.text||""),$._slideObjects.push(J)}function yB($){($._slideLayout._slideObjects||[]).forEach((q)=>{if(q._type===D0.placeholder){if($._slideObjects.filter((Q)=>Q.options&&Q.options.placeholder===q.options.placeholder).length===0)L5($,[{text:""}],q.options,!1)}})}function zJ($,q){var Q;if(q.bkgd){if(!q.background)q.background={};if(typeof q.bkgd==="string")q.background.color=q.bkgd;else{if(q.bkgd.data)q.background.data=q.bkgd.data;if(q.bkgd.path)q.background.path=q.bkgd.path;if(q.bkgd.src)q.background.path=q.bkgd.src}}if((Q=q.background)===null||Q===void 0?void 0:Q.fill)q.background.color=q.background.fill;if($&&($.path||$.data)){$.path=$.path||"preencoded.png";let K=($.path.split(".").pop()||"png").split("?")[0];if(K==="jpg")K="jpeg";q._relsMedia=q._relsMedia||[];let J=q._relsMedia.length+1;q._relsMedia.push({path:$.path,type:D0.image,extn:K,data:$.data||null,rId:J,Target:`../media/${(q._name||"").replace(/\s+/gi,"-")}-image-${q._relsMedia.length+1}.${K}`}),q._bkgdImgRid=J}}function g6($,q,Q){let K=[];if(typeof q==="string"||typeof q==="number")return;else if(Array.isArray(q))K=q;else if(typeof q==="object")K=[q];K.forEach((J,Z)=>{if(Q&&Q[Z]&&Q[Z].hyperlink)J.options=Object.assign(Object.assign({},J.options),Q[Z]);if(Array.isArray(J)){let G=[];J.forEach((W)=>{if(W.options&&!W.text.options)G.push(W.options)}),g6($,J,G)}else if(Array.isArray(J.text))g6($,J.text,Q&&Q[Z]?[Q[Z]]:void 0);else if(J&&typeof J==="object"&&J.options&&J.options.hyperlink&&!J.options.hyperlink._rId)if(typeof J.options.hyperlink!=="object")console.log("ERROR: text `hyperlink` option should be an object. Ex: `hyperlink: {url:'https://github.com'}` ");else if(!J.options.hyperlink.url&&!J.options.hyperlink.slide)console.log("ERROR: 'hyperlink requires either: `url` or `slide`'");else{let G=a2($);$._rels.push({type:D0.hyperlink,data:J.options.hyperlink.slide?"slide":"dummy",rId:G,Target:k0(J.options.hyperlink.url)||J.options.hyperlink.slide.toString()}),J.options.hyperlink._rId=G}else if(J&&typeof J==="object"&&J.options&&J.options.hyperlink&&J.options.hyperlink._rId){if($._rels.filter((G)=>G.rId===J.options.hyperlink._rId).length===0)$._rels.push({type:D0.hyperlink,data:J.options.hyperlink.slide?"slide":"dummy",rId:J.options.hyperlink._rId,Target:k0(J.options.hyperlink.url)||J.options.hyperlink.slide.toString()})}})}class FJ{constructor($){var q;this.addSlide=$.addSlide,this.getSlide=$.getSlide,this._name=`Slide ${$.slideNumber}`,this._presLayout=$.presLayout,this._rId=$.slideRId,this._rels=[],this._relsChart=[],this._relsMedia=[],this._setSlideNum=$.setSlideNum,this._slideId=$.slideId,this._slideLayout=$.slideLayout||null,this._slideNum=$.slideNumber,this._slideObjects=[],this._slideNumberProps=((q=this._slideLayout)===null||q===void 0?void 0:q._slideNumberProps)?this._slideLayout._slideNumberProps:null}set bkgd($){if(this._bkgd=$,!this._background||!this._background.color){if(!this._background)this._background={};if(typeof $==="string")this._background.color=$}}get bkgd(){return this._bkgd}set background($){if(this._background=$,$)zJ($,this)}get background(){return this._background}set color($){this._color=$}get color(){return this._color}set hidden($){this._hidden=$}get hidden(){return this._hidden}set slideNumber($){this._slideNumberProps=$,this._setSlideNum($)}get slideNumber(){return this._slideNumberProps}get newAutoPagedSlides(){return this._newAutoPagedSlides}addChart($,q,Q){let K=Q||{};return K._type=$,WJ(this,$,q,Q),this}addImage($){return BJ(this,$),this}addMedia($){return gB(this,$),this}addNotes($){return AB(this,$),this}addShape($,q){return E7(this,$,q),this}addTable($,q){return this._newAutoPagedSlides=XB(this,$,q,this._slideLayout,this._presLayout,this.addSlide,this.getSlide),this}addText($,q){return L5(this,typeof $==="string"||typeof $==="number"?[{text:$,options:q}]:$,q,!1),this}}function hB($,q){return W2(this,void 0,void 0,function*(){let Q=$.data;return yield new Promise((K,J)=>{var Z,G;let W=new _7.default,B=(Q.length-1)*2+1,V=((G=(Z=Q[0])===null||Z===void 0?void 0:Z.labels)===null||G===void 0?void 0:G.length)>1;W.folder("_rels"),W.folder("docProps"),W.folder("xl/_rels"),W.folder("xl/tables"),W.folder("xl/theme"),W.folder("xl/worksheets"),W.folder("xl/worksheets/_rels"),W.file("[Content_Types].xml",' \n'),W.file("_rels/.rels",` +`),W.file("docProps/app.xml",`Microsoft Macintosh Excel0falseWorksheets1Sheet1falsefalsefalse16.0300 +`),W.file("docProps/core.xml",'PptxGenJSPptxGenJS'+new Date().toISOString()+''+new Date().toISOString()+""),W.file("xl/_rels/workbook.xml.rels",''),W.file("xl/styles.xml",'\n'),W.file("xl/theme/theme1.xml",''),W.file("xl/workbook.xml",` +`),W.file("xl/worksheets/_rels/sheet1.xml.rels",` +`);{let U='';if($.opts._type===q0.BUBBLE||$.opts._type===q0.BUBBLE3D)U+=``;else if($.opts._type===q0.SCATTER)U+=``;else if(V){let w=Q.length;Q[0].labels.forEach((F)=>w+=F.filter((M)=>M&&M!=="").length),U+=``,U+=""}else{let w=Q.length+Q[0].labels.length*Q[0].labels[0].length+Q[0].labels.length,F=Q.length+Q[0].labels.length*Q[0].labels[0].length+1;U+=``,U+=''}if($.opts._type===q0.BUBBLE||$.opts._type===q0.BUBBLE3D)Q.forEach((w,F)=>{if(F===0)U+="X-Axis";else U+=`${k0(w.name||`Y-Axis${F}`)}`,U+=`${k0(`Size${F}`)}`});else Q.forEach((w)=>{U+=`${k0((w.name||" ").replace("X-Axis","X-Values"))}`});if($.opts._type!==q0.BUBBLE&&$.opts._type!==q0.BUBBLE3D&&$.opts._type!==q0.SCATTER)Q[0].labels.slice().reverse().forEach((w)=>{w.filter((F)=>F&&F!=="").forEach((F)=>{U+=`${k0(F)}`})});U+=` +`,W.file("xl/sharedStrings.xml",U)}{let U='';if($.opts._type===q0.BUBBLE||$.opts._type===q0.BUBBLE3D){U+=``,U+=``;let w=1;Q.forEach((F,M)=>{if(M===0)U+=``;else U+=``,w++,U+=``})}else if($.opts._type===q0.SCATTER)U+=`
`,U+=``,Q.forEach((w,F)=>{U+=``});else U+=`
`,U+=``,Q[0].labels.forEach((w,F)=>{U+=``}),Q.forEach((w,F)=>{U+=``});U+="",U+='',U+="
",W.file("xl/tables/table1.xml",U)}{let U='';if(U+='',$.opts._type===q0.BUBBLE||$.opts._type===q0.BUBBLE3D)U+=``;else if($.opts._type===q0.SCATTER)U+=``;else U+=``;if(U+='',U+='',$.opts._type===q0.BUBBLE||$.opts._type===q0.BUBBLE3D){U+="",U+=``,U+='0';for(let w=1;w${w}`;U+="",Q[0].values.forEach((w,F)=>{U+=``,U+=`${w}`;let M=2;for(let k=1;k${Q[k].values[F]||""}`,M++,U+=`${Q[k].sizes[F]||""}`,M++;U+=""})}else if($.opts._type===q0.SCATTER){U+="",U+=``;for(let w=0;w${w}`;U+="",Q[0].values.forEach((w,F)=>{U+=``,U+=`${w}`;for(let M=1;M${Q[M].values[F]||Q[M].values[F]===0?Q[M].values[F]:""}`;U+=""})}else if(U+="",!V){U+=``,Q[0].labels.forEach((w,F)=>{U+=`0`});for(let w=0;w${w+1}`;U+="",Q[0].labels[0].forEach((w,F)=>{U+=``;for(let M=Q[0].labels.length-1;M>=0;M--)U+=``,U+=`${Q.length+F+1}`,U+="";for(let M=0;M${Q[M].values[F]||""}`;U+=""})}else{U+=``;for(let k=0;k0`;for(let k=Q[0].labels.length-1;k${k}`;U+="";let w=Q.length,F=Q[0].labels[0].length,M=Q[0].labels.length;for(let k=0;k`;let f=w,L=Q[0].labels.slice().reverse();L.forEach((D,z)=>{if(D[k]){let H=z===0?1:L[z-1].filter((v)=>v&&v!=="").length;f+=H,U+=`${f}`}});for(let D=0;D${Q[D].values[k]||0}`;U+=""}}U+="",U+='',U+=` +`,W.file("xl/worksheets/sheet1.xml",U)}W.generateAsync({type:"base64"}).then((U)=>{q.file(`ppt/embeddings/Microsoft_Excel_Worksheet${$.globalId}.xlsx`,U,{base64:!0}),q.file("ppt/charts/_rels/"+$.fileName+".rels",``),q.file(`ppt/charts/${$.fileName}`,xB($)),K("")}).catch((U)=>{J(U)})})})}function xB($){var q,Q,K,J;let Z='',G=!1;{if(Z+='',Z+='',Z+=``,Z+="",$.opts.showTitle)Z+=H5({title:$.opts.title||"Chart Title",color:$.opts.titleColor,fontFace:$.opts.titleFontFace,fontSize:$.opts.titleFontSize||DB,titleAlign:$.opts.titleAlign,titleBold:$.opts.titleBold,titlePos:$.opts.titlePos,titleRotate:$.opts.titleRotate},$.opts.x,$.opts.y),Z+='';else Z+='';if($.opts._type===q0.BAR3D)Z+=``;if(Z+="",$.opts.layout)Z+="",Z+=" ",Z+=' ',Z+=' ',Z+=' ',Z+=' ',Z+=' ',Z+=' ',Z+=' ',Z+=" ",Z+="";else Z+=""}if(Array.isArray($.opts._type))$.opts._type.forEach((W)=>{let B=Object.assign(Object.assign({},$.opts),W.options),V=B.secondaryValAxis?N5:o2,U=B.secondaryCatAxis?x7:B8;G=G||B.secondaryValAxis,Z+=$J(W.type,W.data,B,V,U)});else Z+=$J($.opts._type,$.data,$.opts,o2,B8);if($.opts._type!==q0.PIE&&$.opts._type!==q0.DOUGHNUT){if($.opts.valAxes&&$.opts.valAxes.length>1&&!G)throw Error("Secondary axis must be used by one of the multiple charts");if($.opts.catAxes){if(!$.opts.valAxes||$.opts.valAxes.length!==$.opts.catAxes.length)throw Error("There must be the same number of value and category axes.");Z+=A7(Object.assign(Object.assign({},$.opts),$.opts.catAxes[0]),B8,o2)}else Z+=A7($.opts,B8,o2);if($.opts.valAxes){if(Z+=X7(Object.assign(Object.assign({},$.opts),$.opts.valAxes[0]),o2),$.opts.valAxes[1])Z+=X7(Object.assign(Object.assign({},$.opts),$.opts.valAxes[1]),N5)}else if(Z+=X7($.opts,o2),$.opts._type===q0.BAR3D)Z+=OB($.opts,UJ,o2);if(((q=$.opts)===null||q===void 0?void 0:q.catAxes)&&((Q=$.opts)===null||Q===void 0?void 0:Q.catAxes[1]))Z+=A7(Object.assign(Object.assign({},$.opts),$.opts.catAxes[1]),x7,N5)}{if($.opts.showDataTable)Z+="",Z+=` `,Z+=` `,Z+=` `,Z+=` `,Z+=" ",Z+=" ",Z+=' ',Z+=" ",Z+=" ",Z+=" ",Z+=' ',Z+=" ",Z+=" ",Z+=' ',Z+=` `,Z+=' ',Z+=' ',Z+=' ',Z+=' ',Z+=" ",Z+=" ",Z+=' ',Z+=" ",Z+=" ",Z+="";if(Z+=" ",Z+=((K=$.opts.plotArea.fill)===null||K===void 0?void 0:K.color)?B2($.opts.plotArea.fill):"",Z+=$.opts.plotArea.border?`${B2($.opts.plotArea.border.color)}`:"",Z+=" ",Z+=" ",Z+="",$.opts.showLegend){if(Z+="",Z+='',Z+='',$.opts.legendFontFace||$.opts.legendFontSize||$.opts.legendColor){if(Z+="",Z+=" ",Z+=" ",Z+=" ",Z+=" ",Z+=$.opts.legendFontSize?``:"",$.opts.legendColor)Z+=B2($.opts.legendColor);if($.opts.legendFontFace)Z+='';if($.opts.legendFontFace)Z+='';Z+=" ",Z+=" ",Z+=' ',Z+=" ",Z+=""}Z+=""}}if(Z+=' ',Z+=' ',$.opts._type===q0.SCATTER)Z+='';return Z+="",Z+="",Z+=((J=$.opts.chartArea.fill)===null||J===void 0?void 0:J.color)?B2($.opts.chartArea.fill):"",Z+=$.opts.chartArea.border?`${B2($.opts.chartArea.border.color)}`:"",Z+=" ",Z+="",Z+='',Z+="",Z}function $J($,q,Q,K,J,Z){let G=-1,W=1,B=null,V="";switch($){case q0.AREA:case q0.BAR:case q0.BAR3D:case q0.LINE:case q0.RADAR:if(V+=``,$===q0.AREA&&Q.barGrouping==="stacked")V+='';if($===q0.BAR||$===q0.BAR3D)V+='',V+='';if($===q0.RADAR)V+='';V+='',q.forEach((U)=>{var w;G++,V+="",V+=` `,V+=" ",V+=" ",V+=" Sheet1!$"+j0(U._dataIndex+U.labels.length+1)+"$1",V+=' '+k0(U.name)+"",V+=" ",V+=" ";let F=Q.chartColors?Q.chartColors[G%Q.chartColors.length]:null;if(V+=" ",F==="transparent")V+="";else if(Q.chartColorsOpacity)V+=""+R0(F,``)+"";else V+=""+R0(F)+"";if($===q0.LINE||$===q0.RADAR)if(Q.lineSize===0)V+="";else V+=`${R0(F)}`,V+='';else if(Q.dataBorder)V+=`${R0(Q.dataBorder.color)}`;if(V+=T1(Q.shadow,P1),V+=" ",V+=' ',$!==q0.RADAR){if(V+="",V+=``,Q.dataLabelBkgrdColors)V+=`${R0(F)}`;if(V+="",V+=``,V+=`${R0(Q.dataLabelColor||Q2)}`,V+=``,V+="",Q.dataLabelPosition)V+=``;V+='',V+=``,V+=``,V+=``,V+=""}if($===q0.LINE||$===q0.RADAR){if(V+="",V+=' ',Q.lineDataSymbolSize)V+=``;V+=" ",V+=` ${R0(Q.chartColors[U._dataIndex+1>Q.chartColors.length?Math.floor(Math.random()*Q.chartColors.length):U._dataIndex])}`,V+=` ${R0(Q.lineDataSymbolLineColor||F)}`,V+=" ",V+=" ",V+=""}if(($===q0.BAR||$===q0.BAR3D)&&q.length===1&&(Q.chartColors&&Q.chartColors!==z8&&Q.chartColors.length>1||((w=Q.invertedColors)===null||w===void 0?void 0:w.length)))U.values.forEach((M,k)=>{let f=M<0?Q.invertedColors||Q.chartColors||z8:Q.chartColors||[];if(V+=" ",V+=` `,V+=' ',V+=' ',V+=" ",Q.lineSize===0)V+="";else if($===q0.BAR)V+="",V+=' ',V+="";else V+="",V+=" ",V+=' ',V+=" ",V+="";V+=T1(Q.shadow,P1),V+=" ",V+=" "});{if(V+="",Q.catLabelFormatCode)V+=" ",V+=` Sheet1!$A$2:$A$${U.labels[0].length+1}`,V+=" ",V+=" "+(Q.catLabelFormatCode||"General")+"",V+=` `,U.labels[0].forEach((M,k)=>V+=`${k0(M)}`),V+=" ",V+=" ";else V+=" ",V+=` Sheet1!$A$2:$${j0(U.labels.length)}$${U.labels[0].length+1}`,V+=" ",V+=` `,U.labels.forEach((M)=>{V+="",M.forEach((k,f)=>V+=`${k0(k)}`),V+=""}),V+=" ",V+=" ";V+=""}if(V+="",V+=" ",V+=`Sheet1!$${j0(U._dataIndex+U.labels.length+1)}$2:$${j0(U._dataIndex+U.labels.length+1)}$${U.labels[0].length+1}`,V+=" ",V+=" "+(Q.valLabelFormatCode||Q.dataTableFormatCode||"General")+"",V+=` `,U.values.forEach((M,k)=>V+=`${M||M===0?M:""}`),V+=" ",V+=" ",V+="",$===q0.LINE)V+='';V+=""});{if(V+=" ",V+=` `,V+=" ",V+=" ",V+=" ",V+=" ",V+=` `,V+=" "+R0(Q.dataLabelColor||Q2)+"",V+=' ',V+=" ",V+=" ",V+=" ",Q.dataLabelPosition)V+=' ';V+=' ',V+=' ',V+=' ',V+=' ',V+=' ',V+=' ',V+=` `,V+=" "}if($===q0.BAR)V+=` `,V+=` `;else if($===q0.BAR3D)V+=` `,V+=` `,V+=' ';else if($===q0.LINE)V+=' ';V+=``,V+=``;break;case q0.SCATTER:V+="",V+='',V+='',G=-1,q.filter((U,w)=>w>0).forEach((U,w)=>{G++,V+="",V+=` `,V+=` `,V+=" ",V+=" ",V+=` Sheet1!$${j0(w+2)}$1`,V+=' '+k0(U.name)+"",V+=" ",V+=" ",V+=" ";{let F=Q.chartColors[G%Q.chartColors.length];if(F==="transparent")V+="";else if(Q.chartColorsOpacity)V+=""+R0(F,'')+"";else V+=""+R0(F)+"";if(Q.lineSize===0)V+="";else V+=`${R0(F)}`,V+=``;V+=T1(Q.shadow,P1)}V+=" ";{if(V+="",V+=' ',Q.lineDataSymbolSize)V+=``;V+="",V+=`${R0(Q.chartColors[w+1>Q.chartColors.length?Math.floor(Math.random()*Q.chartColors.length):w])}`,V+=`${R0(Q.lineDataSymbolLineColor||Q.chartColors[G%Q.chartColors.length])}`,V+="",V+="",V+=""}if(Q.showLabel){let F=Y5("-xxxx-xxxx-xxxx-xxxxxxxxxxxx");if(U.labels[0]&&(Q.dataLabelFormatScatter==="custom"||Q.dataLabelFormatScatter==="customXY"))V+="",U.labels[0].forEach((M,k)=>{if(Q.dataLabelFormatScatter==="custom"||Q.dataLabelFormatScatter==="customXY"){if(V+=" ",V+=` `,V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=' ',V+=" "+k0(M)+"",V+=" ",Q.dataLabelFormatScatter==="customXY"&&!/^ *$/.test(M))V+=" ",V+=' ',V+=" (",V+=" ",V+=' ',V+=' ',V+=" ",V+=" ",V+=" ",V+=" ["+k0(U.name)+"",V+=" ",V+=" ",V+=' ',V+=" , ",V+=" ",V+=' ',V+=' ',V+=" ",V+=" ",V+=" ",V+=" ["+k0(U.name)+"]",V+=" ",V+=" ",V+=' ',V+=" )",V+=" ",V+=' ';if(V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",Q.dataLabelPosition)V+=' ';V+=' ',V+=' ',V+=' ',V+=' ',V+=' ',V+=' ',V+=' ',V+=" ",V+=' ',V+=' ',V+=` `,V+=" ",V+=" ",V+=""}}),V+="";if(Q.dataLabelFormatScatter==="XY"){if(V+="",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=' ',V+=" ",V+=" ",Q.dataLabelPosition)V+=' ';V+=' ',V+=` `,V+=` `,V+=` `,V+=' ',V+=' ',V+=" ",V+=' ',V+=' ',V+=" ",V+=" ",V+=""}}if(q.length===1&&Q.chartColors!==z8)U.values.forEach((F,M)=>{let k=F<0?Q.invertedColors||Q.chartColors||z8:Q.chartColors||[];if(V+=" ",V+=` `,V+=' ',V+=' ',V+=" ",Q.lineSize===0)V+="";else V+="",V+=' ',V+="";V+=T1(Q.shadow,P1),V+=" ",V+=" "});V+="",V+=" ",V+=` Sheet1!$A$2:$A$${q[0].values.length+1}`,V+=" ",V+=" General",V+=` `,q[0].values.forEach((F,M)=>{V+=`${F||F===0?F:""}`}),V+=" ",V+=" ",V+="",V+="",V+=" ",V+=` Sheet1!$${j0(w+2)}$2:$${j0(w+2)}$${q[0].values.length+1}`,V+=" ",V+=" General",V+=` `,q[0].values.forEach((F,M)=>{V+=`${U.values[M]||U.values[M]===0?U.values[M]:""}`}),V+=" ",V+=" ",V+="",V+='',V+=""});{if(V+=" ",V+=` `,V+=" ",V+=" ",V+=" ",V+=" ",V+=` `,V+=" "+R0(Q.dataLabelColor||Q2)+"",V+=' ',V+=" ",V+=" ",V+=" ",Q.dataLabelPosition)V+=' ';V+=' ',V+=' ',V+=' ',V+=' ',V+=' ',V+=' ',V+=" "}V+=``,V+="";break;case q0.BUBBLE:case q0.BUBBLE3D:V+="",V+='',G=-1,q.filter((U,w)=>w>0).forEach((U,w)=>{G++,V+="",V+=` `,V+=` `,V+=" ",V+=" ",V+=" Sheet1!$"+j0(W+1)+"$1",V+=' '+k0(U.name)+"",V+=" ",V+=" ";{V+="";let F=Q.chartColors[G%Q.chartColors.length];if(F==="transparent")V+="";else if(Q.chartColorsOpacity)V+=`${R0(F,'')}`;else V+=""+R0(F)+"";if(Q.lineSize===0)V+="";else if(Q.dataBorder)V+=`${R0(Q.dataBorder.color)}`;else V+=`${R0(F)}`,V+=``;V+=T1(Q.shadow,P1),V+=""}V+="",V+=" ",V+=` Sheet1!$A$2:$A$${q[0].values.length+1}`,V+=" ",V+=" General",V+=` `,q[0].values.forEach((F,M)=>{V+=`${F||F===0?F:""}`}),V+=" ",V+=" ",V+="",V+="",V+=" ",V+=`Sheet1!$${j0(W+1)}$2:$${j0(W+1)}$${q[0].values.length+1}`,W++,V+=" ",V+=" General",V+=` `,q[0].values.forEach((F,M)=>{V+=`${U.values[M]||U.values[M]===0?U.values[M]:""}`}),V+=" ",V+=" ",V+="",V+=" ",V+=" ",V+=`Sheet1!$${j0(W+1)}$2:$${j0(W+1)}$${U.sizes.length+1}`,W++,V+=" ",V+=" General",V+=` `,U.sizes.forEach((F,M)=>{V+=`${F||""}`}),V+=" ",V+=" ",V+=" ",V+=' ',V+=""});{if(V+="",V+=``,V+="",V+=``,V+=`${R0(Q.dataLabelColor||Q2)}`,V+=``,V+="",Q.dataLabelPosition)V+=``;V+='',V+=``,V+=``,V+="",V+=' ',V+=' ',V+=" ",V+="",V+=""}V+=``,V+="";break;case q0.DOUGHNUT:case q0.PIE:if(B=q[0],V+="",V+=' ',V+="",V+=' ',V+=' ',V+=" ",V+=" ",V+=" Sheet1!$B$1",V+=" ",V+=' ',V+=' '+k0(B.name)+"",V+=" ",V+=" ",V+=" ",V+=" ",V+=' ',V+=' ',Q.dataNoEffects)V+="";else V+=T1(Q.shadow,P1);if(V+=" ",B.labels[0].forEach((U,w)=>{if(V+="",V+=` `,V+=' ',V+=" ",V+=`${R0(Q.chartColors[w+1>Q.chartColors.length?Math.floor(Math.random()*Q.chartColors.length):w])}`,Q.dataBorder)V+=`${R0(Q.dataBorder.color)}`;V+=T1(Q.shadow,P1),V+=" ",V+=""}),V+="",B.labels[0].forEach((U,w)=>{if(V+="",V+=` `,V+=` `,V+=" ",V+=" ",V+=" ",V+=` `,V+=" "+R0(Q.dataLabelColor||Q2)+"",V+=` `,V+=" ",V+=" ",V+=" ",$===q0.PIE&&Q.dataLabelPosition)V+=``;V+=' ',V+=' ',V+=' ',V+=' ',V+=' ',V+=' ',V+=" "}),V+=` `,V+=" ",V+=" ",V+=" ",V+=" ",V+=" ",V+=` `,V+=' ',V+=" ",V+=" ",V+=" ",V+=" ",V+=$===q0.PIE?'':"",V+=' ',V+=' ',V+=' ',V+=' ',V+=' ',V+=' ',V+=` `,V+="",V+="",V+=" ",V+=` Sheet1!$A$2:$A$${B.labels[0].length+1}`,V+=" ",V+=` `,B.labels[0].forEach((U,w)=>{V+=`${k0(U)}`}),V+=" ",V+=" ",V+="",V+=" ",V+=" ",V+=` Sheet1!$B$2:$B$${B.labels[0].length+1}`,V+=" ",V+=` `,B.values.forEach((U,w)=>{V+=`${U||U===0?U:""}`}),V+=" ",V+=" ",V+=" ",V+=" ",V+=` `,$===q0.DOUGHNUT)V+=``;V+="";break;default:V+="";break}return V}function A7($,q,Q){let K="";if($._type===q0.SCATTER||$._type===q0.BUBBLE||$._type===q0.BUBBLE3D)K+="";else K+="";if(K+=' ',K+=" ",K+='',$.catAxisMaxVal||$.catAxisMaxVal===0)K+=``;if($.catAxisMinVal||$.catAxisMinVal===0)K+=``;if(K+="",K+=' ',K+=' ',K+=$.catGridLine.style!=="none"?b7($.catGridLine):"",$.showCatAxisTitle)K+=H5({color:$.catAxisTitleColor,fontFace:$.catAxisTitleFontFace,fontSize:$.catAxisTitleFontSize,titleRotate:$.catAxisTitleRotate,title:$.catAxisTitle||"Axis Title"});if($._type===q0.SCATTER||$._type===q0.BUBBLE||$._type===q0.BUBBLE3D)K+=' ';else K+=' ';if($._type===q0.SCATTER)K+=' ',K+=' ',K+=' ';else K+=' ',K+=' ',K+=' ';if(K+=" ",K+=` `,K+=!$.catAxisLineShow?"":""+R0($.catAxisLineColor||u1.color)+"",K+=' ',K+=" ",K+=" ",K+=" ",K+=" ",$.catAxisLabelRotate)K+=``;else K+="";if(K+=" ",K+=" ",K+=" ",K+=` `,K+=" "+R0($.catAxisLabelColor||Q2)+"",K+=' ',K+=" ",K+=" ",K+=' ',K+=" ",K+=" ",K+=' ',K+=` `,K+=' ',K+=' ',K+=` `,$.catAxisLabelFrequency)K+=' ';if($.catLabelFormatCode||$._type===q0.SCATTER||$._type===q0.BUBBLE||$._type===q0.BUBBLE3D){if($.catLabelFormatCode){if(["catAxisBaseTimeUnit","catAxisMajorTimeUnit","catAxisMinorTimeUnit"].forEach((J)=>{if($[J]&&(typeof $[J]!=="string"||!["days","months","years"].includes($[J].toLowerCase())))console.warn(`"${J}" must be one of: 'days','months','years' !`),$[J]=null}),$.catAxisBaseTimeUnit)K+='';if($.catAxisMajorTimeUnit)K+='';if($.catAxisMinorTimeUnit)K+=''}if($.catAxisMajorUnit)K+=``;if($.catAxisMinorUnit)K+=``}if($._type===q0.SCATTER||$._type===q0.BUBBLE||$._type===q0.BUBBLE3D)K+="";else K+="";return K}function X7($,q){let Q=q===o2?$.barDir==="col"?"l":"b":$.barDir!=="col"?"r":"t";if(q===N5)Q="r";let K=q===o2?B8:x7,J="";if(J+="",J+=' ',J+=" ",$.valAxisLogScaleBase)J+=``;if(J+='',$.valAxisMaxVal||$.valAxisMaxVal===0)J+=``;if($.valAxisMinVal||$.valAxisMinVal===0)J+=``;if(J+=" ",J+=` `,J+=' ',$.valGridLine.style!=="none")J+=b7($.valGridLine);if($.showValAxisTitle)J+=H5({color:$.valAxisTitleColor,fontFace:$.valAxisTitleFontFace,fontSize:$.valAxisTitleFontSize,titleRotate:$.valAxisTitleRotate,title:$.valAxisTitle||"Axis Title"});if(J+=``,$._type===q0.SCATTER)J+=' ',J+=' ',J+=' ';else J+=' ',J+=' ',J+=' ';if(J+=" ",J+=` `,J+=!$.valAxisLineShow?"":""+R0($.valAxisLineColor||u1.color)+"",J+=' ',J+=" ",J+=" ",J+=" ",J+=" ",J+=` `,J+=" ",J+=" ",J+=" ",J+=` `,J+=" "+R0($.valAxisLabelColor||Q2)+"",J+=' ',J+=" ",J+=" ",J+=' ',J+=" ",J+=" ",J+=' ',typeof $.catAxisCrossesAt==="number")J+=` `;else if(typeof $.catAxisCrossesAt==="string")J+=' ';else J+=' ';if(J+=' ',$.valAxisMajorUnit)J+=` `;if($.valAxisDisplayUnit)J+=`${$.valAxisDisplayUnitLabel?"":""}`;return J+="",J}function OB($,q,Q){let K="";if(K+="",K+=' ',K+=' ',K+=' ',K+=' ',K+=$.serGridLine.style!=="none"?b7($.serGridLine):"",$.showSerAxisTitle)K+=H5({color:$.serAxisTitleColor,fontFace:$.serAxisTitleFontFace,fontSize:$.serAxisTitleFontSize,titleRotate:$.serAxisTitleRotate,title:$.serAxisTitle||"Axis Title"});if(K+=` `,K+=' ',K+=' ',K+=` `,K+=" ",K+=' ',K+=!$.serAxisLineShow?"":`${R0($.serAxisLineColor||u1.color)}`,K+=' ',K+=" ",K+=" ",K+=" ",K+=" ",K+=" ",K+=" ",K+=" ",K+=" ",K+=` `,K+=` ${R0($.serAxisLabelColor||Q2)}`,K+=` `,K+=" ",K+=" ",K+=' ',K+=" ",K+=" ",K+=' ',K+=' ',$.serAxisLabelFrequency)K+=' ';if($.serLabelFormatCode){if(["serAxisBaseTimeUnit","serAxisMajorTimeUnit","serAxisMinorTimeUnit"].forEach((J)=>{if($[J]&&(typeof $[J]!=="string"||!["days","months","years"].includes(J.toLowerCase())))console.warn(`"${J}" must be one of: 'days','months','years' !`),$[J]=null}),$.serAxisBaseTimeUnit)K+=` `;if($.serAxisMajorTimeUnit)K+=` `;if($.serAxisMinorTimeUnit)K+=` `;if($.serAxisMajorUnit)K+=` `;if($.serAxisMinorUnit)K+=` `}return K+="",K}function H5($,q,Q){let K=$.titleAlign==="left"||$.titleAlign==="right"?``:"",J=$.titleRotate?``:"",Z=$.fontSize?`sz="${Math.round($.fontSize*100)}"`:"",G=$.titleBold?1:0,W="";if($.titlePos&&typeof $.titlePos.x==="number"&&typeof $.titlePos.y==="number"){let B=$.titlePos.x+q,V=$.titlePos.y+Q,U=B===0?0:B*(B/5)/10;if(U>=1)U=U/10;if(U>=0.1)U=U/10;let w=V===0?0:V*(V/5)/10;if(w>=1)w=w/10;if(w>=0.1)w=w/10;W=``}return` ${J} @@ -38,46 +37,46 @@ ${K} - ${f0(Q.color||z1)} - + ${R0($.color||Q2)} + - ${f0(Q.color||z1)} - + ${R0($.color||Q2)} + - ${L0(Q.title)||""} + ${k0($.title)||""} - ${B} + ${W} -
`}function h0(Q){let $="",q=Q-1;if(q<=25)$=y8[q];else $=`${y8[Math.floor(q/y8.length-1)]}${y8[q%y8.length]}`;return $}function q6(Q,$){if(!Q)return"";else if(typeof Q!=="object")return console.warn("`shadow` options must be an object. Ex: `{shadow: {type:'none'}}`"),"";let q="",K=Object.assign(Object.assign({},$),Q),J=K.type||"outer",Z=Y0(K.blur),G=Y0(K.offset),B=Math.round(K.angle*60000),W=K.color,U=Math.round(K.opacity*1e5),V=K.rotateWithShape?1:0;return q+=``,q+=``,q+=``,q+=``,q+="",q}function H9(Q){let $="";return $+=" ",$+=` `,$+=' ',$+=' ',$+=" ",$+=" ",$+="",$}function n5(Q){if(!Q||Q==="flat")return"flat";else if(Q==="square")return"sq";else if(Q==="round")return"rnd";else throw new Error(`Invalid chart line cap: ${Q}`)}function G9(Q){var $,q;let K=typeof process!=="undefined"&&!!(($=process.versions)===null||$===void 0?void 0:$.node)&&((q=process.release)===null||q===void 0?void 0:q.name)==="node",J,Z,G=K?()=>H1(this,void 0,void 0,function*(){({default:J}=yield import("node:fs")),{default:Z}=yield Promise.resolve().then(() => (DJ(),LJ))}):()=>H1(this,void 0,void 0,function*(){});if(K)G();let B=[],W=Q._relsMedia.filter((V)=>V.type!=="online"&&!V.data&&(!V.path||V.path&&!V.path.includes("preencoded"))),U=[];return W.forEach((V)=>{if(!U.includes(V.path))V.isDuplicate=!1,U.push(V.path);else V.isDuplicate=!0}),W.filter((V)=>!V.isDuplicate).forEach((V)=>{B.push((()=>H1(this,void 0,void 0,function*(){if(!Z)yield G();if(K&&J&&V.path.indexOf("http")!==0)try{let N=J.readFileSync(V.path);return V.data=Buffer.from(N).toString("base64"),W.filter((F)=>F.isDuplicate&&F.path===V.path).forEach((F)=>F.data=V.data),"done"}catch(N){throw V.data=c6,W.filter((F)=>F.isDuplicate&&F.path===V.path).forEach((F)=>F.data=V.data),new Error(`ERROR: Unable to read media: "${V.path}" -${String(N)}`)}if(K&&Z&&V.path.startsWith("http"))return yield new Promise((N,F)=>{Z.get(V.path,(M)=>{let v="";M.setEncoding("binary"),M.on("data",(x)=>v+=x),M.on("end",()=>{V.data=Buffer.from(v,"binary").toString("base64"),W.filter((x)=>x.isDuplicate&&x.path===V.path).forEach((x)=>x.data=V.data),N("done")}),M.on("error",()=>{V.data=c6,W.filter((x)=>x.isDuplicate&&x.path===V.path).forEach((x)=>x.data=V.data),F(new Error(`ERROR! Unable to load image (https.get): ${V.path}`))})})});return yield new Promise((N,F)=>{let M=new XMLHttpRequest;M.onload=()=>{let v=new FileReader;v.onloadend=()=>{if(V.data=v.result,W.filter((x)=>x.isDuplicate&&x.path===V.path).forEach((x)=>x.data=V.data),!V.isSvgPng)N("done");else vJ(V).then(()=>N("done")).catch(F)},v.readAsDataURL(M.response)},M.onerror=()=>{V.data=c6,W.filter((v)=>v.isDuplicate&&v.path===V.path).forEach((v)=>v.data=V.data),F(new Error(`ERROR! Unable to load image (xhr.onerror): ${V.path}`))},M.open("GET",V.path),M.responseType="blob",M.send()})}))())}),Q._relsMedia.filter((V)=>V.isSvgPng&&V.data).forEach((V)=>{(()=>H1(this,void 0,void 0,function*(){if(K&&!J)yield G();if(K&&J)V.data=c6,B.push(Promise.resolve("done"));else B.push(vJ(V))}))()}),B}function vJ(Q){return H1(this,void 0,void 0,function*(){return yield new Promise(($,q)=>{let K=new Image;K.onload=()=>{if(K.width+K.height===0)K.onerror("h/w=0");let J=document.createElement("CANVAS"),Z=J.getContext("2d");J.width=K.width,J.height=K.height,Z.drawImage(K,0,0);try{Q.data=J.toDataURL(Q.type),$("done")}catch(G){K.onerror(G.toString())}J=null},K.onerror=()=>{Q.data=c6,q(new Error(`ERROR! Unable to load image (image.onerror): ${Q.path}`))},K.src=typeof Q.data==="string"?Q.data:c6})})}var Nz={cover:function(Q,$){let q=Q.h/Q.w,J=$.h/$.w>q,Z=J?$.h/q:$.w,G=J?$.h:$.w*q,B=Math.round(50000*(1-$.w/Z)),W=Math.round(50000*(1-$.h/G));return``},contain:function(Q,$){let q=Q.h/Q.w,J=$.h/$.w>q,Z=J?$.w:$.h/q,G=J?$.w*q:$.h,B=Math.round(50000*(1-$.w/Z)),W=Math.round(50000*(1-$.h/G));return``},crop:function(Q,$){let q=$.x,K=Q.w-($.x+$.w),J=$.y,Z=Q.h-($.y+$.h),G=Math.round(1e5*(q/Q.w)),B=Math.round(1e5*(K/Q.w)),W=Math.round(1e5*(J/Q.h)),U=Math.round(1e5*(Z/Q.h));return``}};function k9(Q){var $;let q=Q._name?'':"",K=1;if(Q._bkgdImgRid)q+=``;else if(($=Q.background)===null||$===void 0?void 0:$.color)q+=`${k1(Q.background)}`;else if(!Q.bkgd&&Q._name&&Q._name===B9)q+='';if(q+="",q+='',q+='',q+='',Q._slideObjects.forEach((J,Z)=>{var G,B,W,U,V,N,F,M;let v=0,x=0,y=v0("75%","X",Q._presLayout),D=0,z,Y="",H=null,R=null,c=0,m=0,$0=null,_=null,g=(G=J.options)===null||G===void 0?void 0:G.sizing,O=(B=J.options)===null||B===void 0?void 0:B.rounding;if(Q._slideLayout!==void 0&&Q._slideLayout._slideObjects!==void 0&&J.options&&J.options.placeholder)z=Q._slideLayout._slideObjects.filter((A)=>A.options.placeholder===J.options.placeholder)[0];if(J.options=J.options||{},typeof J.options.x!=="undefined")v=v0(J.options.x,"X",Q._presLayout);if(typeof J.options.y!=="undefined")x=v0(J.options.y,"Y",Q._presLayout);if(typeof J.options.w!=="undefined")y=v0(J.options.w,"X",Q._presLayout);if(typeof J.options.h!=="undefined")D=v0(J.options.h,"Y",Q._presLayout);let h=y,f=D;if(z){if(z.options.x||z.options.x===0)v=v0(z.options.x,"X",Q._presLayout);if(z.options.y||z.options.y===0)x=v0(z.options.y,"Y",Q._presLayout);if(z.options.w||z.options.w===0)y=v0(z.options.w,"X",Q._presLayout);if(z.options.h||z.options.h===0)D=v0(z.options.h,"Y",Q._presLayout)}if(J.options.flipH)Y+=' flipH="1"';if(J.options.flipV)Y+=' flipV="1"';if(J.options.rotate)Y+=` rot="${K6(J.options.rotate)}"`;switch(J._type){case D0.table:if(H=J.arrTabRows,R=J.options,c=0,m=0,H[0].forEach((A)=>{$0=A.options||null,c+=($0===null||$0===void 0?void 0:$0.colspan)?Number($0.colspan):1}),_=``,_+=' ',_+=``,_+='',Array.isArray(R.colW)){_+="";for(let A=0;A`}_+=""}else{if(m=R.colW?R.colW:H0,J.options.w&&!R.colW)m=Math.round((typeof J.options.w==="number"?J.options.w:1)/c);_+="";for(let A=0;A`;_+=""}H.forEach((A)=>{var I,n;for(let i=0;i1){let U0=new Array(z0-1).fill(void 0).map(()=>{return{_type:D0.tablecell,options:{rowspan:S},_hmerge:!0}});A.splice(i+1,0,...U0),i+=z0}else i+=1}}),H.forEach((A,I)=>{let n=H[I+1];if(!n)return;A.forEach((i,K0)=>{var z0,S;let U0=i._rowContinue||((z0=i.options)===null||z0===void 0?void 0:z0.rowspan),k=(S=i.options)===null||S===void 0?void 0:S.colspan,u=i._hmerge;if(U0&&U0>1){let Q0={_type:D0.tablecell,options:{colspan:k},_rowContinue:U0-1,_vmerge:!0,_hmerge:u};n.splice(K0,0,Q0)}})}),H.forEach((A,I)=>{let n=0;if(Array.isArray(R.rowH)&&R.rowH[I])n=C0(Number(R.rowH[I]));else if(R.rowH&&!isNaN(Number(R.rowH)))n=C0(Number(R.rowH));else if(J.options.cy||J.options.h)n=Math.round((J.options.h?C0(J.options.h):typeof J.options.cy==="number"?J.options.cy:1)/H.length);_+=``,A.forEach((i)=>{var K0,z0,S,U0,k;let u=i,Q0={rowSpan:((K0=u.options)===null||K0===void 0?void 0:K0.rowspan)>1?u.options.rowspan:void 0,gridSpan:((z0=u.options)===null||z0===void 0?void 0:z0.colspan)>1?u.options.colspan:void 0,vMerge:u._vmerge?1:void 0,hMerge:u._hmerge?1:void 0},E=Object.keys(Q0).map((Z0)=>[Z0,Q0[Z0]]).filter(([,Z0])=>!!Z0).map(([Z0,W0])=>`${String(Z0)}="${String(W0)}"`).join(" ");if(E)E=" "+E;if(u._hmerge||u._vmerge){_+=``;return}let q0=u.options||{};u.options=q0,["align","bold","border","color","fill","fontFace","fontSize","margin","textDirection","underline","valign"].forEach((Z0)=>{if(R[Z0]&&!q0[Z0]&&q0[Z0]!==0)q0[Z0]=R[Z0]});let B0=q0.valign?` anchor="${q0.valign.replace(/^c$/i,"ctr").replace(/^m$/i,"ctr").replace("center","ctr").replace("middle","ctr").replace("top","t").replace("btm","b").replace("bottom","b")}"`:"",w0=q0.textDirection&&q0.textDirection!=="horz"?` vert="${q0.textDirection}"`:"",M0=((U0=(S=u._optImp)===null||S===void 0?void 0:S.fill)===null||U0===void 0?void 0:U0.color)?u._optImp.fill.color:((k=u._optImp)===null||k===void 0?void 0:k.fill)&&typeof u._optImp.fill==="string"?u._optImp.fill:"";M0=M0||q0.fill?q0.fill:"";let b=M0?k1(M0):"",T=q0.margin===0||q0.margin?q0.margin:CJ;if(!Array.isArray(T)&&typeof T==="number")T=[T,T,T,T];let t="";if(T[0]>=1)t=` marL="${Y0(T[3])}" marR="${Y0(T[1])}" marT="${Y0(T[0])}" marB="${Y0(T[2])}"`;else t=` marL="${C0(T[3])}" marR="${C0(T[1])}" marT="${C0(T[0])}" marB="${C0(T[2])}"`;if(_+=`${RJ(u)}`,q0.border&&Array.isArray(q0.border))[{idx:3,name:"lnL"},{idx:1,name:"lnR"},{idx:0,name:"lnT"},{idx:2,name:"lnB"}].forEach((Z0)=>{if(q0.border[Z0.idx].type!=="none")_+=``,_+=`${f0(q0.border[Z0.idx].color)}`,_+=``,_+=``;else _+=``});_+=b,_+=" ",_+=" "}),_+=""}),_+=" ",_+=" ",_+=" ",_+="",q+=_,K++;break;case D0.text:case D0.placeholder:if(!J.options.line&&D===0)D=H0*0.3;if(!J.options._bodyProp)J.options._bodyProp={};if(J.options.margin&&Array.isArray(J.options.margin))J.options._bodyProp.lIns=Y0(J.options.margin[0]||0),J.options._bodyProp.rIns=Y0(J.options.margin[1]||0),J.options._bodyProp.bIns=Y0(J.options.margin[2]||0),J.options._bodyProp.tIns=Y0(J.options.margin[3]||0);else if(typeof J.options.margin==="number")J.options._bodyProp.lIns=Y0(J.options.margin),J.options._bodyProp.rIns=Y0(J.options.margin),J.options._bodyProp.bIns=Y0(J.options.margin),J.options._bodyProp.tIns=Y0(J.options.margin);if(q+="",q+=``,(W=J.options.hyperlink)===null||W===void 0?void 0:W.url)q+=``;if((U=J.options.hyperlink)===null||U===void 0?void 0:U.slide)q+=``;if(q+="",q+="':"/>"),q+=`${J._type==="placeholder"?b5(J):b5(z)}`,q+="",q+=``,q+=``,q+=``,J.shape==="custGeom")q+="",q+="",q+="",q+="",q+="",q+="",q+='',q+="",q+=``,(N=J.options.points)===null||N===void 0||N.forEach((A,I)=>{if("curve"in A)switch(A.curve.type){case"arc":q+=``;break;case"cubic":q+=` - - - - `;break;case"quadratic":q+=` - - - `;break}else if("close"in A)q+="";else if(A.moveTo||I===0)q+=``;else q+=``}),q+="",q+="",q+="";else{if(q+='',J.options.rectRadius)q+=``;else if(J.options.angleRange){for(let A=0;A<2;A++){let I=J.options.angleRange[A];q+=``}if(J.options.arcThicknessRatio)q+=``}q+=""}if(q+=J.options.fill?k1(J.options.fill):"",J.options.line){if(q+=J.options.line.width?``:"",J.options.line.color)q+=k1(J.options.line);if(J.options.line.dashType)q+=``;if(J.options.line.beginArrowType)q+=``;if(J.options.line.endArrowType)q+=``;q+=""}if(J.options.shadow&&J.options.shadow.type!=="none")J.options.shadow.type=J.options.shadow.type||"outer",J.options.shadow.blur=Y0(J.options.shadow.blur||8),J.options.shadow.offset=Y0(J.options.shadow.offset||4),J.options.shadow.angle=Math.round((J.options.shadow.angle||270)*60000),J.options.shadow.opacity=Math.round((J.options.shadow.opacity||0.75)*1e5),J.options.shadow.color=J.options.shadow.color||HJ.color,q+="",q+=` `,q+=` `,q+=` `,q+=" ",q+="";q+="",q+=RJ(J),q+="";break;case D0.image:if(q+="",q+=" ",q+=``,(F=J.hyperlink)===null||F===void 0?void 0:F.url)q+=``;if((M=J.hyperlink)===null||M===void 0?void 0:M.slide)q+=``;if(q+=" ",q+=' ',q+=" "+b5(z)+"",q+=" ",q+="",(Q._relsMedia||[]).filter((A)=>A.rId===J.imageRid)[0]&&(Q._relsMedia||[]).filter((A)=>A.rId===J.imageRid)[0].extn==="svg")q+=``,q+=J.options.transparency?` `:"",q+=" ",q+=' ',q+=` `,q+=" ",q+=" ",q+="";else q+=``,q+=J.options.transparency?``:"",q+="";if(g===null||g===void 0?void 0:g.type){let A=g.w?v0(g.w,"X",Q._presLayout):y,I=g.h?v0(g.h,"Y",Q._presLayout):D,n=v0(g.x||0,"X",Q._presLayout),i=v0(g.y||0,"Y",Q._presLayout);q+=Nz[g.type]({w:h,h:f},{w:A,h:I,x:n,y:i}),h=A,f=I}else q+=" ";if(q+="",q+="",q+=" ",q+=` `,q+=` `,q+=" ",q+=` `,J.options.shadow&&J.options.shadow.type!=="none")J.options.shadow.type=J.options.shadow.type||"outer",J.options.shadow.blur=Y0(J.options.shadow.blur||8),J.options.shadow.offset=Y0(J.options.shadow.offset||4),J.options.shadow.angle=Math.round((J.options.shadow.angle||270)*60000),J.options.shadow.opacity=Math.round((J.options.shadow.opacity||0.75)*1e5),J.options.shadow.color=J.options.shadow.color||HJ.color,q+="",q+=``,q+=``,q+=``,q+=``,q+="";q+="",q+="";break;case D0.media:if(J.mtype==="online")q+="",q+=" ",q+=``,q+=" ",q+=" ",q+=` `,q+=" ",q+=" ",q+=` `,q+=" ",q+=` `,q+=' ',q+=" ",q+="";else q+="",q+=" ",q+=``,q+=' ',q+=" ",q+=` `,q+=" ",q+=' ',q+=` `,q+=" ",q+=" ",q+=" ",q+=" ",q+=` `,q+=" ",q+=` `,q+=' ',q+=" ",q+="";break;case D0.chart:q+="",q+=" ",q+=` `,q+=" ",q+=` ${b5(z)}`,q+=" ",q+=` `,q+=' ',q+=' ',q+=` `,q+=" ",q+=" ",q+="";break;default:q+="";break}}),Q._slideNumberProps){if(!Q._slideNumberProps.align)Q._slideNumberProps.align="left";if(q+="",q+=" ",q+=' ',q+=' ',q+=" ",q+=" ",q+=` `,q+="",q+="`,Q._slideNumberProps.color)q+=k1(Q._slideNumberProps.color);if(Q._slideNumberProps.fontFace)q+=``;q+=""}if(q+="",q+="",Q._slideNumberProps.align.startsWith("l"))q+='';else if(Q._slideNumberProps.align.startsWith("c"))q+='';else if(Q._slideNumberProps.align.startsWith("r"))q+='';else q+='';q+=``,q+=`${Q._slideNum}`,q+=""}return q+="",q+="",q}function v9(Q,$){let q=0,K=''+r0+'';return Q._rels.forEach((J)=>{if(q=Math.max(q,J.rId),J.type.toLowerCase().includes("hyperlink"))if(J.data==="slide")K+=``;else K+=``;else if(J.type.toLowerCase().includes("notesSlide"))K+=``}),(Q._relsChart||[]).forEach((J)=>{q=Math.max(q,J.rId),K+=``}),(Q._relsMedia||[]).forEach((J)=>{let Z=J.rId.toString();if(q=Math.max(q,J.rId),J.type.toLowerCase().includes("image"))K+='';else if(J.type.toLowerCase().includes("audio"))if(K.includes(' Target="'+J.Target+'"'))K+='';else K+='';else if(J.type.toLowerCase().includes("video"))if(K.includes(' Target="'+J.Target+'"'))K+='';else K+='';else if(J.type.toLowerCase().includes("online"))if(K.includes(' Target="'+J.Target+'"'))K+='';else K+=''}),$.forEach((J,Z)=>{K+=``}),K+="",K}function IJ(Q,$){var q,K;let J="",Z="",G="",B="",W=$?"a:lvl1pPr":"a:pPr",U=Y0(tW),V=`<${W}${Q.options.rtlMode?' rtl="1" ':""}`;{if(Q.options.align)switch(Q.options.align){case"left":V+=' algn="l"';break;case"right":V+=' algn="r"';break;case"center":V+=' algn="ctr"';break;case"justify":V+=' algn="just"';break;default:V+="";break}if(Q.options.lineSpacing)Z=``;else if(Q.options.lineSpacingMultiple)Z=``;if(Q.options.indentLevel&&!isNaN(Number(Q.options.indentLevel))&&Q.options.indentLevel>0)V+=` lvl="${Q.options.indentLevel}"`;if(Q.options.paraSpaceBefore&&!isNaN(Number(Q.options.paraSpaceBefore))&&Q.options.paraSpaceBefore>0)G+=``;if(Q.options.paraSpaceAfter&&!isNaN(Number(Q.options.paraSpaceAfter))&&Q.options.paraSpaceAfter>0)G+=``;if(typeof Q.options.bullet==="object"){if((K=(q=Q===null||Q===void 0?void 0:Q.options)===null||q===void 0?void 0:q.bullet)===null||K===void 0?void 0:K.indent)U=Y0(Q.options.bullet.indent);if(Q.options.bullet.type){if(Q.options.bullet.type.toString().toLowerCase()==="number")V+=` marL="${Q.options.indentLevel&&Q.options.indentLevel>0?U+U*Q.options.indentLevel:U}" indent="-${U}"`,J=``}else if(Q.options.bullet.characterCode){let N=`&#x${Q.options.bullet.characterCode};`;if(!/^[0-9A-Fa-f]{4}$/.test(Q.options.bullet.characterCode))console.warn("Warning: `bullet.characterCode should be a 4-digit unicode charatcer (ex: 22AB)`!"),N=_6.DEFAULT;V+=` marL="${Q.options.indentLevel&&Q.options.indentLevel>0?U+U*Q.options.indentLevel:U}" indent="-${U}"`,J=''}else if(Q.options.bullet.code){let N=`&#x${Q.options.bullet.code};`;if(!/^[0-9A-Fa-f]{4}$/.test(Q.options.bullet.code))console.warn("Warning: `bullet.code should be a 4-digit hex code (ex: 22AB)`!"),N=_6.DEFAULT;V+=` marL="${Q.options.indentLevel&&Q.options.indentLevel>0?U+U*Q.options.indentLevel:U}" indent="-${U}"`,J=''}else V+=` marL="${Q.options.indentLevel&&Q.options.indentLevel>0?U+U*Q.options.indentLevel:U}" indent="-${U}"`,J=``}else if(Q.options.bullet)V+=` marL="${Q.options.indentLevel&&Q.options.indentLevel>0?U+U*Q.options.indentLevel:U}" indent="-${U}"`,J=``;else if(!Q.options.bullet)V+=' indent="0" marL="0"',J="";if(Q.options.tabStops&&Array.isArray(Q.options.tabStops))B=`${Q.options.tabStops.map((F)=>``).join("")}`;if(V+=">"+Z+G+J+B,$)V+=OJ(Q.options,!0);V+=""}return V}function OJ(Q,$){var q;let K="",J=$?"a:defRPr":"a:rPr";if(K+="<"+J+' lang="'+(Q.lang?Q.lang:"en-US")+'"'+(Q.lang?' altLang="en-US"':""),K+=Q.fontSize?` sz="${Math.round(Q.fontSize*100)}"`:"",K+=(Q===null||Q===void 0?void 0:Q.bold)?` b="${Q.bold?"1":"0"}"`:"",K+=(Q===null||Q===void 0?void 0:Q.italic)?` i="${Q.italic?"1":"0"}"`:"",K+=(Q===null||Q===void 0?void 0:Q.strike)?` strike="${typeof Q.strike==="string"?Q.strike:"sngStrike"}"`:"",typeof Q.underline==="object"&&((q=Q.underline)===null||q===void 0?void 0:q.style))K+=` u="${Q.underline.style}"`;else if(typeof Q.underline==="string")K+=` u="${String(Q.underline)}"`;else if(Q.hyperlink)K+=' u="sng"';if(Q.baseline)K+=` baseline="${Math.round(Q.baseline*50)}"`;else if(Q.subscript)K+=' baseline="-40000"';else if(Q.superscript)K+=' baseline="30000"';if(K+=Q.charSpacing?` spc="${Math.round(Q.charSpacing*100)}" kern="0"`:"",K+=' dirty="0">',Q.color||Q.fontFace||Q.outline||typeof Q.underline==="object"&&Q.underline.color){if(Q.outline&&typeof Q.outline==="object")K+=`${k1(Q.outline.color||"FFFFFF")}`;if(Q.color)K+=k1({color:Q.color,transparency:Q.transparency});if(Q.highlight)K+=`${f0(Q.highlight)}`;if(typeof Q.underline==="object"&&Q.underline.color)K+=`${k1(Q.underline.color)}`;if(Q.glow)K+=`${Kz(Q.glow,Qz)}`;if(Q.fontFace)K+=``}if(Q.hyperlink){if(typeof Q.hyperlink!=="object")throw new Error("ERROR: text `hyperlink` option should be an object. Ex: `hyperlink:{url:'https://github.com'}` ");else if(!Q.hyperlink.url&&!Q.hyperlink.slide)throw new Error("ERROR: 'hyperlink requires either `url` or `slide`'");else if(Q.hyperlink.url)K+=`":"/>"}`;else if(Q.hyperlink.slide)K+=`":"/>"}`;if(Q.color)K+=" ",K+=' ',K+=' ',K+=" ",K+=" ",K+=""}return K+=``,K}function Yz(Q){return Q.text?`${OJ(Q.options,!1)}${L0(Q.text)}`:""}function Lz(Q){let $="";else if(Q.options.fit==="resize")$+=""}if(Q.options.shrinkText)$+="";$+=Q.options._bodyProp.autoFit?"":"",$+="
"}else $+=' wrap="square" rtlCol="0">',$+="
";return Q._type===D0.tablecell?"":$}function RJ(Q){let $=Q.options||{},q=[],K=[];if($&&Q._type!==D0.tablecell&&(typeof Q.text==="undefined"||Q.text===null))return"";let J=Q._type===D0.tablecell?"":"";if(J+=Lz(Q),$.h===0&&$.line&&$.align)J+='';else if(Q._type==="placeholder")J+=`${IJ(Q,!0)}`;else J+="";if(typeof Q.text==="string"||typeof Q.text==="number")q.push({text:Q.text.toString(),options:$||{}});else if(Q.text&&!Array.isArray(Q.text)&&typeof Q.text==="object"&&Object.keys(Q.text).includes("text"))q.push({text:Q.text||"",options:Q.options||{}});else if(Array.isArray(Q.text))q=Q.text.map((B)=>({text:B.text,options:B.options}));q.forEach((B,W)=>{if(!B.text)B.text="";if(B.options=B.options||$||{},W===0&&B.options&&!B.options.bullet&&$.bullet)B.options.bullet=$.bullet;if(typeof B.text==="string"||typeof B.text==="number")B.text=B.text.toString().replace(/\r*\n/g,r0);if(B.text.includes(r0)&&B.text.match(/\n$/g)===null)B.text.split(r0).forEach((U)=>{B.options.breakLine=!0,K.push({text:U,options:B.options})});else K.push(B)});let Z=[],G=[];if(K.forEach((B,W)=>{if(G.length>0&&(B.options.align||$.align)){if(B.options.align!==K[W-1].options.align)Z.push(G),G=[]}else if(G.length>0&&B.options.bullet&&G.length>0)Z.push(G),G=[],B.options.breakLine=!1;if(G.push(B),G.length>0&&B.options.breakLine){if(W+1{var W;let U=!1;J+="";let V=`{if(N.options._lineIdx=F,F>0&&N.options.softBreakBefore)J+="";if(N.options.align=N.options.align||$.align,N.options.lineSpacing=N.options.lineSpacing||$.lineSpacing,N.options.lineSpacingMultiple=N.options.lineSpacingMultiple||$.lineSpacingMultiple,N.options.indentLevel=N.options.indentLevel||$.indentLevel,N.options.paraSpaceBefore=N.options.paraSpaceBefore||$.paraSpaceBefore,N.options.paraSpaceAfter=N.options.paraSpaceAfter||$.paraSpaceAfter,V=IJ(N,!1),J+=V.replace("",""),Object.entries($).filter(([M])=>!(N.options.hyperlink&&M==="color")).forEach(([M,v])=>{if(M!=="bullet"&&!N.options[M])N.options[M]=v}),J+=Yz(N),!N.text&&$.fontSize||N.options.fontSize)U=!0,$.fontSize=$.fontSize||N.options.fontSize}),Q._type===D0.tablecell&&($.fontSize||$.fontFace))if($.fontFace)J+=`',J+=``,J+=``,J+=``,J+="";else J+=`';else if(U)J+=`';else J+=``;J+=""}),J.indexOf("")===-1)J+="";return J+=Q._type===D0.tablecell?"":"",J}function b5(Q){var $,q;if(!Q)return"";let K=(($=Q.options)===null||$===void 0?void 0:$._placeholderIdx)?Q.options._placeholderIdx:"",J=((q=Q.options)===null||q===void 0?void 0:q._placeholderType)?Q.options._placeholderType:"",Z=J&&O8[J]?O8[J].toString():"";return``}function j0($){let q="",Q=$-1;if(Q<=25)q=W8[Q];else q=`${W8[Math.floor(Q/W8.length-1)]}${W8[Q%W8.length]}`;return q}function T1($,q){if(!$)return"";else if(typeof $!=="object")return console.warn("`shadow` options must be an object. Ex: `{shadow: {type:'none'}}`"),"";let Q="",K=Object.assign(Object.assign({},q),$),J=K.type||"outer",Z=Y0(K.blur),G=Y0(K.offset),W=Math.round(K.angle*60000),B=K.color,V=Math.round(K.opacity*1e5),U=K.rotateWithShape?1:0;return Q+=``,Q+=``,Q+=``,Q+=``,Q+="",Q}function b7($){let q="";return q+=" ",q+=` `,q+=' ',q+=' ',q+=" ",q+=" ",q+="",q}function k5($){if(!$||$==="flat")return"flat";else if($==="square")return"sq";else if($==="round")return"rnd";else throw Error(`Invalid chart line cap: ${$}`)}function y7($){var q,Q;let K=typeof process<"u"&&!!((q=process.versions)===null||q===void 0?void 0:q.node)&&((Q=process.release)===null||Q===void 0?void 0:Q.name)==="node",J,Z,G=K?()=>W2(this,void 0,void 0,function*(){({default:J}=yield import("node:fs")),{default:Z}=yield Promise.resolve().then(() => (tK(),sK))}):()=>W2(this,void 0,void 0,function*(){});if(K)G();let W=[],B=$._relsMedia.filter((U)=>U.type!=="online"&&!U.data&&(!U.path||U.path&&!U.path.includes("preencoded"))),V=[];return B.forEach((U)=>{if(!V.includes(U.path))U.isDuplicate=!1,V.push(U.path);else U.isDuplicate=!0}),B.filter((U)=>!U.isDuplicate).forEach((U)=>{W.push((()=>W2(this,void 0,void 0,function*(){if(!Z)yield G();if(K&&J&&U.path.indexOf("http")!==0)try{let w=J.readFileSync(U.path);return U.data=Buffer.from(w).toString("base64"),B.filter((F)=>F.isDuplicate&&F.path===U.path).forEach((F)=>F.data=U.data),"done"}catch(w){throw U.data=j6,B.filter((F)=>F.isDuplicate&&F.path===U.path).forEach((F)=>F.data=U.data),Error(`ERROR: Unable to read media: "${U.path}" +${String(w)}`)}if(K&&Z&&U.path.startsWith("http"))return yield new Promise((w,F)=>{Z.get(U.path,(M)=>{let k="";M.setEncoding("binary"),M.on("data",(f)=>k+=f),M.on("end",()=>{U.data=Buffer.from(k,"binary").toString("base64"),B.filter((f)=>f.isDuplicate&&f.path===U.path).forEach((f)=>f.data=U.data),w("done")}),M.on("error",()=>{U.data=j6,B.filter((f)=>f.isDuplicate&&f.path===U.path).forEach((f)=>f.data=U.data),F(Error(`ERROR! Unable to load image (https.get): ${U.path}`))})})});return yield new Promise((w,F)=>{let M=new XMLHttpRequest;M.onload=()=>{let k=new FileReader;k.onloadend=()=>{if(U.data=k.result,B.filter((f)=>f.isDuplicate&&f.path===U.path).forEach((f)=>f.data=U.data),!U.isSvgPng)w("done");else QJ(U).then(()=>w("done")).catch(F)},k.readAsDataURL(M.response)},M.onerror=()=>{U.data=j6,B.filter((k)=>k.isDuplicate&&k.path===U.path).forEach((k)=>k.data=U.data),F(Error(`ERROR! Unable to load image (xhr.onerror): ${U.path}`))},M.open("GET",U.path),M.responseType="blob",M.send()})}))())}),$._relsMedia.filter((U)=>U.isSvgPng&&U.data).forEach((U)=>{(()=>W2(this,void 0,void 0,function*(){if(K&&!J)yield G();if(K&&J)U.data=j6,W.push(Promise.resolve("done"));else W.push(QJ(U))}))()}),W}function QJ($){return W2(this,void 0,void 0,function*(){return yield new Promise((q,Q)=>{let K=new Image;K.onload=()=>{if(K.width+K.height===0)K.onerror("h/w=0");let J=document.createElement("CANVAS"),Z=J.getContext("2d");J.width=K.width,J.height=K.height,Z.drawImage(K,0,0);try{$.data=J.toDataURL($.type),q("done")}catch(G){K.onerror(G.toString())}J=null},K.onerror=()=>{$.data=j6,Q(Error(`ERROR! Unable to load image (image.onerror): ${$.path}`))},K.src=typeof $.data==="string"?$.data:j6})})}var PB={cover:function($,q){let Q=$.h/$.w,J=q.h/q.w>Q,Z=J?q.h/Q:q.w,G=J?q.h:q.w*Q,W=Math.round(50000*(1-q.w/Z)),B=Math.round(50000*(1-q.h/G));return``},contain:function($,q){let Q=$.h/$.w,J=q.h/q.w>Q,Z=J?q.w:q.h/Q,G=J?q.w*Q:q.h,W=Math.round(50000*(1-q.w/Z)),B=Math.round(50000*(1-q.h/G));return``},crop:function($,q){let Q=q.x,K=$.w-(q.x+q.w),J=q.y,Z=$.h-(q.y+q.h),G=Math.round(1e5*(Q/$.w)),W=Math.round(1e5*(K/$.w)),B=Math.round(1e5*(J/$.h)),V=Math.round(1e5*(Z/$.h));return``}};function n7($){var q;let Q=$._name?'':"",K=1;if($._bkgdImgRid)Q+=``;else if((q=$.background)===null||q===void 0?void 0:q.color)Q+=`${B2($.background)}`;else if(!$.bkgd&&$._name&&$._name===h7)Q+='';if(Q+="",Q+='',Q+='',Q+='',$._slideObjects.forEach((J,Z)=>{var G,W,B,V,U,w,F,M;let k=0,f=0,L=H0("75%","X",$._presLayout),D=0,z,N="",H=null,v=null,j=0,n=0,d=null,_=null,X=(G=J.options)===null||G===void 0?void 0:G.sizing,P=(W=J.options)===null||W===void 0?void 0:W.rounding;if($._slideLayout!==void 0&&$._slideLayout._slideObjects!==void 0&&J.options&&J.options.placeholder)z=$._slideLayout._slideObjects.filter((h)=>h.options.placeholder===J.options.placeholder)[0];if(J.options=J.options||{},typeof J.options.x<"u")k=H0(J.options.x,"X",$._presLayout);if(typeof J.options.y<"u")f=H0(J.options.y,"Y",$._presLayout);if(typeof J.options.w<"u")L=H0(J.options.w,"X",$._presLayout);if(typeof J.options.h<"u")D=H0(J.options.h,"Y",$._presLayout);let g=L,c=D;if(z){if(z.options.x||z.options.x===0)k=H0(z.options.x,"X",$._presLayout);if(z.options.y||z.options.y===0)f=H0(z.options.y,"Y",$._presLayout);if(z.options.w||z.options.w===0)L=H0(z.options.w,"X",$._presLayout);if(z.options.h||z.options.h===0)D=H0(z.options.h,"Y",$._presLayout)}if(J.options.flipH)N+=' flipH="1"';if(J.options.flipV)N+=' flipV="1"';if(J.options.rotate)N+=` rot="${S1(J.options.rotate)}"`;switch(J._type){case D0.table:if(H=J.arrTabRows,v=J.options,j=0,n=0,H[0].forEach((h)=>{d=h.options||null,j+=(d===null||d===void 0?void 0:d.colspan)?Number(d.colspan):1}),_=``,_+=' ',_+=``,_+='',Array.isArray(v.colW)){_+="";for(let h=0;h`}_+=""}else{if(n=v.colW?v.colW:L0,J.options.w&&!v.colW)n=Math.round((typeof J.options.w==="number"?J.options.w:1)/j);_+="";for(let h=0;h`;_+=""}H.forEach((h)=>{var x,l;for(let $0=0;$01){let W0=Array(F0-1).fill(void 0).map(()=>{return{_type:D0.tablecell,options:{rowspan:p},_hmerge:!0}});h.splice($0+1,0,...W0),$0+=F0}else $0+=1}}),H.forEach((h,x)=>{let l=H[x+1];if(!l)return;h.forEach(($0,Z0)=>{var F0,p;let W0=$0._rowContinue||((F0=$0.options)===null||F0===void 0?void 0:F0.rowspan),y=(p=$0.options)===null||p===void 0?void 0:p.colspan,i=$0._hmerge;if(W0&&W0>1){let U0={_type:D0.tablecell,options:{colspan:y},_rowContinue:W0-1,_vmerge:!0,_hmerge:i};l.splice(Z0,0,U0)}})}),H.forEach((h,x)=>{let l=0;if(Array.isArray(v.rowH)&&v.rowH[x])l=v0(Number(v.rowH[x]));else if(v.rowH&&!isNaN(Number(v.rowH)))l=v0(Number(v.rowH));else if(J.options.cy||J.options.h)l=Math.round((J.options.h?v0(J.options.h):typeof J.options.cy==="number"?J.options.cy:1)/H.length);_+=``,h.forEach(($0)=>{var Z0,F0,p,W0,y;let i=$0,U0={rowSpan:((Z0=i.options)===null||Z0===void 0?void 0:Z0.rowspan)>1?i.options.rowspan:void 0,gridSpan:((F0=i.options)===null||F0===void 0?void 0:F0.colspan)>1?i.options.colspan:void 0,vMerge:i._vmerge?1:void 0,hMerge:i._hmerge?1:void 0},m=Object.keys(U0).map((K0)=>[K0,U0[K0]]).filter(([,K0])=>!!K0).map(([K0,R])=>`${String(K0)}="${String(R)}"`).join(" ");if(m)m=" "+m;if(i._hmerge||i._vmerge){_+=``;return}let V0=i.options||{};i.options=V0,["align","bold","border","color","fill","fontFace","fontSize","margin","textDirection","underline","valign"].forEach((K0)=>{if(v[K0]&&!V0[K0]&&V0[K0]!==0)V0[K0]=v[K0]});let w0=V0.valign?` anchor="${V0.valign.replace(/^c$/i,"ctr").replace(/^m$/i,"ctr").replace("center","ctr").replace("middle","ctr").replace("top","t").replace("btm","b").replace("bottom","b")}"`:"",S=V0.textDirection&&V0.textDirection!=="horz"?` vert="${V0.textDirection}"`:"",b=((W0=(p=i._optImp)===null||p===void 0?void 0:p.fill)===null||W0===void 0?void 0:W0.color)?i._optImp.fill.color:((y=i._optImp)===null||y===void 0?void 0:y.fill)&&typeof i._optImp.fill==="string"?i._optImp.fill:"";b=b||V0.fill?V0.fill:"";let O=b?B2(b):"",E=V0.margin===0||V0.margin?V0.margin:JJ;if(!Array.isArray(E)&&typeof E==="number")E=[E,E,E,E];let a="";if(E[0]>=1)a=` marL="${Y0(E[3])}" marR="${Y0(E[1])}" marT="${Y0(E[0])}" marB="${Y0(E[2])}"`;else a=` marL="${v0(E[3])}" marR="${v0(E[1])}" marT="${v0(E[0])}" marB="${v0(E[2])}"`;if(_+=`${KJ(i)}`,V0.border&&Array.isArray(V0.border))[{idx:3,name:"lnL"},{idx:1,name:"lnR"},{idx:0,name:"lnT"},{idx:2,name:"lnB"}].forEach((K0)=>{if(V0.border[K0.idx].type!=="none")_+=``,_+=`${R0(V0.border[K0.idx].color)}`,_+=``,_+=``;else _+=``});_+=O,_+=" ",_+=" "}),_+=""}),_+=" ",_+=" ",_+=" ",_+="",Q+=_,K++;break;case D0.text:case D0.placeholder:if(!J.options.line&&D===0)D=L0*0.3;if(!J.options._bodyProp)J.options._bodyProp={};if(J.options.margin&&Array.isArray(J.options.margin))J.options._bodyProp.lIns=Y0(J.options.margin[0]||0),J.options._bodyProp.rIns=Y0(J.options.margin[1]||0),J.options._bodyProp.bIns=Y0(J.options.margin[2]||0),J.options._bodyProp.tIns=Y0(J.options.margin[3]||0);else if(typeof J.options.margin==="number")J.options._bodyProp.lIns=Y0(J.options.margin),J.options._bodyProp.rIns=Y0(J.options.margin),J.options._bodyProp.bIns=Y0(J.options.margin),J.options._bodyProp.tIns=Y0(J.options.margin);if(Q+="",Q+=``,(B=J.options.hyperlink)===null||B===void 0?void 0:B.url)Q+=``;if((V=J.options.hyperlink)===null||V===void 0?void 0:V.slide)Q+=``;if(Q+="",Q+="':"/>"),Q+=`${J._type==="placeholder"?w5(J):w5(z)}`,Q+="",Q+=``,Q+=``,Q+=``,J.shape==="custGeom")Q+="",Q+="",Q+="",Q+="",Q+="",Q+="",Q+='',Q+="",Q+=``,(w=J.options.points)===null||w===void 0||w.forEach((h,x)=>{if("curve"in h)switch(h.curve.type){case"arc":Q+=``;break;case"cubic":Q+=` + + + + `;break;case"quadratic":Q+=` + + + `;break}else if("close"in h)Q+="";else if(h.moveTo||x===0)Q+=``;else Q+=``}),Q+="",Q+="",Q+="";else{if(Q+='',J.options.rectRadius)Q+=``;else if(J.options.angleRange){for(let h=0;h<2;h++){let x=J.options.angleRange[h];Q+=``}if(J.options.arcThicknessRatio)Q+=``}Q+=""}if(Q+=J.options.fill?B2(J.options.fill):"",J.options.line){if(Q+=J.options.line.width?``:"",J.options.line.color)Q+=B2(J.options.line);if(J.options.line.dashType)Q+=``;if(J.options.line.beginArrowType)Q+=``;if(J.options.line.endArrowType)Q+=``;Q+=""}if(J.options.shadow&&J.options.shadow.type!=="none")J.options.shadow.type=J.options.shadow.type||"outer",J.options.shadow.blur=Y0(J.options.shadow.blur||8),J.options.shadow.offset=Y0(J.options.shadow.offset||4),J.options.shadow.angle=Math.round((J.options.shadow.angle||270)*60000),J.options.shadow.opacity=Math.round((J.options.shadow.opacity||0.75)*1e5),J.options.shadow.color=J.options.shadow.color||eK.color,Q+="",Q+=` `,Q+=` `,Q+=` `,Q+=" ",Q+="";Q+="",Q+=KJ(J),Q+="";break;case D0.image:if(Q+="",Q+=" ",Q+=``,(F=J.hyperlink)===null||F===void 0?void 0:F.url)Q+=``;if((M=J.hyperlink)===null||M===void 0?void 0:M.slide)Q+=``;if(Q+=" ",Q+=' ',Q+=" "+w5(z)+"",Q+=" ",Q+="",($._relsMedia||[]).filter((h)=>h.rId===J.imageRid)[0]&&($._relsMedia||[]).filter((h)=>h.rId===J.imageRid)[0].extn==="svg")Q+=``,Q+=J.options.transparency?` `:"",Q+=" ",Q+=' ',Q+=` `,Q+=" ",Q+=" ",Q+="";else Q+=``,Q+=J.options.transparency?``:"",Q+="";if(X===null||X===void 0?void 0:X.type){let h=X.w?H0(X.w,"X",$._presLayout):L,x=X.h?H0(X.h,"Y",$._presLayout):D,l=H0(X.x||0,"X",$._presLayout),$0=H0(X.y||0,"Y",$._presLayout);Q+=PB[X.type]({w:g,h:c},{w:h,h:x,x:l,y:$0}),g=h,c=x}else Q+=" ";if(Q+="",Q+="",Q+=" ",Q+=` `,Q+=` `,Q+=" ",Q+=` `,J.options.shadow&&J.options.shadow.type!=="none")J.options.shadow.type=J.options.shadow.type||"outer",J.options.shadow.blur=Y0(J.options.shadow.blur||8),J.options.shadow.offset=Y0(J.options.shadow.offset||4),J.options.shadow.angle=Math.round((J.options.shadow.angle||270)*60000),J.options.shadow.opacity=Math.round((J.options.shadow.opacity||0.75)*1e5),J.options.shadow.color=J.options.shadow.color||eK.color,Q+="",Q+=``,Q+=``,Q+=``,Q+=``,Q+="";Q+="",Q+="";break;case D0.media:if(J.mtype==="online")Q+="",Q+=" ",Q+=``,Q+=" ",Q+=" ",Q+=` `,Q+=" ",Q+=" ",Q+=` `,Q+=" ",Q+=` `,Q+=' ',Q+=" ",Q+="";else Q+="",Q+=" ",Q+=``,Q+=' ',Q+=" ",Q+=` `,Q+=" ",Q+=' ',Q+=` `,Q+=" ",Q+=" ",Q+=" ",Q+=" ",Q+=` `,Q+=" ",Q+=` `,Q+=' ',Q+=" ",Q+="";break;case D0.chart:Q+="",Q+=" ",Q+=` `,Q+=" ",Q+=` ${w5(z)}`,Q+=" ",Q+=` `,Q+=' ',Q+=' ',Q+=` `,Q+=" ",Q+=" ",Q+="";break;default:Q+="";break}}),$._slideNumberProps){if(!$._slideNumberProps.align)$._slideNumberProps.align="left";if(Q+="",Q+=" ",Q+=' ',Q+=' ',Q+=" ",Q+=" ",Q+=` `,Q+="",Q+="`,$._slideNumberProps.color)Q+=B2($._slideNumberProps.color);if($._slideNumberProps.fontFace)Q+=``;Q+=""}if(Q+="",Q+="",$._slideNumberProps.align.startsWith("l"))Q+='';else if($._slideNumberProps.align.startsWith("c"))Q+='';else if($._slideNumberProps.align.startsWith("r"))Q+='';else Q+='';Q+=``,Q+=`${$._slideNum}`,Q+=""}return Q+="",Q+="",Q}function d7($,q){let Q=0,K=''+n0+'';return $._rels.forEach((J)=>{if(Q=Math.max(Q,J.rId),J.type.toLowerCase().includes("hyperlink"))if(J.data==="slide")K+=``;else K+=``;else if(J.type.toLowerCase().includes("notesSlide"))K+=``}),($._relsChart||[]).forEach((J)=>{Q=Math.max(Q,J.rId),K+=``}),($._relsMedia||[]).forEach((J)=>{let Z=J.rId.toString();if(Q=Math.max(Q,J.rId),J.type.toLowerCase().includes("image"))K+='';else if(J.type.toLowerCase().includes("audio"))if(K.includes(' Target="'+J.Target+'"'))K+='';else K+='';else if(J.type.toLowerCase().includes("video"))if(K.includes(' Target="'+J.Target+'"'))K+='';else K+='';else if(J.type.toLowerCase().includes("online"))if(K.includes(' Target="'+J.Target+'"'))K+='';else K+=''}),q.forEach((J,Z)=>{K+=``}),K+="",K}function qJ($,q){var Q,K;let J="",Z="",G="",W="",B=q?"a:lvl1pPr":"a:pPr",V=Y0(kB),U=`<${B}${$.options.rtlMode?' rtl="1" ':""}`;{if($.options.align)switch($.options.align){case"left":U+=' algn="l"';break;case"right":U+=' algn="r"';break;case"center":U+=' algn="ctr"';break;case"justify":U+=' algn="just"';break;default:U+="";break}if($.options.lineSpacing)Z=``;else if($.options.lineSpacingMultiple)Z=``;if($.options.indentLevel&&!isNaN(Number($.options.indentLevel))&&$.options.indentLevel>0)U+=` lvl="${$.options.indentLevel}"`;if($.options.paraSpaceBefore&&!isNaN(Number($.options.paraSpaceBefore))&&$.options.paraSpaceBefore>0)G+=``;if($.options.paraSpaceAfter&&!isNaN(Number($.options.paraSpaceAfter))&&$.options.paraSpaceAfter>0)G+=``;if(typeof $.options.bullet==="object"){if((K=(Q=$===null||$===void 0?void 0:$.options)===null||Q===void 0?void 0:Q.bullet)===null||K===void 0?void 0:K.indent)V=Y0($.options.bullet.indent);if($.options.bullet.type){if($.options.bullet.type.toString().toLowerCase()==="number")U+=` marL="${$.options.indentLevel&&$.options.indentLevel>0?V+V*$.options.indentLevel:V}" indent="-${V}"`,J=``}else if($.options.bullet.characterCode){let w=`&#x${$.options.bullet.characterCode};`;if(!/^[0-9A-Fa-f]{4}$/.test($.options.bullet.characterCode))console.warn("Warning: `bullet.characterCode should be a 4-digit unicode charatcer (ex: 22AB)`!"),w=C6.DEFAULT;U+=` marL="${$.options.indentLevel&&$.options.indentLevel>0?V+V*$.options.indentLevel:V}" indent="-${V}"`,J=''}else if($.options.bullet.code){let w=`&#x${$.options.bullet.code};`;if(!/^[0-9A-Fa-f]{4}$/.test($.options.bullet.code))console.warn("Warning: `bullet.code should be a 4-digit hex code (ex: 22AB)`!"),w=C6.DEFAULT;U+=` marL="${$.options.indentLevel&&$.options.indentLevel>0?V+V*$.options.indentLevel:V}" indent="-${V}"`,J=''}else U+=` marL="${$.options.indentLevel&&$.options.indentLevel>0?V+V*$.options.indentLevel:V}" indent="-${V}"`,J=``}else if($.options.bullet)U+=` marL="${$.options.indentLevel&&$.options.indentLevel>0?V+V*$.options.indentLevel:V}" indent="-${V}"`,J=``;else if(!$.options.bullet)U+=' indent="0" marL="0"',J="";if($.options.tabStops&&Array.isArray($.options.tabStops))W=`${$.options.tabStops.map((F)=>``).join("")}`;if(U+=">"+Z+G+J+W,q)U+=MJ($.options,!0);U+=""}return U}function MJ($,q){var Q;let K="",J=q?"a:defRPr":"a:rPr";if(K+="<"+J+' lang="'+($.lang?$.lang:"en-US")+'"'+($.lang?' altLang="en-US"':""),K+=$.fontSize?` sz="${Math.round($.fontSize*100)}"`:"",K+=($===null||$===void 0?void 0:$.bold)?` b="${$.bold?"1":"0"}"`:"",K+=($===null||$===void 0?void 0:$.italic)?` i="${$.italic?"1":"0"}"`:"",K+=($===null||$===void 0?void 0:$.strike)?` strike="${typeof $.strike==="string"?$.strike:"sngStrike"}"`:"",typeof $.underline==="object"&&((Q=$.underline)===null||Q===void 0?void 0:Q.style))K+=` u="${$.underline.style}"`;else if(typeof $.underline==="string")K+=` u="${String($.underline)}"`;else if($.hyperlink)K+=' u="sng"';if($.baseline)K+=` baseline="${Math.round($.baseline*50)}"`;else if($.subscript)K+=' baseline="-40000"';else if($.superscript)K+=' baseline="30000"';if(K+=$.charSpacing?` spc="${Math.round($.charSpacing*100)}" kern="0"`:"",K+=' dirty="0">',$.color||$.fontFace||$.outline||typeof $.underline==="object"&&$.underline.color){if($.outline&&typeof $.outline==="object")K+=`${B2($.outline.color||"FFFFFF")}`;if($.color)K+=B2({color:$.color,transparency:$.transparency});if($.highlight)K+=`${R0($.highlight)}`;if(typeof $.underline==="object"&&$.underline.color)K+=`${B2($.underline.color)}`;if($.glow)K+=`${fB($.glow,LB)}`;if($.fontFace)K+=``}if($.hyperlink){if(typeof $.hyperlink!=="object")throw Error("ERROR: text `hyperlink` option should be an object. Ex: `hyperlink:{url:'https://github.com'}` ");else if(!$.hyperlink.url&&!$.hyperlink.slide)throw Error("ERROR: 'hyperlink requires either `url` or `slide`'");else if($.hyperlink.url)K+=`":"/>"}`;else if($.hyperlink.slide)K+=`":"/>"}`;if($.color)K+=" ",K+=' ',K+=' ',K+=" ",K+=" ",K+=""}return K+=``,K}function TB($){return $.text?`${MJ($.options,!1)}${k0($.text)}`:""}function uB($){let q="";else if($.options.fit==="resize")q+=""}if($.options.shrinkText)q+="";q+=$.options._bodyProp.autoFit?"":"",q+=""}else q+=' wrap="square" rtlCol="0">',q+="";return $._type===D0.tablecell?"":q}function KJ($){let q=$.options||{},Q=[],K=[];if(q&&$._type!==D0.tablecell&&(typeof $.text>"u"||$.text===null))return"";let J=$._type===D0.tablecell?"":"";if(J+=uB($),q.h===0&&q.line&&q.align)J+='';else if($._type==="placeholder")J+=`${qJ($,!0)}`;else J+="";if(typeof $.text==="string"||typeof $.text==="number")Q.push({text:$.text.toString(),options:q||{}});else if($.text&&!Array.isArray($.text)&&typeof $.text==="object"&&Object.keys($.text).includes("text"))Q.push({text:$.text||"",options:$.options||{}});else if(Array.isArray($.text))Q=$.text.map((W)=>({text:W.text,options:W.options}));Q.forEach((W,B)=>{if(!W.text)W.text="";if(W.options=W.options||q||{},B===0&&W.options&&!W.options.bullet&&q.bullet)W.options.bullet=q.bullet;if(typeof W.text==="string"||typeof W.text==="number")W.text=W.text.toString().replace(/\r*\n/g,n0);if(W.text.includes(n0)&&W.text.match(/\n$/g)===null)W.text.split(n0).forEach((V)=>{W.options.breakLine=!0,K.push({text:V,options:W.options})});else K.push(W)});let Z=[],G=[];if(K.forEach((W,B)=>{if(G.length>0&&(W.options.align||q.align)){if(W.options.align!==K[B-1].options.align)Z.push(G),G=[]}else if(G.length>0&&W.options.bullet&&G.length>0)Z.push(G),G=[],W.options.breakLine=!1;if(G.push(W),G.length>0&&W.options.breakLine){if(B+1{var B;let V=!1;J+="";let U=`{if(w.options._lineIdx=F,F>0&&w.options.softBreakBefore)J+="";if(w.options.align=w.options.align||q.align,w.options.lineSpacing=w.options.lineSpacing||q.lineSpacing,w.options.lineSpacingMultiple=w.options.lineSpacingMultiple||q.lineSpacingMultiple,w.options.indentLevel=w.options.indentLevel||q.indentLevel,w.options.paraSpaceBefore=w.options.paraSpaceBefore||q.paraSpaceBefore,w.options.paraSpaceAfter=w.options.paraSpaceAfter||q.paraSpaceAfter,U=qJ(w,!1),J+=U.replace("",""),Object.entries(q).filter(([M])=>!(w.options.hyperlink&&M==="color")).forEach(([M,k])=>{if(M!=="bullet"&&!w.options[M])w.options[M]=k}),J+=TB(w),!w.text&&q.fontSize||w.options.fontSize)V=!0,q.fontSize=q.fontSize||w.options.fontSize}),$._type===D0.tablecell&&(q.fontSize||q.fontFace))if(q.fontFace)J+=`',J+=``,J+=``,J+=``,J+="";else J+=`';else if(V)J+=`';else J+=``;J+=""}),J.indexOf("")===-1)J+="";return J+=$._type===D0.tablecell?"":"",J}function w5($){var q,Q;if(!$)return"";let K=((q=$.options)===null||q===void 0?void 0:q._placeholderIdx)?$.options._placeholderIdx:"",J=((Q=$.options)===null||Q===void 0?void 0:Q._placeholderType)?$.options._placeholderType:"",Z=J&&F8[J]?F8[J].toString():"";return`0?' hasCustomPrompt="1"':""} - />`}function Dz(Q,$,q){let K=''+r0;return K+='',K+='',K+='',K+='',K+='',K+='',K+='',K+='',K+='',K+='',Q.forEach((J)=>{(J._relsMedia||[]).forEach((Z)=>{if(Z.type!=="image"&&Z.type!=="online"&&Z.type!=="chart"&&Z.extn!=="m4v"&&!K.includes(Z.type))K+=''})}),K+='',K+='',K+='',K+='',Q.forEach((J,Z)=>{K+=``,K+=``,J._relsChart.forEach((G)=>{K+=``})}),K+='',K+='',K+='',K+='',$.forEach((J,Z)=>{K+=``,(J._relsChart||[]).forEach((G)=>{K+=' '})}),Q.forEach((J,Z)=>{K+=``}),q._relsChart.forEach((J)=>{K+=' '}),q._relsMedia.forEach((J)=>{if(J.type!=="image"&&J.type!=="online"&&J.type!=="chart"&&J.extn!=="m4v"&&!K.includes(J.type))K+=' '}),K+=' ',K+=' ',K+="",K}function Hz(){return`${r0} + ${Z&&F8[Z]?` type="${Z}"`:""} + ${$.text&&$.text.length>0?' hasCustomPrompt="1"':""} + />`}function SB($,q,Q){let K=''+n0;return K+='',K+='',K+='',K+='',K+='',K+='',K+='',K+='',K+='',K+='',$.forEach((J)=>{(J._relsMedia||[]).forEach((Z)=>{if(Z.type!=="image"&&Z.type!=="online"&&Z.type!=="chart"&&Z.extn!=="m4v"&&!K.includes(Z.type))K+=''})}),K+='',K+='',K+='',K+='',$.forEach((J,Z)=>{K+=``,K+=``,J._relsChart.forEach((G)=>{K+=``})}),K+='',K+='',K+='',K+='',q.forEach((J,Z)=>{K+=``,(J._relsChart||[]).forEach((G)=>{K+=' '})}),$.forEach((J,Z)=>{K+=``}),Q._relsChart.forEach((J)=>{K+=' '}),Q._relsMedia.forEach((J)=>{if(J.type!=="image"&&J.type!=="online"&&J.type!=="chart"&&J.extn!=="m4v"&&!K.includes(J.type))K+=' '}),K+=' ',K+=' ',K+="",K}function EB(){return`${n0} - `}function kz(Q,$){return`${r0} + `}function _B($,q){return`${n0} 0 0 Microsoft Office PowerPoint On-screen Show (16:9) 0 - ${Q.length} - ${Q.length} + ${$.length} + ${$.length} 0 0 false @@ -88,38 +87,38 @@ ${String(N)}`)}if(K&&Z&&V.path.startsWith("http"))return yield new Promise((N,F) Theme 1 Slide Titles - ${Q.length} + ${$.length} - + Arial Calibri Office Theme - ${Q.map((q,K)=>`Slide ${K+1}`).join("")} + ${$.map((Q,K)=>`Slide ${K+1}`).join("")} - ${$} + ${q} false false false 16.0000 - `}function vz(Q,$,q,K){return` + `}function cB($,q,Q,K){return` - ${L0(Q)} - ${L0($)} - ${L0(q)} - ${L0(q)} + ${k0($)} + ${k0(q)} + ${k0(Q)} + ${k0(Q)} ${K} ${new Date().toISOString().replace(/\.\d\d\dZ/,"Z")} ${new Date().toISOString().replace(/\.\d\d\dZ/,"Z")} - `}function Iz(Q){let $=1,q=''+r0;q+='',q+='';for(let K=1;K<=Q.length;K++)q+=``;return $++,q+=``,q}function Rz(Q){return`${r0}${k9(Q)}`}function Cz(Q){let $="";return Q._slideObjects.forEach((q)=>{if(q._type===D0.notes)$+=(q===null||q===void 0?void 0:q.text)&&q.text[0]?q.text[0].text:""}),$.replace(/\r*\n/g,r0)}function jz(){return`${r0}7/23/19Click to edit Master text stylesSecond levelThird levelFourth levelFifth level‹#›`}function fz(Q){return`${r0}${L0(Cz(Q))}${Q._slideNum}`}function Az(Q){return` + `}function bB($){let q=1,Q=''+n0;Q+='',Q+='';for(let K=1;K<=$.length;K++)Q+=``;return q++,Q+=``,Q}function nB($){return`${n0}${n7($)}`}function dB($){let q="";return $._slideObjects.forEach((Q)=>{if(Q._type===D0.notes)q+=(Q===null||Q===void 0?void 0:Q.text)&&Q.text[0]?Q.text[0].text:""}),q.replace(/\r*\n/g,n0)}function mB(){return`${n0}7/23/19Click to edit Master text stylesSecond levelThird levelFourth levelFifth level‹#›`}function pB($){return`${n0}${k0(dB($))}${$._slideNum}`}function iB($){return` - ${k9(Q)} - `}function gz(Q,$){let q=$.map((J,Z)=>``),K=''+r0;return K+='',K+=k9(Q),K+='',K+=""+q.join("")+"",K+='',K+=' '+' '+' '+' '+' '+' '+' '+' '+' '+' '+' ',K+="",K}function Xz(Q,$){return v9($[Q-1],[{target:"../slideMasters/slideMaster1.xml",type:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster"}])}function yz(Q,$,q){return v9(Q[q-1],[{target:`../slideLayouts/slideLayout${Pz(Q,$,q)}.xml`,type:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout"},{target:`../notesSlides/notesSlide${q}.xml`,type:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide"}])}function hz(Q){return` + ${n7($)} + `}function oB($,q){let Q=q.map((J,Z)=>``),K=''+n0;return K+='',K+=n7($),K+='',K+=""+Q.join("")+"",K+='',K+=' '+' '+' '+' '+' '+' '+' '+' '+' '+' '+' ',K+="",K}function aB($,q){return d7(q[$-1],[{target:"../slideMasters/slideMaster1.xml",type:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster"}])}function lB($,q,Q){return d7($[Q-1],[{target:`../slideLayouts/slideLayout${eB($,q,Q)}.xml`,type:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout"},{target:`../notesSlides/notesSlide${Q}.xml`,type:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide"}])}function rB($){return` - - `}function xz(Q,$){let q=$.map((K,J)=>({target:`../slideLayouts/slideLayout${J+1}.xml`,type:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout"}));return q.push({target:"../theme/theme1.xml",type:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"}),v9(Q,q)}function Oz(){return`${r0} + + `}function sB($,q){let Q=q.map((K,J)=>({target:`../slideLayouts/slideLayout${J+1}.xml`,type:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout"}));return Q.push({target:"../theme/theme1.xml",type:"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"}),d7($,Q)}function tB(){return`${n0} - `}function Pz(Q,$,q){for(let K=0;K<$.length;K++)if($[K]._name===Q[q-1]._slideLayout._name)return K+1;return 1}function Tz(Q){var $,q,K,J;let Z=(($=Q.theme)===null||$===void 0?void 0:$.headFontFace)?``:'',G=((K=Q.theme)===null||K===void 0?void 0:K.bodyFontFace)?``:'';return`${Z}${G}`}function Ez(Q){let $=`${r0}`;$+='',$+="",Q.slides.forEach((q)=>$+=``),$+="",$+=``,$+=``,$+=``,$+="";for(let q=1;q<10;q++)$+=``;if($+="",Q.sections&&Q.sections.length>0)$+='',$+='',Q.sections.forEach((q)=>{$+=``,q._slides.forEach((K)=>$+=``),$+=""}),$+="",$+='',$+="";return $+="",$}function Sz(){return`${r0}`}function uz(){return`${r0}`}function _z(){return`${r0}`}var cz="4.0.1";class I9{set layout(Q){let $=this.LAYOUTS[Q];if($)this._layout=Q,this._presLayout=$;else throw new Error("UNKNOWN-LAYOUT")}get layout(){return this._layout}get version(){return this._version}set author(Q){this._author=Q}get author(){return this._author}set company(Q){this._company=Q}get company(){return this._company}set revision(Q){this._revision=Q}get revision(){return this._revision}set subject(Q){this._subject=Q}get subject(){return this._subject}set theme(Q){this._theme=Q}get theme(){return this._theme}set title(Q){this._title=Q}get title(){return this._title}set rtlMode(Q){this._rtlMode=Q}get rtlMode(){return this._rtlMode}get masterSlide(){return this._masterSlide}get slides(){return this._slides}get sections(){return this._sections}get slideLayouts(){return this._slideLayouts}get AlignH(){return this._alignH}get AlignV(){return this._alignV}get ChartType(){return this._chartType}get OutputType(){return this._outputType}get presLayout(){return this._presLayout}get SchemeColor(){return this._schemeColor}get ShapeType(){return this._shapeType}get charts(){return this._charts}get colors(){return this._colors}get shapes(){return this._shapes}constructor(){this._version=cz,this._alignH=w9,this._alignV=N9,this._chartType=F9,this._outputType=z9,this._schemeColor=D1,this._shapeType=M9,this._charts=F0,this._colors=p5,this._shapes=j2,this.addNewSlide=(J)=>{let Z=this.sections.length>0&&this.sections[this.sections.length-1]._slides.filter((G)=>G._slideNum===this.slides[this.slides.length-1]._slideNum).length>0;return J.sectionTitle=Z?this.sections[this.sections.length-1].title:null,this.addSlide(J)},this.getSlide=(J)=>this.slides.filter((Z)=>Z._slideNum===J)[0],this.setSlideNumber=(J)=>{this.masterSlide._slideNumberProps=J,this.slideLayouts.filter((Z)=>Z._name===B9)[0]._slideNumberProps=J},this.createChartMediaRels=(J,Z,G)=>{J._relsChart.forEach((B)=>G.push(Fz(B,Z))),J._relsMedia.forEach((B)=>{if(B.type!=="online"&&B.type!=="hyperlink"){let W=B.data&&typeof B.data==="string"?B.data:"";if(!W.includes(",")&&!W.includes(";"))W="image/png;base64,"+W;else if(!W.includes(","))W="image/png;base64,"+W;else if(!W.includes(";"))W="image/png;"+W;Z.file(B.Target.replace("..","ppt"),W.split(",").pop(),{base64:!0})}})},this.writeFileToBrowser=(J,Z)=>H1(this,void 0,void 0,function*(){let G=document.createElement("a");if(G.setAttribute("style","display:none;"),G.dataset.interception="off",document.body.appendChild(G),window.URL.createObjectURL){let B=window.URL.createObjectURL(new Blob([Z],{type:"application/vnd.openxmlformats-officedocument.presentationml.presentation"}));return G.href=B,G.download=J,G.click(),setTimeout(()=>{window.URL.revokeObjectURL(B),document.body.removeChild(G)},100),yield Promise.resolve(J)}}),this.exportPresentation=(J)=>H1(this,void 0,void 0,function*(){let Z=[],G=[],B=new L9.default;return this.slides.forEach((W)=>{G=G.concat(G9(W))}),this.slideLayouts.forEach((W)=>{G=G.concat(G9(W))}),G=G.concat(G9(this.masterSlide)),yield Promise.all(G).then(()=>H1(this,void 0,void 0,function*(){return this.slides.forEach((W)=>{if(W._slideLayout)zz(W)}),B.folder("_rels"),B.folder("docProps"),B.folder("ppt").folder("_rels"),B.folder("ppt/charts").folder("_rels"),B.folder("ppt/embeddings"),B.folder("ppt/media"),B.folder("ppt/slideLayouts").folder("_rels"),B.folder("ppt/slideMasters").folder("_rels"),B.folder("ppt/slides").folder("_rels"),B.folder("ppt/theme"),B.folder("ppt/notesMasters").folder("_rels"),B.folder("ppt/notesSlides").folder("_rels"),B.file("[Content_Types].xml",Dz(this.slides,this.slideLayouts,this.masterSlide)),B.file("_rels/.rels",Hz()),B.file("docProps/app.xml",kz(this.slides,this.company)),B.file("docProps/core.xml",vz(this.title,this.subject,this.author,this.revision)),B.file("ppt/_rels/presentation.xml.rels",Iz(this.slides)),B.file("ppt/theme/theme1.xml",Tz(this)),B.file("ppt/presentation.xml",Ez(this)),B.file("ppt/presProps.xml",Sz()),B.file("ppt/tableStyles.xml",uz()),B.file("ppt/viewProps.xml",_z()),this.slideLayouts.forEach((W,U)=>{B.file(`ppt/slideLayouts/slideLayout${U+1}.xml`,Az(W)),B.file(`ppt/slideLayouts/_rels/slideLayout${U+1}.xml.rels`,Xz(U+1,this.slideLayouts))}),this.slides.forEach((W,U)=>{B.file(`ppt/slides/slide${U+1}.xml`,Rz(W)),B.file(`ppt/slides/_rels/slide${U+1}.xml.rels`,yz(this.slides,this.slideLayouts,U+1)),B.file(`ppt/notesSlides/notesSlide${U+1}.xml`,fz(W)),B.file(`ppt/notesSlides/_rels/notesSlide${U+1}.xml.rels`,hz(U+1))}),B.file("ppt/slideMasters/slideMaster1.xml",gz(this.masterSlide,this.slideLayouts)),B.file("ppt/slideMasters/_rels/slideMaster1.xml.rels",xz(this.masterSlide,this.slideLayouts)),B.file("ppt/notesMasters/notesMaster1.xml",jz()),B.file("ppt/notesMasters/_rels/notesMaster1.xml.rels",Oz()),this.slideLayouts.forEach((W)=>{this.createChartMediaRels(W,B,Z)}),this.slides.forEach((W)=>{this.createChartMediaRels(W,B,Z)}),this.createChartMediaRels(this.masterSlide,B,Z),yield Promise.all(Z).then(()=>H1(this,void 0,void 0,function*(){if(J.outputType==="STREAM")return yield B.generateAsync({type:"nodebuffer",compression:J.compression?"DEFLATE":"STORE"});else if(J.outputType)return yield B.generateAsync({type:J.outputType});else return yield B.generateAsync({type:"blob",compression:J.compression?"DEFLATE":"STORE"})}))}))});let Q={name:"screen4x3",width:9144000,height:6858000},$={name:"screen16x9",width:9144000,height:5143500},q={name:"screen16x10",width:9144000,height:5715000},K={name:"custom",width:12192000,height:6858000};this.LAYOUTS={LAYOUT_4x3:Q,LAYOUT_16x9:$,LAYOUT_16x10:q,LAYOUT_WIDE:K},this._author="PptxGenJS",this._company="PptxGenJS",this._revision="1",this._subject="PptxGenJS Presentation",this._title="PptxGenJS Presentation",this._presLayout={name:this.LAYOUTS[E6].name,_sizeW:this.LAYOUTS[E6].width,_sizeH:this.LAYOUTS[E6].height,width:this.LAYOUTS[E6].width,height:this.LAYOUTS[E6].height},this._rtlMode=!1,this._slideLayouts=[{_margin:P8,_name:B9,_presLayout:this._presLayout,_rels:[],_relsChart:[],_relsMedia:[],_slide:null,_slideNum:1000,_slideNumberProps:null,_slideObjects:[]}],this._slides=[],this._sections=[],this._masterSlide={addChart:null,addImage:null,addMedia:null,addNotes:null,addShape:null,addTable:null,addText:null,_name:null,_presLayout:this._presLayout,_rId:null,_rels:[],_relsChart:[],_relsMedia:[],_slideId:null,_slideLayout:null,_slideNum:null,_slideNumberProps:null,_slideObjects:[]}}stream(Q){return H1(this,void 0,void 0,function*(){return yield this.exportPresentation({compression:Q===null||Q===void 0?void 0:Q.compression,outputType:"STREAM"})})}write(Q){return H1(this,void 0,void 0,function*(){let $=typeof Q==="object"&&(Q===null||Q===void 0?void 0:Q.outputType)?Q.outputType:Q?Q:null,q=typeof Q==="object"&&(Q===null||Q===void 0?void 0:Q.compression)?Q.compression:!1;return yield this.exportPresentation({compression:q,outputType:$})})}writeFile(Q){return H1(this,void 0,void 0,function*(){var $,q;let K=typeof process!=="undefined"&&!!(($=process.versions)===null||$===void 0?void 0:$.node)&&((q=process.release)===null||q===void 0?void 0:q.name)==="node";if(typeof Q==="string")console.warn("[WARNING] writeFile(string) is deprecated - pass { fileName } instead."),Q={fileName:Q};let{fileName:J="Presentation.pptx",compression:Z=!1}=Q,G=J.toLowerCase().endsWith(".pptx")?J:`${J}.pptx`,B=K?"nodebuffer":null,W=yield this.exportPresentation({compression:Z,outputType:B});if(K){let{promises:U}=yield import("node:fs"),{writeFile:V}=U;return yield V(G,W),G}return yield this.writeFileToBrowser(G,W),G})}addSection(Q){if(!Q)console.warn("addSection requires an argument");else if(!Q.title)console.warn("addSection requires a title");let $={_type:"user",_slides:[],title:Q.title};if(Q.order)this.sections.splice(Q.order,0,$);else this._sections.push($)}addSlide(Q){let $=typeof Q==="string"?Q:(Q===null||Q===void 0?void 0:Q.masterName)?Q.masterName:"",q={_name:this.LAYOUTS[E6].name,_presLayout:this.presLayout,_rels:[],_relsChart:[],_relsMedia:[],_slideNum:this.slides.length+1};if($){let J=this.slideLayouts.filter((Z)=>Z._name===$)[0];if(J)q=J}let K=new xJ({addSlide:this.addNewSlide,getSlide:this.getSlide,presLayout:this.presLayout,setSlideNum:this.setSlideNumber,slideId:this.slides.length+256,slideRId:this.slides.length+2,slideNumber:this.slides.length+1,slideLayout:q});if(this._slides.push(K),Q===null||Q===void 0?void 0:Q.sectionTitle){let J=this.sections.filter((Z)=>Z.title===Q.sectionTitle)[0];if(!J)console.warn(`addSlide: unable to find section with title: "${Q.sectionTitle}"`);else J._slides.push(K)}else if(this.sections&&this.sections.length>0&&!(Q===null||Q===void 0?void 0:Q.sectionTitle)){let J=this._sections[this.sections.length-1];if(J._type==="default")J._slides.push(K);else this._sections.push({title:`Default-${this.sections.filter((Z)=>Z._type==="default").length+1}`,_type:"default",_slides:[K]})}return K}defineLayout(Q){if(!Q)console.warn("defineLayout requires `{name, width, height}`");else if(!Q.name)console.warn("defineLayout requires `name`");else if(!Q.width)console.warn("defineLayout requires `width`");else if(!Q.height)console.warn("defineLayout requires `height`");else if(typeof Q.height!=="number")console.warn("defineLayout `height` should be a number (inches)");else if(typeof Q.width!=="number")console.warn("defineLayout `width` should be a number (inches)");this.LAYOUTS[Q.name]={name:Q.name,_sizeW:Math.round(Number(Q.width)*H0),_sizeH:Math.round(Number(Q.height)*H0),width:Math.round(Number(Q.width)*H0),height:Math.round(Number(Q.height)*H0)}}defineSlideMaster(Q){let $=JSON.parse(JSON.stringify(Q));if(!$.title)throw new Error("defineSlideMaster() object argument requires a `title` value. (https://gitbrent.github.io/PptxGenJS/docs/masters.html)");let q={_margin:$.margin||P8,_name:$.title,_presLayout:this.presLayout,_rels:[],_relsChart:[],_relsMedia:[],_slide:null,_slideNum:1000+this.slideLayouts.length+1,_slideNumberProps:$.slideNumber||null,_slideObjects:[],background:$.background||null,bkgd:$.bkgd||null};if(Zz($,q),this.slideLayouts.push(q),$.background||$.bkgd)hJ($.background,q);if(q._slideNumberProps&&!this.masterSlide._slideNumberProps)this.masterSlide._slideNumberProps=q._slideNumberProps}tableToSlides(Q,$={}){Uz(this,Q,$,($===null||$===void 0?void 0:$.masterSlideName)?this.slideLayouts.filter((q)=>q._name===$.masterSlideName)[0]:null)}}if(typeof globalThis.Buffer==="undefined")globalThis.Buffer=J0;if(typeof globalThis.process==="undefined")globalThis.process=bz;globalThis.__bundles=globalThis.__bundles||{};globalThis.__bundles.pptxgenjs=I9;})(); + `}function eB($,q,Q){for(let K=0;K`:'',G=((K=$.theme)===null||K===void 0?void 0:K.bodyFontFace)?``:'';return`${Z}${G}`}function Qz($){let q=`${n0}`;q+='',q+="",$.slides.forEach((Q)=>q+=``),q+="",q+=``,q+=``,q+=``,q+="";for(let Q=1;Q<10;Q++)q+=``;if(q+="",$.sections&&$.sections.length>0)q+='',q+='',$.sections.forEach((Q)=>{q+=``,Q._slides.forEach((K)=>q+=``),q+=""}),q+="",q+='',q+="";return q+="",q}function qz(){return`${n0}`}function Kz(){return`${n0}`}function Jz(){return`${n0}`}var Vz="4.0.1";class m7{set layout($){let q=this.LAYOUTS[$];if(q)this._layout=$,this._presLayout=q;else throw Error("UNKNOWN-LAYOUT")}get layout(){return this._layout}get version(){return this._version}set author($){this._author=$}get author(){return this._author}set company($){this._company=$}get company(){return this._company}set revision($){this._revision=$}get revision(){return this._revision}set subject($){this._subject=$}get subject(){return this._subject}set theme($){this._theme=$}get theme(){return this._theme}set title($){this._title=$}get title(){return this._title}set rtlMode($){this._rtlMode=$}get rtlMode(){return this._rtlMode}get masterSlide(){return this._masterSlide}get slides(){return this._slides}get sections(){return this._sections}get slideLayouts(){return this._slideLayouts}get AlignH(){return this._alignH}get AlignV(){return this._alignV}get ChartType(){return this._chartType}get OutputType(){return this._outputType}get presLayout(){return this._presLayout}get SchemeColor(){return this._schemeColor}get ShapeType(){return this._shapeType}get charts(){return this._charts}get colors(){return this._colors}get shapes(){return this._shapes}constructor(){this._version=Vz,this._alignH=u7,this._alignV=S7,this._chartType=P7,this._outputType=O7,this._schemeColor=G2,this._shapeType=T7,this._charts=q0,this._colors=D5,this._shapes=B1,this.addNewSlide=(J)=>{let Z=this.sections.length>0&&this.sections[this.sections.length-1]._slides.filter((G)=>G._slideNum===this.slides[this.slides.length-1]._slideNum).length>0;return J.sectionTitle=Z?this.sections[this.sections.length-1].title:null,this.addSlide(J)},this.getSlide=(J)=>this.slides.filter((Z)=>Z._slideNum===J)[0],this.setSlideNumber=(J)=>{this.masterSlide._slideNumberProps=J,this.slideLayouts.filter((Z)=>Z._name===h7)[0]._slideNumberProps=J},this.createChartMediaRels=(J,Z,G)=>{J._relsChart.forEach((W)=>G.push(hB(W,Z))),J._relsMedia.forEach((W)=>{if(W.type!=="online"&&W.type!=="hyperlink"){let B=W.data&&typeof W.data==="string"?W.data:"";if(!B.includes(",")&&!B.includes(";"))B="image/png;base64,"+B;else if(!B.includes(","))B="image/png;base64,"+B;else if(!B.includes(";"))B="image/png;"+B;Z.file(W.Target.replace("..","ppt"),B.split(",").pop(),{base64:!0})}})},this.writeFileToBrowser=(J,Z)=>W2(this,void 0,void 0,function*(){let G=document.createElement("a");if(G.setAttribute("style","display:none;"),G.dataset.interception="off",document.body.appendChild(G),window.URL.createObjectURL){let W=window.URL.createObjectURL(new Blob([Z],{type:"application/vnd.openxmlformats-officedocument.presentationml.presentation"}));return G.href=W,G.download=J,G.click(),setTimeout(()=>{window.URL.revokeObjectURL(W),document.body.removeChild(G)},100),yield Promise.resolve(J)}}),this.exportPresentation=(J)=>W2(this,void 0,void 0,function*(){let Z=[],G=[],W=new _7.default;return this.slides.forEach((B)=>{G=G.concat(y7(B))}),this.slideLayouts.forEach((B)=>{G=G.concat(y7(B))}),G=G.concat(y7(this.masterSlide)),yield Promise.all(G).then(()=>W2(this,void 0,void 0,function*(){return this.slides.forEach((B)=>{if(B._slideLayout)yB(B)}),W.folder("_rels"),W.folder("docProps"),W.folder("ppt").folder("_rels"),W.folder("ppt/charts").folder("_rels"),W.folder("ppt/embeddings"),W.folder("ppt/media"),W.folder("ppt/slideLayouts").folder("_rels"),W.folder("ppt/slideMasters").folder("_rels"),W.folder("ppt/slides").folder("_rels"),W.folder("ppt/theme"),W.folder("ppt/notesMasters").folder("_rels"),W.folder("ppt/notesSlides").folder("_rels"),W.file("[Content_Types].xml",SB(this.slides,this.slideLayouts,this.masterSlide)),W.file("_rels/.rels",EB()),W.file("docProps/app.xml",_B(this.slides,this.company)),W.file("docProps/core.xml",cB(this.title,this.subject,this.author,this.revision)),W.file("ppt/_rels/presentation.xml.rels",bB(this.slides)),W.file("ppt/theme/theme1.xml",$z(this)),W.file("ppt/presentation.xml",Qz(this)),W.file("ppt/presProps.xml",qz()),W.file("ppt/tableStyles.xml",Kz()),W.file("ppt/viewProps.xml",Jz()),this.slideLayouts.forEach((B,V)=>{W.file(`ppt/slideLayouts/slideLayout${V+1}.xml`,iB(B)),W.file(`ppt/slideLayouts/_rels/slideLayout${V+1}.xml.rels`,aB(V+1,this.slideLayouts))}),this.slides.forEach((B,V)=>{W.file(`ppt/slides/slide${V+1}.xml`,nB(B)),W.file(`ppt/slides/_rels/slide${V+1}.xml.rels`,lB(this.slides,this.slideLayouts,V+1)),W.file(`ppt/notesSlides/notesSlide${V+1}.xml`,pB(B)),W.file(`ppt/notesSlides/_rels/notesSlide${V+1}.xml.rels`,rB(V+1))}),W.file("ppt/slideMasters/slideMaster1.xml",oB(this.masterSlide,this.slideLayouts)),W.file("ppt/slideMasters/_rels/slideMaster1.xml.rels",sB(this.masterSlide,this.slideLayouts)),W.file("ppt/notesMasters/notesMaster1.xml",mB()),W.file("ppt/notesMasters/_rels/notesMaster1.xml.rels",tB()),this.slideLayouts.forEach((B)=>{this.createChartMediaRels(B,W,Z)}),this.slides.forEach((B)=>{this.createChartMediaRels(B,W,Z)}),this.createChartMediaRels(this.masterSlide,W,Z),yield Promise.all(Z).then(()=>W2(this,void 0,void 0,function*(){if(J.outputType==="STREAM")return yield W.generateAsync({type:"nodebuffer",compression:J.compression?"DEFLATE":"STORE"});else if(J.outputType)return yield W.generateAsync({type:J.outputType});else return yield W.generateAsync({type:"blob",compression:J.compression?"DEFLATE":"STORE"})}))}))});let $={name:"screen4x3",width:9144000,height:6858000},q={name:"screen16x9",width:9144000,height:5143500},Q={name:"screen16x10",width:9144000,height:5715000},K={name:"custom",width:12192000,height:6858000};this.LAYOUTS={LAYOUT_4x3:$,LAYOUT_16x9:q,LAYOUT_16x10:Q,LAYOUT_WIDE:K},this._author="PptxGenJS",this._company="PptxGenJS",this._revision="1",this._subject="PptxGenJS Presentation",this._title="PptxGenJS Presentation",this._presLayout={name:this.LAYOUTS[f6].name,_sizeW:this.LAYOUTS[f6].width,_sizeH:this.LAYOUTS[f6].height,width:this.LAYOUTS[f6].width,height:this.LAYOUTS[f6].height},this._rtlMode=!1,this._slideLayouts=[{_margin:M8,_name:h7,_presLayout:this._presLayout,_rels:[],_relsChart:[],_relsMedia:[],_slide:null,_slideNum:1000,_slideNumberProps:null,_slideObjects:[]}],this._slides=[],this._sections=[],this._masterSlide={addChart:null,addImage:null,addMedia:null,addNotes:null,addShape:null,addTable:null,addText:null,_name:null,_presLayout:this._presLayout,_rId:null,_rels:[],_relsChart:[],_relsMedia:[],_slideId:null,_slideLayout:null,_slideNum:null,_slideNumberProps:null,_slideObjects:[]}}stream($){return W2(this,void 0,void 0,function*(){return yield this.exportPresentation({compression:$===null||$===void 0?void 0:$.compression,outputType:"STREAM"})})}write($){return W2(this,void 0,void 0,function*(){let q=typeof $==="object"&&($===null||$===void 0?void 0:$.outputType)?$.outputType:$?$:null,Q=typeof $==="object"&&($===null||$===void 0?void 0:$.compression)?$.compression:!1;return yield this.exportPresentation({compression:Q,outputType:q})})}writeFile($){return W2(this,void 0,void 0,function*(){var q,Q;let K=typeof process<"u"&&!!((q=process.versions)===null||q===void 0?void 0:q.node)&&((Q=process.release)===null||Q===void 0?void 0:Q.name)==="node";if(typeof $==="string")console.warn("[WARNING] writeFile(string) is deprecated - pass { fileName } instead."),$={fileName:$};let{fileName:J="Presentation.pptx",compression:Z=!1}=$,G=J.toLowerCase().endsWith(".pptx")?J:`${J}.pptx`,W=K?"nodebuffer":null,B=yield this.exportPresentation({compression:Z,outputType:W});if(K){let{promises:V}=yield import("node:fs"),{writeFile:U}=V;return yield U(G,B),G}return yield this.writeFileToBrowser(G,B),G})}addSection($){if(!$)console.warn("addSection requires an argument");else if(!$.title)console.warn("addSection requires a title");let q={_type:"user",_slides:[],title:$.title};if($.order)this.sections.splice($.order,0,q);else this._sections.push(q)}addSlide($){let q=typeof $==="string"?$:($===null||$===void 0?void 0:$.masterName)?$.masterName:"",Q={_name:this.LAYOUTS[f6].name,_presLayout:this.presLayout,_rels:[],_relsChart:[],_relsMedia:[],_slideNum:this.slides.length+1};if(q){let J=this.slideLayouts.filter((Z)=>Z._name===q)[0];if(J)Q=J}let K=new FJ({addSlide:this.addNewSlide,getSlide:this.getSlide,presLayout:this.presLayout,setSlideNum:this.setSlideNumber,slideId:this.slides.length+256,slideRId:this.slides.length+2,slideNumber:this.slides.length+1,slideLayout:Q});if(this._slides.push(K),$===null||$===void 0?void 0:$.sectionTitle){let J=this.sections.filter((Z)=>Z.title===$.sectionTitle)[0];if(!J)console.warn(`addSlide: unable to find section with title: "${$.sectionTitle}"`);else J._slides.push(K)}else if(this.sections&&this.sections.length>0&&!($===null||$===void 0?void 0:$.sectionTitle)){let J=this._sections[this.sections.length-1];if(J._type==="default")J._slides.push(K);else this._sections.push({title:`Default-${this.sections.filter((Z)=>Z._type==="default").length+1}`,_type:"default",_slides:[K]})}return K}defineLayout($){if(!$)console.warn("defineLayout requires `{name, width, height}`");else if(!$.name)console.warn("defineLayout requires `name`");else if(!$.width)console.warn("defineLayout requires `width`");else if(!$.height)console.warn("defineLayout requires `height`");else if(typeof $.height!=="number")console.warn("defineLayout `height` should be a number (inches)");else if(typeof $.width!=="number")console.warn("defineLayout `width` should be a number (inches)");this.LAYOUTS[$.name]={name:$.name,_sizeW:Math.round(Number($.width)*L0),_sizeH:Math.round(Number($.height)*L0),width:Math.round(Number($.width)*L0),height:Math.round(Number($.height)*L0)}}defineSlideMaster($){let q=JSON.parse(JSON.stringify($));if(!q.title)throw Error("defineSlideMaster() object argument requires a `title` value. (https://gitbrent.github.io/PptxGenJS/docs/masters.html)");let Q={_margin:q.margin||M8,_name:q.title,_presLayout:this.presLayout,_rels:[],_relsChart:[],_relsMedia:[],_slide:null,_slideNum:1000+this.slideLayouts.length+1,_slideNumberProps:q.slideNumber||null,_slideObjects:[],background:q.background||null,bkgd:q.bkgd||null};if(jB(q,Q),this.slideLayouts.push(Q),q.background||q.bkgd)zJ(q.background,Q);if(Q._slideNumberProps&&!this.masterSlide._slideNumberProps)this.masterSlide._slideNumberProps=Q._slideNumberProps}tableToSlides($,q={}){IB(this,$,q,(q===null||q===void 0?void 0:q.masterSlideName)?this.slideLayouts.filter((Q)=>Q._name===q.masterSlideName)[0]:null)}}if(typeof globalThis.Buffer>"u")globalThis.Buffer=o;if(typeof globalThis.process>"u")globalThis.process=Uz;globalThis.__bundles=globalThis.__bundles||{};globalThis.__bundles.pptxgenjs=m7;})(); diff --git a/apps/sim/lib/execution/sandbox/run-task.ts b/apps/sim/lib/execution/sandbox/run-task.ts index 1a87ffa7e91..c46a3251386 100644 --- a/apps/sim/lib/execution/sandbox/run-task.ts +++ b/apps/sim/lib/execution/sandbox/run-task.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { generateShortId } from '@/lib/core/utils/uuid' +import { generateShortId } from '@sim/utils/id' import { executeInIsolatedVM, type IsolatedVMBrokerHandler, diff --git a/apps/sim/lib/knowledge/chunks/service.ts b/apps/sim/lib/knowledge/chunks/service.ts index 847f61871fc..e8bfac6679e 100644 --- a/apps/sim/lib/knowledge/chunks/service.ts +++ b/apps/sim/lib/knowledge/chunks/service.ts @@ -2,8 +2,8 @@ import { createHash } from 'crypto' import { db } from '@sim/db' import { document, embedding, knowledgeBase } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, asc, desc, eq, ilike, inArray, isNull, sql } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' import type { BatchOperationResult, ChunkData, diff --git a/apps/sim/lib/knowledge/connectors/sync-engine.test.ts b/apps/sim/lib/knowledge/connectors/sync-engine.test.ts index a3edab14251..03bf2df4b2e 100644 --- a/apps/sim/lib/knowledge/connectors/sync-engine.test.ts +++ b/apps/sim/lib/knowledge/connectors/sync-engine.test.ts @@ -1,17 +1,11 @@ /** * @vitest-environment node */ -import { loggerMock } from '@sim/testing' +import { authOAuthUtilsMock, schemaMock, urlsMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' vi.mock('@sim/db', () => ({ db: {} })) -vi.mock('@sim/db/schema', () => ({ - document: {}, - knowledgeBase: {}, - knowledgeConnector: {}, - knowledgeConnectorSyncLog: {}, -})) -vi.mock('@sim/logger', () => loggerMock) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn(), eq: vi.fn(), @@ -19,14 +13,14 @@ vi.mock('drizzle-orm', () => ({ isNull: vi.fn(), ne: vi.fn(), })) -vi.mock('@/lib/core/utils/urls', () => ({ getInternalApiBaseUrl: vi.fn() })) +vi.mock('@/lib/core/utils/urls', () => urlsMock) vi.mock('@/lib/knowledge/documents/service', () => ({ hardDeleteDocuments: vi.fn(), isTriggerAvailable: vi.fn(), processDocumentAsync: vi.fn(), })) vi.mock('@/lib/uploads', () => ({ StorageService: {} })) -vi.mock('@/app/api/auth/oauth/utils', () => ({ refreshAccessTokenIfNeeded: vi.fn() })) +vi.mock('@/app/api/auth/oauth/utils', () => authOAuthUtilsMock) vi.mock('@/background/knowledge-connector-sync', () => ({ knowledgeConnectorSync: { trigger: vi.fn() }, })) diff --git a/apps/sim/lib/knowledge/connectors/sync-engine.ts b/apps/sim/lib/knowledge/connectors/sync-engine.ts index bd9ffaf9f1a..ef949c1f789 100644 --- a/apps/sim/lib/knowledge/connectors/sync-engine.ts +++ b/apps/sim/lib/knowledge/connectors/sync-engine.ts @@ -7,11 +7,11 @@ import { knowledgeConnectorSyncLog, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, eq, gt, inArray, isNull, lt, ne, or, sql } from 'drizzle-orm' import { decryptApiKey } from '@/lib/api-key/crypto' -import { toError } from '@/lib/core/utils/helpers' import { getInternalApiBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import type { DocumentData } from '@/lib/knowledge/documents/service' import { hardDeleteDocuments, diff --git a/apps/sim/lib/knowledge/documents/document-processor.ts b/apps/sim/lib/knowledge/documents/document-processor.ts index 4878ed0257d..249108205a9 100644 --- a/apps/sim/lib/knowledge/documents/document-processor.ts +++ b/apps/sim/lib/knowledge/documents/document-processor.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { PDFDocument } from 'pdf-lib' import { getBYOKKey } from '@/lib/api-key/byok' import { @@ -13,7 +14,6 @@ import { } from '@/lib/chunkers' import type { ChunkingStrategy, StrategyOptions } from '@/lib/chunkers/types' import { env } from '@/lib/core/config/env' -import { toError } from '@/lib/core/utils/helpers' import { parseBuffer, parseFile } from '@/lib/file-parsers' import type { FileParseMetadata } from '@/lib/file-parsers/types' import { resolveParserExtension } from '@/lib/knowledge/documents/parser-extension' diff --git a/apps/sim/lib/knowledge/documents/service.ts b/apps/sim/lib/knowledge/documents/service.ts index ad160f1836c..14a7858e006 100644 --- a/apps/sim/lib/knowledge/documents/service.ts +++ b/apps/sim/lib/knowledge/documents/service.ts @@ -8,6 +8,8 @@ import { knowledgeConnector, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { tasks } from '@trigger.dev/sdk' import { and, @@ -30,8 +32,6 @@ import { checkAndBillOverageThreshold } from '@/lib/billing/threshold-billing' import type { ChunkingStrategy, StrategyOptions } from '@/lib/chunkers/types' import { env } from '@/lib/core/config/env' import { getCostMultiplier, isTriggerDevEnabled } from '@/lib/core/config/feature-flags' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { processDocument } from '@/lib/knowledge/documents/document-processor' import type { DocumentSortField, SortOrder } from '@/lib/knowledge/documents/types' import { generateEmbeddings } from '@/lib/knowledge/embeddings' diff --git a/apps/sim/lib/knowledge/documents/utils.test.ts b/apps/sim/lib/knowledge/documents/utils.test.ts index 3156d21ff92..0474f0a80b1 100644 --- a/apps/sim/lib/knowledge/documents/utils.test.ts +++ b/apps/sim/lib/knowledge/documents/utils.test.ts @@ -1,12 +1,7 @@ /** * @vitest-environment node */ -import { describe, expect, it, vi } from 'vitest' - -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }), -})) - +import { describe, expect, it } from 'vitest' import { isRetryableError } from './utils' describe('isRetryableError', () => { diff --git a/apps/sim/lib/knowledge/documents/utils.ts b/apps/sim/lib/knowledge/documents/utils.ts index af3b3561409..bafc5d4cc99 100644 --- a/apps/sim/lib/knowledge/documents/utils.ts +++ b/apps/sim/lib/knowledge/documents/utils.ts @@ -1,5 +1,6 @@ import { createLogger } from '@sim/logger' -import { sleep, toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' const logger = createLogger('RetryUtils') diff --git a/apps/sim/lib/knowledge/service.ts b/apps/sim/lib/knowledge/service.ts index 4867bf251ce..00f4326a063 100644 --- a/apps/sim/lib/knowledge/service.ts +++ b/apps/sim/lib/knowledge/service.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { document, knowledgeBase, knowledgeConnector, permissions, workspace } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { getPostgresErrorCode } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, count, eq, inArray, isNotNull, isNull, ne, or, sql } from 'drizzle-orm' -import { getPostgresErrorCode } from '@/lib/core/utils/pg-error' import { generateRestoreName } from '@/lib/core/utils/restore-name' -import { generateId } from '@/lib/core/utils/uuid' import type { ChunkingConfig, CreateKnowledgeBaseData, diff --git a/apps/sim/lib/knowledge/tags/service.ts b/apps/sim/lib/knowledge/tags/service.ts index ea8e2cd23ae..89ee85dbf23 100644 --- a/apps/sim/lib/knowledge/tags/service.ts +++ b/apps/sim/lib/knowledge/tags/service.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import { document, embedding, knowledgeBaseTagDefinitions } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNotNull, isNull, sql } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' import type { DbOrTx } from '@/lib/db/types' import { getSlotsForFieldType, SUPPORTED_FIELD_TYPES } from '@/lib/knowledge/constants' import type { BulkTagDefinitionsData, DocumentTagDefinition } from '@/lib/knowledge/tags/types' diff --git a/apps/sim/lib/logs/events.ts b/apps/sim/lib/logs/events.ts index c1f54d64da3..02703ba7ce0 100644 --- a/apps/sim/lib/logs/events.ts +++ b/apps/sim/lib/logs/events.ts @@ -1,9 +1,9 @@ import { db } from '@sim/db' import { workspaceNotificationDelivery, workspaceNotificationSubscription } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, or, sql } from 'drizzle-orm' import { isTriggerDevEnabled } from '@/lib/core/config/feature-flags' -import { generateId } from '@/lib/core/utils/uuid' import type { WorkflowExecutionLog } from '@/lib/logs/types' import { type AlertCheckContext, diff --git a/apps/sim/lib/logs/execution/logger.test.ts b/apps/sim/lib/logs/execution/logger.test.ts index 1e18987eb6e..bb0d79ef05f 100644 --- a/apps/sim/lib/logs/execution/logger.test.ts +++ b/apps/sim/lib/logs/execution/logger.test.ts @@ -1,17 +1,8 @@ -import { databaseMock, loggerMock } from '@sim/testing' +import { featureFlagsMock, schemaMock } from '@sim/testing' import { beforeEach, describe, expect, test, vi } from 'vitest' import { ExecutionLogger } from '@/lib/logs/execution/logger' -vi.mock('@sim/db', () => databaseMock) - -// Mock database schema -vi.mock('@sim/db/schema', () => ({ - member: {}, - userStats: {}, - user: {}, - workflow: {}, - workflowExecutionLogs: {}, -})) +vi.mock('@sim/db/schema', () => schemaMock) // Mock billing modules vi.mock('@/lib/billing/core/subscription', () => ({ @@ -36,9 +27,7 @@ vi.mock('@/lib/billing/threshold-billing', () => ({ checkAndBillOverageThreshold: vi.fn(() => Promise.resolve()), })) -vi.mock('@/lib/core/config/feature-flags', () => ({ - isBillingEnabled: false, -})) +vi.mock('@/lib/core/config/feature-flags', () => featureFlagsMock) // Mock security module vi.mock('@/lib/core/security/redaction', () => ({ @@ -50,8 +39,6 @@ vi.mock('@/lib/core/utils/display-filters', () => ({ filterForDisplay: vi.fn((data) => data), })) -vi.mock('@sim/logger', () => loggerMock) - // Mock events vi.mock('@/lib/logs/events', () => ({ emitWorkflowExecutionCompleted: vi.fn(() => Promise.resolve()), diff --git a/apps/sim/lib/logs/execution/logger.ts b/apps/sim/lib/logs/execution/logger.ts index ef96063387c..d538ab738ad 100644 --- a/apps/sim/lib/logs/execution/logger.ts +++ b/apps/sim/lib/logs/execution/logger.ts @@ -7,6 +7,7 @@ import { workflowExecutionLogs, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq, sql } from 'drizzle-orm' import { BASE_EXECUTION_CHARGE } from '@/lib/billing/constants' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' @@ -20,7 +21,6 @@ import { checkAndBillOverageThreshold } from '@/lib/billing/threshold-billing' import { isBillingEnabled } from '@/lib/core/config/feature-flags' import { redactApiKeys } from '@/lib/core/security/redaction' import { filterForDisplay } from '@/lib/core/utils/display-filters' -import { generateId } from '@/lib/core/utils/uuid' import { emitWorkflowExecutionCompleted } from '@/lib/logs/events' import { snapshotService } from '@/lib/logs/execution/snapshot/service' import type { diff --git a/apps/sim/lib/logs/execution/logging-factory.test.ts b/apps/sim/lib/logs/execution/logging-factory.test.ts index badc63542d6..01a8612b5bf 100644 --- a/apps/sim/lib/logs/execution/logging-factory.test.ts +++ b/apps/sim/lib/logs/execution/logging-factory.test.ts @@ -1,37 +1,32 @@ -import { loggerMock } from '@sim/testing' -import { describe, expect, test, vi } from 'vitest' +import { workflowsPersistenceUtilsMock, workflowsPersistenceUtilsMockFns } from '@sim/testing' +import { beforeEach, describe, expect, test, vi } from 'vitest' import { calculateCostSummary, createEnvironmentObject, createTriggerObject, } from '@/lib/logs/execution/logging-factory' -// Mock the billing constants +/** Mock the billing constants */ vi.mock('@/lib/billing/constants', () => ({ BASE_EXECUTION_CHARGE: 0.005, })) -vi.mock('@sim/logger', () => loggerMock) - -// Mock workflow persistence utils -vi.mock('@/lib/workflows/persistence/utils', () => ({ - loadDeployedWorkflowState: vi.fn(() => - Promise.resolve({ - blocks: {}, - edges: [], - loops: {}, - parallels: {}, - }) - ), - loadWorkflowFromNormalizedTables: vi.fn(() => - Promise.resolve({ - blocks: {}, - edges: [], - loops: {}, - parallels: {}, - }) - ), -})) +vi.mock('@/lib/workflows/persistence/utils', () => workflowsPersistenceUtilsMock) + +beforeEach(() => { + workflowsPersistenceUtilsMockFns.mockLoadDeployedWorkflowState.mockResolvedValue({ + blocks: {}, + edges: [], + loops: {}, + parallels: {}, + }) + workflowsPersistenceUtilsMockFns.mockLoadWorkflowFromNormalizedTables.mockResolvedValue({ + blocks: {}, + edges: [], + loops: {}, + parallels: {}, + }) +}) describe('createTriggerObject', () => { test('should create a trigger object with basic type', () => { diff --git a/apps/sim/lib/logs/execution/logging-session.test.ts b/apps/sim/lib/logs/execution/logging-session.test.ts index dfc2a306d2e..d47baae69a3 100644 --- a/apps/sim/lib/logs/execution/logging-session.test.ts +++ b/apps/sim/lib/logs/execution/logging-session.test.ts @@ -1,3 +1,4 @@ +import { schemaMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' const dbMocks = vi.hoisted(() => { @@ -45,18 +46,7 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - workflowExecutionLogs: {}, -})) - -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ - info: vi.fn(), - error: vi.fn(), - warn: vi.fn(), - debug: vi.fn(), - }), -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ eq: dbMocks.eq, diff --git a/apps/sim/lib/logs/execution/logging-session.ts b/apps/sim/lib/logs/execution/logging-session.ts index 15911376917..d8390468324 100644 --- a/apps/sim/lib/logs/execution/logging-session.ts +++ b/apps/sim/lib/logs/execution/logging-session.ts @@ -1,9 +1,9 @@ import { db } from '@sim/db' import { workflowExecutionLogs } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq, sql } from 'drizzle-orm' import { BASE_EXECUTION_CHARGE } from '@/lib/billing/constants' -import { toError } from '@/lib/core/utils/helpers' import { executionLogger } from '@/lib/logs/execution/logger' import { calculateCostSummary, diff --git a/apps/sim/lib/logs/execution/snapshot/service.test.ts b/apps/sim/lib/logs/execution/snapshot/service.test.ts index 213d887e53b..5008072c360 100644 --- a/apps/sim/lib/logs/execution/snapshot/service.test.ts +++ b/apps/sim/lib/logs/execution/snapshot/service.test.ts @@ -1,30 +1,11 @@ /** * @vitest-environment node */ -import { databaseMock, drizzleOrmMock, loggerMock } from '@sim/testing' +import { databaseMock, schemaMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockSchemaExports } = vi.hoisted(() => ({ - mockSchemaExports: { - workflowExecutionSnapshots: { - id: 'id', - workflowId: 'workflow_id', - stateHash: 'state_hash', - stateData: 'state_data', - createdAt: 'created_at', - }, - workflowExecutionLogs: { - id: 'id', - stateSnapshotId: 'state_snapshot_id', - }, - }, -})) - -vi.mock('@sim/db', () => databaseMock) -vi.mock('@sim/db/schema', () => mockSchemaExports) -vi.mock('@sim/logger', () => loggerMock) -vi.mock('drizzle-orm', () => drizzleOrmMock) -vi.mock('@/lib/core/utils/uuid', () => ({ +vi.mock('@sim/db/schema', () => schemaMock) +vi.mock('@sim/utils/id', () => ({ generateId: vi.fn(() => 'generated-uuid-1'), generateShortId: vi.fn(() => 'generated-short-1'), isValidUuid: vi.fn((v: string) => diff --git a/apps/sim/lib/logs/execution/snapshot/service.ts b/apps/sim/lib/logs/execution/snapshot/service.ts index f23d88072ae..82327c1903e 100644 --- a/apps/sim/lib/logs/execution/snapshot/service.ts +++ b/apps/sim/lib/logs/execution/snapshot/service.ts @@ -2,8 +2,8 @@ import { createHash } from 'crypto' import { db } from '@sim/db' import { workflowExecutionLogs, workflowExecutionSnapshots } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, lt, notExists, sql } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' import type { SnapshotService as ISnapshotService, SnapshotCreationResult, diff --git a/apps/sim/lib/mcp/client.test.ts b/apps/sim/lib/mcp/client.test.ts index 386769d41e3..389062627b0 100644 --- a/apps/sim/lib/mcp/client.test.ts +++ b/apps/sim/lib/mcp/client.test.ts @@ -1,11 +1,8 @@ /** * @vitest-environment node */ -import { loggerMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -vi.mock('@sim/logger', () => loggerMock) - /** * Capture the notification handler registered via `client.setNotificationHandler()`. * This lets us simulate the MCP SDK delivering a `tools/list_changed` notification. diff --git a/apps/sim/lib/mcp/connection-manager.test.ts b/apps/sim/lib/mcp/connection-manager.test.ts index 8b4b684cf0f..b464235153f 100644 --- a/apps/sim/lib/mcp/connection-manager.test.ts +++ b/apps/sim/lib/mcp/connection-manager.test.ts @@ -1,7 +1,6 @@ /** * @vitest-environment node */ -import { loggerMock } from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' interface MockMcpClient { @@ -37,7 +36,6 @@ const { MockMcpClientConstructor, mockOnToolsChanged, mockPublishToolsChanged } }) ) -vi.mock('@sim/logger', () => loggerMock) vi.mock('@/lib/core/config/feature-flags', () => ({ isTest: false })) vi.mock('@/lib/mcp/pubsub', () => ({ mcpPubSub: { diff --git a/apps/sim/lib/mcp/domain-check.test.ts b/apps/sim/lib/mcp/domain-check.test.ts index fa7b120416b..6cc76716ca0 100644 --- a/apps/sim/lib/mcp/domain-check.test.ts +++ b/apps/sim/lib/mcp/domain-check.test.ts @@ -1,6 +1,7 @@ /** * @vitest-environment node */ +import { inputValidationMock, inputValidationMockFns } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' const { mockGetAllowedMcpDomainsFromEnv, mockDnsLookup } = vi.hoisted(() => ({ @@ -12,19 +13,19 @@ vi.mock('@/lib/core/config/feature-flags', () => ({ getAllowedMcpDomainsFromEnv: mockGetAllowedMcpDomainsFromEnv, })) -vi.mock('@/lib/core/security/input-validation.server', () => ({ - isPrivateOrReservedIP: (ip: string) => { - if (ip.startsWith('10.') || ip.startsWith('192.168.')) return true - if (ip.startsWith('172.')) { - const second = Number.parseInt(ip.split('.')[1], 10) - if (second >= 16 && second <= 31) return true - } - if (ip.startsWith('169.254.')) return true - if (ip.startsWith('127.') || ip === '::1') return true - if (ip === '0.0.0.0') return true - return false - }, -})) +vi.mock('@/lib/core/security/input-validation.server', () => inputValidationMock) + +inputValidationMockFns.mockIsPrivateOrReservedIP.mockImplementation((ip: string) => { + if (ip.startsWith('10.') || ip.startsWith('192.168.')) return true + if (ip.startsWith('172.')) { + const second = Number.parseInt(ip.split('.')[1], 10) + if (second >= 16 && second <= 31) return true + } + if (ip.startsWith('169.254.')) return true + if (ip.startsWith('127.') || ip === '::1') return true + if (ip === '0.0.0.0') return true + return false +}) vi.mock('dns/promises', () => ({ default: { lookup: mockDnsLookup }, diff --git a/apps/sim/lib/mcp/domain-check.ts b/apps/sim/lib/mcp/domain-check.ts index 7985cf795ff..83ec36c69f5 100644 --- a/apps/sim/lib/mcp/domain-check.ts +++ b/apps/sim/lib/mcp/domain-check.ts @@ -1,9 +1,9 @@ import dns from 'dns/promises' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import * as ipaddr from 'ipaddr.js' import { getAllowedMcpDomainsFromEnv } from '@/lib/core/config/feature-flags' import { isPrivateOrReservedIP } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' import { createEnvVarPattern } from '@/executor/utils/reference-validation' const logger = createLogger('McpDomainCheck') diff --git a/apps/sim/lib/mcp/middleware.ts b/apps/sim/lib/mcp/middleware.ts index c45044fd92b..6e4aa816221 100644 --- a/apps/sim/lib/mcp/middleware.ts +++ b/apps/sim/lib/mcp/middleware.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import type { NextRequest, NextResponse } from 'next/server' import { checkSessionOrInternalAuth } from '@/lib/auth/hybrid' -import { toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { createMcpErrorResponse } from '@/lib/mcp/utils' import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' diff --git a/apps/sim/lib/mcp/pubsub.test.ts b/apps/sim/lib/mcp/pubsub.test.ts index 12b138c6d86..d3c4e1e005e 100644 --- a/apps/sim/lib/mcp/pubsub.test.ts +++ b/apps/sim/lib/mcp/pubsub.test.ts @@ -1,7 +1,6 @@ /** * @vitest-environment node */ -import { loggerMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' const { mockToolsChannel, mockWorkflowToolsChannel } = vi.hoisted(() => { @@ -18,7 +17,6 @@ const { mockToolsChannel, mockWorkflowToolsChannel } = vi.hoisted(() => { return { mockToolsChannel, mockWorkflowToolsChannel } }) -vi.mock('@sim/logger', () => loggerMock) vi.mock('@/lib/events/pubsub', () => ({ createPubSubChannel: vi.fn((config: { label: string }) => { if (config.label === 'mcp-tools') return mockToolsChannel diff --git a/apps/sim/lib/mcp/service.ts b/apps/sim/lib/mcp/service.ts index 072cee8247d..943ad4d8038 100644 --- a/apps/sim/lib/mcp/service.ts +++ b/apps/sim/lib/mcp/service.ts @@ -5,9 +5,10 @@ import { db } from '@sim/db' import { mcpServers } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' import { and, eq, isNull } from 'drizzle-orm' import { isTest } from '@/lib/core/config/feature-flags' -import { sleep, toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { McpClient } from '@/lib/mcp/client' import { mcpConnectionManager } from '@/lib/mcp/connection-manager' diff --git a/apps/sim/lib/mcp/storage/memory-cache.test.ts b/apps/sim/lib/mcp/storage/memory-cache.test.ts index fd4b8682bd0..0db17924355 100644 --- a/apps/sim/lib/mcp/storage/memory-cache.test.ts +++ b/apps/sim/lib/mcp/storage/memory-cache.test.ts @@ -1,8 +1,4 @@ -import { loggerMock } from '@sim/testing' -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' - -vi.mock('@sim/logger', () => loggerMock) - +import { afterEach, beforeEach, describe, expect, it } from 'vitest' import type { McpTool } from '@/lib/mcp/types' import { MemoryMcpCache } from './memory-cache' diff --git a/apps/sim/lib/messaging/email/mailer.test.ts b/apps/sim/lib/messaging/email/mailer.test.ts index 18e720b6268..cfa432f0228 100644 --- a/apps/sim/lib/messaging/email/mailer.test.ts +++ b/apps/sim/lib/messaging/email/mailer.test.ts @@ -1,4 +1,4 @@ -import { createEnvMock, loggerMock } from '@sim/testing' +import { createEnvMock } from '@sim/testing' import { beforeEach, describe, expect, it, type Mock, vi } from 'vitest' const mockSend = vi.fn() @@ -55,8 +55,6 @@ vi.mock('@/lib/messaging/email/utils', () => ({ NO_EMAIL_HEADER_CONTROL_CHARS_REGEX: /^[^\r\n]*$/, })) -vi.mock('@sim/logger', () => loggerMock) - import { type EmailType, hasEmailService, sendBatchEmails, sendEmail } from './mailer' import { generateUnsubscribeToken, isUnsubscribed } from './unsubscribe' diff --git a/apps/sim/lib/messaging/email/unsubscribe.test.ts b/apps/sim/lib/messaging/email/unsubscribe.test.ts index 5cfdce66196..db3b64ffb0c 100644 --- a/apps/sim/lib/messaging/email/unsubscribe.test.ts +++ b/apps/sim/lib/messaging/email/unsubscribe.test.ts @@ -1,18 +1,8 @@ -import { createEnvMock, databaseMock, loggerMock } from '@sim/testing' +import { createEnvMock, databaseMock, schemaMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' import type { EmailType } from '@/lib/messaging/email/mailer' -vi.mock('@sim/db', () => databaseMock) - -vi.mock('@sim/db/schema', () => ({ - user: { id: 'id', email: 'email' }, - settings: { - userId: 'userId', - emailPreferences: 'emailPreferences', - id: 'id', - updatedAt: 'updatedAt', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ eq: vi.fn((a, b) => ({ type: 'eq', left: a, right: b })), @@ -22,8 +12,6 @@ const mockDb = databaseMock.db as Record> vi.mock('@/lib/core/config/env', () => createEnvMock({ BETTER_AUTH_SECRET: 'test-secret-key' })) -vi.mock('@sim/logger', () => loggerMock) - import { generateUnsubscribeToken, getEmailPreferences, diff --git a/apps/sim/lib/messaging/email/utils.test.ts b/apps/sim/lib/messaging/email/utils.test.ts index f23a34c413c..c261c8966d0 100644 --- a/apps/sim/lib/messaging/email/utils.test.ts +++ b/apps/sim/lib/messaging/email/utils.test.ts @@ -1,5 +1,5 @@ -import { createEnvMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { createEnvMock, urlsMock, urlsMockFns } from '@sim/testing' +import { beforeEach, describe, expect, it, vi } from 'vitest' import { EMAIL_HEADER_CONTROL_CHARS_REGEX, getFromEmailAddress, @@ -22,9 +22,11 @@ vi.mock('@/lib/core/config/env', () => }) ) -vi.mock('@/lib/core/utils/urls', () => ({ - getEmailDomain: vi.fn().mockReturnValue('fallback.com'), -})) +vi.mock('@/lib/core/utils/urls', () => urlsMock) + +beforeEach(() => { + urlsMockFns.mockGetEmailDomain.mockReturnValue('fallback.com') +}) describe('getFromEmailAddress', () => { it('should return the configured FROM_EMAIL_ADDRESS', () => { diff --git a/apps/sim/lib/mothership/inbox/executor.ts b/apps/sim/lib/mothership/inbox/executor.ts index 8eaace6c3b5..b46ea43a67c 100644 --- a/apps/sim/lib/mothership/inbox/executor.ts +++ b/apps/sim/lib/mothership/inbox/executor.ts @@ -1,5 +1,6 @@ import { copilotChats, db, mothershipInboxTask, permissions, user, workspace } from '@sim/db' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, sql } from 'drizzle-orm' import { resolveOrCreateChat } from '@/lib/copilot/chat/lifecycle' import { buildIntegrationToolSchemas } from '@/lib/copilot/chat/payload' @@ -13,7 +14,6 @@ import { requestChatTitle } from '@/lib/copilot/request/lifecycle/start' import type { OrchestratorResult } from '@/lib/copilot/request/types' import { taskPubSub } from '@/lib/copilot/tasks' import { isHosted } from '@/lib/core/config/feature-flags' -import { generateId } from '@/lib/core/utils/uuid' import * as agentmail from '@/lib/mothership/inbox/agentmail-client' import { formatEmailAsMessage } from '@/lib/mothership/inbox/format' import { sendInboxResponse } from '@/lib/mothership/inbox/response' diff --git a/apps/sim/lib/mothership/inbox/lifecycle.ts b/apps/sim/lib/mothership/inbox/lifecycle.ts index 1159aa727ec..264ce0c4c96 100644 --- a/apps/sim/lib/mothership/inbox/lifecycle.ts +++ b/apps/sim/lib/mothership/inbox/lifecycle.ts @@ -1,8 +1,8 @@ import { db, mothershipInboxWebhook, workspace } from '@sim/db' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import * as agentmail from '@/lib/mothership/inbox/agentmail-client' import type { InboxConfig } from '@/lib/mothership/inbox/types' diff --git a/apps/sim/lib/notifications/inactivity-polling.ts b/apps/sim/lib/notifications/inactivity-polling.ts index 6bcd1098dee..254d07be462 100644 --- a/apps/sim/lib/notifications/inactivity-polling.ts +++ b/apps/sim/lib/notifications/inactivity-polling.ts @@ -7,9 +7,9 @@ import { workspaceNotificationSubscription, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, gte, inArray, sql } from 'drizzle-orm' import { isTriggerDevEnabled } from '@/lib/core/config/feature-flags' -import { generateId } from '@/lib/core/utils/uuid' import { TRIGGER_TYPES } from '@/lib/workflows/triggers/triggers' import { executeNotificationDelivery, diff --git a/apps/sim/lib/oauth/oauth.test.ts b/apps/sim/lib/oauth/oauth.test.ts index 1b1338892a3..93ad2a9b9ab 100644 --- a/apps/sim/lib/oauth/oauth.test.ts +++ b/apps/sim/lib/oauth/oauth.test.ts @@ -1,4 +1,4 @@ -import { createEnvMock, createMockFetch, loggerMock } from '@sim/testing' +import { createEnvMock, createMockFetch } from '@sim/testing' import { describe, expect, it, vi } from 'vitest' vi.mock('@/lib/core/config/env', () => @@ -52,8 +52,6 @@ vi.mock('@/lib/core/config/env', () => }) ) -vi.mock('@sim/logger', () => loggerMock) - import { refreshOAuthToken } from '@/lib/oauth' /** diff --git a/apps/sim/lib/oauth/oauth.ts b/apps/sim/lib/oauth/oauth.ts index a83105d0e48..65afa3a30a8 100644 --- a/apps/sim/lib/oauth/oauth.ts +++ b/apps/sim/lib/oauth/oauth.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { AirtableIcon, AsanaIcon, @@ -51,7 +52,6 @@ import { ZoomIcon, } from '@/components/icons' import { env } from '@/lib/core/config/env' -import { toError } from '@/lib/core/utils/helpers' import type { OAuthProviderConfig } from './types' const logger = createLogger('OAuth') diff --git a/apps/sim/lib/og/capture-preview.ts b/apps/sim/lib/og/capture-preview.ts index 83818e707ef..8170f3ad6c6 100644 --- a/apps/sim/lib/og/capture-preview.ts +++ b/apps/sim/lib/og/capture-preview.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { sleep } from '@/lib/core/utils/helpers' +import { sleep } from '@sim/utils/helpers' const logger = createLogger('OGCapturePreview') diff --git a/apps/sim/lib/table/__tests__/sql.test.ts b/apps/sim/lib/table/__tests__/sql.test.ts index f2cbd32f92e..492e3e7fc8b 100644 --- a/apps/sim/lib/table/__tests__/sql.test.ts +++ b/apps/sim/lib/table/__tests__/sql.test.ts @@ -5,11 +5,7 @@ * * Tests for the table SQL query builder utilities including filter and sort clause generation. */ -import { drizzleOrmMock } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' - -vi.mock('drizzle-orm', () => drizzleOrmMock) - +import { describe, expect, it } from 'vitest' import { buildFilterClause, buildSortClause } from '../sql' import type { Filter } from '../types' diff --git a/apps/sim/lib/table/__tests__/update-row.test.ts b/apps/sim/lib/table/__tests__/update-row.test.ts index ef899da0f9f..e1b126bf2f2 100644 --- a/apps/sim/lib/table/__tests__/update-row.test.ts +++ b/apps/sim/lib/table/__tests__/update-row.test.ts @@ -3,8 +3,8 @@ */ import { databaseMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -import { updateRow } from '../service' -import type { TableDefinition } from '../types' +import { updateRow } from '@/lib/table/service' +import type { TableDefinition } from '@/lib/table/types' const EXISTING_ROW = { id: 'row-1', diff --git a/apps/sim/lib/table/query-builder/converters.ts b/apps/sim/lib/table/query-builder/converters.ts index 6f65f859dc8..16b1e7ab274 100644 --- a/apps/sim/lib/table/query-builder/converters.ts +++ b/apps/sim/lib/table/query-builder/converters.ts @@ -2,7 +2,7 @@ * Converters for transforming between UI builder state and API filter/sort objects. */ -import { generateShortId } from '@/lib/core/utils/uuid' +import { generateShortId } from '@sim/utils/id' import type { Filter, FilterRule, JsonValue, Sort, SortDirection, SortRule } from '../types' /** Converts UI filter rules to a Filter object for API queries. */ diff --git a/apps/sim/lib/table/query-builder/use-query-builder.ts b/apps/sim/lib/table/query-builder/use-query-builder.ts index 1bab3a82f28..1f4d4f06195 100644 --- a/apps/sim/lib/table/query-builder/use-query-builder.ts +++ b/apps/sim/lib/table/query-builder/use-query-builder.ts @@ -3,7 +3,7 @@ */ import { useCallback } from 'react' -import { generateShortId } from '@/lib/core/utils/uuid' +import { generateShortId } from '@sim/utils/id' import type { ColumnOption } from '../types' import { COMPARISON_OPERATORS, diff --git a/apps/sim/lib/table/service.ts b/apps/sim/lib/table/service.ts index a8e0bdecb71..3409e71f4a3 100644 --- a/apps/sim/lib/table/service.ts +++ b/apps/sim/lib/table/service.ts @@ -10,10 +10,10 @@ import { db } from '@sim/db' import { userTableDefinitions, userTableRows } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { getPostgresErrorCode } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, count, eq, gt, gte, inArray, isNull, sql } from 'drizzle-orm' -import { getPostgresErrorCode } from '@/lib/core/utils/pg-error' import { generateRestoreName } from '@/lib/core/utils/restore-name' -import { generateId } from '@/lib/core/utils/uuid' import { COLUMN_TYPES, NAME_PATTERN, TABLE_LIMITS, USER_TABLE_ROWS_SQL_NAME } from './constants' import { buildFilterClause, buildSortClause } from './sql' import type { diff --git a/apps/sim/lib/tokenization/calculators.ts b/apps/sim/lib/tokenization/calculators.ts index e163a3a4969..3a1a34a2657 100644 --- a/apps/sim/lib/tokenization/calculators.ts +++ b/apps/sim/lib/tokenization/calculators.ts @@ -3,7 +3,7 @@ */ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { createTokenizationError } from '@/lib/tokenization/errors' import { estimateInputTokens, diff --git a/apps/sim/lib/tokenization/streaming.ts b/apps/sim/lib/tokenization/streaming.ts index 547e375389d..047fd0b8b38 100644 --- a/apps/sim/lib/tokenization/streaming.ts +++ b/apps/sim/lib/tokenization/streaming.ts @@ -3,7 +3,7 @@ */ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { calculateStreamingCost } from '@/lib/tokenization/calculators' import { TOKENIZATION_CONFIG } from '@/lib/tokenization/constants' import { diff --git a/apps/sim/lib/tokenization/utils.ts b/apps/sim/lib/tokenization/utils.ts index c94bcc0857c..e3c3c3287d0 100644 --- a/apps/sim/lib/tokenization/utils.ts +++ b/apps/sim/lib/tokenization/utils.ts @@ -3,7 +3,7 @@ */ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { LLM_BLOCK_TYPES, MAX_PREVIEW_LENGTH, diff --git a/apps/sim/lib/uploads/contexts/workspace/workspace-file-manager.ts b/apps/sim/lib/uploads/contexts/workspace/workspace-file-manager.ts index 6c3ea54b8b2..825fbd9794a 100644 --- a/apps/sim/lib/uploads/contexts/workspace/workspace-file-manager.ts +++ b/apps/sim/lib/uploads/contexts/workspace/workspace-file-manager.ts @@ -6,6 +6,7 @@ import { db } from '@sim/db' import { workspaceFiles } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { getPostgresErrorCode } from '@sim/utils/errors' import { and, eq, isNull, sql } from 'drizzle-orm' import { checkStorageQuota, @@ -13,7 +14,6 @@ import { incrementStorageUsage, } from '@/lib/billing/storage' import { normalizeVfsSegment } from '@/lib/copilot/vfs/normalize-segment' -import { getPostgresErrorCode } from '@/lib/core/utils/pg-error' import { generateRestoreName } from '@/lib/core/utils/restore-name' import { getServePathPrefix } from '@/lib/uploads' import { downloadFile, hasCloudStorage, uploadFile } from '@/lib/uploads/core/storage-service' diff --git a/apps/sim/lib/uploads/providers/blob/client.ts b/apps/sim/lib/uploads/providers/blob/client.ts index 7b863b7d6cf..fa957376403 100644 --- a/apps/sim/lib/uploads/providers/blob/client.ts +++ b/apps/sim/lib/uploads/providers/blob/client.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { BLOB_CONFIG } from '@/lib/uploads/config' -import { generateId } from '@/lib/core/utils/uuid' import type { AzureMultipartPart, AzureMultipartUploadInit, diff --git a/apps/sim/lib/uploads/providers/s3/client.ts b/apps/sim/lib/uploads/providers/s3/client.ts index 073ac882a2e..0f27ceed16b 100644 --- a/apps/sim/lib/uploads/providers/s3/client.ts +++ b/apps/sim/lib/uploads/providers/s3/client.ts @@ -9,8 +9,8 @@ import { UploadPartCommand, } from '@aws-sdk/client-s3' import { getSignedUrl } from '@aws-sdk/s3-request-presigner' +import { generateId } from '@sim/utils/id' import { env } from '@/lib/core/config/env' -import { generateId } from '@/lib/core/utils/uuid' import { S3_CONFIG, S3_KB_CONFIG } from '@/lib/uploads/config' import type { S3Config, diff --git a/apps/sim/lib/webhooks/deploy.ts b/apps/sim/lib/webhooks/deploy.ts index b88f62480b4..2a5c5e3dc0d 100644 --- a/apps/sim/lib/webhooks/deploy.ts +++ b/apps/sim/lib/webhooks/deploy.ts @@ -1,9 +1,9 @@ import { db } from '@sim/db' import { webhook } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { and, eq, inArray, isNull } from 'drizzle-orm' import type { NextRequest } from 'next/server' -import { generateShortId } from '@/lib/core/utils/uuid' import { getProviderIdFromServiceId } from '@/lib/oauth' import { PendingWebhookVerificationTracker } from '@/lib/webhooks/pending-verification' import { diff --git a/apps/sim/lib/webhooks/pending-verification.test.ts b/apps/sim/lib/webhooks/pending-verification.test.ts index eb3e4673033..9e2ff26ca8a 100644 --- a/apps/sim/lib/webhooks/pending-verification.test.ts +++ b/apps/sim/lib/webhooks/pending-verification.test.ts @@ -1,19 +1,10 @@ /** * @vitest-environment node */ +import { redisConfigMock } from '@sim/testing' import { afterEach, describe, expect, it, vi } from 'vitest' -vi.mock('@/lib/core/config/redis', () => ({ - getRedisClient: vi.fn().mockReturnValue(null), -})) - -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), -})) +vi.mock('@/lib/core/config/redis', () => redisConfigMock) import { clearPendingWebhookVerification, diff --git a/apps/sim/lib/webhooks/pending-verification.ts b/apps/sim/lib/webhooks/pending-verification.ts index db38b6f6a11..026b6b82ccc 100644 --- a/apps/sim/lib/webhooks/pending-verification.ts +++ b/apps/sim/lib/webhooks/pending-verification.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { getRedisClient } from '@/lib/core/config/redis' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('WebhookPendingVerification') diff --git a/apps/sim/lib/webhooks/polling/orchestrator.ts b/apps/sim/lib/webhooks/polling/orchestrator.ts index 508ff91972f..14133e76a48 100644 --- a/apps/sim/lib/webhooks/polling/orchestrator.ts +++ b/apps/sim/lib/webhooks/polling/orchestrator.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { generateShortId } from '@/lib/core/utils/uuid' +import { generateShortId } from '@sim/utils/id' import { getPollingHandler } from '@/lib/webhooks/polling/registry' import type { PollSummary, WebhookRecord, WorkflowRecord } from '@/lib/webhooks/polling/types' import { fetchActiveWebhooks, runWithConcurrency } from '@/lib/webhooks/polling/utils' diff --git a/apps/sim/lib/webhooks/processor.test.ts b/apps/sim/lib/webhooks/processor.test.ts index 6d644092e84..8549e6198a3 100644 --- a/apps/sim/lib/webhooks/processor.test.ts +++ b/apps/sim/lib/webhooks/processor.test.ts @@ -2,22 +2,25 @@ * @vitest-environment node */ -import { createMockRequest } from '@sim/testing' +import { + createMockRequest, + executionPreprocessingMock, + executionPreprocessingMockFns, + featureFlagsMock, + schemaMock, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockGenerateId, - mockPreprocessExecution, - mockEnqueue, - mockGetJobQueue, - mockShouldExecuteInline, -} = vi.hoisted(() => ({ - mockGenerateId: vi.fn(), - mockPreprocessExecution: vi.fn(), - mockEnqueue: vi.fn(), - mockGetJobQueue: vi.fn(), - mockShouldExecuteInline: vi.fn(), -})) +const { mockGenerateId, mockEnqueue, mockGetJobQueue, mockShouldExecuteInline } = vi.hoisted( + () => ({ + mockGenerateId: vi.fn(), + mockEnqueue: vi.fn(), + mockGetJobQueue: vi.fn(), + mockShouldExecuteInline: vi.fn(), + }) +) + +const mockPreprocessExecution = executionPreprocessingMockFns.mockPreprocessExecution vi.mock('@sim/db', () => ({ db: {}, @@ -26,19 +29,7 @@ vi.mock('@sim/db', () => ({ workflowDeploymentVersion: {}, })) -vi.mock('@sim/db/schema', () => ({ - credentialSet: {}, - subscription: {}, -})) - -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('drizzle-orm', () => ({ and: vi.fn(), @@ -47,7 +38,7 @@ vi.mock('drizzle-orm', () => ({ or: vi.fn(), })) -vi.mock('@/lib/core/utils/uuid', () => ({ +vi.mock('@sim/utils/id', () => ({ generateId: mockGenerateId, generateShortId: vi.fn(() => 'mock-short-id'), isValidUuid: vi.fn((v: string) => @@ -66,9 +57,7 @@ vi.mock('@/lib/core/async-jobs', () => ({ shouldExecuteInline: mockShouldExecuteInline, })) -vi.mock('@/lib/core/config/feature-flags', () => ({ - isProd: false, -})) +vi.mock('@/lib/core/config/feature-flags', () => featureFlagsMock) vi.mock('@/lib/core/security/encryption', () => ({ safeCompare: vi.fn().mockReturnValue(true), @@ -78,9 +67,7 @@ vi.mock('@/lib/environment/utils', () => ({ getEffectiveDecryptedEnv: vi.fn().mockResolvedValue({}), })) -vi.mock('@/lib/execution/preprocessing', () => ({ - preprocessExecution: mockPreprocessExecution, -})) +vi.mock('@/lib/execution/preprocessing', () => executionPreprocessingMock) vi.mock('@/lib/webhooks/pending-verification', () => ({ getPendingWebhookVerification: vi.fn(), diff --git a/apps/sim/lib/webhooks/processor.ts b/apps/sim/lib/webhooks/processor.ts index e8b28b753eb..654041de608 100644 --- a/apps/sim/lib/webhooks/processor.ts +++ b/apps/sim/lib/webhooks/processor.ts @@ -1,6 +1,8 @@ import { db, webhook, workflow, workflowDeploymentVersion } from '@sim/db' import { credentialSet } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, eq, isNull, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { isOrganizationOnTeamOrEnterprisePlan } from '@/lib/billing/core/subscription' @@ -8,8 +10,6 @@ import { tryAdmit } from '@/lib/core/admission/gate' import { getInlineJobQueue, getJobQueue, shouldExecuteInline } from '@/lib/core/async-jobs' import type { AsyncExecutionCorrelation } from '@/lib/core/async-jobs/types' import { isProd } from '@/lib/core/config/feature-flags' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { getEffectiveDecryptedEnv } from '@/lib/environment/utils' import { preprocessExecution } from '@/lib/execution/preprocessing' import { diff --git a/apps/sim/lib/webhooks/provider-subscriptions.ts b/apps/sim/lib/webhooks/provider-subscriptions.ts index 3c6060ce0c6..e2e8eceebac 100644 --- a/apps/sim/lib/webhooks/provider-subscriptions.ts +++ b/apps/sim/lib/webhooks/provider-subscriptions.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import type { NextRequest } from 'next/server' -import { toError } from '@/lib/core/utils/helpers' import { getProviderHandler } from '@/lib/webhooks/providers' const logger = createLogger('WebhookProviderSubscriptions') diff --git a/apps/sim/lib/webhooks/providers/ashby.ts b/apps/sim/lib/webhooks/providers/ashby.ts index d7903af812f..a6c112ff8d1 100644 --- a/apps/sim/lib/webhooks/providers/ashby.ts +++ b/apps/sim/lib/webhooks/providers/ashby.ts @@ -1,7 +1,7 @@ import crypto from 'crypto' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { safeCompare } from '@/lib/core/security/encryption' -import { generateId } from '@/lib/core/utils/uuid' import { getNotificationUrl, getProviderConfig } from '@/lib/webhooks/provider-subscription-utils' import type { DeleteSubscriptionContext, diff --git a/apps/sim/lib/webhooks/providers/attio.ts b/apps/sim/lib/webhooks/providers/attio.ts index 6c23b6939f7..7ac8f87c7b5 100644 --- a/apps/sim/lib/webhooks/providers/attio.ts +++ b/apps/sim/lib/webhooks/providers/attio.ts @@ -1,8 +1,8 @@ import crypto from 'crypto' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { NextResponse } from 'next/server' import { safeCompare } from '@/lib/core/security/encryption' -import { toError } from '@/lib/core/utils/helpers' import { getBaseUrl } from '@/lib/core/utils/urls' import { getCredentialOwner, getProviderConfig } from '@/lib/webhooks/provider-subscription-utils' import type { diff --git a/apps/sim/lib/webhooks/providers/gong.ts b/apps/sim/lib/webhooks/providers/gong.ts index 6a836892072..f1c3f355dc3 100644 --- a/apps/sim/lib/webhooks/providers/gong.ts +++ b/apps/sim/lib/webhooks/providers/gong.ts @@ -1,8 +1,8 @@ import { createHash } from 'node:crypto' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import * as jose from 'jose' import { NextResponse } from 'next/server' -import { toError } from '@/lib/core/utils/helpers' import type { AuthContext, FormatInputContext, diff --git a/apps/sim/lib/webhooks/providers/linear.ts b/apps/sim/lib/webhooks/providers/linear.ts index 00fd67b9e06..457d0992ab5 100644 --- a/apps/sim/lib/webhooks/providers/linear.ts +++ b/apps/sim/lib/webhooks/providers/linear.ts @@ -1,9 +1,9 @@ import crypto from 'crypto' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { NextResponse } from 'next/server' import { safeCompare } from '@/lib/core/security/encryption' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { getNotificationUrl, getProviderConfig } from '@/lib/webhooks/provider-subscription-utils' import type { AuthContext, diff --git a/apps/sim/lib/webhooks/providers/microsoft-teams.ts b/apps/sim/lib/webhooks/providers/microsoft-teams.ts index 5344fa02ee7..68e588d6f57 100644 --- a/apps/sim/lib/webhooks/providers/microsoft-teams.ts +++ b/apps/sim/lib/webhooks/providers/microsoft-teams.ts @@ -2,6 +2,7 @@ import crypto from 'crypto' import { db } from '@sim/db' import { account } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { safeCompare } from '@/lib/core/security/encryption' @@ -11,7 +12,6 @@ import { secureFetchWithPinnedIP, validateUrlWithDNS, } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' import { sanitizeUrlForLog } from '@/lib/core/utils/logging' import { getCredentialOwner, diff --git a/apps/sim/lib/webhooks/providers/monday.ts b/apps/sim/lib/webhooks/providers/monday.ts index 9a932edfee1..da7f872c6fa 100644 --- a/apps/sim/lib/webhooks/providers/monday.ts +++ b/apps/sim/lib/webhooks/providers/monday.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { NextResponse } from 'next/server' import { validateMondayNumericId } from '@/lib/core/security/input-validation' -import { toError } from '@/lib/core/utils/helpers' import { getCredentialOwner, getNotificationUrl, diff --git a/apps/sim/lib/webhooks/providers/slack.ts b/apps/sim/lib/webhooks/providers/slack.ts index da87722b5cf..a5488f0aa4e 100644 --- a/apps/sim/lib/webhooks/providers/slack.ts +++ b/apps/sim/lib/webhooks/providers/slack.ts @@ -1,12 +1,12 @@ import crypto from 'crypto' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { NextResponse } from 'next/server' import { safeCompare } from '@/lib/core/security/encryption' import { secureFetchWithPinnedIP, validateUrlWithDNS, } from '@/lib/core/security/input-validation.server' -import { toError } from '@/lib/core/utils/helpers' import type { AuthContext, FormatInputContext, diff --git a/apps/sim/lib/webhooks/providers/vercel.test.ts b/apps/sim/lib/webhooks/providers/vercel.test.ts index 0792b26c45e..9bd56a7bab7 100644 --- a/apps/sim/lib/webhooks/providers/vercel.test.ts +++ b/apps/sim/lib/webhooks/providers/vercel.test.ts @@ -3,18 +3,9 @@ */ import crypto from 'crypto' import { createMockRequest } from '@sim/testing' -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import { vercelHandler } from '@/lib/webhooks/providers/vercel' -vi.mock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})) - describe('vercelHandler', () => { describe('verifyAuth', () => { const secret = 'test-signing-secret' diff --git a/apps/sim/lib/webhooks/providers/whatsapp.test.ts b/apps/sim/lib/webhooks/providers/whatsapp.test.ts index f648bd776a0..99dcc53c531 100644 --- a/apps/sim/lib/webhooks/providers/whatsapp.test.ts +++ b/apps/sim/lib/webhooks/providers/whatsapp.test.ts @@ -2,6 +2,7 @@ * @vitest-environment node */ import { createHmac } from 'node:crypto' +import { schemaMock } from '@sim/testing' import { NextRequest } from 'next/server' import { describe, expect, it, vi } from 'vitest' @@ -10,9 +11,7 @@ vi.mock('@sim/db', () => ({ workflowDeploymentVersion: {}, })) -vi.mock('@sim/db/schema', () => ({ - webhook: {}, -})) +vi.mock('@sim/db/schema', () => schemaMock) import { whatsappHandler } from './whatsapp' diff --git a/apps/sim/lib/webhooks/providers/zoom.ts b/apps/sim/lib/webhooks/providers/zoom.ts index 67a0800dd0c..409d7c8f921 100644 --- a/apps/sim/lib/webhooks/providers/zoom.ts +++ b/apps/sim/lib/webhooks/providers/zoom.ts @@ -1,11 +1,11 @@ import crypto from 'crypto' import { db, webhook, workflow } from '@sim/db' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { and, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { NextResponse } from 'next/server' import { safeCompare } from '@/lib/core/security/encryption' -import { toError } from '@/lib/core/utils/helpers' import { resolveEnvVarsInObject } from '@/lib/webhooks/env-resolver' import type { AuthContext, diff --git a/apps/sim/lib/webhooks/utils.server.ts b/apps/sim/lib/webhooks/utils.server.ts index 4e0d3d168be..84698d05cf2 100644 --- a/apps/sim/lib/webhooks/utils.server.ts +++ b/apps/sim/lib/webhooks/utils.server.ts @@ -1,8 +1,8 @@ import { db, workflowDeploymentVersion } from '@sim/db' import { webhook, workflow } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { and, eq, isNull, or } from 'drizzle-orm' -import { generateShortId } from '@/lib/core/utils/uuid' import type { DbOrTx } from '@/lib/db/types' import { getProviderIdFromServiceId } from '@/lib/oauth' import { cleanupExternalWebhook } from '@/lib/webhooks/provider-subscriptions' diff --git a/apps/sim/lib/workflows/custom-tools/operations.ts b/apps/sim/lib/workflows/custom-tools/operations.ts index d77b8220110..8fbccef1b43 100644 --- a/apps/sim/lib/workflows/custom-tools/operations.ts +++ b/apps/sim/lib/workflows/custom-tools/operations.ts @@ -1,9 +1,9 @@ import { db } from '@sim/db' import { customTools } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { and, desc, eq, isNull, or } from 'drizzle-orm' import { generateRequestId } from '@/lib/core/utils/request' -import { generateShortId } from '@/lib/core/utils/uuid' const logger = createLogger('CustomToolsOperations') diff --git a/apps/sim/lib/workflows/defaults.ts b/apps/sim/lib/workflows/defaults.ts index c6c4c001c5c..e9dc0f8076b 100644 --- a/apps/sim/lib/workflows/defaults.ts +++ b/apps/sim/lib/workflows/defaults.ts @@ -1,4 +1,4 @@ -import { generateId } from '@/lib/core/utils/uuid' +import { generateId } from '@sim/utils/id' import { getEffectiveBlockOutputs } from '@/lib/workflows/blocks/block-outputs' import { getBlock } from '@/blocks' import type { BlockConfig, SubBlockConfig } from '@/blocks/types' diff --git a/apps/sim/lib/workflows/diff/diff-engine.test.ts b/apps/sim/lib/workflows/diff/diff-engine.test.ts index 04cf3d18197..f4ff309a066 100644 --- a/apps/sim/lib/workflows/diff/diff-engine.test.ts +++ b/apps/sim/lib/workflows/diff/diff-engine.test.ts @@ -1,12 +1,9 @@ /** * @vitest-environment node */ -import { loggerMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' import type { BlockState, WorkflowState } from '@/stores/workflows/workflow/types' -vi.mock('@sim/logger', () => loggerMock) - vi.mock('@/stores/workflows/workflow/store', () => ({ useWorkflowStore: { getState: () => ({ diff --git a/apps/sim/lib/workflows/diff/diff-engine.ts b/apps/sim/lib/workflows/diff/diff-engine.ts index 3f025b8fe00..de00b7439dc 100644 --- a/apps/sim/lib/workflows/diff/diff-engine.ts +++ b/apps/sim/lib/workflows/diff/diff-engine.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import type { Edge } from 'reactflow' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { getTargetedLayoutImpact } from '@/lib/workflows/autolayout' import type { BlockWithDiff } from '@/lib/workflows/diff/types' import { isValidKey } from '@/lib/workflows/sanitization/key-validation' diff --git a/apps/sim/lib/workflows/executor/execute-workflow.ts b/apps/sim/lib/workflows/executor/execute-workflow.ts index 51843ffe2af..f812ed6b328 100644 --- a/apps/sim/lib/workflows/executor/execute-workflow.ts +++ b/apps/sim/lib/workflows/executor/execute-workflow.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { LoggingSession } from '@/lib/logs/execution/logging-session' import { captureServerEvent } from '@/lib/posthog/server' import { executeWorkflowCore } from '@/lib/workflows/executor/execution-core' diff --git a/apps/sim/lib/workflows/executor/execution-core.test.ts b/apps/sim/lib/workflows/executor/execution-core.test.ts index a0a4e3d0da5..86b3a085bdb 100644 --- a/apps/sim/lib/workflows/executor/execution-core.test.ts +++ b/apps/sim/lib/workflows/executor/execution-core.test.ts @@ -1,8 +1,12 @@ +import { + workflowsPersistenceUtilsMock, + workflowsPersistenceUtilsMockFns, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' const { - loadWorkflowFromNormalizedTablesMock, - loadDeployedWorkflowStateMock, getPersonalAndWorkspaceEnvMock, mergeSubblockStateWithValuesMock, safeStartMock, @@ -11,7 +15,6 @@ const { safeCompleteWithCancellationMock, safeCompleteWithPauseMock, hasCompletedMock, - updateWorkflowRunCountsMock, clearExecutionCancellationMock, buildTraceSpansMock, serializeWorkflowMock, @@ -20,8 +23,6 @@ const { executorConstructorMock, findStartBlockMock, } = vi.hoisted(() => ({ - loadWorkflowFromNormalizedTablesMock: vi.fn(), - loadDeployedWorkflowStateMock: vi.fn(), getPersonalAndWorkspaceEnvMock: vi.fn(), mergeSubblockStateWithValuesMock: vi.fn(), safeStartMock: vi.fn(), @@ -30,7 +31,6 @@ const { safeCompleteWithCancellationMock: vi.fn(), safeCompleteWithPauseMock: vi.fn(), hasCompletedMock: vi.fn(), - updateWorkflowRunCountsMock: vi.fn(), clearExecutionCancellationMock: vi.fn(), buildTraceSpansMock: vi.fn(), serializeWorkflowMock: vi.fn(), @@ -40,14 +40,10 @@ const { findStartBlockMock: vi.fn(), })) -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ - info: vi.fn(), - error: vi.fn(), - warn: vi.fn(), - debug: vi.fn(), - }), -})) +const loadWorkflowFromNormalizedTablesMock = + workflowsPersistenceUtilsMockFns.mockLoadWorkflowFromNormalizedTables +const loadDeployedWorkflowStateMock = workflowsPersistenceUtilsMockFns.mockLoadDeployedWorkflowState +const updateWorkflowRunCountsMock = workflowsUtilsMockFns.mockUpdateWorkflowRunCounts vi.mock('@/lib/environment/utils', () => ({ getPersonalAndWorkspaceEnv: getPersonalAndWorkspaceEnvMock, @@ -61,10 +57,7 @@ vi.mock('@/lib/logs/execution/trace-spans/trace-spans', () => ({ buildTraceSpans: buildTraceSpansMock, })) -vi.mock('@/lib/workflows/persistence/utils', () => ({ - loadWorkflowFromNormalizedTables: loadWorkflowFromNormalizedTablesMock, - loadDeployedWorkflowState: loadDeployedWorkflowStateMock, -})) +vi.mock('@/lib/workflows/persistence/utils', () => workflowsPersistenceUtilsMock) vi.mock('@/lib/workflows/subblocks', () => ({ mergeSubblockStateWithValues: mergeSubblockStateWithValuesMock, @@ -76,9 +69,7 @@ vi.mock('@/lib/workflows/triggers/triggers', () => ({ }, })) -vi.mock('@/lib/workflows/utils', () => ({ - updateWorkflowRunCounts: updateWorkflowRunCountsMock, -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) vi.mock('@/executor', () => ({ Executor: vi.fn().mockImplementation((args) => { diff --git a/apps/sim/lib/workflows/executor/human-in-the-loop-manager.ts b/apps/sim/lib/workflows/executor/human-in-the-loop-manager.ts index b0e0c1d8cf0..97285d7579a 100644 --- a/apps/sim/lib/workflows/executor/human-in-the-loop-manager.ts +++ b/apps/sim/lib/workflows/executor/human-in-the-loop-manager.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { pausedExecutions, resumeQueue, workflowExecutionLogs } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import { and, asc, desc, eq, inArray, lt, type SQL, sql } from 'drizzle-orm' import type { Edge } from 'reactflow' import { createTimeoutAbortController, getTimeoutErrorMessage } from '@/lib/core/execution-limits' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { createExecutionEventWriter, setExecutionMeta } from '@/lib/execution/event-buffer' import { preprocessExecution } from '@/lib/execution/preprocessing' import { LoggingSession } from '@/lib/logs/execution/logging-session' diff --git a/apps/sim/lib/workflows/executor/pause-persistence.ts b/apps/sim/lib/workflows/executor/pause-persistence.ts index 019f2084139..57036dccf6f 100644 --- a/apps/sim/lib/workflows/executor/pause-persistence.ts +++ b/apps/sim/lib/workflows/executor/pause-persistence.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { LoggingSession } from '@/lib/logs/execution/logging-session' import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' import type { ExecutionResult } from '@/executor/types' diff --git a/apps/sim/lib/workflows/executor/queued-workflow-execution.ts b/apps/sim/lib/workflows/executor/queued-workflow-execution.ts index c37fefef20d..4d9e3dfaa36 100644 --- a/apps/sim/lib/workflows/executor/queued-workflow-execution.ts +++ b/apps/sim/lib/workflows/executor/queued-workflow-execution.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { createTimeoutAbortController, getTimeoutErrorMessage } from '@/lib/core/execution-limits' -import { toError } from '@/lib/core/utils/helpers' import { createExecutionEventWriter, setExecutionMeta } from '@/lib/execution/event-buffer' import { LoggingSession } from '@/lib/logs/execution/logging-session' import { buildTraceSpans } from '@/lib/logs/execution/trace-spans/trace-spans' diff --git a/apps/sim/lib/workflows/lifecycle.test.ts b/apps/sim/lib/workflows/lifecycle.test.ts index 28c3b2386ee..8f210d1e549 100644 --- a/apps/sim/lib/workflows/lifecycle.test.ts +++ b/apps/sim/lib/workflows/lifecycle.test.ts @@ -1,21 +1,26 @@ /** * @vitest-environment node */ +import { + createEnvMock, + schemaMock, + urlsMock, + urlsMockFns, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { - mockSelect, - mockTransaction, - mockGetWorkflowById, - mockCleanupExternalWebhook, - mockWorkflowDeleted, -} = vi.hoisted(() => ({ - mockSelect: vi.fn(), - mockTransaction: vi.fn(), - mockGetWorkflowById: vi.fn(), - mockCleanupExternalWebhook: vi.fn(), - mockWorkflowDeleted: vi.fn(), -})) +const { mockSelect, mockTransaction, mockCleanupExternalWebhook, mockWorkflowDeleted } = vi.hoisted( + () => ({ + mockSelect: vi.fn(), + mockTransaction: vi.fn(), + mockCleanupExternalWebhook: vi.fn(), + mockWorkflowDeleted: vi.fn(), + }) +) + +const mockGetWorkflowById = workflowsUtilsMockFns.mockGetWorkflowById vi.mock('@sim/db', () => ({ db: { @@ -24,44 +29,19 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - a2aAgent: { archivedAt: 'a2a_archived_at' }, - chat: { archivedAt: 'chat_archived_at' }, - form: { archivedAt: 'form_archived_at' }, - webhook: { archivedAt: 'webhook_archived_at' }, - workflow: { archivedAt: 'workflow_archived_at' }, - workflowDeploymentVersion: { isActive: 'workflow_deployment_version_is_active' }, - workflowMcpTool: { archivedAt: 'workflow_mcp_tool_archived_at' }, - workflowSchedule: { archivedAt: 'workflow_schedule_archived_at' }, -})) - -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), -})) +vi.mock('@sim/db/schema', () => schemaMock) -vi.mock('@/lib/workflows/utils', () => ({ - getWorkflowById: (...args: unknown[]) => mockGetWorkflowById(...args), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) vi.mock('@/lib/webhooks/provider-subscriptions', () => ({ cleanupExternalWebhook: (...args: unknown[]) => mockCleanupExternalWebhook(...args), })) -vi.mock('@/lib/core/config/env', () => ({ - env: { - SOCKET_SERVER_URL: 'http://socket.test', - INTERNAL_API_SECRET: 'secret', - }, - getEnv: vi.fn(), -})) +vi.mock('@/lib/core/config/env', () => + createEnvMock({ SOCKET_SERVER_URL: 'http://socket.test', INTERNAL_API_SECRET: 'secret' }) +) -vi.mock('@/lib/core/utils/urls', () => ({ - getSocketServerUrl: vi.fn().mockReturnValue('http://socket.test'), -})) +vi.mock('@/lib/core/utils/urls', () => urlsMock) vi.mock('@/lib/core/telemetry', () => ({ PlatformEvents: { @@ -92,6 +72,7 @@ function createUpdateChain() { describe('workflow lifecycle', () => { beforeEach(() => { vi.clearAllMocks() + urlsMockFns.mockGetSocketServerUrl.mockReturnValue('http://socket.test') vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: true })) }) diff --git a/apps/sim/lib/workflows/operations/import-export.ts b/apps/sim/lib/workflows/operations/import-export.ts index 093f3617a9f..aa19e967834 100644 --- a/apps/sim/lib/workflows/operations/import-export.ts +++ b/apps/sim/lib/workflows/operations/import-export.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { generateId } from '@/lib/core/utils/uuid' +import { generateId } from '@sim/utils/id' import { type ExportWorkflowState, sanitizeForExport, diff --git a/apps/sim/lib/workflows/operations/socket-operations.ts b/apps/sim/lib/workflows/operations/socket-operations.ts index 8c951088aa4..a19edbe1094 100644 --- a/apps/sim/lib/workflows/operations/socket-operations.ts +++ b/apps/sim/lib/workflows/operations/socket-operations.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { client } from '@/lib/auth/auth-client' -import { generateId } from '@/lib/core/utils/uuid' import { useOperationQueueStore } from '@/stores/operation-queue/store' import type { WorkflowState } from '@/stores/workflows/workflow/types' import { normalizeWorkflowState } from '@/stores/workflows/workflow/validation' diff --git a/apps/sim/lib/workflows/orchestration/chat-deploy.ts b/apps/sim/lib/workflows/orchestration/chat-deploy.ts index 03ec584547d..e10323445d4 100644 --- a/apps/sim/lib/workflows/orchestration/chat-deploy.ts +++ b/apps/sim/lib/workflows/orchestration/chat-deploy.ts @@ -1,11 +1,11 @@ import { db } from '@sim/db' import { chat } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull } from 'drizzle-orm' import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log' import { encryptSecret } from '@/lib/core/security/encryption' import { getBaseUrl } from '@/lib/core/utils/urls' -import { generateId } from '@/lib/core/utils/uuid' import { performFullDeploy } from '@/lib/workflows/orchestration/deploy' const logger = createLogger('ChatDeployOrchestration') diff --git a/apps/sim/lib/workflows/persistence/custom-tools-persistence.ts b/apps/sim/lib/workflows/persistence/custom-tools-persistence.ts index c9f64606f43..05f215fd8c1 100644 --- a/apps/sim/lib/workflows/persistence/custom-tools-persistence.ts +++ b/apps/sim/lib/workflows/persistence/custom-tools-persistence.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { upsertCustomTools } from '@/lib/workflows/custom-tools/operations' const logger = createLogger('CustomToolsPersistence') diff --git a/apps/sim/lib/workflows/persistence/duplicate.test.ts b/apps/sim/lib/workflows/persistence/duplicate.test.ts index 95ada5cd481..58e44a6a091 100644 --- a/apps/sim/lib/workflows/persistence/duplicate.test.ts +++ b/apps/sim/lib/workflows/persistence/duplicate.test.ts @@ -1,11 +1,19 @@ /** * @vitest-environment node */ +import { + permissionsMock, + permissionsMockFns, + schemaMock, + workflowsUtilsMock, + workflowsUtilsMockFns, +} from '@sim/testing' import { drizzleOrmMock } from '@sim/testing/mocks' import { beforeEach, describe, expect, it, vi } from 'vitest' -const mockAuthorizeWorkflowByWorkspacePermission = vi.fn() -const mockGetUserEntityPermissions = vi.fn() +const mockAuthorizeWorkflowByWorkspacePermission = + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission +const mockGetUserEntityPermissions = permissionsMockFns.mockGetUserEntityPermissions const { mockDb } = vi.hoisted(() => ({ mockDb: { @@ -17,39 +25,11 @@ vi.mock('drizzle-orm', () => ({ ...drizzleOrmMock, min: vi.fn((field) => ({ type: 'min', field })), })) -vi.mock('@/lib/workflows/utils', () => ({ - authorizeWorkflowByWorkspacePermission: (...args: unknown[]) => - mockAuthorizeWorkflowByWorkspacePermission(...args), - deduplicateWorkflowName: vi.fn(async (name: string) => name), -})) +vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - getUserEntityPermissions: (...args: unknown[]) => mockGetUserEntityPermissions(...args), -})) +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) -vi.mock('@sim/db/schema', () => ({ - workflow: { - id: 'id', - workspaceId: 'workspaceId', - folderId: 'folderId', - sortOrder: 'sortOrder', - variables: 'variables', - }, - workflowFolder: { - workspaceId: 'workspaceId', - parentId: 'parentId', - sortOrder: 'sortOrder', - }, - workflowBlocks: { - workflowId: 'workflowId', - }, - workflowEdges: { - workflowId: 'workflowId', - }, - workflowSubflows: { - workflowId: 'workflowId', - }, -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('@sim/db', () => ({ db: mockDb, @@ -106,6 +86,9 @@ describe('duplicateWorkflow ordering', () => { }) mockAuthorizeWorkflowByWorkspacePermission.mockResolvedValue({ allowed: true }) + workflowsUtilsMockFns.mockDeduplicateWorkflowName.mockImplementation( + async (name: string) => name + ) mockGetUserEntityPermissions.mockResolvedValue('write') }) diff --git a/apps/sim/lib/workflows/persistence/duplicate.ts b/apps/sim/lib/workflows/persistence/duplicate.ts index f0dd52614b5..ff111d203a0 100644 --- a/apps/sim/lib/workflows/persistence/duplicate.ts +++ b/apps/sim/lib/workflows/persistence/duplicate.ts @@ -7,8 +7,8 @@ import { workflowSubflows, } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, isNull, min } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' import { remapConditionBlockIds, remapConditionEdgeHandle } from '@/lib/workflows/condition-ids' import { authorizeWorkflowByWorkspacePermission, diff --git a/apps/sim/lib/workflows/persistence/utils.test.ts b/apps/sim/lib/workflows/persistence/utils.test.ts index e5e02b74a6d..3a8f3c47cba 100644 --- a/apps/sim/lib/workflows/persistence/utils.test.ts +++ b/apps/sim/lib/workflows/persistence/utils.test.ts @@ -16,9 +16,7 @@ import { createParallelBlock, createStarterBlock, createWorkflowState, - loggerMock, } from '@sim/testing' -import { drizzleOrmMock } from '@sim/testing/mocks' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { BlockState as AppBlockState, @@ -114,10 +112,6 @@ vi.mock('@sim/db', () => ({ webhook: {}, })) -vi.mock('drizzle-orm', () => drizzleOrmMock) - -vi.mock('@sim/logger', () => loggerMock) - import * as dbHelpers from '@/lib/workflows/persistence/utils' const mockWorkflowId = 'test-workflow-123' diff --git a/apps/sim/lib/workflows/persistence/utils.ts b/apps/sim/lib/workflows/persistence/utils.ts index b1f0641bd8b..bbf939b78a5 100644 --- a/apps/sim/lib/workflows/persistence/utils.ts +++ b/apps/sim/lib/workflows/persistence/utils.ts @@ -8,10 +8,10 @@ import { } from '@sim/db' import { credential } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import type { InferInsertModel, InferSelectModel } from 'drizzle-orm' import { and, desc, eq, inArray, sql } from 'drizzle-orm' import type { Edge } from 'reactflow' -import { generateId } from '@/lib/core/utils/uuid' import type { DbOrTx } from '@/lib/db/types' import { getActiveWorkflowContext } from '@/lib/workflows/active-context' import { remapConditionBlockIds, remapConditionEdgeHandle } from '@/lib/workflows/condition-ids' diff --git a/apps/sim/lib/workflows/sanitization/validation.ts b/apps/sim/lib/workflows/sanitization/validation.ts index 58defea1269..a3aabb946e6 100644 --- a/apps/sim/lib/workflows/sanitization/validation.ts +++ b/apps/sim/lib/workflows/sanitization/validation.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { getBlock } from '@/blocks/registry' import { isCustomTool, isMcpTool } from '@/executor/constants' import type { BlockState, WorkflowState } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/lib/workflows/schedules/deploy.test.ts b/apps/sim/lib/workflows/schedules/deploy.test.ts index f58755a307d..8e6e5a33189 100644 --- a/apps/sim/lib/workflows/schedules/deploy.test.ts +++ b/apps/sim/lib/workflows/schedules/deploy.test.ts @@ -3,7 +3,6 @@ * * @vitest-environment node */ -import { loggerMock } from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' const { @@ -61,8 +60,6 @@ vi.mock('@/lib/webhooks/deploy', () => ({ cleanupWebhooksForWorkflow: vi.fn().mockResolvedValue(undefined), })) -vi.mock('@sim/logger', () => loggerMock) - vi.mock('./utils', async (importOriginal) => { const original = await importOriginal() return { diff --git a/apps/sim/lib/workflows/schedules/deploy.ts b/apps/sim/lib/workflows/schedules/deploy.ts index 1405aa3f073..f413b2665e6 100644 --- a/apps/sim/lib/workflows/schedules/deploy.ts +++ b/apps/sim/lib/workflows/schedules/deploy.ts @@ -1,7 +1,7 @@ import { db, workflowSchedule } from '@sim/db' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, eq, inArray, isNull } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' import type { DbOrTx } from '@/lib/db/types' import { cleanupWebhooksForWorkflow } from '@/lib/webhooks/deploy' import type { BlockState } from '@/lib/workflows/schedules/utils' diff --git a/apps/sim/lib/workflows/schedules/utils.ts b/apps/sim/lib/workflows/schedules/utils.ts index 51b42ae04aa..aadd8d53ae2 100644 --- a/apps/sim/lib/workflows/schedules/utils.ts +++ b/apps/sim/lib/workflows/schedules/utils.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { formatDateTime } from '@sim/utils/formatting' import { Cron } from 'croner' import cronstrue from 'cronstrue' -import { formatDateTime } from '@/lib/core/utils/formatting' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('ScheduleUtils') diff --git a/apps/sim/lib/workflows/skills/operations.ts b/apps/sim/lib/workflows/skills/operations.ts index 2c725d3fa64..d033a1a6ffd 100644 --- a/apps/sim/lib/workflows/skills/operations.ts +++ b/apps/sim/lib/workflows/skills/operations.ts @@ -1,9 +1,9 @@ import { db } from '@sim/db' import { skill } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateShortId } from '@sim/utils/id' import { and, desc, eq, ne } from 'drizzle-orm' import { generateRequestId } from '@/lib/core/utils/request' -import { generateShortId } from '@/lib/core/utils/uuid' const logger = createLogger('SkillsOperations') diff --git a/apps/sim/lib/workflows/triggers/trigger-utils.ts b/apps/sim/lib/workflows/triggers/trigger-utils.ts index e2b1d4e5aa4..4be09424a5f 100644 --- a/apps/sim/lib/workflows/triggers/trigger-utils.ts +++ b/apps/sim/lib/workflows/triggers/trigger-utils.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { isInputDefinitionTrigger } from '@/lib/workflows/triggers/input-definition-triggers' import { type StartBlockCandidate, diff --git a/apps/sim/lib/workflows/utils.test.ts b/apps/sim/lib/workflows/utils.test.ts index 0be09c73815..f08dce38705 100644 --- a/apps/sim/lib/workflows/utils.test.ts +++ b/apps/sim/lib/workflows/utils.test.ts @@ -8,6 +8,8 @@ */ import { + authMock, + authMockFns, createSession, createWorkflowRecord, databaseMock, @@ -16,14 +18,11 @@ import { } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockGetSession, mockGetActiveWorkflowContext } = vi.hoisted(() => ({ - mockGetSession: vi.fn(), +const { mockGetActiveWorkflowContext } = vi.hoisted(() => ({ mockGetActiveWorkflowContext: vi.fn(), })) -vi.mock('@/lib/auth', () => ({ - getSession: mockGetSession, -})) +vi.mock('@/lib/auth', () => authMock) vi.mock('@/lib/workflows/active-context', () => ({ getActiveWorkflowContext: mockGetActiveWorkflowContext, @@ -47,7 +46,7 @@ describe('validateWorkflowPermissions', () => { describe('authentication', () => { it('should return 401 when no session exists', async () => { - mockGetSession.mockResolvedValue(null) + authMockFns.mockGetSession.mockResolvedValue(null) const result = await validateWorkflowPermissions('wf-1', 'req-1', 'read') @@ -56,7 +55,7 @@ describe('validateWorkflowPermissions', () => { }) it('should return 401 when session has no user id', async () => { - mockGetSession.mockResolvedValue({ user: {} }) + authMockFns.mockGetSession.mockResolvedValue({ user: {} }) const result = await validateWorkflowPermissions('wf-1', 'req-1', 'read') @@ -66,7 +65,7 @@ describe('validateWorkflowPermissions', () => { describe('workflow not found', () => { it('should return 404 when workflow does not exist', async () => { - mockGetSession.mockResolvedValue(mockSession) + authMockFns.mockGetSession.mockResolvedValue(mockSession) mockGetActiveWorkflowContext.mockResolvedValue(null) const result = await validateWorkflowPermissions('non-existent', 'req-1', 'read') @@ -78,7 +77,9 @@ describe('validateWorkflowPermissions', () => { describe('owner access', () => { it('should deny access to workflow owner without workspace permissions for read action', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'owner-1', email: 'owner-1@test.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'owner-1', email: 'owner-1@test.com' }, + }) mockGetActiveWorkflowContext.mockResolvedValue({ workflow: mockWorkflow, workspaceId: 'ws-1', @@ -95,7 +96,9 @@ describe('validateWorkflowPermissions', () => { }) it('should deny access to workflow owner without workspace permissions for write action', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'owner-1', email: 'owner-1@test.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'owner-1', email: 'owner-1@test.com' }, + }) mockGetActiveWorkflowContext.mockResolvedValue({ workflow: mockWorkflow, workspaceId: 'ws-1', @@ -112,7 +115,9 @@ describe('validateWorkflowPermissions', () => { }) it('should deny access to workflow owner without workspace permissions for admin action', async () => { - mockGetSession.mockResolvedValue({ user: { id: 'owner-1', email: 'owner-1@test.com' } }) + authMockFns.mockGetSession.mockResolvedValue({ + user: { id: 'owner-1', email: 'owner-1@test.com' }, + }) mockGetActiveWorkflowContext.mockResolvedValue({ workflow: mockWorkflow, workspaceId: 'ws-1', @@ -131,7 +136,7 @@ describe('validateWorkflowPermissions', () => { describe('workspace member access with permissions', () => { beforeEach(() => { - mockGetSession.mockResolvedValue(mockSession) + authMockFns.mockGetSession.mockResolvedValue(mockSession) }) it('should grant read access to user with read permission', async () => { @@ -235,7 +240,7 @@ describe('validateWorkflowPermissions', () => { describe('no workspace permission', () => { it('should deny access to user without any workspace permission', async () => { - mockGetSession.mockResolvedValue(mockSession) + authMockFns.mockGetSession.mockResolvedValue(mockSession) mockGetActiveWorkflowContext.mockResolvedValue({ workflow: mockWorkflow, workspaceId: 'ws-1', @@ -260,7 +265,7 @@ describe('validateWorkflowPermissions', () => { workspaceId: null, }) - mockGetSession.mockResolvedValue(mockSession) + authMockFns.mockGetSession.mockResolvedValue(mockSession) mockGetActiveWorkflowContext.mockResolvedValue({ workflow: workflowWithoutWorkspace, workspaceId: '', @@ -278,7 +283,7 @@ describe('validateWorkflowPermissions', () => { workspaceId: null, }) - mockGetSession.mockResolvedValue(mockSession) + authMockFns.mockGetSession.mockResolvedValue(mockSession) mockGetActiveWorkflowContext.mockResolvedValue({ workflow: workflowWithoutWorkspace, workspaceId: '', @@ -292,7 +297,7 @@ describe('validateWorkflowPermissions', () => { describe('default action', () => { it('should default to read action when not specified', async () => { - mockGetSession.mockResolvedValue(mockSession) + authMockFns.mockGetSession.mockResolvedValue(mockSession) mockGetActiveWorkflowContext.mockResolvedValue({ workflow: mockWorkflow, workspaceId: 'ws-1', diff --git a/apps/sim/lib/workflows/utils.ts b/apps/sim/lib/workflows/utils.ts index 31d70991eae..5dfdc5c0668 100644 --- a/apps/sim/lib/workflows/utils.ts +++ b/apps/sim/lib/workflows/utils.ts @@ -1,10 +1,10 @@ import { db } from '@sim/db' import { permissions, userStats, workflowFolder, workflow as workflowTable } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { and, asc, eq, inArray, isNull, max, min, sql } from 'drizzle-orm' import { NextResponse } from 'next/server' import { getSession } from '@/lib/auth' -import { generateId } from '@/lib/core/utils/uuid' import { getActiveWorkflowContext } from '@/lib/workflows/active-context' import { getNextWorkflowColor } from '@/lib/workflows/colors' import { buildDefaultWorkflowArtifacts } from '@/lib/workflows/defaults' diff --git a/apps/sim/lib/workspaces/duplicate.ts b/apps/sim/lib/workspaces/duplicate.ts index 53172001eff..1580214c96b 100644 --- a/apps/sim/lib/workspaces/duplicate.ts +++ b/apps/sim/lib/workspaces/duplicate.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import { permissions, workflow, workflowFolder, workspace as workspaceTable } from '@sim/db/schema' import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { eq } from 'drizzle-orm' -import { generateId } from '@/lib/core/utils/uuid' import { duplicateWorkflow } from '@/lib/workflows/persistence/duplicate' import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' diff --git a/apps/sim/lib/workspaces/lifecycle.test.ts b/apps/sim/lib/workspaces/lifecycle.test.ts index cdc6c2fc611..7743c60c5e7 100644 --- a/apps/sim/lib/workspaces/lifecycle.test.ts +++ b/apps/sim/lib/workspaces/lifecycle.test.ts @@ -1,15 +1,16 @@ /** * @vitest-environment node */ +import { permissionsMock, permissionsMockFns, schemaMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -const { mockSelect, mockTransaction, mockArchiveWorkflowsForWorkspace, mockGetWorkspaceWithOwner } = - vi.hoisted(() => ({ - mockSelect: vi.fn(), - mockTransaction: vi.fn(), - mockArchiveWorkflowsForWorkspace: vi.fn(), - mockGetWorkspaceWithOwner: vi.fn(), - })) +const { mockSelect, mockTransaction, mockArchiveWorkflowsForWorkspace } = vi.hoisted(() => ({ + mockSelect: vi.fn(), + mockTransaction: vi.fn(), + mockArchiveWorkflowsForWorkspace: vi.fn(), +})) + +const mockGetWorkspaceWithOwner = permissionsMockFns.mockGetWorkspaceWithOwner vi.mock('@sim/db', () => ({ db: { @@ -18,36 +19,13 @@ vi.mock('@sim/db', () => ({ }, })) -vi.mock('@sim/db/schema', () => ({ - apiKey: { type: 'api_key_type' }, - document: { deletedAt: 'document_deleted_at', knowledgeBaseId: 'document_kb_id' }, - knowledgeBase: { deletedAt: 'kb_deleted_at' }, - knowledgeConnector: { deletedAt: 'knowledge_connector_deleted_at', knowledgeBaseId: 'kc_kb_id' }, - mcpServers: { deletedAt: 'mcp_servers_deleted_at' }, - userTableDefinitions: { archivedAt: 'table_archived_at' }, - workflowSchedule: { archivedAt: 'schedule_archived_at' }, - workspace: { archivedAt: 'workspace_archived_at' }, - workflowMcpServer: { isPublic: 'workflow_mcp_server_is_public' }, - workspaceFiles: { deletedAt: 'workspace_file_deleted_at' }, - workspaceInvitation: { status: 'workspace_invitation_status' }, - workspaceNotificationSubscription: { active: 'workspace_notification_active' }, -})) - -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), -})) +vi.mock('@sim/db/schema', () => schemaMock) vi.mock('@/lib/workflows/lifecycle', () => ({ archiveWorkflowsForWorkspace: (...args: unknown[]) => mockArchiveWorkflowsForWorkspace(...args), })) -vi.mock('@/lib/workspaces/permissions/utils', () => ({ - getWorkspaceWithOwner: (...args: unknown[]) => mockGetWorkspaceWithOwner(...args), -})) +vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) import { archiveWorkspace } from './lifecycle' diff --git a/apps/sim/lib/workspaces/permissions/utils.test.ts b/apps/sim/lib/workspaces/permissions/utils.test.ts index 04d86332339..dbd8e9a5386 100644 --- a/apps/sim/lib/workspaces/permissions/utils.test.ts +++ b/apps/sim/lib/workspaces/permissions/utils.test.ts @@ -1,32 +1,7 @@ -import { databaseMock, drizzleOrmMock } from '@sim/testing' +import { schemaMock } from '@sim/testing' import { beforeEach, describe, expect, it, vi } from 'vitest' -vi.mock('@sim/db', () => databaseMock) - -vi.mock('@sim/db/schema', () => ({ - permissions: { - permissionType: 'permission_type', - userId: 'user_id', - entityType: 'entity_type', - entityId: 'entity_id', - id: 'permission_id', - }, - permissionTypeEnum: { - enumValues: ['admin', 'write', 'read'] as const, - }, - user: { - id: 'user_id', - email: 'user_email', - name: 'user_name', - }, - workspace: { - id: 'workspace_id', - name: 'workspace_name', - ownerId: 'workspace_owner_id', - }, -})) - -vi.mock('drizzle-orm', () => drizzleOrmMock) +vi.mock('@sim/db/schema', () => schemaMock) import { db } from '@sim/db' import { diff --git a/apps/sim/providers/anthropic/core.ts b/apps/sim/providers/anthropic/core.ts index 756cd8f248a..c51d1420188 100644 --- a/apps/sim/providers/anthropic/core.ts +++ b/apps/sim/providers/anthropic/core.ts @@ -2,7 +2,7 @@ import type Anthropic from '@anthropic-ai/sdk' import { transformJSONSchema } from '@anthropic-ai/sdk/lib/transform-json-schema' import type { RawMessageStreamEvent } from '@anthropic-ai/sdk/resources/messages/messages' import type { Logger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import { diff --git a/apps/sim/providers/azure-openai/index.ts b/apps/sim/providers/azure-openai/index.ts index a1ef02578fc..0d8566be602 100644 --- a/apps/sim/providers/azure-openai/index.ts +++ b/apps/sim/providers/azure-openai/index.ts @@ -1,4 +1,5 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { AzureOpenAI } from 'openai' import type { ChatCompletion, @@ -10,7 +11,6 @@ import type { } from 'openai/resources/chat/completions' import type { ReasoningEffort } from 'openai/resources/shared' import { env } from '@/lib/core/config/env' -import { toError } from '@/lib/core/utils/helpers' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import { diff --git a/apps/sim/providers/bedrock/index.ts b/apps/sim/providers/bedrock/index.ts index 60d5dd36a13..f054d781999 100644 --- a/apps/sim/providers/bedrock/index.ts +++ b/apps/sim/providers/bedrock/index.ts @@ -13,7 +13,7 @@ import { type ToolUseBlock, } from '@aws-sdk/client-bedrock-runtime' import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import { diff --git a/apps/sim/providers/cerebras/index.ts b/apps/sim/providers/cerebras/index.ts index f1f111c267e..2bdfcdc1722 100644 --- a/apps/sim/providers/cerebras/index.ts +++ b/apps/sim/providers/cerebras/index.ts @@ -1,6 +1,6 @@ import { Cerebras } from '@cerebras/cerebras_cloud_sdk' import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import type { CerebrasResponse } from '@/providers/cerebras/types' diff --git a/apps/sim/providers/deepseek/index.ts b/apps/sim/providers/deepseek/index.ts index 5b60ec1e78b..bd4abf1ace4 100644 --- a/apps/sim/providers/deepseek/index.ts +++ b/apps/sim/providers/deepseek/index.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import OpenAI from 'openai' -import { toError } from '@/lib/core/utils/helpers' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import { createReadableStreamFromDeepseekStream } from '@/providers/deepseek/utils' diff --git a/apps/sim/providers/fireworks/index.ts b/apps/sim/providers/fireworks/index.ts index 9fd4ff1641b..08d24584f96 100644 --- a/apps/sim/providers/fireworks/index.ts +++ b/apps/sim/providers/fireworks/index.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import OpenAI from 'openai' import type { ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions' -import { toError } from '@/lib/core/utils/helpers' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import { diff --git a/apps/sim/providers/gemini/core.ts b/apps/sim/providers/gemini/core.ts index 851b70fba25..786975eabcc 100644 --- a/apps/sim/providers/gemini/core.ts +++ b/apps/sim/providers/gemini/core.ts @@ -12,7 +12,7 @@ import { type ToolConfig, } from '@google/genai' import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import { diff --git a/apps/sim/providers/google/utils.ts b/apps/sim/providers/google/utils.ts index 48f1d43ecc1..f2717ff1092 100644 --- a/apps/sim/providers/google/utils.ts +++ b/apps/sim/providers/google/utils.ts @@ -13,7 +13,7 @@ import { Type, } from '@google/genai' import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { ProviderRequest } from '@/providers/types' import { trackForcedToolUsage } from '@/providers/utils' diff --git a/apps/sim/providers/groq/index.ts b/apps/sim/providers/groq/index.ts index 013386f6e4e..fba8984e86b 100644 --- a/apps/sim/providers/groq/index.ts +++ b/apps/sim/providers/groq/index.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { Groq } from 'groq-sdk' -import { toError } from '@/lib/core/utils/helpers' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import { createReadableStreamFromGroqStream } from '@/providers/groq/utils' diff --git a/apps/sim/providers/index.ts b/apps/sim/providers/index.ts index b667b05e722..867748b5549 100644 --- a/apps/sim/providers/index.ts +++ b/apps/sim/providers/index.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { getApiKeyWithBYOK } from '@/lib/api-key/byok' import { getCostMultiplier } from '@/lib/core/config/feature-flags' -import { toError } from '@/lib/core/utils/helpers' import type { StreamingExecution } from '@/executor/types' import { getProviderExecutor } from '@/providers/registry' import type { ProviderId, ProviderRequest, ProviderResponse } from '@/providers/types' diff --git a/apps/sim/providers/mistral/index.ts b/apps/sim/providers/mistral/index.ts index dcfc103ef44..32e24c1f329 100644 --- a/apps/sim/providers/mistral/index.ts +++ b/apps/sim/providers/mistral/index.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import OpenAI from 'openai' import type { ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions' -import { toError } from '@/lib/core/utils/helpers' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import { createReadableStreamFromMistralStream } from '@/providers/mistral/utils' diff --git a/apps/sim/providers/ollama/index.ts b/apps/sim/providers/ollama/index.ts index dcaa0233b1e..45ea3802b9c 100644 --- a/apps/sim/providers/ollama/index.ts +++ b/apps/sim/providers/ollama/index.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import OpenAI from 'openai' import type { ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions' -import { toError } from '@/lib/core/utils/helpers' import { getOllamaUrl } from '@/lib/core/utils/urls' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' diff --git a/apps/sim/providers/openai/core.ts b/apps/sim/providers/openai/core.ts index 53e429351b5..6a0104e0651 100644 --- a/apps/sim/providers/openai/core.ts +++ b/apps/sim/providers/openai/core.ts @@ -1,6 +1,6 @@ import type { Logger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import type OpenAI from 'openai' -import { toError } from '@/lib/core/utils/helpers' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import type { Message, ProviderRequest, ProviderResponse, TimeSegment } from '@/providers/types' diff --git a/apps/sim/providers/openrouter/index.ts b/apps/sim/providers/openrouter/index.ts index 2c57366aac6..89ae932c32d 100644 --- a/apps/sim/providers/openrouter/index.ts +++ b/apps/sim/providers/openrouter/index.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import OpenAI from 'openai' import type { ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions' -import { toError } from '@/lib/core/utils/helpers' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import { getProviderDefaultModel, getProviderModels } from '@/providers/models' diff --git a/apps/sim/providers/openrouter/utils.ts b/apps/sim/providers/openrouter/utils.ts index a914b036e33..8d8dade8279 100644 --- a/apps/sim/providers/openrouter/utils.ts +++ b/apps/sim/providers/openrouter/utils.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import type { ChatCompletionChunk } from 'openai/resources/chat/completions' import type { CompletionUsage } from 'openai/resources/completions' -import { toError } from '@/lib/core/utils/helpers' import { checkForForcedToolUsageOpenAI, createOpenAICompatibleStream } from '@/providers/utils' const logger = createLogger('OpenRouterUtils') diff --git a/apps/sim/providers/vllm/index.ts b/apps/sim/providers/vllm/index.ts index ae053017176..66027c43f96 100644 --- a/apps/sim/providers/vllm/index.ts +++ b/apps/sim/providers/vllm/index.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import OpenAI from 'openai' import type { ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions' import { env } from '@/lib/core/config/env' -import { toError } from '@/lib/core/utils/helpers' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import { getProviderDefaultModel, getProviderModels } from '@/providers/models' diff --git a/apps/sim/providers/xai/index.ts b/apps/sim/providers/xai/index.ts index cd7d8b28f8f..fdbed7f5c47 100644 --- a/apps/sim/providers/xai/index.ts +++ b/apps/sim/providers/xai/index.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import OpenAI from 'openai' import type { ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions' -import { toError } from '@/lib/core/utils/helpers' import type { StreamingExecution } from '@/executor/types' import { MAX_TOOL_ITERATIONS } from '@/providers' import { getProviderDefaultModel, getProviderModels } from '@/providers/models' diff --git a/apps/sim/serializer/index.test.ts b/apps/sim/serializer/index.test.ts index b0bb50d2a36..12ae27b2794 100644 --- a/apps/sim/serializer/index.test.ts +++ b/apps/sim/serializer/index.test.ts @@ -18,14 +18,13 @@ import { createMinimalWorkflowState, createMissingMetadataWorkflow, } from '@sim/testing/factories' -import { blocksMock, loggerMock, toolsUtilsMock } from '@sim/testing/mocks' +import { blocksMock, toolsUtilsMock } from '@sim/testing/mocks' import { describe, expect, it, vi } from 'vitest' import { Serializer } from '@/serializer/index' import type { SerializedWorkflow } from '@/serializer/types' vi.mock('@/blocks', () => blocksMock) vi.mock('@/tools/utils', () => toolsUtilsMock) -vi.mock('@sim/logger', () => loggerMock) describe('Serializer', () => { describe('serializeWorkflow', () => { diff --git a/apps/sim/serializer/index.ts b/apps/sim/serializer/index.ts index d570f982066..d62e295a48b 100644 --- a/apps/sim/serializer/index.ts +++ b/apps/sim/serializer/index.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import type { Edge } from 'reactflow' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import type { CanonicalModeOverrides } from '@/lib/workflows/subblocks/visibility' import { buildCanonicalIndex, diff --git a/apps/sim/serializer/tests/serializer.extended.test.ts b/apps/sim/serializer/tests/serializer.extended.test.ts index f4004c13253..79e62bf7b93 100644 --- a/apps/sim/serializer/tests/serializer.extended.test.ts +++ b/apps/sim/serializer/tests/serializer.extended.test.ts @@ -14,7 +14,7 @@ import { createStarterBlock, WorkflowBuilder, } from '@sim/testing' -import { loggerMock, toolsUtilsMock } from '@sim/testing/mocks' +import { toolsUtilsMock } from '@sim/testing/mocks' import { describe, expect, it, vi } from 'vitest' import { Serializer, WorkflowValidationError } from '@/serializer/index' import type { SerializedWorkflow } from '@/serializer/types' @@ -228,7 +228,6 @@ vi.mock('@/blocks', () => ({ getAllBlocks: () => Object.values(mockBlockConfigs), })) vi.mock('@/tools/utils', () => toolsUtilsMock) -vi.mock('@sim/logger', () => loggerMock) describe('Serializer Extended Tests', () => { describe('WorkflowValidationError', () => { diff --git a/apps/sim/socket/handlers/operations.ts b/apps/sim/socket/handlers/operations.ts index 207bd569369..c47c380e896 100644 --- a/apps/sim/socket/handlers/operations.ts +++ b/apps/sim/socket/handlers/operations.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { ZodError } from 'zod' -import { generateId } from '@/lib/core/utils/uuid' import { BLOCK_OPERATIONS, BLOCKS_OPERATIONS, diff --git a/apps/sim/socket/handlers/workflow.test.ts b/apps/sim/socket/handlers/workflow.test.ts index dd1c300338f..ac65399faf2 100644 --- a/apps/sim/socket/handlers/workflow.test.ts +++ b/apps/sim/socket/handlers/workflow.test.ts @@ -9,15 +9,6 @@ const { mockGetWorkflowState, mockVerifyWorkflowAccess } = vi.hoisted(() => ({ mockVerifyWorkflowAccess: vi.fn(), })) -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - debug: vi.fn(), - }), -})) - vi.mock('@sim/db', () => ({ db: { select: vi.fn() }, user: { image: 'image' }, diff --git a/apps/sim/socket/index.test.ts b/apps/sim/socket/index.test.ts index f470763c994..e50f4e97c22 100644 --- a/apps/sim/socket/index.test.ts +++ b/apps/sim/socket/index.test.ts @@ -4,7 +4,7 @@ * @vitest-environment node */ import { createServer, request as httpRequest } from 'http' -import { createEnvMock, createMockLogger, databaseMock } from '@sim/testing' +import { createEnvMock, createMockLogger } from '@sim/testing' import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest' import { createSocketIOServer } from '@/socket/config/socket' import { MemoryRoomManager } from '@/socket/rooms' @@ -18,8 +18,6 @@ vi.mock('@/lib/auth', () => ({ }, })) -vi.mock('@sim/db', () => databaseMock) - // Mock redis package to prevent actual Redis connections vi.mock('redis', () => ({ createClient: vi.fn(() => ({ diff --git a/apps/sim/socket/middleware/auth.ts b/apps/sim/socket/middleware/auth.ts index 05ac073b882..a9daddcfc3f 100644 --- a/apps/sim/socket/middleware/auth.ts +++ b/apps/sim/socket/middleware/auth.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import type { Socket } from 'socket.io' import { auth } from '@/lib/auth' import { ANONYMOUS_USER, ANONYMOUS_USER_ID } from '@/lib/auth/constants' import { isAuthDisabled } from '@/lib/core/config/feature-flags' -import { toError } from '@/lib/core/utils/helpers' const logger = createLogger('SocketAuth') diff --git a/apps/sim/socket/middleware/permissions.test.ts b/apps/sim/socket/middleware/permissions.test.ts index 32c4722e104..0394a2230a3 100644 --- a/apps/sim/socket/middleware/permissions.test.ts +++ b/apps/sim/socket/middleware/permissions.test.ts @@ -8,6 +8,7 @@ */ import { + authMock, expectPermissionAllowed, expectPermissionDenied, ROLE_ALLOWED_OPERATIONS, @@ -15,10 +16,7 @@ import { } from '@sim/testing' import { describe, expect, it, vi } from 'vitest' -vi.mock('@/lib/auth', () => ({ - auth: { api: { getSession: vi.fn() } }, - getSession: vi.fn(), -})) +vi.mock('@/lib/auth', () => authMock) import { checkRolePermission } from '@/socket/middleware/permissions' diff --git a/apps/sim/stores/chat/store.ts b/apps/sim/stores/chat/store.ts index 070ec6bfa27..5ac6f24d93a 100644 --- a/apps/sim/stores/chat/store.ts +++ b/apps/sim/stores/chat/store.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { create } from 'zustand' import { devtools, persist } from 'zustand/middleware' -import { generateId } from '@/lib/core/utils/uuid' import type { ChatMessage, ChatState } from './types' import { MAX_CHAT_HEIGHT, MAX_CHAT_WIDTH, MIN_CHAT_HEIGHT, MIN_CHAT_WIDTH } from './utils' diff --git a/apps/sim/stores/notifications/store.ts b/apps/sim/stores/notifications/store.ts index 9e843ceed18..594a875d2c8 100644 --- a/apps/sim/stores/notifications/store.ts +++ b/apps/sim/stores/notifications/store.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { create } from 'zustand' import { persist } from 'zustand/middleware' -import { generateId } from '@/lib/core/utils/uuid' import type { AddNotificationParams, Notification } from './types' const logger = createLogger('NotificationStore') diff --git a/apps/sim/stores/operation-queue/store.test.ts b/apps/sim/stores/operation-queue/store.test.ts index b37f673e68b..b86a3da2561 100644 --- a/apps/sim/stores/operation-queue/store.test.ts +++ b/apps/sim/stores/operation-queue/store.test.ts @@ -2,16 +2,6 @@ * @vitest-environment node */ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' - -vi.mock('@sim/logger', () => ({ - createLogger: () => ({ - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }), -})) - import { registerEmitFunctions, useOperationQueueStore } from '@/stores/operation-queue/store' describe('operation queue room gating', () => { diff --git a/apps/sim/stores/table/store.ts b/apps/sim/stores/table/store.ts index 6590ba6e6b0..47d1e973f67 100644 --- a/apps/sim/stores/table/store.ts +++ b/apps/sim/stores/table/store.ts @@ -3,9 +3,9 @@ * Ephemeral — no persistence. Stacks are keyed by tableId. */ +import { generateShortId } from '@sim/utils/id' import { create } from 'zustand' import { devtools } from 'zustand/middleware' -import { generateShortId } from '@/lib/core/utils/uuid' import type { TableUndoAction, TableUndoStacks, TableUndoState, UndoEntry } from './types' const STACK_CAPACITY = 100 diff --git a/apps/sim/stores/terminal/console/store.ts b/apps/sim/stores/terminal/console/store.ts index db11856dd5d..d6d8414a16a 100644 --- a/apps/sim/stores/terminal/console/store.ts +++ b/apps/sim/stores/terminal/console/store.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { create } from 'zustand' import { devtools } from 'zustand/middleware' import { useShallow } from 'zustand/react/shallow' import { redactApiKeys } from '@/lib/core/security/redaction' -import { generateId } from '@/lib/core/utils/uuid' import { getQueryClient } from '@/app/_shell/providers/query-provider' import type { NormalizedBlockOutput } from '@/executor/types' import { type GeneralSettings, generalSettingsKeys } from '@/hooks/queries/general-settings' diff --git a/apps/sim/stores/undo-redo/utils.ts b/apps/sim/stores/undo-redo/utils.ts index 1837585b285..861277e02e4 100644 --- a/apps/sim/stores/undo-redo/utils.ts +++ b/apps/sim/stores/undo-redo/utils.ts @@ -1,5 +1,5 @@ +import { generateId } from '@sim/utils/id' import type { Edge } from 'reactflow' -import { generateId } from '@/lib/core/utils/uuid' import { UNDO_REDO_OPERATIONS } from '@/socket/constants' import type { BatchAddBlocksOperation, diff --git a/apps/sim/stores/variables/store.ts b/apps/sim/stores/variables/store.ts index bf25ccbc55e..d3c71e2600e 100644 --- a/apps/sim/stores/variables/store.ts +++ b/apps/sim/stores/variables/store.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import JSON5 from 'json5' import { create } from 'zustand' import { devtools } from 'zustand/middleware' -import { generateId } from '@/lib/core/utils/uuid' import { normalizeName } from '@/executor/constants' import { useOperationQueueStore } from '@/stores/operation-queue/store' import type { Variable, VariablesStore } from '@/stores/variables/types' diff --git a/apps/sim/stores/workflow-diff/store.ts b/apps/sim/stores/workflow-diff/store.ts index eac3b271de1..b97f2951894 100644 --- a/apps/sim/stores/workflow-diff/store.ts +++ b/apps/sim/stores/workflow-diff/store.ts @@ -1,8 +1,8 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' import { create } from 'zustand' import { devtools } from 'zustand/middleware' import { COPILOT_STATS_API_PATH } from '@/lib/copilot/constants' -import { toError } from '@/lib/core/utils/helpers' import { stripWorkflowDiffMarkers, WorkflowDiffEngine } from '@/lib/workflows/diff' import { enqueueReplaceWorkflowState } from '@/lib/workflows/operations/socket-operations' import { validateWorkflowState } from '@/lib/workflows/sanitization/validation' diff --git a/apps/sim/stores/workflows/subblock/store.ts b/apps/sim/stores/workflows/subblock/store.ts index 405eb21be5a..3e735f75e2c 100644 --- a/apps/sim/stores/workflows/subblock/store.ts +++ b/apps/sim/stores/workflows/subblock/store.ts @@ -1,7 +1,7 @@ import { createLogger } from '@sim/logger' +import { generateId } from '@sim/utils/id' import { create } from 'zustand' import { devtools } from 'zustand/middleware' -import { generateId } from '@/lib/core/utils/uuid' import { getBlock } from '@/blocks' import type { SubBlockConfig } from '@/blocks/types' import { populateTriggerFieldsFromConfig } from '@/hooks/use-trigger-config-aggregation' diff --git a/apps/sim/stores/workflows/utils.ts b/apps/sim/stores/workflows/utils.ts index 2e11760917e..25b372693b1 100644 --- a/apps/sim/stores/workflows/utils.ts +++ b/apps/sim/stores/workflows/utils.ts @@ -1,5 +1,5 @@ +import { generateId } from '@sim/utils/id' import type { Edge } from 'reactflow' -import { generateId } from '@/lib/core/utils/uuid' import { DEFAULT_DUPLICATE_OFFSET } from '@/lib/workflows/autolayout/constants' import { getEffectiveBlockOutputs } from '@/lib/workflows/blocks/block-outputs' import { remapConditionBlockIds, remapConditionEdgeHandle } from '@/lib/workflows/condition-ids' diff --git a/apps/sim/stores/workflows/workflow/store.ts b/apps/sim/stores/workflows/workflow/store.ts index 6b0fae892a0..888bf069bef 100644 --- a/apps/sim/stores/workflows/workflow/store.ts +++ b/apps/sim/stores/workflows/workflow/store.ts @@ -1,9 +1,9 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { generateId } from '@sim/utils/id' import type { Edge } from 'reactflow' import { create } from 'zustand' import { devtools } from 'zustand/middleware' -import { toError } from '@/lib/core/utils/helpers' -import { generateId } from '@/lib/core/utils/uuid' import { DEFAULT_DUPLICATE_OFFSET } from '@/lib/workflows/autolayout/constants' import { getDynamicHandleSubblockType, diff --git a/apps/sim/tools/apify/run_actor_async.ts b/apps/sim/tools/apify/run_actor_async.ts index b569d0bf8eb..2a88539ecda 100644 --- a/apps/sim/tools/apify/run_actor_async.ts +++ b/apps/sim/tools/apify/run_actor_async.ts @@ -1,5 +1,5 @@ +import { sleep } from '@sim/utils/helpers' import { DEFAULT_EXECUTION_TIMEOUT_MS } from '@/lib/core/execution-limits' -import { sleep } from '@/lib/core/utils/helpers' import type { RunActorParams, RunActorResult } from '@/tools/apify/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/brightdata/discover.ts b/apps/sim/tools/brightdata/discover.ts index bfcd5f4522b..3a78c84084e 100644 --- a/apps/sim/tools/brightdata/discover.ts +++ b/apps/sim/tools/brightdata/discover.ts @@ -1,6 +1,7 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' import { DEFAULT_EXECUTION_TIMEOUT_MS } from '@/lib/core/execution-limits' -import { sleep, toError } from '@/lib/core/utils/helpers' import type { BrightDataDiscoverParams, BrightDataDiscoverResponse } from '@/tools/brightdata/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/browser_use/run_task.ts b/apps/sim/tools/browser_use/run_task.ts index ea880fc0314..e87f1f965f2 100644 --- a/apps/sim/tools/browser_use/run_task.ts +++ b/apps/sim/tools/browser_use/run_task.ts @@ -1,6 +1,6 @@ import { createLogger } from '@sim/logger' +import { sleep } from '@sim/utils/helpers' import { getMaxExecutionTimeout } from '@/lib/core/execution-limits' -import { sleep } from '@/lib/core/utils/helpers' import type { BrowserUseRunTaskParams, BrowserUseRunTaskResponse } from '@/tools/browser_use/types' import type { ToolConfig, ToolResponse } from '@/tools/types' diff --git a/apps/sim/tools/datadog/list_monitors.ts b/apps/sim/tools/datadog/list_monitors.ts index 2d7190d67a5..eaf24493600 100644 --- a/apps/sim/tools/datadog/list_monitors.ts +++ b/apps/sim/tools/datadog/list_monitors.ts @@ -1,6 +1,9 @@ +import { createLogger } from '@sim/logger' import type { ListMonitorsParams, ListMonitorsResponse } from '@/tools/datadog/types' import type { ToolConfig } from '@/tools/types' +const logger = createLogger('DatadogListMonitors') + export const listMonitorsTool: ToolConfig = { id: 'datadog_list_monitors', name: 'Datadog List Monitors', @@ -87,7 +90,7 @@ export const listMonitorsTool: ToolConfig = { id: 'incidentio_workflows_create', name: 'incident.io Workflows Create', @@ -125,7 +128,7 @@ export const workflowsCreateTool: ToolConfig ({ mockIsHosted: { value: false }, @@ -43,11 +43,12 @@ const { mockListCustomTools: vi.fn(), mockGetCustomToolByIdOrTitle: vi.fn(), mockGenerateInternalToken: vi.fn(), - mockSecureFetchWithPinnedIP: vi.fn(), - mockValidateUrlWithDNS: vi.fn(), mockResolveWorkspaceFileReference: vi.fn(), })) +const mockSecureFetchWithPinnedIP = inputValidationMockFns.mockSecureFetchWithPinnedIP +const mockValidateUrlWithDNS = inputValidationMockFns.mockValidateUrlWithDNS + // Mock feature flags vi.mock('@/lib/core/config/feature-flags', () => ({ get isHosted() { @@ -79,10 +80,7 @@ vi.mock('@/lib/auth/internal', () => ({ vi.mock('@/lib/billing/core/usage-log', () => ({})) -vi.mock('@/lib/core/security/input-validation.server', () => ({ - secureFetchWithPinnedIP: (...args: unknown[]) => mockSecureFetchWithPinnedIP(...args), - validateUrlWithDNS: (...args: unknown[]) => mockValidateUrlWithDNS(...args), -})) +vi.mock('@/lib/core/security/input-validation.server', () => inputValidationMock) vi.mock('@/lib/core/rate-limiter/hosted-key', () => ({ getHostedKeyRateLimiter: () => mockRateLimiterFns, diff --git a/apps/sim/tools/index.ts b/apps/sim/tools/index.ts index c6f4b521a4a..8e85c2de38f 100644 --- a/apps/sim/tools/index.ts +++ b/apps/sim/tools/index.ts @@ -1,4 +1,6 @@ import { createLogger } from '@sim/logger' +import { toError } from '@sim/utils/errors' +import { sleep } from '@sim/utils/helpers' import { getBYOKKey } from '@/lib/api-key/byok' import { generateInternalToken } from '@/lib/auth/internal' import { isHosted } from '@/lib/core/config/feature-flags' @@ -9,7 +11,6 @@ import { validateUrlWithDNS, } from '@/lib/core/security/input-validation.server' import { PlatformEvents } from '@/lib/core/telemetry' -import { sleep, toError } from '@/lib/core/utils/helpers' import { generateRequestId } from '@/lib/core/utils/request' import { getBaseUrl, getInternalApiBaseUrl } from '@/lib/core/utils/urls' import { isUserFile } from '@/lib/core/utils/user-file' diff --git a/apps/sim/tools/langsmith/utils.ts b/apps/sim/tools/langsmith/utils.ts index 07daa0d4efe..4e270e7dccc 100644 --- a/apps/sim/tools/langsmith/utils.ts +++ b/apps/sim/tools/langsmith/utils.ts @@ -1,4 +1,4 @@ -import { generateId } from '@/lib/core/utils/uuid' +import { generateId } from '@sim/utils/id' import type { LangsmithRunPayload } from '@/tools/langsmith/types' interface NormalizedRunPayload { diff --git a/apps/sim/tools/mistral/parser.ts b/apps/sim/tools/mistral/parser.ts index 778b4e66c6b..884b4c0e874 100644 --- a/apps/sim/tools/mistral/parser.ts +++ b/apps/sim/tools/mistral/parser.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { isInternalFileUrl } from '@/lib/uploads/utils/file-utils' import type { MistralParserInput, diff --git a/apps/sim/tools/notion/query_database.ts b/apps/sim/tools/notion/query_database.ts index 50bced19e52..5c4d8ee8a60 100644 --- a/apps/sim/tools/notion/query_database.ts +++ b/apps/sim/tools/notion/query_database.ts @@ -1,4 +1,4 @@ -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { NotionQueryDatabaseParams, NotionResponse } from '@/tools/notion/types' import { DATABASE_QUERY_RESULTS_OUTPUT, PAGINATION_OUTPUT_PROPERTIES } from '@/tools/notion/types' import { extractTitle, formatPropertyValue } from '@/tools/notion/utils' diff --git a/apps/sim/tools/params.ts b/apps/sim/tools/params.ts index 838002333b8..6336f4293a8 100644 --- a/apps/sim/tools/params.ts +++ b/apps/sim/tools/params.ts @@ -169,7 +169,7 @@ function getBlockConfigurations(): Record { blockConfigCache![block.type] = block }) } catch (error) { - console.warn('Could not load block configuration:', error) + logger.warn('Could not load block configuration:', error) blockConfigCache = {} } } diff --git a/apps/sim/tools/pulse/parser.ts b/apps/sim/tools/pulse/parser.ts index 202afee22e1..242080be8ef 100644 --- a/apps/sim/tools/pulse/parser.ts +++ b/apps/sim/tools/pulse/parser.ts @@ -1,4 +1,4 @@ -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { isInternalFileUrl } from '@/lib/uploads/utils/file-utils' import type { PulseParserInput, PulseParserOutput, PulseParserV2Input } from '@/tools/pulse/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/reducto/parser.ts b/apps/sim/tools/reducto/parser.ts index adba9c1975c..ea08c90ffef 100644 --- a/apps/sim/tools/reducto/parser.ts +++ b/apps/sim/tools/reducto/parser.ts @@ -1,4 +1,4 @@ -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import { isInternalFileUrl } from '@/lib/uploads/utils/file-utils' import type { ReductoParserInput, diff --git a/apps/sim/tools/sharepoint/create_list.ts b/apps/sim/tools/sharepoint/create_list.ts index 06ea0d44e88..18d949ac7cd 100644 --- a/apps/sim/tools/sharepoint/create_list.ts +++ b/apps/sim/tools/sharepoint/create_list.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { SharepointCreateListResponse, SharepointList, diff --git a/apps/sim/tools/sharepoint/read_page.ts b/apps/sim/tools/sharepoint/read_page.ts index 6adc0b7912b..e896df3cf0a 100644 --- a/apps/sim/tools/sharepoint/read_page.ts +++ b/apps/sim/tools/sharepoint/read_page.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { GraphApiResponse, SharepointPageContent, diff --git a/apps/sim/tools/supabase/utils.test.ts b/apps/sim/tools/supabase/utils.test.ts index 18c01fd8bf3..ac649b008f9 100644 --- a/apps/sim/tools/supabase/utils.test.ts +++ b/apps/sim/tools/supabase/utils.test.ts @@ -1,11 +1,10 @@ /** * @vitest-environment node */ +import { featureFlagsMock } from '@sim/testing' import { describe, expect, it, vi } from 'vitest' -vi.mock('@/lib/core/config/feature-flags', () => ({ - isHosted: false, -})) +vi.mock('@/lib/core/config/feature-flags', () => featureFlagsMock) import { supabaseBaseUrl } from '@/tools/supabase/utils' diff --git a/apps/sim/tools/textract/parser.ts b/apps/sim/tools/textract/parser.ts index 65fd98b6fa8..4ec1c6307e4 100644 --- a/apps/sim/tools/textract/parser.ts +++ b/apps/sim/tools/textract/parser.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { TextractParserInput, TextractParserOutput, diff --git a/apps/sim/tools/tinybird/query.ts b/apps/sim/tools/tinybird/query.ts index 0990fd1cfba..6af90fd3a4f 100644 --- a/apps/sim/tools/tinybird/query.ts +++ b/apps/sim/tools/tinybird/query.ts @@ -1,5 +1,5 @@ import { createLogger } from '@sim/logger' -import { toError } from '@/lib/core/utils/helpers' +import { toError } from '@sim/utils/errors' import type { TinybirdQueryParams, TinybirdQueryResponse } from '@/tools/tinybird/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/utils.test.ts b/apps/sim/tools/utils.test.ts index 9d8fa28f2f1..cf90b5ded2f 100644 --- a/apps/sim/tools/utils.test.ts +++ b/apps/sim/tools/utils.test.ts @@ -1,9 +1,5 @@ -import { createMockResponse, loggerMock } from '@sim/testing' +import { createMockResponse, inputValidationMock, inputValidationMockFns } from '@sim/testing' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { - secureFetchWithPinnedIP, - validateUrlWithDNS, -} from '@/lib/core/security/input-validation.server' import { transformTable } from '@/tools/shared/table' import type { ToolConfig } from '@/tools/types' import { @@ -15,11 +11,7 @@ import { } from '@/tools/utils' import { executeRequest } from '@/tools/utils.server' -vi.mock('@sim/logger', () => loggerMock) -vi.mock('@/lib/core/security/input-validation.server', () => ({ - validateUrlWithDNS: vi.fn(), - secureFetchWithPinnedIP: vi.fn(), -})) +vi.mock('@/lib/core/security/input-validation.server', () => inputValidationMock) const { mockGetQueryData } = vi.hoisted(() => ({ mockGetQueryData: vi.fn(), @@ -413,8 +405,8 @@ describe('validateRequiredParametersAfterMerge', () => { describe('executeRequest', () => { let mockTool: ToolConfig - const mockValidateUrlWithDNS = vi.mocked(validateUrlWithDNS) - const mockSecureFetchWithPinnedIP = vi.mocked(secureFetchWithPinnedIP) + const mockValidateUrlWithDNS = inputValidationMockFns.mockValidateUrlWithDNS + const mockSecureFetchWithPinnedIP = inputValidationMockFns.mockSecureFetchWithPinnedIP beforeEach(() => { mockValidateUrlWithDNS.mockResolvedValue({ diff --git a/apps/sim/triggers/generic/webhook.ts b/apps/sim/triggers/generic/webhook.ts index db3fecc3be6..9fc953817af 100644 --- a/apps/sim/triggers/generic/webhook.ts +++ b/apps/sim/triggers/generic/webhook.ts @@ -1,5 +1,5 @@ +import { generateId } from '@sim/utils/id' import { WebhookIcon } from '@/components/icons' -import { generateId } from '@/lib/core/utils/uuid' import type { TriggerConfig } from '@/triggers/types' export const genericWebhookTrigger: TriggerConfig = { diff --git a/bun.lock b/bun.lock index 654302c8665..07b45deb663 100644 --- a/bun.lock +++ b/bun.lock @@ -333,6 +333,15 @@ "name": "@sim/tsconfig", "version": "0.0.0", }, + "packages/utils": { + "name": "@sim/utils", + "version": "0.1.0", + "devDependencies": { + "@sim/tsconfig": "workspace:*", + "typescript": "^5.7.3", + "vitest": "^3.0.8", + }, + }, }, "trustedDependencies": [ "ffmpeg-static", @@ -1338,6 +1347,8 @@ "@sim/tsconfig": ["@sim/tsconfig@workspace:packages/tsconfig"], + "@sim/utils": ["@sim/utils@workspace:packages/utils"], + "@simplewebauthn/browser": ["@simplewebauthn/browser@13.3.0", "", {}, "sha512-BE/UWv6FOToAdVk0EokzkqQQDOWtNydYlY6+OrmiZ5SCNmb41VehttboTetUM3T/fr6EAFYVXjz4My2wg230rQ=="], "@simplewebauthn/server": ["@simplewebauthn/server@13.3.0", "", { "dependencies": { "@hexagon/base64": "^1.1.27", "@levischuck/tiny-cbor": "^0.2.2", "@peculiar/asn1-android": "^2.6.0", "@peculiar/asn1-ecc": "^2.6.1", "@peculiar/asn1-rsa": "^2.6.1", "@peculiar/asn1-schema": "^2.6.0", "@peculiar/asn1-x509": "^2.6.1", "@peculiar/x509": "^1.14.3" } }, "sha512-MLHYFrYG8/wK2i+86XMhiecK72nMaHKKt4bo+7Q1TbuG9iGjlSdfkPWKO5ZFE/BX+ygCJ7pr8H/AJeyAj1EaTQ=="], diff --git a/packages/testing/src/index.ts b/packages/testing/src/index.ts index 9c9382fb0ba..0ae16d2b827 100644 --- a/packages/testing/src/index.ts +++ b/packages/testing/src/index.ts @@ -44,42 +44,5 @@ export * from './assertions' export * from './builders' export * from './factories' -export { - AuthTypeMock, - auditMock, - clearRedisMocks, - createEnvMock, - createMockDb, - createMockFetch, - createMockFormDataRequest, - createMockGetEnv, - createMockLogger, - createMockRedis, - createMockRequest, - createMockResponse, - createMockSocket, - createMockStorage, - databaseMock, - defaultMockEnv, - defaultMockUser, - drizzleOrmMock, - envMock, - loggerMock, - type MockAuthResult, - type MockFetchResponse, - type MockHybridAuthResult, - type MockRedis, - type MockUser, - mockAuth, - mockCommonSchemas, - mockConsoleLogger, - mockDrizzleOrm, - mockHybridAuth, - mockKnowledgeSchemas, - requestUtilsMock, - setupCommonApiMocks, - setupGlobalFetchMock, - setupGlobalStorageMocks, - telemetryMock, -} from './mocks' +export * from './mocks' export * from './types' diff --git a/packages/testing/src/mocks/api.mock.ts b/packages/testing/src/mocks/api.mock.ts deleted file mode 100644 index 2a4acd92619..00000000000 --- a/packages/testing/src/mocks/api.mock.ts +++ /dev/null @@ -1,198 +0,0 @@ -/** - * Mock utilities for API testing - */ -import { vi } from 'vitest' -import { createMockLogger } from './logger.mock' - -/** - * Mock drizzle-orm operators for database query testing. - * Provides mock implementations of common drizzle-orm operators. - * - * @example - * ```ts - * mockDrizzleOrm() - * // Now eq, and, or, etc. from drizzle-orm are mocked - * ``` - */ -export function mockDrizzleOrm() { - vi.doMock('drizzle-orm', () => ({ - and: vi.fn((...conditions) => ({ conditions, type: 'and' })), - eq: vi.fn((field, value) => ({ field, value, type: 'eq' })), - or: vi.fn((...conditions) => ({ type: 'or', conditions })), - gte: vi.fn((field, value) => ({ type: 'gte', field, value })), - lte: vi.fn((field, value) => ({ type: 'lte', field, value })), - gt: vi.fn((field, value) => ({ type: 'gt', field, value })), - lt: vi.fn((field, value) => ({ type: 'lt', field, value })), - ne: vi.fn((field, value) => ({ type: 'ne', field, value })), - asc: vi.fn((field) => ({ field, type: 'asc' })), - desc: vi.fn((field) => ({ field, type: 'desc' })), - isNull: vi.fn((field) => ({ field, type: 'isNull' })), - isNotNull: vi.fn((field) => ({ field, type: 'isNotNull' })), - inArray: vi.fn((field, values) => ({ field, values, type: 'inArray' })), - notInArray: vi.fn((field, values) => ({ field, values, type: 'notInArray' })), - like: vi.fn((field, value) => ({ field, value, type: 'like' })), - ilike: vi.fn((field, value) => ({ field, value, type: 'ilike' })), - count: vi.fn((field) => ({ field, type: 'count' })), - sum: vi.fn((field) => ({ field, type: 'sum' })), - avg: vi.fn((field) => ({ field, type: 'avg' })), - min: vi.fn((field) => ({ field, type: 'min' })), - max: vi.fn((field) => ({ field, type: 'max' })), - sql: vi.fn((strings, ...values) => ({ - type: 'sql', - sql: strings, - values, - })), - })) -} - -/** - * Mock common database schema patterns. - * Provides mock schema objects for common tables. - * - * @example - * ```ts - * mockCommonSchemas() - * // Now @sim/db/schema exports are mocked - * ``` - */ -export function mockCommonSchemas() { - vi.doMock('@sim/db/schema', () => ({ - workflowFolder: { - id: 'id', - userId: 'userId', - parentId: 'parentId', - updatedAt: 'updatedAt', - workspaceId: 'workspaceId', - sortOrder: 'sortOrder', - createdAt: 'createdAt', - }, - workflow: { - id: 'id', - folderId: 'folderId', - userId: 'userId', - updatedAt: 'updatedAt', - }, - account: { - userId: 'userId', - providerId: 'providerId', - }, - user: { - email: 'email', - id: 'id', - }, - })) -} - -/** - * Mock console logger using the shared mock logger. - * Ensures tests can assert on logger calls. - * - * @example - * ```ts - * mockConsoleLogger() - * // Now @sim/logger.createLogger returns a mock logger - * ``` - */ -export function mockConsoleLogger() { - const mockLogger = createMockLogger() - vi.doMock('@sim/logger', () => ({ - createLogger: vi.fn().mockReturnValue(mockLogger), - })) - return mockLogger -} - -/** - * Setup common API test mocks (schemas, drizzle ORM). - * Does NOT set up logger mocks - call mockConsoleLogger() separately if needed. - * - * @example - * ```ts - * setupCommonApiMocks() - * const mockLogger = mockConsoleLogger() // Call separately to get logger instance - * ``` - */ -export function setupCommonApiMocks() { - mockCommonSchemas() - mockDrizzleOrm() -} - -/** - * Mock knowledge-related database schemas. - * Provides mock schema objects for knowledge base tables. - * - * @example - * ```ts - * mockKnowledgeSchemas() - * // Now @sim/db/schema exports knowledge base tables - * ``` - */ -export function mockKnowledgeSchemas() { - vi.doMock('@sim/db/schema', () => ({ - knowledgeBase: { - id: 'kb_id', - userId: 'user_id', - name: 'kb_name', - description: 'description', - tokenCount: 'token_count', - embeddingModel: 'embedding_model', - embeddingDimension: 'embedding_dimension', - chunkingConfig: 'chunking_config', - workspaceId: 'workspace_id', - createdAt: 'created_at', - updatedAt: 'updated_at', - deletedAt: 'deleted_at', - }, - document: { - id: 'doc_id', - knowledgeBaseId: 'kb_id', - filename: 'filename', - fileUrl: 'file_url', - fileSize: 'file_size', - mimeType: 'mime_type', - chunkCount: 'chunk_count', - tokenCount: 'token_count', - characterCount: 'character_count', - processingStatus: 'processing_status', - processingStartedAt: 'processing_started_at', - processingCompletedAt: 'processing_completed_at', - processingError: 'processing_error', - enabled: 'enabled', - tag1: 'tag1', - tag2: 'tag2', - tag3: 'tag3', - tag4: 'tag4', - tag5: 'tag5', - tag6: 'tag6', - tag7: 'tag7', - uploadedAt: 'uploaded_at', - deletedAt: 'deleted_at', - }, - embedding: { - id: 'embedding_id', - documentId: 'doc_id', - knowledgeBaseId: 'kb_id', - chunkIndex: 'chunk_index', - content: 'content', - embedding: 'embedding', - tokenCount: 'token_count', - characterCount: 'character_count', - tag1: 'tag1', - tag2: 'tag2', - tag3: 'tag3', - tag4: 'tag4', - tag5: 'tag5', - tag6: 'tag6', - tag7: 'tag7', - createdAt: 'created_at', - }, - permissions: { - id: 'permission_id', - userId: 'user_id', - entityType: 'entity_type', - entityId: 'entity_id', - permissionType: 'permission_type', - createdAt: 'created_at', - updatedAt: 'updated_at', - }, - })) -} diff --git a/packages/testing/src/mocks/audit.mock.ts b/packages/testing/src/mocks/audit.mock.ts index a36f182738c..d930aa62d4f 100644 --- a/packages/testing/src/mocks/audit.mock.ts +++ b/packages/testing/src/mocks/audit.mock.ts @@ -1,8 +1,23 @@ import { vi } from 'vitest' /** - * Mock module for @/lib/audit/log. - * Use with vi.mock() to replace the real audit logger in tests. + * Controllable mock functions for `@/lib/audit/log`. + * Exposes `mockRecordAudit` so tests can assert or override behavior per test. + * + * @example + * ```ts + * import { auditMockFns } from '@sim/testing' + * + * expect(auditMockFns.mockRecordAudit).toHaveBeenCalledWith(...) + * auditMockFns.mockRecordAudit.mockRejectedValueOnce(new Error('audit failed')) + * ``` + */ +export const auditMockFns = { + mockRecordAudit: vi.fn(), +} + +/** + * Static mock module for `@/lib/audit/log`. * * @example * ```ts @@ -10,7 +25,7 @@ import { vi } from 'vitest' * ``` */ export const auditMock = { - recordAudit: vi.fn(), + recordAudit: auditMockFns.mockRecordAudit, AuditAction: { API_KEY_CREATED: 'api_key.created', API_KEY_UPDATED: 'api_key.updated', diff --git a/packages/testing/src/mocks/auth-oauth-utils.mock.ts b/packages/testing/src/mocks/auth-oauth-utils.mock.ts new file mode 100644 index 00000000000..ad0d6395ac1 --- /dev/null +++ b/packages/testing/src/mocks/auth-oauth-utils.mock.ts @@ -0,0 +1,59 @@ +import { vi } from 'vitest' + +/** + * Mock of the `ServiceAccountTokenError` class from + * `@/app/api/auth/oauth/utils`. Declared as a real class so consumer code + * using `instanceof ServiceAccountTokenError` keeps working under mock. + */ +export class ServiceAccountTokenErrorMock extends Error { + constructor( + public readonly statusCode: number, + public readonly errorDescription: string + ) { + super(errorDescription) + this.name = 'ServiceAccountTokenError' + } +} + +/** + * Controllable mock functions for `@/app/api/auth/oauth/utils`. + * All defaults are bare `vi.fn()` — configure per-test as needed. + * + * @example + * ```ts + * import { authOAuthUtilsMockFns } from '@sim/testing' + * + * authOAuthUtilsMockFns.mockRefreshAccessTokenIfNeeded.mockResolvedValue('access-token') + * authOAuthUtilsMockFns.mockGetOAuthToken.mockResolvedValue(null) + * ``` + */ +export const authOAuthUtilsMockFns = { + mockResolveOAuthAccountId: vi.fn(), + mockGetServiceAccountToken: vi.fn(), + mockSafeAccountInsert: vi.fn(), + mockGetCredential: vi.fn(), + mockGetOAuthToken: vi.fn(), + mockRefreshAccessTokenIfNeeded: vi.fn(), + mockRefreshTokenIfNeeded: vi.fn(), + mockGetCredentialsForCredentialSet: vi.fn(), +} + +/** + * Static mock module for `@/app/api/auth/oauth/utils`. + * + * @example + * ```ts + * vi.mock('@/app/api/auth/oauth/utils', () => authOAuthUtilsMock) + * ``` + */ +export const authOAuthUtilsMock = { + ServiceAccountTokenError: ServiceAccountTokenErrorMock, + resolveOAuthAccountId: authOAuthUtilsMockFns.mockResolveOAuthAccountId, + getServiceAccountToken: authOAuthUtilsMockFns.mockGetServiceAccountToken, + safeAccountInsert: authOAuthUtilsMockFns.mockSafeAccountInsert, + getCredential: authOAuthUtilsMockFns.mockGetCredential, + getOAuthToken: authOAuthUtilsMockFns.mockGetOAuthToken, + refreshAccessTokenIfNeeded: authOAuthUtilsMockFns.mockRefreshAccessTokenIfNeeded, + refreshTokenIfNeeded: authOAuthUtilsMockFns.mockRefreshTokenIfNeeded, + getCredentialsForCredentialSet: authOAuthUtilsMockFns.mockGetCredentialsForCredentialSet, +} diff --git a/packages/testing/src/mocks/auth.mock.ts b/packages/testing/src/mocks/auth.mock.ts index 209d93b34d2..1e9a800a3c2 100644 --- a/packages/testing/src/mocks/auth.mock.ts +++ b/packages/testing/src/mocks/auth.mock.ts @@ -1,10 +1,7 @@ -/** - * Mock authentication utilities for API testing - */ import { vi } from 'vitest' /** - * Mock user interface for authentication testing + * Mock user interface for authentication testing. */ export interface MockUser { id: string @@ -13,62 +10,26 @@ export interface MockUser { } /** - * Result object returned by mockAuth with helper methods - */ -export interface MockAuthResult { - /** The mock getSession function */ - mockGetSession: ReturnType - /** Set authenticated state with optional custom user */ - setAuthenticated: (user?: MockUser) => void - /** Set unauthenticated state (session returns null) */ - setUnauthenticated: () => void - /** Alias for setAuthenticated */ - mockAuthenticatedUser: (user?: MockUser) => void - /** Alias for setUnauthenticated */ - mockUnauthenticated: () => void -} - -/** - * Default mock user for testing + * Controllable mock functions for `@/lib/auth`. Override per-test with + * `authMockFns.mockGetSession.mockResolvedValueOnce(...)`. */ -export const defaultMockUser: MockUser = { - id: 'user-123', - email: 'test@example.com', +export const authMockFns = { + mockGetSession: vi.fn(), } /** - * Mock authentication for API tests. - * Uses vi.doMock to mock the auth module's getSession function. - * - * @param user - Optional user object to use for authenticated requests - * @returns Object with authentication helper functions + * Static mock module for `@/lib/auth`. * * @example * ```ts - * const auth = mockAuth() - * auth.setAuthenticated() // User is now authenticated - * auth.setUnauthenticated() // User is now unauthenticated - * - * // With custom user - * auth.setAuthenticated({ id: 'custom-id', email: 'custom@test.com' }) + * vi.mock('@/lib/auth', () => authMock) * ``` */ -export function mockAuth(user: MockUser = defaultMockUser): MockAuthResult { - const mockGetSession = vi.fn() - - vi.doMock('@/lib/auth', () => ({ - getSession: mockGetSession, - })) - - const setAuthenticated = (customUser?: MockUser) => - mockGetSession.mockResolvedValue({ user: customUser || user }) - const setUnauthenticated = () => mockGetSession.mockResolvedValue(null) - - return { - mockGetSession, - mockAuthenticatedUser: setAuthenticated, - mockUnauthenticated: setUnauthenticated, - setAuthenticated, - setUnauthenticated, - } +export const authMock = { + getSession: authMockFns.mockGetSession, + auth: { + api: { + getSession: authMockFns.mockGetSession, + }, + }, } diff --git a/packages/testing/src/mocks/copilot-http.mock.ts b/packages/testing/src/mocks/copilot-http.mock.ts new file mode 100644 index 00000000000..0b484758af9 --- /dev/null +++ b/packages/testing/src/mocks/copilot-http.mock.ts @@ -0,0 +1,85 @@ +import { vi } from 'vitest' + +/** + * Frozen mirror of the `NotificationStatus` const from + * `@/lib/copilot/request/http`. Matches the real values so route code using + * e.g. `NotificationStatus.success` keeps resolving under mock. + */ +const NotificationStatusMock = { + pending: 'pending', + background: 'background', + success: 'success', + error: 'error', + cancelled: 'cancelled', +} as const + +/** + * Controllable mock functions for `@/lib/copilot/request/http`. + * Response helpers default to returning minimal Response-like objects so + * handler tests can assert `res.status` and `await res.json()`. + * `createRequestTracker` returns a stable tracker with `requestId`, + * `startTime`, and a `getDuration()` that always returns `0`. + * + * @example + * ```ts + * import { copilotHttpMockFns } from '@sim/testing' + * + * copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly.mockResolvedValue({ + * userId: 'user-1', + * isAuthenticated: true, + * }) + * ``` + */ +export const copilotHttpMockFns = { + mockCreateUnauthorizedResponse: vi.fn(() => ({ + status: 401, + ok: false, + json: async () => ({ error: 'Unauthorized' }), + })), + mockCreateBadRequestResponse: vi.fn((message: string) => ({ + status: 400, + ok: false, + json: async () => ({ error: message }), + })), + mockCreateNotFoundResponse: vi.fn((message: string) => ({ + status: 404, + ok: false, + json: async () => ({ error: message }), + })), + mockCreateInternalServerErrorResponse: vi.fn((message: string) => ({ + status: 500, + ok: false, + json: async () => ({ error: message }), + })), + mockCreateRequestId: vi.fn(() => 'test-request-id'), + mockCreateShortRequestId: vi.fn(() => 'test-req'), + mockCreateRequestTracker: vi.fn(() => ({ + requestId: 'test-req', + startTime: 0, + getDuration: () => 0, + })), + mockAuthenticateCopilotRequestSessionOnly: vi.fn(), + mockCheckInternalApiKey: vi.fn(), +} + +/** + * Static mock module for `@/lib/copilot/request/http`. + * + * @example + * ```ts + * vi.mock('@/lib/copilot/request/http', () => copilotHttpMock) + * ``` + */ +export const copilotHttpMock = { + NotificationStatus: NotificationStatusMock, + createUnauthorizedResponse: copilotHttpMockFns.mockCreateUnauthorizedResponse, + createBadRequestResponse: copilotHttpMockFns.mockCreateBadRequestResponse, + createNotFoundResponse: copilotHttpMockFns.mockCreateNotFoundResponse, + createInternalServerErrorResponse: copilotHttpMockFns.mockCreateInternalServerErrorResponse, + createRequestId: copilotHttpMockFns.mockCreateRequestId, + createShortRequestId: copilotHttpMockFns.mockCreateShortRequestId, + createRequestTracker: copilotHttpMockFns.mockCreateRequestTracker, + authenticateCopilotRequestSessionOnly: + copilotHttpMockFns.mockAuthenticateCopilotRequestSessionOnly, + checkInternalApiKey: copilotHttpMockFns.mockCheckInternalApiKey, +} diff --git a/packages/testing/src/mocks/encryption.mock.ts b/packages/testing/src/mocks/encryption.mock.ts new file mode 100644 index 00000000000..169b150be30 --- /dev/null +++ b/packages/testing/src/mocks/encryption.mock.ts @@ -0,0 +1,31 @@ +import { vi } from 'vitest' + +/** + * Controllable mock functions for `@/lib/core/security/encryption`. + * Default: `decryptSecret` resolves to `{ decrypted: 'test-decrypted' }`, + * `encryptSecret` resolves to `{ encrypted: 'test-encrypted', iv: 'test-iv' }`. + * + * @example + * ```ts + * import { encryptionMockFns } from '@sim/testing' + * + * encryptionMockFns.mockDecryptSecret.mockResolvedValueOnce({ decrypted: 'my-secret' }) + * ``` + */ +export const encryptionMockFns = { + mockDecryptSecret: vi.fn().mockResolvedValue({ decrypted: 'test-decrypted' }), + mockEncryptSecret: vi.fn().mockResolvedValue({ encrypted: 'test-encrypted', iv: 'test-iv' }), +} + +/** + * Static mock module for `@/lib/core/security/encryption`. + * + * @example + * ```ts + * vi.mock('@/lib/core/security/encryption', () => encryptionMock) + * ``` + */ +export const encryptionMock = { + decryptSecret: encryptionMockFns.mockDecryptSecret, + encryptSecret: encryptionMockFns.mockEncryptSecret, +} diff --git a/packages/testing/src/mocks/execution-preprocessing.mock.ts b/packages/testing/src/mocks/execution-preprocessing.mock.ts new file mode 100644 index 00000000000..dab2f8d4154 --- /dev/null +++ b/packages/testing/src/mocks/execution-preprocessing.mock.ts @@ -0,0 +1,31 @@ +import { vi } from 'vitest' + +/** + * Controllable mock functions for `@/lib/execution/preprocessing`. + * Default is a bare `vi.fn()` — configure per-test. + * + * @example + * ```ts + * import { executionPreprocessingMockFns } from '@sim/testing' + * + * executionPreprocessingMockFns.mockPreprocessExecution.mockResolvedValue({ + * success: true, + * actorUserId: 'user-1', + * }) + * ``` + */ +export const executionPreprocessingMockFns = { + mockPreprocessExecution: vi.fn(), +} + +/** + * Static mock module for `@/lib/execution/preprocessing`. + * + * @example + * ```ts + * vi.mock('@/lib/execution/preprocessing', () => executionPreprocessingMock) + * ``` + */ +export const executionPreprocessingMock = { + preprocessExecution: executionPreprocessingMockFns.mockPreprocessExecution, +} diff --git a/packages/testing/src/mocks/feature-flags.mock.ts b/packages/testing/src/mocks/feature-flags.mock.ts new file mode 100644 index 00000000000..9a108d3cde2 --- /dev/null +++ b/packages/testing/src/mocks/feature-flags.mock.ts @@ -0,0 +1,44 @@ +import { vi } from 'vitest' + +/** + * Static mock module for `@/lib/core/config/feature-flags`. + * All boolean flags default to `false` for safe test isolation. + * + * @example + * ```ts + * vi.mock('@/lib/core/config/feature-flags', () => featureFlagsMock) + * ``` + */ +export const featureFlagsMock = { + isProd: false, + isDev: false, + isTest: true, + isHosted: false, + isBillingEnabled: false, + isEmailVerificationEnabled: false, + isAuthDisabled: false, + isRegistrationDisabled: false, + isEmailPasswordEnabled: false, + isSignupEmailValidationEnabled: false, + isTriggerDevEnabled: false, + isSsoEnabled: false, + isCredentialSetsEnabled: false, + isAccessControlEnabled: false, + isOrganizationsEnabled: false, + isInboxEnabled: false, + isWhitelabelingEnabled: false, + isAuditLogsEnabled: false, + isE2bEnabled: false, + isOllamaConfigured: false, + isAzureConfigured: false, + isInvitationsDisabled: false, + isPublicApiDisabled: false, + isGoogleAuthDisabled: false, + isGithubAuthDisabled: false, + isReactGrabEnabled: false, + isReactScanEnabled: false, + getAllowedIntegrationsFromEnv: vi.fn().mockReturnValue(null), + getBlacklistedProvidersFromEnv: vi.fn().mockReturnValue([]), + getAllowedMcpDomainsFromEnv: vi.fn().mockReturnValue(null), + getCostMultiplier: vi.fn().mockReturnValue(1), +} diff --git a/packages/testing/src/mocks/hybrid-auth.mock.ts b/packages/testing/src/mocks/hybrid-auth.mock.ts index add5babbcc3..312719d0088 100644 --- a/packages/testing/src/mocks/hybrid-auth.mock.ts +++ b/packages/testing/src/mocks/hybrid-auth.mock.ts @@ -1,96 +1,36 @@ -/** - * Mock for @/lib/auth/hybrid module. - * Provides controllable mock functions for checkHybridAuth, checkSessionOrInternalAuth, and checkInternalAuth. - */ import { vi } from 'vitest' -import type { MockUser } from './auth.mock' -import { defaultMockUser } from './auth.mock' /** - * Auth type constants matching @/lib/auth/hybrid AuthType. - * Include this in vi.mock() factories so route code can reference AuthType.*. + * Auth type constants matching `@/lib/auth/hybrid` AuthType. Included in + * `hybridAuthMock.AuthType` so route code can reference `AuthType.SESSION` etc. */ -export const AuthTypeMock = { +const AuthTypeMock = { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt', } as const -interface HybridAuthResponse { - success: boolean - userId?: string - userName?: string | null - userEmail?: string | null - authType?: (typeof AuthTypeMock)[keyof typeof AuthTypeMock] - error?: string -} - /** - * Result object returned by mockHybridAuth with helper methods + * Controllable mock functions for `@/lib/auth/hybrid`. Override per-test with + * `hybridAuthMockFns.mockCheckHybridAuth.mockResolvedValueOnce(...)`. */ -export interface MockHybridAuthResult { - mockCheckHybridAuth: ReturnType - mockCheckSessionOrInternalAuth: ReturnType - mockCheckInternalAuth: ReturnType - setAuthenticated: (user?: MockUser) => void - setUnauthenticated: () => void +export const hybridAuthMockFns = { + mockCheckHybridAuth: vi.fn(), + mockCheckSessionOrInternalAuth: vi.fn(), + mockCheckInternalAuth: vi.fn(), } /** - * Mock hybrid authentication for API tests. - * Uses vi.doMock to mock the @/lib/auth/hybrid module. - * - * @param user - Optional default user for authenticated state - * @returns Object with mock functions and authentication helpers + * Static mock module for `@/lib/auth/hybrid`. * * @example * ```ts - * const hybridAuth = mockHybridAuth() - * hybridAuth.setAuthenticated() // All hybrid auth checks succeed - * hybridAuth.setUnauthenticated() // All hybrid auth checks fail + * vi.mock('@/lib/auth/hybrid', () => hybridAuthMock) * ``` */ -export function mockHybridAuth(user: MockUser = defaultMockUser): MockHybridAuthResult { - const mockCheckHybridAuth = vi.fn<() => Promise>() - const mockCheckSessionOrInternalAuth = vi.fn<() => Promise>() - const mockCheckInternalAuth = vi.fn<() => Promise>() - - vi.doMock('@/lib/auth/hybrid', () => ({ - AuthType: AuthTypeMock, - checkHybridAuth: mockCheckHybridAuth, - checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth, - checkInternalAuth: mockCheckInternalAuth, - })) - - const setAuthenticated = (customUser?: MockUser) => { - const u = customUser || user - const response: HybridAuthResponse = { - success: true, - userId: u.id, - userName: u.name ?? null, - userEmail: u.email, - authType: 'session', - } - mockCheckHybridAuth.mockResolvedValue(response) - mockCheckSessionOrInternalAuth.mockResolvedValue(response) - mockCheckInternalAuth.mockResolvedValue(response) - } - - const setUnauthenticated = () => { - const response: HybridAuthResponse = { - success: false, - error: 'Unauthorized', - } - mockCheckHybridAuth.mockResolvedValue(response) - mockCheckSessionOrInternalAuth.mockResolvedValue(response) - mockCheckInternalAuth.mockResolvedValue(response) - } - - return { - mockCheckHybridAuth, - mockCheckSessionOrInternalAuth, - mockCheckInternalAuth, - setAuthenticated, - setUnauthenticated, - } +export const hybridAuthMock = { + AuthType: AuthTypeMock, + checkHybridAuth: hybridAuthMockFns.mockCheckHybridAuth, + checkSessionOrInternalAuth: hybridAuthMockFns.mockCheckSessionOrInternalAuth, + checkInternalAuth: hybridAuthMockFns.mockCheckInternalAuth, } diff --git a/packages/testing/src/mocks/index.ts b/packages/testing/src/mocks/index.ts index 67fa5349903..5ba775e01f7 100644 --- a/packages/testing/src/mocks/index.ts +++ b/packages/testing/src/mocks/index.ts @@ -16,23 +16,16 @@ * ``` */ -// API mocks -export { - mockCommonSchemas, - mockConsoleLogger, - mockDrizzleOrm, - mockKnowledgeSchemas, - setupCommonApiMocks, -} from './api.mock' // Audit mocks -export { auditMock } from './audit.mock' +export { auditMock, auditMockFns } from './audit.mock' // Auth mocks +export { authMock, authMockFns, type MockUser } from './auth.mock' +// Auth OAuth utils mocks (for @/app/api/auth/oauth/utils) export { - defaultMockUser, - type MockAuthResult, - type MockUser, - mockAuth, -} from './auth.mock' + authOAuthUtilsMock, + authOAuthUtilsMockFns, + ServiceAccountTokenErrorMock, +} from './auth-oauth-utils.mock' // Blocks mocks export { blocksMock, @@ -42,6 +35,8 @@ export { mockToolConfigs, toolsUtilsMock, } from './blocks.mock' +// Copilot HTTP mocks (for @/lib/copilot/request/http) +export { copilotHttpMock, copilotHttpMockFns } from './copilot-http.mock' // Database mocks export { createMockDb, @@ -50,8 +45,17 @@ export { databaseMock, drizzleOrmMock, } from './database.mock' +// Encryption mocks +export { encryptionMock, encryptionMockFns } from './encryption.mock' // Env mocks export { createEnvMock, createMockGetEnv, defaultMockEnv, envMock } from './env.mock' +// Execution preprocessing mocks (for @/lib/execution/preprocessing) +export { + executionPreprocessingMock, + executionPreprocessingMockFns, +} from './execution-preprocessing.mock' +// Feature flag mocks +export { featureFlagsMock } from './feature-flags.mock' // Executor mocks - use side-effect import: import '@sim/testing/mocks/executor' // Fetch mocks export { @@ -64,13 +68,34 @@ export { setupGlobalFetchMock, } from './fetch.mock' // Hybrid auth mocks -export { AuthTypeMock, type MockHybridAuthResult, mockHybridAuth } from './hybrid-auth.mock' +export { hybridAuthMock, hybridAuthMockFns } from './hybrid-auth.mock' +// Input validation mocks +export { inputValidationMock, inputValidationMockFns } from './input-validation.mock' +// Knowledge API utils mocks (for @/app/api/knowledge/utils) +export { knowledgeApiUtilsMock, knowledgeApiUtilsMockFns } from './knowledge-api-utils.mock' // Logger mocks export { clearLoggerMocks, createMockLogger, getLoggerCalls, loggerMock } from './logger.mock' -// Redis mocks +// Logging session mocks (for @/lib/logs/execution/logging-session) +export { + LoggingSessionMock, + loggingSessionMock, + loggingSessionMockFns, +} from './logging-session.mock' +// Permission mocks +export { permissionsMock, permissionsMockFns } from './permissions.mock' +// Redis client mocks (for Redis client objects) export { clearRedisMocks, createMockRedis, type MockRedis } from './redis.mock' +// Redis config mocks (for @/lib/core/config/redis) +export { redisConfigMock, redisConfigMockFns } from './redis-config.mock' // Request mocks -export { createMockFormDataRequest, createMockRequest, requestUtilsMock } from './request.mock' +export { + createMockFormDataRequest, + createMockRequest, + requestUtilsMock, + requestUtilsMockFns, +} from './request.mock' +// Schema mocks +export { schemaMock } from './schema.mock' // Socket mocks export { createMockSocket, @@ -82,3 +107,19 @@ export { export { clearStorageMocks, createMockStorage, setupGlobalStorageMocks } from './storage.mock' // Telemetry mocks export { telemetryMock } from './telemetry.mock' +// URL mocks +export { urlsMock, urlsMockFns } from './urls.mock' +// Workflows API utils mocks (for @/app/api/workflows/utils) +export { workflowsApiUtilsMock, workflowsApiUtilsMockFns } from './workflows-api-utils.mock' +// Workflows orchestration mocks (for @/lib/workflows/orchestration) +export { + workflowsOrchestrationMock, + workflowsOrchestrationMockFns, +} from './workflows-orchestration.mock' +// Workflows persistence utils mocks (for @/lib/workflows/persistence/utils) +export { + workflowsPersistenceUtilsMock, + workflowsPersistenceUtilsMockFns, +} from './workflows-persistence-utils.mock' +// Workflows-utils mocks +export { workflowsUtilsMock, workflowsUtilsMockFns } from './workflows-utils.mock' diff --git a/packages/testing/src/mocks/input-validation.mock.ts b/packages/testing/src/mocks/input-validation.mock.ts new file mode 100644 index 00000000000..a525df9fcfa --- /dev/null +++ b/packages/testing/src/mocks/input-validation.mock.ts @@ -0,0 +1,47 @@ +import { vi } from 'vitest' + +/** + * Controllable mock functions for `@/lib/core/security/input-validation.server`. + * + * @example + * ```ts + * import { inputValidationMockFns } from '@sim/testing' + * + * inputValidationMockFns.mockValidateUrlWithDNS.mockResolvedValue({ valid: true }) + * inputValidationMockFns.mockSecureFetchWithPinnedIP.mockResolvedValue({ response: new Response() }) + * ``` + */ +export const inputValidationMockFns = { + mockValidateUrlWithDNS: vi.fn(), + mockValidateDatabaseHost: vi.fn(), + mockSecureFetchWithPinnedIP: vi.fn(), + mockSecureFetchWithValidation: vi.fn(), + mockIsPrivateOrReservedIP: vi.fn().mockReturnValue(false), + mockCreatePinnedLookup: vi.fn(), +} + +/** + * Static mock module for `@/lib/core/security/input-validation.server`. + * + * @example + * ```ts + * vi.mock('@/lib/core/security/input-validation.server', () => inputValidationMock) + * ``` + */ +export const inputValidationMock = { + validateUrlWithDNS: inputValidationMockFns.mockValidateUrlWithDNS, + validateDatabaseHost: inputValidationMockFns.mockValidateDatabaseHost, + secureFetchWithPinnedIP: inputValidationMockFns.mockSecureFetchWithPinnedIP, + secureFetchWithValidation: inputValidationMockFns.mockSecureFetchWithValidation, + isPrivateOrReservedIP: inputValidationMockFns.mockIsPrivateOrReservedIP, + createPinnedLookup: inputValidationMockFns.mockCreatePinnedLookup, + SecureFetchHeaders: class { + headers: Record = {} + set(k: string, v: string) { + this.headers[k] = v + } + get(k: string) { + return this.headers[k] + } + }, +} diff --git a/packages/testing/src/mocks/knowledge-api-utils.mock.ts b/packages/testing/src/mocks/knowledge-api-utils.mock.ts new file mode 100644 index 00000000000..b0cb3ed816a --- /dev/null +++ b/packages/testing/src/mocks/knowledge-api-utils.mock.ts @@ -0,0 +1,40 @@ +import { vi } from 'vitest' + +/** + * Controllable mock functions for `@/app/api/knowledge/utils`. + * All defaults are bare `vi.fn()` — override per-test with + * `knowledgeApiUtilsMockFns.mockCheckKnowledgeBaseAccess.mockResolvedValueOnce(...)`. + * + * @example + * ```ts + * import { knowledgeApiUtilsMockFns } from '@sim/testing' + * + * knowledgeApiUtilsMockFns.mockCheckKnowledgeBaseAccess.mockResolvedValue({ + * hasAccess: true, + * knowledgeBase: { id: 'kb-1', userId: 'u-1', workspaceId: 'ws-1', name: 'KB' }, + * }) + * ``` + */ +export const knowledgeApiUtilsMockFns = { + mockCheckKnowledgeBaseAccess: vi.fn(), + mockCheckKnowledgeBaseWriteAccess: vi.fn(), + mockCheckDocumentWriteAccess: vi.fn(), + mockCheckDocumentAccess: vi.fn(), + mockCheckChunkAccess: vi.fn(), +} + +/** + * Static mock module for `@/app/api/knowledge/utils`. + * + * @example + * ```ts + * vi.mock('@/app/api/knowledge/utils', () => knowledgeApiUtilsMock) + * ``` + */ +export const knowledgeApiUtilsMock = { + checkKnowledgeBaseAccess: knowledgeApiUtilsMockFns.mockCheckKnowledgeBaseAccess, + checkKnowledgeBaseWriteAccess: knowledgeApiUtilsMockFns.mockCheckKnowledgeBaseWriteAccess, + checkDocumentWriteAccess: knowledgeApiUtilsMockFns.mockCheckDocumentWriteAccess, + checkDocumentAccess: knowledgeApiUtilsMockFns.mockCheckDocumentAccess, + checkChunkAccess: knowledgeApiUtilsMockFns.mockCheckChunkAccess, +} diff --git a/packages/testing/src/mocks/logging-session.mock.ts b/packages/testing/src/mocks/logging-session.mock.ts new file mode 100644 index 00000000000..fdf025573e2 --- /dev/null +++ b/packages/testing/src/mocks/logging-session.mock.ts @@ -0,0 +1,65 @@ +import { vi } from 'vitest' + +/** + * Controllable mock functions for the `LoggingSession` class from + * `@/lib/logs/execution/logging-session`. Every instance method is backed by a + * shared `vi.fn()` so tests that construct multiple sessions observe identical + * mock state. `mockSafeStart` defaults to `true` because callers branch on the + * boolean result. All other methods resolve to `undefined`. + * + * @example + * ```ts + * import { loggingSessionMockFns } from '@sim/testing' + * + * loggingSessionMockFns.mockSafeStart.mockResolvedValueOnce(false) + * expect(loggingSessionMockFns.mockSafeCompleteWithError).toHaveBeenCalled() + * ``` + */ +export const loggingSessionMockFns = { + mockStart: vi.fn().mockResolvedValue(undefined), + mockComplete: vi.fn().mockResolvedValue(undefined), + mockCompleteWithError: vi.fn().mockResolvedValue(undefined), + mockCompleteWithCancellation: vi.fn().mockResolvedValue(undefined), + mockCompleteWithPause: vi.fn().mockResolvedValue(undefined), + mockSafeStart: vi.fn().mockResolvedValue(true), + mockWaitForCompletion: vi.fn().mockResolvedValue(undefined), + mockWaitForPostExecution: vi.fn().mockResolvedValue(undefined), + mockSafeComplete: vi.fn().mockResolvedValue(undefined), + mockSafeCompleteWithError: vi.fn().mockResolvedValue(undefined), + mockSafeCompleteWithCancellation: vi.fn().mockResolvedValue(undefined), + mockSafeCompleteWithPause: vi.fn().mockResolvedValue(undefined), + mockMarkAsFailed: vi.fn().mockResolvedValue(undefined), +} + +/** + * Constructor-shaped mock for `LoggingSession`. Each `new LoggingSession(...)` + * call returns an object whose methods point at the shared `vi.fn()` refs in + * `loggingSessionMockFns`. + */ +export const LoggingSessionMock = vi.fn().mockImplementation(() => ({ + start: loggingSessionMockFns.mockStart, + complete: loggingSessionMockFns.mockComplete, + completeWithError: loggingSessionMockFns.mockCompleteWithError, + completeWithCancellation: loggingSessionMockFns.mockCompleteWithCancellation, + completeWithPause: loggingSessionMockFns.mockCompleteWithPause, + safeStart: loggingSessionMockFns.mockSafeStart, + waitForCompletion: loggingSessionMockFns.mockWaitForCompletion, + waitForPostExecution: loggingSessionMockFns.mockWaitForPostExecution, + safeComplete: loggingSessionMockFns.mockSafeComplete, + safeCompleteWithError: loggingSessionMockFns.mockSafeCompleteWithError, + safeCompleteWithCancellation: loggingSessionMockFns.mockSafeCompleteWithCancellation, + safeCompleteWithPause: loggingSessionMockFns.mockSafeCompleteWithPause, + markAsFailed: loggingSessionMockFns.mockMarkAsFailed, +})) + +/** + * Static mock module for `@/lib/logs/execution/logging-session`. + * + * @example + * ```ts + * vi.mock('@/lib/logs/execution/logging-session', () => loggingSessionMock) + * ``` + */ +export const loggingSessionMock = { + LoggingSession: LoggingSessionMock, +} diff --git a/packages/testing/src/mocks/permissions.mock.ts b/packages/testing/src/mocks/permissions.mock.ts new file mode 100644 index 00000000000..167d079f9a8 --- /dev/null +++ b/packages/testing/src/mocks/permissions.mock.ts @@ -0,0 +1,50 @@ +import { vi } from 'vitest' + +/** + * Controllable mock functions for `@/lib/workspaces/permissions/utils`. + * + * @example + * ```ts + * import { permissionsMockFns } from '@sim/testing' + * + * permissionsMockFns.mockCheckWorkspaceAccess.mockResolvedValue({ + * exists: true, hasAccess: true, canWrite: true, workspace: { id: 'ws-1', name: 'Test', ownerId: 'user-1' }, + * }) + * ``` + */ +export const permissionsMockFns = { + mockWorkspaceExists: vi.fn(), + mockGetWorkspaceById: vi.fn(), + mockGetWorkspaceWithOwner: vi.fn(), + mockCheckWorkspaceAccess: vi.fn(), + mockAssertActiveWorkspaceAccess: vi.fn(), + mockGetUserEntityPermissions: vi.fn(), + mockHasAdminPermission: vi.fn(), + mockGetUsersWithPermissions: vi.fn(), + mockGetWorkspaceMemberProfiles: vi.fn(), + mockHasWorkspaceAdminAccess: vi.fn(), + mockGetManageableWorkspaces: vi.fn(), +} + +/** + * Static mock module for `@/lib/workspaces/permissions/utils`. + * Defaults resolve to "allowed" state for safe test defaults. + * + * @example + * ```ts + * vi.mock('@/lib/workspaces/permissions/utils', () => permissionsMock) + * ``` + */ +export const permissionsMock = { + workspaceExists: permissionsMockFns.mockWorkspaceExists, + getWorkspaceById: permissionsMockFns.mockGetWorkspaceById, + getWorkspaceWithOwner: permissionsMockFns.mockGetWorkspaceWithOwner, + checkWorkspaceAccess: permissionsMockFns.mockCheckWorkspaceAccess, + assertActiveWorkspaceAccess: permissionsMockFns.mockAssertActiveWorkspaceAccess, + getUserEntityPermissions: permissionsMockFns.mockGetUserEntityPermissions, + hasAdminPermission: permissionsMockFns.mockHasAdminPermission, + getUsersWithPermissions: permissionsMockFns.mockGetUsersWithPermissions, + getWorkspaceMemberProfiles: permissionsMockFns.mockGetWorkspaceMemberProfiles, + hasWorkspaceAdminAccess: permissionsMockFns.mockHasWorkspaceAdminAccess, + getManageableWorkspaces: permissionsMockFns.mockGetManageableWorkspaces, +} diff --git a/packages/testing/src/mocks/redis-config.mock.ts b/packages/testing/src/mocks/redis-config.mock.ts new file mode 100644 index 00000000000..b40cf71eeef --- /dev/null +++ b/packages/testing/src/mocks/redis-config.mock.ts @@ -0,0 +1,39 @@ +import { vi } from 'vitest' + +/** + * Controllable mock functions for `@/lib/core/config/redis`. + * Default: `getRedisClient` returns `null` (tests that need a client override it). + * `acquireLock` defaults to succeeding (`true`); `releaseLock` defaults to `true`. + * + * @example + * ```ts + * import { redisConfigMockFns } from '@sim/testing' + * + * redisConfigMockFns.mockGetRedisClient.mockReturnValue(myFakeRedis) + * ``` + */ +export const redisConfigMockFns = { + mockGetRedisClient: vi.fn().mockReturnValue(null), + mockOnRedisReconnect: vi.fn(), + mockAcquireLock: vi.fn().mockResolvedValue(true), + mockReleaseLock: vi.fn().mockResolvedValue(true), + mockCloseRedisConnection: vi.fn().mockResolvedValue(undefined), + mockResetForTesting: vi.fn(), +} + +/** + * Static mock module for `@/lib/core/config/redis`. + * + * @example + * ```ts + * vi.mock('@/lib/core/config/redis', () => redisConfigMock) + * ``` + */ +export const redisConfigMock = { + getRedisClient: redisConfigMockFns.mockGetRedisClient, + onRedisReconnect: redisConfigMockFns.mockOnRedisReconnect, + acquireLock: redisConfigMockFns.mockAcquireLock, + releaseLock: redisConfigMockFns.mockReleaseLock, + closeRedisConnection: redisConfigMockFns.mockCloseRedisConnection, + resetForTesting: redisConfigMockFns.mockResetForTesting, +} diff --git a/packages/testing/src/mocks/request.mock.ts b/packages/testing/src/mocks/request.mock.ts index 5b8610d550d..3b9fc0f9aba 100644 --- a/packages/testing/src/mocks/request.mock.ts +++ b/packages/testing/src/mocks/request.mock.ts @@ -60,7 +60,23 @@ export function createMockFormDataRequest( } /** - * Pre-configured mock for @/lib/core/utils/request module. + * Controllable mock functions for `@/lib/core/utils/request`. + * + * @example + * ```ts + * import { requestUtilsMockFns } from '@sim/testing' + * + * requestUtilsMockFns.mockGenerateRequestId.mockReturnValueOnce('test-req-42') + * requestUtilsMockFns.mockGetClientIp.mockReturnValueOnce('10.0.0.5') + * ``` + */ +export const requestUtilsMockFns = { + mockGenerateRequestId: vi.fn(() => 'mock-request-id'), + mockGetClientIp: vi.fn(() => '127.0.0.1'), +} + +/** + * Static mock module for `@/lib/core/utils/request`. * * @example * ```ts @@ -68,6 +84,7 @@ export function createMockFormDataRequest( * ``` */ export const requestUtilsMock = { - generateRequestId: vi.fn(() => 'mock-request-id'), - noop: vi.fn(), + generateRequestId: requestUtilsMockFns.mockGenerateRequestId, + getClientIp: requestUtilsMockFns.mockGetClientIp, + noop: () => {}, } diff --git a/packages/testing/src/mocks/schema.mock.ts b/packages/testing/src/mocks/schema.mock.ts new file mode 100644 index 00000000000..e7399b9bd23 --- /dev/null +++ b/packages/testing/src/mocks/schema.mock.ts @@ -0,0 +1,1206 @@ +/** + * Comprehensive mock for `@sim/db/schema`. + * Every exported table maps each column to its own name as a string, + * which satisfies drizzle column references used in query builders. + */ + +export const schemaMock = { + user: { + id: 'id', + name: 'name', + email: 'email', + normalizedEmail: 'normalizedEmail', + emailVerified: 'emailVerified', + image: 'image', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + stripeCustomerId: 'stripeCustomerId', + role: 'role', + banned: 'banned', + banReason: 'banReason', + banExpires: 'banExpires', + }, + session: { + id: 'id', + expiresAt: 'expiresAt', + token: 'token', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + ipAddress: 'ipAddress', + userAgent: 'userAgent', + userId: 'userId', + activeOrganizationId: 'activeOrganizationId', + impersonatedBy: 'impersonatedBy', + }, + account: { + id: 'id', + accountId: 'accountId', + providerId: 'providerId', + userId: 'userId', + accessToken: 'accessToken', + refreshToken: 'refreshToken', + idToken: 'idToken', + accessTokenExpiresAt: 'accessTokenExpiresAt', + refreshTokenExpiresAt: 'refreshTokenExpiresAt', + scope: 'scope', + password: 'password', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + verification: { + id: 'id', + identifier: 'identifier', + value: 'value', + expiresAt: 'expiresAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + workflowFolder: { + id: 'id', + name: 'name', + userId: 'userId', + workspaceId: 'workspaceId', + parentId: 'parentId', + color: 'color', + isExpanded: 'isExpanded', + sortOrder: 'sortOrder', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + archivedAt: 'archivedAt', + }, + workflow: { + id: 'id', + userId: 'userId', + workspaceId: 'workspaceId', + folderId: 'folderId', + sortOrder: 'sortOrder', + name: 'name', + description: 'description', + color: 'color', + lastSynced: 'lastSynced', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + isDeployed: 'isDeployed', + deployedAt: 'deployedAt', + isPublicApi: 'isPublicApi', + runCount: 'runCount', + lastRunAt: 'lastRunAt', + variables: 'variables', + archivedAt: 'archivedAt', + }, + workflowBlocks: { + id: 'id', + workflowId: 'workflowId', + type: 'type', + name: 'name', + positionX: 'positionX', + positionY: 'positionY', + enabled: 'enabled', + horizontalHandles: 'horizontalHandles', + isWide: 'isWide', + advancedMode: 'advancedMode', + triggerMode: 'triggerMode', + locked: 'locked', + height: 'height', + subBlocks: 'subBlocks', + outputs: 'outputs', + data: 'data', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + workflowEdges: { + id: 'id', + workflowId: 'workflowId', + sourceBlockId: 'sourceBlockId', + targetBlockId: 'targetBlockId', + sourceHandle: 'sourceHandle', + targetHandle: 'targetHandle', + createdAt: 'createdAt', + }, + workflowSubflows: { + id: 'id', + workflowId: 'workflowId', + type: 'type', + config: 'config', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + waitlist: { + id: 'id', + email: 'email', + status: 'status', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + workflowExecutionSnapshots: { + id: 'id', + workflowId: 'workflowId', + stateHash: 'stateHash', + stateData: 'stateData', + createdAt: 'createdAt', + }, + workflowExecutionLogs: { + id: 'id', + workflowId: 'workflowId', + workspaceId: 'workspaceId', + executionId: 'executionId', + stateSnapshotId: 'stateSnapshotId', + deploymentVersionId: 'deploymentVersionId', + level: 'level', + status: 'status', + trigger: 'trigger', + startedAt: 'startedAt', + endedAt: 'endedAt', + totalDurationMs: 'totalDurationMs', + executionData: 'executionData', + cost: 'cost', + files: 'files', + createdAt: 'createdAt', + }, + pausedExecutions: { + id: 'id', + workflowId: 'workflowId', + executionId: 'executionId', + executionSnapshot: 'executionSnapshot', + pausePoints: 'pausePoints', + totalPauseCount: 'totalPauseCount', + resumedCount: 'resumedCount', + status: 'status', + metadata: 'metadata', + pausedAt: 'pausedAt', + updatedAt: 'updatedAt', + expiresAt: 'expiresAt', + }, + resumeQueue: { + id: 'id', + pausedExecutionId: 'pausedExecutionId', + parentExecutionId: 'parentExecutionId', + newExecutionId: 'newExecutionId', + contextId: 'contextId', + resumeInput: 'resumeInput', + status: 'status', + queuedAt: 'queuedAt', + claimedAt: 'claimedAt', + completedAt: 'completedAt', + failureReason: 'failureReason', + }, + environment: { + id: 'id', + userId: 'userId', + variables: 'variables', + updatedAt: 'updatedAt', + }, + workspaceEnvironment: { + id: 'id', + workspaceId: 'workspaceId', + variables: 'variables', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + workspaceBYOKKeys: { + id: 'id', + workspaceId: 'workspaceId', + providerId: 'providerId', + encryptedApiKey: 'encryptedApiKey', + createdBy: 'createdBy', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + settings: { + id: 'id', + userId: 'userId', + theme: 'theme', + autoConnect: 'autoConnect', + telemetryEnabled: 'telemetryEnabled', + emailPreferences: 'emailPreferences', + billingUsageNotificationsEnabled: 'billingUsageNotificationsEnabled', + showTrainingControls: 'showTrainingControls', + superUserModeEnabled: 'superUserModeEnabled', + errorNotificationsEnabled: 'errorNotificationsEnabled', + snapToGridSize: 'snapToGridSize', + showActionBar: 'showActionBar', + copilotEnabledModels: 'copilotEnabledModels', + copilotAutoAllowedTools: 'copilotAutoAllowedTools', + lastActiveWorkspaceId: 'lastActiveWorkspaceId', + updatedAt: 'updatedAt', + }, + workflowSchedule: { + id: 'id', + workflowId: 'workflowId', + deploymentVersionId: 'deploymentVersionId', + blockId: 'blockId', + cronExpression: 'cronExpression', + nextRunAt: 'nextRunAt', + lastRanAt: 'lastRanAt', + lastQueuedAt: 'lastQueuedAt', + triggerType: 'triggerType', + timezone: 'timezone', + failedCount: 'failedCount', + status: 'status', + lastFailedAt: 'lastFailedAt', + sourceType: 'sourceType', + jobTitle: 'jobTitle', + prompt: 'prompt', + lifecycle: 'lifecycle', + successCondition: 'successCondition', + maxRuns: 'maxRuns', + runCount: 'runCount', + sourceChatId: 'sourceChatId', + sourceTaskName: 'sourceTaskName', + sourceUserId: 'sourceUserId', + sourceWorkspaceId: 'sourceWorkspaceId', + jobHistory: 'jobHistory', + archivedAt: 'archivedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + jobExecutionLogs: { + id: 'id', + scheduleId: 'scheduleId', + workspaceId: 'workspaceId', + executionId: 'executionId', + level: 'level', + status: 'status', + trigger: 'trigger', + startedAt: 'startedAt', + endedAt: 'endedAt', + totalDurationMs: 'totalDurationMs', + executionData: 'executionData', + cost: 'cost', + createdAt: 'createdAt', + }, + webhook: { + id: 'id', + workflowId: 'workflowId', + deploymentVersionId: 'deploymentVersionId', + blockId: 'blockId', + path: 'path', + provider: 'provider', + providerConfig: 'providerConfig', + isActive: 'isActive', + failedCount: 'failedCount', + lastFailedAt: 'lastFailedAt', + credentialSetId: 'credentialSetId', + archivedAt: 'archivedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + notificationTypeEnum: 'notificationTypeEnum', + notificationDeliveryStatusEnum: 'notificationDeliveryStatusEnum', + workspaceNotificationSubscription: { + id: 'id', + workspaceId: 'workspaceId', + notificationType: 'notificationType', + workflowIds: 'workflowIds', + allWorkflows: 'allWorkflows', + levelFilter: 'levelFilter', + triggerFilter: 'triggerFilter', + includeFinalOutput: 'includeFinalOutput', + includeTraceSpans: 'includeTraceSpans', + includeRateLimits: 'includeRateLimits', + includeUsageData: 'includeUsageData', + webhookConfig: 'webhookConfig', + emailRecipients: 'emailRecipients', + slackConfig: 'slackConfig', + alertConfig: 'alertConfig', + lastAlertAt: 'lastAlertAt', + active: 'active', + createdBy: 'createdBy', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + workspaceNotificationDelivery: { + id: 'id', + subscriptionId: 'subscriptionId', + workflowId: 'workflowId', + executionId: 'executionId', + status: 'status', + attempts: 'attempts', + lastAttemptAt: 'lastAttemptAt', + nextAttemptAt: 'nextAttemptAt', + responseStatus: 'responseStatus', + responseBody: 'responseBody', + errorMessage: 'errorMessage', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + apiKey: { + id: 'id', + userId: 'userId', + workspaceId: 'workspaceId', + createdBy: 'createdBy', + name: 'name', + key: 'key', + type: 'type', + lastUsed: 'lastUsed', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + expiresAt: 'expiresAt', + }, + billingBlockedReasonEnum: 'billingBlockedReasonEnum', + userStats: { + id: 'id', + userId: 'userId', + totalManualExecutions: 'totalManualExecutions', + totalApiCalls: 'totalApiCalls', + totalWebhookTriggers: 'totalWebhookTriggers', + totalScheduledExecutions: 'totalScheduledExecutions', + totalChatExecutions: 'totalChatExecutions', + totalMcpExecutions: 'totalMcpExecutions', + totalA2aExecutions: 'totalA2aExecutions', + totalTokensUsed: 'totalTokensUsed', + totalCost: 'totalCost', + currentUsageLimit: 'currentUsageLimit', + usageLimitUpdatedAt: 'usageLimitUpdatedAt', + currentPeriodCost: 'currentPeriodCost', + lastPeriodCost: 'lastPeriodCost', + billedOverageThisPeriod: 'billedOverageThisPeriod', + proPeriodCostSnapshot: 'proPeriodCostSnapshot', + creditBalance: 'creditBalance', + totalCopilotCost: 'totalCopilotCost', + currentPeriodCopilotCost: 'currentPeriodCopilotCost', + lastPeriodCopilotCost: 'lastPeriodCopilotCost', + totalCopilotTokens: 'totalCopilotTokens', + totalCopilotCalls: 'totalCopilotCalls', + totalMcpCopilotCalls: 'totalMcpCopilotCalls', + totalMcpCopilotCost: 'totalMcpCopilotCost', + currentPeriodMcpCopilotCost: 'currentPeriodMcpCopilotCost', + storageUsedBytes: 'storageUsedBytes', + lastActive: 'lastActive', + billingBlocked: 'billingBlocked', + billingBlockedReason: 'billingBlockedReason', + }, + customTools: { + id: 'id', + workspaceId: 'workspaceId', + userId: 'userId', + title: 'title', + schema: 'schema', + code: 'code', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + skill: { + id: 'id', + workspaceId: 'workspaceId', + userId: 'userId', + name: 'name', + description: 'description', + content: 'content', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + subscription: { + id: 'id', + plan: 'plan', + referenceId: 'referenceId', + stripeCustomerId: 'stripeCustomerId', + stripeSubscriptionId: 'stripeSubscriptionId', + status: 'status', + periodStart: 'periodStart', + periodEnd: 'periodEnd', + cancelAtPeriodEnd: 'cancelAtPeriodEnd', + seats: 'seats', + trialStart: 'trialStart', + trialEnd: 'trialEnd', + metadata: 'metadata', + }, + rateLimitBucket: { + key: 'key', + tokens: 'tokens', + lastRefillAt: 'lastRefillAt', + updatedAt: 'updatedAt', + }, + chat: { + id: 'id', + workflowId: 'workflowId', + userId: 'userId', + identifier: 'identifier', + title: 'title', + description: 'description', + isActive: 'isActive', + customizations: 'customizations', + authType: 'authType', + password: 'password', + allowedEmails: 'allowedEmails', + outputConfigs: 'outputConfigs', + archivedAt: 'archivedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + form: { + id: 'id', + workflowId: 'workflowId', + userId: 'userId', + identifier: 'identifier', + title: 'title', + description: 'description', + isActive: 'isActive', + customizations: 'customizations', + authType: 'authType', + password: 'password', + allowedEmails: 'allowedEmails', + showBranding: 'showBranding', + archivedAt: 'archivedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + organization: { + id: 'id', + name: 'name', + slug: 'slug', + logo: 'logo', + metadata: 'metadata', + whitelabelSettings: 'whitelabelSettings', + orgUsageLimit: 'orgUsageLimit', + storageUsedBytes: 'storageUsedBytes', + departedMemberUsage: 'departedMemberUsage', + creditBalance: 'creditBalance', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + member: { + id: 'id', + userId: 'userId', + organizationId: 'organizationId', + role: 'role', + createdAt: 'createdAt', + }, + invitation: { + id: 'id', + email: 'email', + inviterId: 'inviterId', + organizationId: 'organizationId', + role: 'role', + status: 'status', + expiresAt: 'expiresAt', + createdAt: 'createdAt', + }, + workspace: { + id: 'id', + name: 'name', + color: 'color', + logoUrl: 'logoUrl', + ownerId: 'ownerId', + billedAccountUserId: 'billedAccountUserId', + allowPersonalApiKeys: 'allowPersonalApiKeys', + inboxEnabled: 'inboxEnabled', + inboxAddress: 'inboxAddress', + inboxProviderId: 'inboxProviderId', + archivedAt: 'archivedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + workspaceFile: { + id: 'id', + workspaceId: 'workspaceId', + name: 'name', + key: 'key', + size: 'size', + type: 'type', + uploadedBy: 'uploadedBy', + deletedAt: 'deletedAt', + uploadedAt: 'uploadedAt', + }, + workspaceFiles: { + id: 'id', + key: 'key', + userId: 'userId', + workspaceId: 'workspaceId', + context: 'context', + chatId: 'chatId', + originalName: 'originalName', + contentType: 'contentType', + size: 'size', + deletedAt: 'deletedAt', + uploadedAt: 'uploadedAt', + }, + permissionTypeEnum: 'permissionTypeEnum', + workspaceInvitationStatusEnum: 'workspaceInvitationStatusEnum', + workspaceInvitation: { + id: 'id', + workspaceId: 'workspaceId', + email: 'email', + inviterId: 'inviterId', + role: 'role', + status: 'status', + token: 'token', + permissions: 'permissions', + orgInvitationId: 'orgInvitationId', + expiresAt: 'expiresAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + permissions: { + id: 'id', + userId: 'userId', + entityType: 'entityType', + entityId: 'entityId', + permissionType: 'permissionType', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + memory: { + id: 'id', + workspaceId: 'workspaceId', + key: 'key', + data: 'data', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + deletedAt: 'deletedAt', + }, + knowledgeBase: { + id: 'id', + userId: 'userId', + workspaceId: 'workspaceId', + name: 'name', + description: 'description', + tokenCount: 'tokenCount', + embeddingModel: 'embeddingModel', + embeddingDimension: 'embeddingDimension', + chunkingConfig: 'chunkingConfig', + deletedAt: 'deletedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + document: { + id: 'id', + knowledgeBaseId: 'knowledgeBaseId', + filename: 'filename', + fileUrl: 'fileUrl', + fileSize: 'fileSize', + mimeType: 'mimeType', + chunkCount: 'chunkCount', + tokenCount: 'tokenCount', + characterCount: 'characterCount', + processingStatus: 'processingStatus', + processingStartedAt: 'processingStartedAt', + processingCompletedAt: 'processingCompletedAt', + processingError: 'processingError', + enabled: 'enabled', + archivedAt: 'archivedAt', + deletedAt: 'deletedAt', + userExcluded: 'userExcluded', + tag1: 'tag1', + tag2: 'tag2', + tag3: 'tag3', + tag4: 'tag4', + tag5: 'tag5', + tag6: 'tag6', + tag7: 'tag7', + number1: 'number1', + number2: 'number2', + number3: 'number3', + number4: 'number4', + number5: 'number5', + date1: 'date1', + date2: 'date2', + boolean1: 'boolean1', + boolean2: 'boolean2', + boolean3: 'boolean3', + connectorId: 'connectorId', + externalId: 'externalId', + contentHash: 'contentHash', + sourceUrl: 'sourceUrl', + uploadedAt: 'uploadedAt', + }, + knowledgeBaseTagDefinitions: { + id: 'id', + knowledgeBaseId: 'knowledgeBaseId', + tagSlot: 'tagSlot', + displayName: 'displayName', + fieldType: 'fieldType', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + embedding: { + id: 'id', + knowledgeBaseId: 'knowledgeBaseId', + documentId: 'documentId', + chunkIndex: 'chunkIndex', + chunkHash: 'chunkHash', + content: 'content', + contentLength: 'contentLength', + tokenCount: 'tokenCount', + embedding: 'embedding', + embeddingModel: 'embeddingModel', + startOffset: 'startOffset', + endOffset: 'endOffset', + tag1: 'tag1', + tag2: 'tag2', + tag3: 'tag3', + tag4: 'tag4', + tag5: 'tag5', + tag6: 'tag6', + tag7: 'tag7', + number1: 'number1', + number2: 'number2', + number3: 'number3', + number4: 'number4', + number5: 'number5', + date1: 'date1', + date2: 'date2', + boolean1: 'boolean1', + boolean2: 'boolean2', + boolean3: 'boolean3', + enabled: 'enabled', + contentTsv: 'contentTsv', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + docsEmbeddings: { + chunkId: 'chunkId', + chunkText: 'chunkText', + sourceDocument: 'sourceDocument', + sourceLink: 'sourceLink', + headerText: 'headerText', + headerLevel: 'headerLevel', + tokenCount: 'tokenCount', + embedding: 'embedding', + embeddingModel: 'embeddingModel', + metadata: 'metadata', + chunkTextTsv: 'chunkTextTsv', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + chatTypeEnum: 'chatTypeEnum', + copilotChats: { + id: 'id', + userId: 'userId', + workflowId: 'workflowId', + workspaceId: 'workspaceId', + type: 'type', + title: 'title', + messages: 'messages', + model: 'model', + conversationId: 'conversationId', + previewYaml: 'previewYaml', + planArtifact: 'planArtifact', + config: 'config', + resources: 'resources', + lastSeenAt: 'lastSeenAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + copilotWorkflowReadHashes: { + id: 'id', + chatId: 'chatId', + workflowId: 'workflowId', + hash: 'hash', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + workflowCheckpoints: { + id: 'id', + userId: 'userId', + workflowId: 'workflowId', + chatId: 'chatId', + messageId: 'messageId', + workflowState: 'workflowState', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + copilotRunStatusEnum: 'copilotRunStatusEnum', + copilotAsyncToolStatusEnum: 'copilotAsyncToolStatusEnum', + copilotRuns: { + id: 'id', + executionId: 'executionId', + parentRunId: 'parentRunId', + chatId: 'chatId', + userId: 'userId', + workflowId: 'workflowId', + workspaceId: 'workspaceId', + streamId: 'streamId', + agent: 'agent', + model: 'model', + provider: 'provider', + status: 'status', + requestContext: 'requestContext', + startedAt: 'startedAt', + completedAt: 'completedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + error: 'error', + }, + copilotRunCheckpoints: { + id: 'id', + runId: 'runId', + pendingToolCallId: 'pendingToolCallId', + conversationSnapshot: 'conversationSnapshot', + agentState: 'agentState', + providerRequest: 'providerRequest', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + copilotAsyncToolCalls: { + id: 'id', + runId: 'runId', + checkpointId: 'checkpointId', + toolCallId: 'toolCallId', + toolName: 'toolName', + args: 'args', + status: 'status', + result: 'result', + error: 'error', + claimedAt: 'claimedAt', + claimedBy: 'claimedBy', + completedAt: 'completedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + templateStatusEnum: 'templateStatusEnum', + templateCreatorTypeEnum: 'templateCreatorTypeEnum', + templateCreators: { + id: 'id', + referenceType: 'referenceType', + referenceId: 'referenceId', + name: 'name', + profileImageUrl: 'profileImageUrl', + details: 'details', + verified: 'verified', + createdBy: 'createdBy', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + templates: { + id: 'id', + workflowId: 'workflowId', + name: 'name', + details: 'details', + creatorId: 'creatorId', + views: 'views', + stars: 'stars', + status: 'status', + tags: 'tags', + requiredCredentials: 'requiredCredentials', + state: 'state', + ogImageUrl: 'ogImageUrl', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + templateStars: { + id: 'id', + userId: 'userId', + templateId: 'templateId', + starredAt: 'starredAt', + createdAt: 'createdAt', + }, + copilotFeedback: { + feedbackId: 'feedbackId', + userId: 'userId', + chatId: 'chatId', + userQuery: 'userQuery', + agentResponse: 'agentResponse', + isPositive: 'isPositive', + feedback: 'feedback', + workflowYaml: 'workflowYaml', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + workflowDeploymentVersion: { + id: 'id', + workflowId: 'workflowId', + version: 'version', + name: 'name', + description: 'description', + state: 'state', + isActive: 'isActive', + createdAt: 'createdAt', + createdBy: 'createdBy', + }, + idempotencyKey: { + key: 'key', + result: 'result', + createdAt: 'createdAt', + }, + mcpServers: { + id: 'id', + workspaceId: 'workspaceId', + createdBy: 'createdBy', + name: 'name', + description: 'description', + transport: 'transport', + url: 'url', + headers: 'headers', + timeout: 'timeout', + retries: 'retries', + enabled: 'enabled', + lastConnected: 'lastConnected', + connectionStatus: 'connectionStatus', + lastError: 'lastError', + statusConfig: 'statusConfig', + toolCount: 'toolCount', + lastToolsRefresh: 'lastToolsRefresh', + totalRequests: 'totalRequests', + lastUsed: 'lastUsed', + deletedAt: 'deletedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + ssoProvider: { + id: 'id', + issuer: 'issuer', + domain: 'domain', + oidcConfig: 'oidcConfig', + samlConfig: 'samlConfig', + userId: 'userId', + providerId: 'providerId', + organizationId: 'organizationId', + }, + workflowMcpServer: { + id: 'id', + workspaceId: 'workspaceId', + createdBy: 'createdBy', + name: 'name', + description: 'description', + isPublic: 'isPublic', + deletedAt: 'deletedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + workflowMcpTool: { + id: 'id', + serverId: 'serverId', + workflowId: 'workflowId', + toolName: 'toolName', + toolDescription: 'toolDescription', + parameterSchema: 'parameterSchema', + archivedAt: 'archivedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + a2aTaskStatusEnum: 'a2aTaskStatusEnum', + a2aAgent: { + id: 'id', + workspaceId: 'workspaceId', + workflowId: 'workflowId', + createdBy: 'createdBy', + name: 'name', + description: 'description', + version: 'version', + capabilities: 'capabilities', + skills: 'skills', + authentication: 'authentication', + signatures: 'signatures', + isPublished: 'isPublished', + publishedAt: 'publishedAt', + archivedAt: 'archivedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + a2aTask: { + id: 'id', + agentId: 'agentId', + sessionId: 'sessionId', + status: 'status', + messages: 'messages', + artifacts: 'artifacts', + executionId: 'executionId', + metadata: 'metadata', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + completedAt: 'completedAt', + }, + a2aPushNotificationConfig: { + id: 'id', + taskId: 'taskId', + url: 'url', + token: 'token', + authSchemes: 'authSchemes', + authCredentials: 'authCredentials', + isActive: 'isActive', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + auditLog: { + id: 'id', + workspaceId: 'workspaceId', + actorId: 'actorId', + action: 'action', + resourceType: 'resourceType', + resourceId: 'resourceId', + actorName: 'actorName', + actorEmail: 'actorEmail', + resourceName: 'resourceName', + description: 'description', + metadata: 'metadata', + ipAddress: 'ipAddress', + userAgent: 'userAgent', + createdAt: 'createdAt', + }, + usageLogCategoryEnum: 'usageLogCategoryEnum', + usageLogSourceEnum: 'usageLogSourceEnum', + usageLog: { + id: 'id', + userId: 'userId', + category: 'category', + source: 'source', + description: 'description', + metadata: 'metadata', + cost: 'cost', + workspaceId: 'workspaceId', + workflowId: 'workflowId', + executionId: 'executionId', + createdAt: 'createdAt', + }, + credentialTypeEnum: 'credentialTypeEnum', + credential: { + id: 'id', + workspaceId: 'workspaceId', + type: 'type', + displayName: 'displayName', + description: 'description', + providerId: 'providerId', + accountId: 'accountId', + envKey: 'envKey', + envOwnerUserId: 'envOwnerUserId', + encryptedServiceAccountKey: 'encryptedServiceAccountKey', + createdBy: 'createdBy', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + credentialMemberRoleEnum: 'credentialMemberRoleEnum', + credentialMemberStatusEnum: 'credentialMemberStatusEnum', + credentialMember: { + id: 'id', + credentialId: 'credentialId', + userId: 'userId', + role: 'role', + status: 'status', + joinedAt: 'joinedAt', + invitedBy: 'invitedBy', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + pendingCredentialDraft: { + id: 'id', + userId: 'userId', + workspaceId: 'workspaceId', + providerId: 'providerId', + displayName: 'displayName', + description: 'description', + credentialId: 'credentialId', + expiresAt: 'expiresAt', + createdAt: 'createdAt', + }, + credentialSet: { + id: 'id', + organizationId: 'organizationId', + name: 'name', + description: 'description', + providerId: 'providerId', + createdBy: 'createdBy', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + credentialSetMemberStatusEnum: 'credentialSetMemberStatusEnum', + credentialSetMember: { + id: 'id', + credentialSetId: 'credentialSetId', + userId: 'userId', + status: 'status', + joinedAt: 'joinedAt', + invitedBy: 'invitedBy', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + credentialSetInvitationStatusEnum: 'credentialSetInvitationStatusEnum', + credentialSetInvitation: { + id: 'id', + credentialSetId: 'credentialSetId', + email: 'email', + token: 'token', + invitedBy: 'invitedBy', + status: 'status', + expiresAt: 'expiresAt', + acceptedAt: 'acceptedAt', + acceptedByUserId: 'acceptedByUserId', + createdAt: 'createdAt', + }, + permissionGroup: { + id: 'id', + organizationId: 'organizationId', + name: 'name', + description: 'description', + config: 'config', + createdBy: 'createdBy', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + autoAddNewMembers: 'autoAddNewMembers', + }, + permissionGroupMember: { + id: 'id', + permissionGroupId: 'permissionGroupId', + userId: 'userId', + assignedBy: 'assignedBy', + assignedAt: 'assignedAt', + }, + asyncJobs: { + id: 'id', + type: 'type', + payload: 'payload', + status: 'status', + createdAt: 'createdAt', + startedAt: 'startedAt', + completedAt: 'completedAt', + runAt: 'runAt', + attempts: 'attempts', + maxAttempts: 'maxAttempts', + error: 'error', + output: 'output', + metadata: 'metadata', + updatedAt: 'updatedAt', + }, + knowledgeConnector: { + id: 'id', + knowledgeBaseId: 'knowledgeBaseId', + connectorType: 'connectorType', + credentialId: 'credentialId', + encryptedApiKey: 'encryptedApiKey', + sourceConfig: 'sourceConfig', + syncMode: 'syncMode', + syncIntervalMinutes: 'syncIntervalMinutes', + status: 'status', + lastSyncAt: 'lastSyncAt', + lastSyncError: 'lastSyncError', + lastSyncDocCount: 'lastSyncDocCount', + nextSyncAt: 'nextSyncAt', + consecutiveFailures: 'consecutiveFailures', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + archivedAt: 'archivedAt', + deletedAt: 'deletedAt', + }, + knowledgeConnectorSyncLog: { + id: 'id', + connectorId: 'connectorId', + status: 'status', + startedAt: 'startedAt', + completedAt: 'completedAt', + docsAdded: 'docsAdded', + docsUpdated: 'docsUpdated', + docsDeleted: 'docsDeleted', + docsUnchanged: 'docsUnchanged', + docsFailed: 'docsFailed', + errorMessage: 'errorMessage', + }, + userTableDefinitions: { + id: 'id', + workspaceId: 'workspaceId', + name: 'name', + description: 'description', + schema: 'schema', + metadata: 'metadata', + maxRows: 'maxRows', + rowCount: 'rowCount', + archivedAt: 'archivedAt', + createdBy: 'createdBy', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + userTableRows: { + id: 'id', + tableId: 'tableId', + workspaceId: 'workspaceId', + data: 'data', + position: 'position', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + createdBy: 'createdBy', + }, + oauthApplication: { + id: 'id', + name: 'name', + icon: 'icon', + metadata: 'metadata', + clientId: 'clientId', + clientSecret: 'clientSecret', + redirectURLs: 'redirectURLs', + type: 'type', + disabled: 'disabled', + userId: 'userId', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + oauthAccessToken: { + id: 'id', + accessToken: 'accessToken', + refreshToken: 'refreshToken', + accessTokenExpiresAt: 'accessTokenExpiresAt', + refreshTokenExpiresAt: 'refreshTokenExpiresAt', + clientId: 'clientId', + userId: 'userId', + scopes: 'scopes', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, + oauthConsent: { + id: 'id', + clientId: 'clientId', + userId: 'userId', + scopes: 'scopes', + createdAt: 'createdAt', + updatedAt: 'updatedAt', + consentGiven: 'consentGiven', + }, + jwks: { + id: 'id', + publicKey: 'publicKey', + privateKey: 'privateKey', + createdAt: 'createdAt', + }, + mothershipInboxAllowedSender: { + id: 'id', + workspaceId: 'workspaceId', + email: 'email', + label: 'label', + addedBy: 'addedBy', + createdAt: 'createdAt', + }, + mothershipInboxTask: { + id: 'id', + workspaceId: 'workspaceId', + fromEmail: 'fromEmail', + fromName: 'fromName', + subject: 'subject', + bodyPreview: 'bodyPreview', + bodyText: 'bodyText', + bodyHtml: 'bodyHtml', + emailMessageId: 'emailMessageId', + inReplyTo: 'inReplyTo', + responseMessageId: 'responseMessageId', + agentmailMessageId: 'agentmailMessageId', + status: 'status', + chatId: 'chatId', + triggerJobId: 'triggerJobId', + resultSummary: 'resultSummary', + errorMessage: 'errorMessage', + rejectionReason: 'rejectionReason', + hasAttachments: 'hasAttachments', + ccRecipients: 'ccRecipients', + createdAt: 'createdAt', + processingStartedAt: 'processingStartedAt', + completedAt: 'completedAt', + }, + mothershipInboxWebhook: { + id: 'id', + workspaceId: 'workspaceId', + webhookId: 'webhookId', + secret: 'secret', + createdAt: 'createdAt', + }, + academyCertStatusEnum: 'academyCertStatusEnum', + academyCertificate: { + id: 'id', + userId: 'userId', + courseId: 'courseId', + status: 'status', + issuedAt: 'issuedAt', + expiresAt: 'expiresAt', + certificateNumber: 'certificateNumber', + metadata: 'metadata', + createdAt: 'createdAt', + }, + /** Custom type export for tsvector */ + tsvector: 'tsvector', +} diff --git a/packages/testing/src/mocks/urls.mock.ts b/packages/testing/src/mocks/urls.mock.ts new file mode 100644 index 00000000000..49992cd278e --- /dev/null +++ b/packages/testing/src/mocks/urls.mock.ts @@ -0,0 +1,43 @@ +import { vi } from 'vitest' + +/** + * Controllable mock functions for `@/lib/core/utils/urls`. + * + * @example + * ```ts + * import { urlsMockFns } from '@sim/testing' + * + * urlsMockFns.mockGetBaseUrl.mockReturnValue('https://custom.example.com') + * ``` + */ +export const urlsMockFns = { + mockGetBaseUrl: vi.fn(), + mockGetInternalApiBaseUrl: vi.fn(), + mockEnsureAbsoluteUrl: vi.fn(), + mockGetBaseDomain: vi.fn(), + mockGetEmailDomain: vi.fn(), + mockGetSocketServerUrl: vi.fn(), + mockGetSocketUrl: vi.fn(), + mockGetOllamaUrl: vi.fn(), +} + +/** + * Static mock module for `@/lib/core/utils/urls`. + * Functions return sensible localhost defaults. + * + * @example + * ```ts + * vi.mock('@/lib/core/utils/urls', () => urlsMock) + * ``` + */ +export const urlsMock = { + SITE_URL: 'https://www.sim.ai', + getBaseUrl: urlsMockFns.mockGetBaseUrl, + getInternalApiBaseUrl: urlsMockFns.mockGetInternalApiBaseUrl, + ensureAbsoluteUrl: urlsMockFns.mockEnsureAbsoluteUrl, + getBaseDomain: urlsMockFns.mockGetBaseDomain, + getEmailDomain: urlsMockFns.mockGetEmailDomain, + getSocketServerUrl: urlsMockFns.mockGetSocketServerUrl, + getSocketUrl: urlsMockFns.mockGetSocketUrl, + getOllamaUrl: urlsMockFns.mockGetOllamaUrl, +} diff --git a/packages/testing/src/mocks/uuid.mock.ts b/packages/testing/src/mocks/uuid.mock.ts deleted file mode 100644 index d8294a4d1d5..00000000000 --- a/packages/testing/src/mocks/uuid.mock.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * UUID mock utilities — intentionally empty. - * - * All test files should mock `@/lib/core/utils/uuid` directly using - * `vi.hoisted()` + `vi.mock()` per project testing rules. - */ diff --git a/packages/testing/src/mocks/workflows-api-utils.mock.ts b/packages/testing/src/mocks/workflows-api-utils.mock.ts new file mode 100644 index 00000000000..f7700695b87 --- /dev/null +++ b/packages/testing/src/mocks/workflows-api-utils.mock.ts @@ -0,0 +1,49 @@ +import { vi } from 'vitest' + +/** + * Controllable mock functions for `@/app/api/workflows/utils`. + * + * Default `createSuccessResponse`/`createErrorResponse` return a mock Response-like + * object where `.json()` resolves to the payload — compatible with most assertions + * like `expect(await res.json()).toEqual(...)` and `expect(res.status).toBe(...)`. + * + * @example + * ```ts + * import { workflowsApiUtilsMockFns } from '@sim/testing' + * + * workflowsApiUtilsMockFns.mockVerifyWorkspaceMembership.mockResolvedValue('admin') + * workflowsApiUtilsMockFns.mockCheckNeedsRedeployment.mockResolvedValue(true) + * ``` + */ +export const workflowsApiUtilsMockFns = { + mockCreateSuccessResponse: vi.fn((data: unknown) => ({ + status: 200, + ok: true, + json: async () => data, + })), + mockCreateErrorResponse: vi.fn((error: string, status: number, code?: string) => ({ + status, + ok: false, + json: async () => ({ + error, + code: code || error.toUpperCase().replace(/\s+/g, '_'), + }), + })), + mockCheckNeedsRedeployment: vi.fn().mockResolvedValue(false), + mockVerifyWorkspaceMembership: vi.fn().mockResolvedValue('member'), +} + +/** + * Static mock module for `@/app/api/workflows/utils`. + * + * @example + * ```ts + * vi.mock('@/app/api/workflows/utils', () => workflowsApiUtilsMock) + * ``` + */ +export const workflowsApiUtilsMock = { + createSuccessResponse: workflowsApiUtilsMockFns.mockCreateSuccessResponse, + createErrorResponse: workflowsApiUtilsMockFns.mockCreateErrorResponse, + checkNeedsRedeployment: workflowsApiUtilsMockFns.mockCheckNeedsRedeployment, + verifyWorkspaceMembership: workflowsApiUtilsMockFns.mockVerifyWorkspaceMembership, +} diff --git a/packages/testing/src/mocks/workflows-orchestration.mock.ts b/packages/testing/src/mocks/workflows-orchestration.mock.ts new file mode 100644 index 00000000000..0e9761fe91a --- /dev/null +++ b/packages/testing/src/mocks/workflows-orchestration.mock.ts @@ -0,0 +1,47 @@ +import { vi } from 'vitest' + +/** + * Controllable mock functions for `@/lib/workflows/orchestration`. + * All defaults are bare `vi.fn()` — configure per-test as needed. + * + * @example + * ```ts + * import { workflowsOrchestrationMockFns } from '@sim/testing' + * + * workflowsOrchestrationMockFns.mockPerformFullDeploy.mockResolvedValue({ + * success: true, + * version: 1, + * }) + * ``` + */ +export const workflowsOrchestrationMockFns = { + mockPerformChatDeploy: vi.fn(), + mockPerformChatUndeploy: vi.fn(), + mockNotifySocketDeploymentChanged: vi.fn(), + mockPerformActivateVersion: vi.fn(), + mockPerformFullDeploy: vi.fn(), + mockPerformFullUndeploy: vi.fn(), + mockPerformRevertToVersion: vi.fn(), + mockPerformDeleteFolder: vi.fn(), + mockPerformDeleteWorkflow: vi.fn(), +} + +/** + * Static mock module for `@/lib/workflows/orchestration`. + * + * @example + * ```ts + * vi.mock('@/lib/workflows/orchestration', () => workflowsOrchestrationMock) + * ``` + */ +export const workflowsOrchestrationMock = { + performChatDeploy: workflowsOrchestrationMockFns.mockPerformChatDeploy, + performChatUndeploy: workflowsOrchestrationMockFns.mockPerformChatUndeploy, + notifySocketDeploymentChanged: workflowsOrchestrationMockFns.mockNotifySocketDeploymentChanged, + performActivateVersion: workflowsOrchestrationMockFns.mockPerformActivateVersion, + performFullDeploy: workflowsOrchestrationMockFns.mockPerformFullDeploy, + performFullUndeploy: workflowsOrchestrationMockFns.mockPerformFullUndeploy, + performRevertToVersion: workflowsOrchestrationMockFns.mockPerformRevertToVersion, + performDeleteFolder: workflowsOrchestrationMockFns.mockPerformDeleteFolder, + performDeleteWorkflow: workflowsOrchestrationMockFns.mockPerformDeleteWorkflow, +} diff --git a/packages/testing/src/mocks/workflows-persistence-utils.mock.ts b/packages/testing/src/mocks/workflows-persistence-utils.mock.ts new file mode 100644 index 00000000000..57fb6761db6 --- /dev/null +++ b/packages/testing/src/mocks/workflows-persistence-utils.mock.ts @@ -0,0 +1,60 @@ +import { vi } from 'vitest' + +/** + * Controllable mock functions for `@/lib/workflows/persistence/utils`. + * All defaults are bare `vi.fn()` — configure per-test as needed. + * + * @example + * ```ts + * import { workflowsPersistenceUtilsMockFns } from '@sim/testing' + * + * workflowsPersistenceUtilsMockFns.mockLoadWorkflowFromNormalizedTables.mockResolvedValue({ + * blocks: {}, + * edges: [], + * loops: {}, + * parallels: {}, + * isFromNormalizedTables: true, + * }) + * ``` + */ +export const workflowsPersistenceUtilsMockFns = { + mockBlockExistsInDeployment: vi.fn(), + mockLoadDeployedWorkflowState: vi.fn(), + mockMigrateAgentBlocksToMessagesFormat: vi.fn(), + mockLoadWorkflowFromNormalizedTables: vi.fn(), + mockSaveWorkflowToNormalizedTables: vi.fn(), + mockWorkflowExistsInNormalizedTables: vi.fn(), + mockDeployWorkflow: vi.fn(), + mockRegenerateWorkflowStateIds: vi.fn(), + mockUndeployWorkflow: vi.fn(), + mockActivateWorkflowVersion: vi.fn(), + mockActivateWorkflowVersionById: vi.fn(), + mockListWorkflowVersions: vi.fn(), +} + +/** + * Static mock module for `@/lib/workflows/persistence/utils`. + * + * @example + * ```ts + * vi.mock('@/lib/workflows/persistence/utils', () => workflowsPersistenceUtilsMock) + * ``` + */ +export const workflowsPersistenceUtilsMock = { + blockExistsInDeployment: workflowsPersistenceUtilsMockFns.mockBlockExistsInDeployment, + loadDeployedWorkflowState: workflowsPersistenceUtilsMockFns.mockLoadDeployedWorkflowState, + migrateAgentBlocksToMessagesFormat: + workflowsPersistenceUtilsMockFns.mockMigrateAgentBlocksToMessagesFormat, + loadWorkflowFromNormalizedTables: + workflowsPersistenceUtilsMockFns.mockLoadWorkflowFromNormalizedTables, + saveWorkflowToNormalizedTables: + workflowsPersistenceUtilsMockFns.mockSaveWorkflowToNormalizedTables, + workflowExistsInNormalizedTables: + workflowsPersistenceUtilsMockFns.mockWorkflowExistsInNormalizedTables, + deployWorkflow: workflowsPersistenceUtilsMockFns.mockDeployWorkflow, + regenerateWorkflowStateIds: workflowsPersistenceUtilsMockFns.mockRegenerateWorkflowStateIds, + undeployWorkflow: workflowsPersistenceUtilsMockFns.mockUndeployWorkflow, + activateWorkflowVersion: workflowsPersistenceUtilsMockFns.mockActivateWorkflowVersion, + activateWorkflowVersionById: workflowsPersistenceUtilsMockFns.mockActivateWorkflowVersionById, + listWorkflowVersions: workflowsPersistenceUtilsMockFns.mockListWorkflowVersions, +} diff --git a/packages/testing/src/mocks/workflows-utils.mock.ts b/packages/testing/src/mocks/workflows-utils.mock.ts new file mode 100644 index 00000000000..0930d9b5dc9 --- /dev/null +++ b/packages/testing/src/mocks/workflows-utils.mock.ts @@ -0,0 +1,70 @@ +import { vi } from 'vitest' + +/** + * Controllable mock functions for `@/lib/workflows/utils`. + * Use these references in tests to configure return values and assert calls. + * + * @example + * ```ts + * import { workflowsUtilsMockFns } from '@sim/testing' + * + * workflowsUtilsMockFns.mockGetWorkflowById.mockResolvedValue({ id: 'wf-1', name: 'Test' }) + * ``` + */ +export const workflowsUtilsMockFns = { + mockGetWorkflowById: vi.fn(), + mockListWorkflows: vi.fn(), + mockDeduplicateWorkflowName: vi.fn(), + mockResolveWorkflowIdForUser: vi.fn(), + mockUpdateWorkflowRunCounts: vi.fn(), + mockWorkflowHasResponseBlock: vi.fn(), + mockCreateHttpResponseFromBlock: vi.fn(), + mockValidateWorkflowPermissions: vi.fn(), + mockAuthorizeWorkflowByWorkspacePermission: vi.fn(), + mockCreateWorkflowRecord: vi.fn(), + mockUpdateWorkflowRecord: vi.fn(), + mockDeleteWorkflowRecord: vi.fn(), + mockSetWorkflowVariables: vi.fn(), + mockCreateFolderRecord: vi.fn(), + mockUpdateFolderRecord: vi.fn(), + mockDeleteFolderRecord: vi.fn(), + mockCheckForCircularReference: vi.fn(), + mockListFolders: vi.fn(), +} + +/** + * Static mock module for `@/lib/workflows/utils`. + * Use with `vi.mock()` to replace the real module in tests. + * + * Default behaviors: + * - `getWorkflowById` resolves to `null` + * - `authorizeWorkflowByWorkspacePermission` resolves to allowed with `test-workspace-id` + * - `validateWorkflowPermissions` resolves to an authorized result + * - Other functions resolve to sensible empty/success defaults + * + * @example + * ```ts + * vi.mock('@/lib/workflows/utils', () => workflowsUtilsMock) + * ``` + */ +export const workflowsUtilsMock = { + getWorkflowById: workflowsUtilsMockFns.mockGetWorkflowById, + listWorkflows: workflowsUtilsMockFns.mockListWorkflows, + deduplicateWorkflowName: workflowsUtilsMockFns.mockDeduplicateWorkflowName, + resolveWorkflowIdForUser: workflowsUtilsMockFns.mockResolveWorkflowIdForUser, + updateWorkflowRunCounts: workflowsUtilsMockFns.mockUpdateWorkflowRunCounts, + workflowHasResponseBlock: workflowsUtilsMockFns.mockWorkflowHasResponseBlock, + createHttpResponseFromBlock: workflowsUtilsMockFns.mockCreateHttpResponseFromBlock, + validateWorkflowPermissions: workflowsUtilsMockFns.mockValidateWorkflowPermissions, + authorizeWorkflowByWorkspacePermission: + workflowsUtilsMockFns.mockAuthorizeWorkflowByWorkspacePermission, + createWorkflowRecord: workflowsUtilsMockFns.mockCreateWorkflowRecord, + updateWorkflowRecord: workflowsUtilsMockFns.mockUpdateWorkflowRecord, + deleteWorkflowRecord: workflowsUtilsMockFns.mockDeleteWorkflowRecord, + setWorkflowVariables: workflowsUtilsMockFns.mockSetWorkflowVariables, + createFolderRecord: workflowsUtilsMockFns.mockCreateFolderRecord, + updateFolderRecord: workflowsUtilsMockFns.mockUpdateFolderRecord, + deleteFolderRecord: workflowsUtilsMockFns.mockDeleteFolderRecord, + checkForCircularReference: workflowsUtilsMockFns.mockCheckForCircularReference, + listFolders: workflowsUtilsMockFns.mockListFolders, +} diff --git a/packages/utils/package.json b/packages/utils/package.json new file mode 100644 index 00000000000..013c600c567 --- /dev/null +++ b/packages/utils/package.json @@ -0,0 +1,45 @@ +{ + "name": "@sim/utils", + "version": "0.1.0", + "private": true, + "sideEffects": false, + "type": "module", + "license": "Apache-2.0", + "exports": { + ".": { + "types": "./src/index.ts", + "default": "./src/index.ts" + }, + "./id": { + "types": "./src/id.ts", + "default": "./src/id.ts" + }, + "./errors": { + "types": "./src/errors.ts", + "default": "./src/errors.ts" + }, + "./helpers": { + "types": "./src/helpers.ts", + "default": "./src/helpers.ts" + }, + "./formatting": { + "types": "./src/formatting.ts", + "default": "./src/formatting.ts" + } + }, + "scripts": { + "type-check": "tsc --noEmit", + "lint": "biome check --write --unsafe .", + "lint:check": "biome check .", + "format": "biome format --write .", + "format:check": "biome format .", + "test": "vitest run", + "test:watch": "vitest" + }, + "dependencies": {}, + "devDependencies": { + "@sim/tsconfig": "workspace:*", + "typescript": "^5.7.3", + "vitest": "^3.0.8" + } +} diff --git a/packages/utils/src/errors.test.ts b/packages/utils/src/errors.test.ts new file mode 100644 index 00000000000..fa11dc191f9 --- /dev/null +++ b/packages/utils/src/errors.test.ts @@ -0,0 +1,78 @@ +/** + * @vitest-environment node + */ +import { describe, expect, it } from 'vitest' +import { getPostgresErrorCode, toError } from './errors.js' + +describe('toError', () => { + it('returns the same Error when given an Error', () => { + const err = new Error('test') + expect(toError(err)).toBe(err) + }) + + it('wraps a string into an Error', () => { + const err = toError('msg') + expect(err).toBeInstanceOf(Error) + expect(err.message).toBe('msg') + }) + + it('wraps a number into an Error', () => { + const err = toError(42) + expect(err).toBeInstanceOf(Error) + expect(err.message).toBe('42') + }) + + it('wraps null into an Error', () => { + const err = toError(null) + expect(err).toBeInstanceOf(Error) + expect(err.message).toBe('null') + }) + + it('wraps undefined into an Error', () => { + const err = toError(undefined) + expect(err).toBeInstanceOf(Error) + expect(err.message).toBe('undefined') + }) +}) + +describe('getPostgresErrorCode', () => { + it('reads code from Error.code', () => { + const err = new Error('fail') as Error & { code: string } + err.code = '23505' + expect(getPostgresErrorCode(err)).toBe('23505') + }) + + it('reads code from plain object', () => { + expect(getPostgresErrorCode({ code: '23505' })).toBe('23505') + }) + + it('reads code from Error.cause', () => { + const err = new Error('fail', { cause: { code: '23505' } }) + expect(getPostgresErrorCode(err)).toBe('23505') + }) + + it('walks nested Error causes', () => { + const pgErr = new Error('unique_violation') as Error & { code: string } + pgErr.code = '23505' + const err = new Error('outer', { cause: new Error('inner', { cause: pgErr }) }) + expect(getPostgresErrorCode(err)).toBe('23505') + }) + + it('returns undefined for non-errors', () => { + expect(getPostgresErrorCode(undefined)).toBeUndefined() + expect(getPostgresErrorCode(null)).toBeUndefined() + expect(getPostgresErrorCode('23505')).toBeUndefined() + }) + + it('returns undefined when no code is present', () => { + expect(getPostgresErrorCode(new Error('no code'))).toBeUndefined() + }) + + it('does not loop forever on circular cause chains', () => { + const err1 = new Error('a') + const err2 = new Error('b', { cause: err1 }) + // Create circular reference + ;(err1 as { cause?: unknown }).cause = err2 + expect(getPostgresErrorCode(err1)).toBeUndefined() + }) +}) diff --git a/apps/sim/lib/core/utils/pg-error.ts b/packages/utils/src/errors.ts similarity index 68% rename from apps/sim/lib/core/utils/pg-error.ts rename to packages/utils/src/errors.ts index df38b955914..73d05d90e31 100644 --- a/apps/sim/lib/core/utils/pg-error.ts +++ b/packages/utils/src/errors.ts @@ -1,3 +1,13 @@ +/** + * Normalizes an unknown caught value into an Error instance. + * Replaces the common `e instanceof Error ? e : new Error(String(e))` pattern in catch clauses. + */ +export function toError(value: unknown): Error { + if (value instanceof Error) return value + if (typeof value === 'string') return new Error(value) + return new Error(String(value)) +} + /** * Returns PostgreSQL error code (e.g. `23505` for unique_violation) when present on a thrown value. * Normalizes common Drizzle / `postgres` driver shapes and walks `cause` chains. diff --git a/packages/utils/src/formatting.test.ts b/packages/utils/src/formatting.test.ts new file mode 100644 index 00000000000..9670efeaed0 --- /dev/null +++ b/packages/utils/src/formatting.test.ts @@ -0,0 +1,179 @@ +/** + * @vitest-environment node + */ +import { describe, expect, it } from 'vitest' +import { + formatAbsoluteDate, + formatCompactTimestamp, + formatDate, + formatDateTime, + formatDuration, + formatRelativeTime, + formatTime, + formatTimeWithSeconds, + getTimezoneAbbreviation, +} from './formatting.js' + +describe('getTimezoneAbbreviation', () => { + it('returns UTC for UTC timezone', () => { + expect(getTimezoneAbbreviation('UTC')).toBe('UTC') + }) + + it('returns JST for Tokyo (no DST)', () => { + expect(getTimezoneAbbreviation('Asia/Tokyo', new Date('2023-01-15'))).toBe('JST') + expect(getTimezoneAbbreviation('Asia/Tokyo', new Date('2023-07-15'))).toBe('JST') + }) + + it('returns the timezone string for unknown timezones', () => { + expect(getTimezoneAbbreviation('Unknown/Zone')).toBe('Unknown/Zone') + }) + + it('returns PST or PDT for Los Angeles', () => { + const result = getTimezoneAbbreviation('America/Los_Angeles', new Date('2023-01-15')) + expect(['PST', 'PDT']).toContain(result) + }) +}) + +describe('formatDateTime', () => { + it('formats a date with time', () => { + const date = new Date('2023-05-15T14:30:00') + const result = formatDateTime(date) + expect(result).toMatch(/May 15, 2023/) + }) + + it('appends timezone abbreviation when timezone is provided', () => { + const date = new Date('2023-05-15T14:30:00Z') + const result = formatDateTime(date, 'UTC') + expect(result).toContain('UTC') + }) +}) + +describe('formatDate', () => { + it('formats a date without time', () => { + const date = new Date('2023-05-15T14:30:00') + const result = formatDate(date) + expect(result).toMatch(/May 15, 2023/) + expect(result).not.toMatch(/14:30/) + }) +}) + +describe('formatAbsoluteDate', () => { + it('formats an ISO date string', () => { + const result = formatAbsoluteDate('2023-05-15T14:30:00Z') + expect(result).toMatch(/May/) + expect(result).toMatch(/2023/) + }) +}) + +describe('formatTime', () => { + it('formats time only', () => { + const date = new Date('2023-05-15T14:30:00') + const result = formatTime(date) + expect(result).toMatch(/2:30 PM|14:30/) + }) +}) + +describe('formatTimeWithSeconds', () => { + it('formats time with seconds and timezone', () => { + const date = new Date('2023-05-15T14:30:45') + const result = formatTimeWithSeconds(date) + expect(result).toMatch(/2:30:45 PM|14:30:45/) + }) + + it('omits timezone when includeTimezone is false', () => { + const date = new Date('2023-05-15T14:30:45') + const withTz = formatTimeWithSeconds(date, true) + const withoutTz = formatTimeWithSeconds(date, false) + expect(withoutTz.length).toBeLessThanOrEqual(withTz.length) + }) +}) + +describe('formatCompactTimestamp', () => { + it('produces MM-DD HH:mm pattern', () => { + const result = formatCompactTimestamp('2023-05-15T14:30:00') + expect(result).toMatch(/^\d{2}-\d{2} \d{2}:\d{2}$/) + }) + + it('returns a formatted string even for invalid dates (no throw)', () => { + const result = formatCompactTimestamp('not-a-date') + expect(typeof result).toBe('string') + }) +}) + +describe('formatDuration', () => { + it('returns "0ms" for 0', () => { + expect(formatDuration(0)).toBe('0ms') + }) + + it('formats milliseconds', () => { + expect(formatDuration(500)).toBe('500ms') + }) + + it('formats seconds', () => { + expect(formatDuration(5000)).toBe('5s') + }) + + it('formats minutes and seconds', () => { + expect(formatDuration(65000)).toBe('1m 5s') + }) + + it('formats hours and minutes', () => { + expect(formatDuration(3725000)).toBe('1h 2m') + }) + + it('returns null for null', () => { + expect(formatDuration(null)).toBeNull() + }) + + it('returns null for undefined', () => { + expect(formatDuration(undefined)).toBeNull() + }) + + it('parses string durations', () => { + expect(formatDuration('500ms')).toBe('500ms') + }) + + it('returns em dash for NaN', () => { + expect(formatDuration(Number.NaN)).toBe('\u2014') + }) + + it('returns em dash for Infinity', () => { + expect(formatDuration(Number.POSITIVE_INFINITY)).toBe('\u2014') + }) + + it('supports precision option for seconds', () => { + expect(formatDuration(1500, { precision: 1 })).toBe('1.5s') + expect(formatDuration(5000, { precision: 1 })).toBe('5s') + }) + + it('formats sub-millisecond durations', () => { + expect(formatDuration(0.5)).toBe('0.50ms') + expect(formatDuration(0.001)).toBe('0ms') + }) + + it('returns original string for non-numeric strings', () => { + expect(formatDuration('not-a-number')).toBe('not-a-number') + }) +}) + +describe('formatRelativeTime', () => { + it('returns "just now" for recent dates', () => { + const now = new Date() + expect(formatRelativeTime(now.toISOString())).toBe('just now') + }) + + it('returns minutes ago', () => { + const date = new Date(Date.now() - 5 * 60 * 1000) + expect(formatRelativeTime(date.toISOString())).toBe('5m ago') + }) + + it('returns hours ago', () => { + const date = new Date(Date.now() - 3 * 60 * 60 * 1000) + expect(formatRelativeTime(date.toISOString())).toBe('3h ago') + }) + + it('returns days ago', () => { + const date = new Date(Date.now() - 2 * 24 * 60 * 60 * 1000) + expect(formatRelativeTime(date.toISOString())).toBe('2d ago') + }) +}) diff --git a/apps/sim/lib/core/utils/formatting.ts b/packages/utils/src/formatting.ts similarity index 99% rename from apps/sim/lib/core/utils/formatting.ts rename to packages/utils/src/formatting.ts index d6985147f68..96460ee90fc 100644 --- a/apps/sim/lib/core/utils/formatting.ts +++ b/packages/utils/src/formatting.ts @@ -178,7 +178,7 @@ export function formatDuration( ms = duration // Handle NaN/Infinity (e.g., cancelled blocks with no end time) if (!Number.isFinite(ms)) { - return '—' + return '\u2014' } } diff --git a/packages/utils/src/helpers.test.ts b/packages/utils/src/helpers.test.ts new file mode 100644 index 00000000000..82fbeb325b4 --- /dev/null +++ b/packages/utils/src/helpers.test.ts @@ -0,0 +1,41 @@ +/** + * @vitest-environment node + */ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { noop, sleep } from './helpers.js' + +describe('sleep', () => { + beforeEach(() => { + vi.useFakeTimers() + }) + + afterEach(() => { + vi.useRealTimers() + }) + + it('resolves after the specified delay', async () => { + const promise = sleep(1000) + vi.advanceTimersByTime(1000) + await expect(promise).resolves.toBeUndefined() + }) + + it('does not resolve before the delay', async () => { + let resolved = false + sleep(1000).then(() => { + resolved = true + }) + vi.advanceTimersByTime(999) + await Promise.resolve() + expect(resolved).toBe(false) + }) +}) + +describe('noop', () => { + it('is a function', () => { + expect(typeof noop).toBe('function') + }) + + it('returns undefined', () => { + expect(noop()).toBeUndefined() + }) +}) diff --git a/packages/utils/src/helpers.ts b/packages/utils/src/helpers.ts new file mode 100644 index 00000000000..4a801a47d55 --- /dev/null +++ b/packages/utils/src/helpers.ts @@ -0,0 +1,10 @@ +/** + * Returns a promise that resolves after the specified duration. + * Replaces the common `new Promise(resolve => setTimeout(resolve, ms))` pattern. + */ +export function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)) +} + +/** No-operation function for use as default callback. */ +export const noop = () => {} diff --git a/packages/utils/src/id.test.ts b/packages/utils/src/id.test.ts new file mode 100644 index 00000000000..7c95de6083f --- /dev/null +++ b/packages/utils/src/id.test.ts @@ -0,0 +1,57 @@ +/** + * @vitest-environment node + */ +import { describe, expect, it } from 'vitest' +import { generateId, generateShortId, isValidUuid } from './id.js' + +const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i + +describe('generateId', () => { + it('returns a valid UUID v4', () => { + const id = generateId() + expect(id).toMatch(UUID_V4_RE) + }) + + it('returns unique values across 100 calls', () => { + const ids = new Set(Array.from({ length: 100 }, () => generateId())) + expect(ids.size).toBe(100) + }) +}) + +describe('generateShortId', () => { + it('returns default length of 21', () => { + const id = generateShortId() + expect(id).toHaveLength(21) + }) + + it('returns custom length when specified', () => { + const id = generateShortId(8) + expect(id).toHaveLength(8) + }) + + it('uses only URL-safe characters', () => { + const id = generateShortId(100) + expect(id).toMatch(/^[a-zA-Z0-9_-]+$/) + }) + + it('returns unique values', () => { + const ids = new Set(Array.from({ length: 100 }, () => generateShortId())) + expect(ids.size).toBe(100) + }) +}) + +describe('isValidUuid', () => { + it('returns true for valid UUIDs', () => { + expect(isValidUuid('550e8400-e29b-41d4-a716-446655440000')).toBe(true) + expect(isValidUuid('6ba7b810-9dad-11d1-80b4-00c04fd430c8')).toBe(true) + expect(isValidUuid(generateId())).toBe(true) + }) + + it('returns false for invalid strings', () => { + expect(isValidUuid('')).toBe(false) + expect(isValidUuid('not-a-uuid')).toBe(false) + expect(isValidUuid('550e8400-e29b-41d4-a716')).toBe(false) + expect(isValidUuid('550e8400e29b41d4a716446655440000')).toBe(false) + expect(isValidUuid('550e8400-e29b-41d4-a716-44665544000g')).toBe(false) + }) +}) diff --git a/apps/sim/lib/core/utils/uuid.ts b/packages/utils/src/id.ts similarity index 100% rename from apps/sim/lib/core/utils/uuid.ts rename to packages/utils/src/id.ts diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 00000000000..83147e181a0 --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1,14 @@ +export { getPostgresErrorCode, toError } from './errors.js' +export { + formatAbsoluteDate, + formatCompactTimestamp, + formatDate, + formatDateTime, + formatDuration, + formatRelativeTime, + formatTime, + formatTimeWithSeconds, + getTimezoneAbbreviation, +} from './formatting.js' +export { noop, sleep } from './helpers.js' +export { generateId, generateShortId, isValidUuid } from './id.js' diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json new file mode 100644 index 00000000000..1ffa3d2e844 --- /dev/null +++ b/packages/utils/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@sim/tsconfig/library.json", + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/utils/vitest.config.ts b/packages/utils/vitest.config.ts new file mode 100644 index 00000000000..471771e48fe --- /dev/null +++ b/packages/utils/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + globals: false, + environment: 'node', + include: ['src/**/*.test.ts'], + }, +}) From f91c1b614adab5086934e482c968b5910c15af02 Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 18 Apr 2026 18:00:44 -0700 Subject: [PATCH 7/9] chore(docker): add packages/utils to app and realtime Dockerfiles (#4229) * chore(docker): add packages/utils to app and realtime Dockerfiles * chore(docker): copy packages/utils in realtime runner stage --- docker/app.Dockerfile | 4 +++- docker/realtime.Dockerfile | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docker/app.Dockerfile b/docker/app.Dockerfile index 5401e758758..eab09c9b157 100644 --- a/docker/app.Dockerfile +++ b/docker/app.Dockerfile @@ -18,12 +18,13 @@ FROM base AS deps WORKDIR /app COPY package.json bun.lock turbo.json ./ -RUN mkdir -p apps packages/db packages/testing packages/logger packages/tsconfig +RUN mkdir -p apps packages/db packages/testing packages/logger packages/tsconfig packages/utils COPY apps/sim/package.json ./apps/sim/package.json COPY packages/db/package.json ./packages/db/package.json COPY packages/testing/package.json ./packages/testing/package.json COPY packages/logger/package.json ./packages/logger/package.json COPY packages/tsconfig/package.json ./packages/tsconfig/package.json +COPY packages/utils/package.json ./packages/utils/package.json # Install dependencies, then rebuild isolated-vm for Node.js # Use --linker=hoisted for flat node_modules layout (required for Docker multi-stage builds) @@ -51,6 +52,7 @@ COPY apps/sim/package.json ./apps/sim/package.json COPY packages/db/package.json ./packages/db/package.json COPY packages/testing/package.json ./packages/testing/package.json COPY packages/logger/package.json ./packages/logger/package.json +COPY packages/utils/package.json ./packages/utils/package.json # Copy workspace configuration files (needed for turbo) COPY apps/sim/next.config.ts ./apps/sim/next.config.ts diff --git a/docker/realtime.Dockerfile b/docker/realtime.Dockerfile index add2c194a99..4bd565c39e5 100644 --- a/docker/realtime.Dockerfile +++ b/docker/realtime.Dockerfile @@ -12,12 +12,13 @@ FROM base AS deps WORKDIR /app COPY package.json bun.lock turbo.json ./ -RUN mkdir -p apps packages/db packages/testing packages/logger packages/tsconfig +RUN mkdir -p apps packages/db packages/testing packages/logger packages/tsconfig packages/utils COPY apps/sim/package.json ./apps/sim/package.json COPY packages/db/package.json ./packages/db/package.json COPY packages/testing/package.json ./packages/testing/package.json COPY packages/logger/package.json ./packages/logger/package.json COPY packages/tsconfig/package.json ./packages/tsconfig/package.json +COPY packages/utils/package.json ./packages/utils/package.json # Install dependencies with hoisted layout for Docker compatibility # Using --linker=hoisted to avoid .bun directory symlinks that don't copy between stages @@ -39,6 +40,7 @@ COPY apps/sim/package.json ./apps/sim/package.json COPY packages/db/package.json ./packages/db/package.json COPY packages/testing/package.json ./packages/testing/package.json COPY packages/logger/package.json ./packages/logger/package.json +COPY packages/utils/package.json ./packages/utils/package.json # Copy source code (changes most frequently - placed last to maximize cache hits) COPY apps/sim ./apps/sim @@ -68,6 +70,9 @@ COPY --from=builder --chown=nextjs:nodejs /app/packages/db ./packages/db # Copy logger package (workspace dependency used by socket) COPY --from=builder --chown=nextjs:nodejs /app/packages/logger ./packages/logger +# Copy utils package (workspace dependency used by socket) +COPY --from=builder --chown=nextjs:nodejs /app/packages/utils ./packages/utils + # Copy sim app (changes most frequently - placed last) COPY --from=builder --chown=nextjs:nodejs /app/apps/sim ./apps/sim From 951fbd4ded8998fdb82c77b5821ec1e6854afb6f Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 18 Apr 2026 21:13:48 -0700 Subject: [PATCH 8/9] fix(landing): render proper 404 for invalid /models and /integrations routes (#4232) --- .../app/(landing)/integrations/not-found.tsx | 28 +++++++++++++++++++ apps/sim/app/(landing)/models/not-found.tsx | 28 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 apps/sim/app/(landing)/integrations/not-found.tsx create mode 100644 apps/sim/app/(landing)/models/not-found.tsx diff --git a/apps/sim/app/(landing)/integrations/not-found.tsx b/apps/sim/app/(landing)/integrations/not-found.tsx new file mode 100644 index 00000000000..b4ca1ec9d64 --- /dev/null +++ b/apps/sim/app/(landing)/integrations/not-found.tsx @@ -0,0 +1,28 @@ +import type { Metadata } from 'next' +import Link from 'next/link' +import { AUTH_PRIMARY_CTA_BASE } from '@/app/(auth)/components/auth-button-classes' + +export const metadata: Metadata = { + title: 'Page Not Found', + robots: { index: false, follow: true }, +} + +export default function IntegrationsNotFound() { + return ( +
+
+

+ Page not found +

+

+ The page you're looking for doesn't exist or has been moved. +

+
+ + Return to Home + +
+
+
+ ) +} diff --git a/apps/sim/app/(landing)/models/not-found.tsx b/apps/sim/app/(landing)/models/not-found.tsx new file mode 100644 index 00000000000..7db4e7cbfb8 --- /dev/null +++ b/apps/sim/app/(landing)/models/not-found.tsx @@ -0,0 +1,28 @@ +import type { Metadata } from 'next' +import Link from 'next/link' +import { AUTH_PRIMARY_CTA_BASE } from '@/app/(auth)/components/auth-button-classes' + +export const metadata: Metadata = { + title: 'Page Not Found', + robots: { index: false, follow: true }, +} + +export default function ModelsNotFound() { + return ( +
+
+

+ Page not found +

+

+ The page you're looking for doesn't exist or has been moved. +

+
+ + Return to Home + +
+
+
+ ) +} From 1ced54a77cf3b9363924e108380937fe7ac0879d Mon Sep 17 00:00:00 2001 From: Waleed Date: Sat, 18 Apr 2026 21:22:29 -0700 Subject: [PATCH 9/9] fix(settings): restore paste-to-destructure for workspace secrets, cleanup hooks and design tokens (#4231) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(settings): restore paste-to-destructure for workspace secrets, cleanup hooks and design tokens Restores the env-var paste feature (KEY=VALUE → split rows, multi-line → multi rows) for workspace secrets that was lost when the unified Credentials tab was split into Secrets and Integrations. Adds `parseEnvVarLine`, `parseValidEnvVars`, and `handleWorkspacePaste` with full support for export prefix, quoted values, inline comments, and base64 false-positive guards. Also adds consistent value masking (show on focus / mask on blur) to new workspace input rows. Cleans up ~20 unnecessary `useCallback` wrappers, fixes a direct state mutation in `handleSingleValuePaste`, moves `e.preventDefault()` inside the `parsedVars.length > 0` guard, replaces all hardcoded hex colors with CSS variable tokens, converts template-literal classNames to `cn()`, and replaces raw ` @@ -221,17 +276,26 @@ interface NewWorkspaceVariableRowProps { envVar: UIEnvironmentVariable index: number onUpdate: (index: number, field: 'key' | 'value', value: string) => void + onPaste?: (e: React.ClipboardEvent, index: number) => void } -function NewWorkspaceVariableRow({ envVar, index, onUpdate }: NewWorkspaceVariableRowProps) { +function NewWorkspaceVariableRow({ + envVar, + index, + onUpdate, + onPaste, +}: NewWorkspaceVariableRowProps) { + const [valueFocused, setValueFocused] = useState(false) const keyError = validateEnvVarKey(envVar.key) const hasContent = Boolean(envVar.key || envVar.value) return (
onUpdate(index, 'key', e.target.value)} + onPaste={onPaste ? (e) => onPaste(e, index) : undefined} placeholder='API_KEY' name={`new_workspace_key_${envVar.id || index}_${Math.random()}`} autoComplete='off' @@ -239,20 +303,26 @@ function NewWorkspaceVariableRow({ envVar, index, onUpdate }: NewWorkspaceVariab spellCheck='false' readOnly onFocus={(e) => e.target.removeAttribute('readOnly')} - className={`h-9 ${keyError ? 'border-[var(--text-error)]' : ''}`} + className={cn('h-9', keyError && 'border-[var(--text-error)]')} />
onUpdate(index, 'value', e.target.value)} + onPaste={onPaste ? (e) => onPaste(e, index) : undefined} placeholder='Enter value' - type='text' + type={valueFocused ? 'text' : 'password'} name={`new_workspace_value_${envVar.id || index}_${Math.random()}`} autoComplete='off' autoCapitalize='off' spellCheck='false' readOnly - onFocus={(e) => e.target.removeAttribute('readOnly')} + onFocus={(e) => { + setValueFocused(true) + e.target.removeAttribute('readOnly') + }} + onBlur={() => setValueFocused(false)} className='col-span-2 ml-0 h-9' /> @@ -264,7 +334,7 @@ function NewWorkspaceVariableRow({ envVar, index, onUpdate }: NewWorkspaceVariab onUpdate(index, 'value', '') }} disabled={!hasContent} - className={`h-9 w-9 ${!hasContent ? 'opacity-30' : ''}`} + className={cn('h-9 w-9', !hasContent && 'opacity-30')} > @@ -273,7 +343,10 @@ function NewWorkspaceVariableRow({ envVar, index, onUpdate }: NewWorkspaceVariab {keyError && (
{keyError}
@@ -336,7 +409,6 @@ export function CredentialsManager() { const isLoading = isPersonalLoading || isWorkspaceLoading const variables = useMemo(() => personalEnvData || {}, [personalEnvData]) - // --- List view state --- const [envVars, setEnvVars] = useState([]) const [newWorkspaceRows, setNewWorkspaceRows] = useState([ createEmptyEnvVar(), @@ -349,7 +421,6 @@ export function CredentialsManager() { const [pendingKeyValue, setPendingKeyValue] = useState('') const [changeToken, setChangeToken] = useState(0) - // --- Detail view state --- const [selectedCredentialId, setSelectedCredentialId] = useState(null) const [prevSelectedCredentialId, setPrevSelectedCredentialId] = useState< string | null | undefined @@ -370,7 +441,6 @@ export function CredentialsManager() { const shouldBlockNavRef = useRef(false) const pendingNavigationUrlRef = useRef(null) - // --- Credential lookups --- const envKeyToCredential = useMemo(() => { const map = new Map() for (const cred of envCredentials) { @@ -398,7 +468,6 @@ export function CredentialsManager() { } } - // --- Detail view hooks --- const { data: members = [], isPending: membersLoading } = useWorkspaceCredentialMembers( selectedCredential?.id ) @@ -407,7 +476,6 @@ export function CredentialsManager() { const upsertMember = useUpsertWorkspaceCredentialMember() const removeMember = useRemoveWorkspaceCredentialMember() - // --- Detail view computed --- const activeMembers = useMemo( () => members.filter((member) => member.status === 'active'), [members] @@ -438,7 +506,6 @@ export function CredentialsManager() { : false const isDetailsDirty = isDescriptionDirty || isDisplayNameDirty - // --- List view computed --- const filteredEnvVars = useMemo(() => { const mapped = envVars.map((envVar, index) => ({ envVar, originalIndex: index })) if (!searchTerm.trim()) return mapped @@ -526,7 +593,6 @@ export function CredentialsManager() { useEffect(() => () => resetNavGuard(), [resetNavGuard]) - // --- Effects --- useEffect(() => { if (hasSavedRef.current) return @@ -611,7 +677,6 @@ export function CredentialsManager() { } }, []) - // --- Pending credential create request --- const applyPendingCredentialCreateRequest = useCallback( (request: PendingCredentialCreateRequest) => { if (request.workspaceId !== workspaceId) return @@ -666,56 +731,52 @@ export function CredentialsManager() { } }, [workspaceId, applyPendingCredentialCreateRequest]) - // --- Detail view handlers --- - const handleSelectCredential = useCallback((credentialId: string) => { + const handleSelectCredential = (credentialId: string) => { setSelectedCredentialId(credentialId) setDetailsError(null) setMemberUserId('') setMemberRole('member') - }, []) + } - const handleViewDetails = useCallback( - async (envKey: string, type: 'env_workspace' | 'env_personal') => { - const existing = envKeyToCredential.get(envKey) - if (existing) { - handleSelectCredential(existing.id) - return - } + const handleViewDetails = async (envKey: string, type: 'env_workspace' | 'env_personal') => { + const existing = envKeyToCredential.get(envKey) + if (existing) { + handleSelectCredential(existing.id) + return + } - try { - const result = await createCredential.mutateAsync({ - workspaceId, - type, - displayName: envKey, - envKey, - ...(type === 'env_personal' ? { envOwnerUserId: session?.user?.id } : {}), - }) - if (result.credential?.id) { - handleSelectCredential(result.credential.id) - } - } catch (error) { - logger.error('Failed to create credential record', error) + try { + const result = await createCredential.mutateAsync({ + workspaceId, + type, + displayName: envKey, + envKey, + ...(type === 'env_personal' ? { envOwnerUserId: session?.user?.id } : {}), + }) + if (result.credential?.id) { + handleSelectCredential(result.credential.id) } - }, - [envKeyToCredential, handleSelectCredential, createCredential, workspaceId, session?.user?.id] - ) + } catch (error) { + logger.error('Failed to create credential record', error) + } + } - const handleBackAttempt = useCallback(() => { + const handleBackAttempt = () => { if (isDetailsDirty && !updateCredential.isPending) { setShowDetailUnsavedChanges(true) } else { setSelectedCredentialId(null) } - }, [isDetailsDirty, updateCredential.isPending]) + } - const handleDiscardDetailChanges = useCallback(() => { + const handleDiscardDetailChanges = () => { setShowDetailUnsavedChanges(false) setSelectedDescriptionDraft(selectedCredential?.description || '') setSelectedDisplayNameDraft(selectedCredential?.displayName || '') setSelectedCredentialId(null) - }, [selectedCredential]) + } - const handleSaveDetails = useCallback(async () => { + const handleSaveDetails = async () => { if (!selectedCredential || !isSelectedAdmin || !isDetailsDirty || updateCredential.isPending) return setDetailsError(null) @@ -733,18 +794,9 @@ export function CredentialsManager() { setDetailsError(message) logger.error('Failed to save secret details', error) } - }, [ - selectedCredential, - isSelectedAdmin, - isDetailsDirty, - isDisplayNameDirty, - isDescriptionDirty, - selectedDisplayNameDraft, - selectedDescriptionDraft, - updateCredential, - ]) + } - const handleAddMember = useCallback(async () => { + const handleAddMember = async () => { if (!memberUserId || !selectedCredential) return try { await upsertMember.mutateAsync({ @@ -757,74 +809,61 @@ export function CredentialsManager() { } catch (error) { logger.error('Failed to add member', error) } - }, [selectedCredential, memberUserId, memberRole]) - - const handleRemoveMember = useCallback( - async (userId: string) => { - if (!selectedCredential) return - try { - await removeMember.mutateAsync({ credentialId: selectedCredential.id, userId }) - } catch (error) { - logger.error('Failed to remove member', error) - } - }, - [selectedCredential] - ) + } - const handleChangeMemberRole = useCallback( - async (userId: string, role: WorkspaceCredentialRole) => { - if (!selectedCredential) return - try { - await upsertMember.mutateAsync({ credentialId: selectedCredential.id, userId, role }) - } catch (error) { - logger.error('Failed to change member role', error) - } - }, - [selectedCredential] - ) + const handleRemoveMember = async (userId: string) => { + if (!selectedCredential) return + try { + await removeMember.mutateAsync({ credentialId: selectedCredential.id, userId }) + } catch (error) { + logger.error('Failed to remove member', error) + } + } - // --- List view handlers --- - const handleWorkspaceKeyRename = useCallback( - (currentKey: string, currentValue: string) => { - const newKey = pendingKeyValue.trim() - if (!renamingKey || renamingKey !== currentKey) return - setRenamingKey(null) - if (!newKey || newKey === currentKey) return - - setWorkspaceVars((prev) => { - const next = { ...prev } - delete next[currentKey] - next[newKey] = currentValue - return next - }) - }, - [pendingKeyValue, renamingKey] - ) + const handleChangeMemberRole = async (userId: string, role: WorkspaceCredentialRole) => { + if (!selectedCredential) return + try { + await upsertMember.mutateAsync({ credentialId: selectedCredential.id, userId, role }) + } catch (error) { + logger.error('Failed to change member role', error) + } + } + + const handleWorkspaceKeyRename = (currentKey: string, currentValue: string) => { + const newKey = pendingKeyValue.trim() + if (!renamingKey || renamingKey !== currentKey) return + setRenamingKey(null) + if (!newKey || newKey === currentKey) return - const handleWorkspaceValueChange = useCallback((key: string, value: string) => { + setWorkspaceVars((prev) => { + const next = { ...prev } + delete next[currentKey] + next[newKey] = currentValue + return next + }) + } + + const handleWorkspaceValueChange = (key: string, value: string) => { setWorkspaceVars((prev) => ({ ...prev, [key]: value })) - }, []) + } - const handleDeleteWorkspaceVar = useCallback((key: string) => { + const handleDeleteWorkspaceVar = (key: string) => { setWorkspaceVars((prev) => { const next = { ...prev } delete next[key] return next }) - }, []) + } - const updateNewWorkspaceRow = useCallback( - (index: number, field: 'key' | 'value', value: string) => { - setNewWorkspaceRows((prev) => updateEnvVarArray(prev, index, field, value)) - }, - [] - ) + const updateNewWorkspaceRow = (index: number, field: 'key' | 'value', value: string) => { + setNewWorkspaceRows((prev) => updateEnvVarArray(prev, index, field, value)) + } - const updateEnvVar = useCallback((index: number, field: 'key' | 'value', value: string) => { + const updateEnvVar = (index: number, field: 'key' | 'value', value: string) => { setEnvVars((prev) => updateEnvVarArray(prev, index, field, value)) - }, []) + } - const removeEnvVar = useCallback((index: number) => { + const removeEnvVar = (index: number) => { setEnvVars((prev) => { const filtered = prev.filter((_, i) => i !== index) const hasTrailingEmpty = @@ -833,130 +872,105 @@ export function CredentialsManager() { !filtered[filtered.length - 1].value return hasTrailingEmpty ? filtered : [...filtered, createEmptyEnvVar()] }) - }, []) + } - const handleValueFocus = useCallback((index: number, e: React.FocusEvent) => { + const handleValueFocus = (index: number, e: React.FocusEvent) => { setFocusedValueIndex(index) e.target.scrollLeft = 0 - }, []) + } - const handleValueClick = useCallback((e: React.MouseEvent) => { + const handleValueClick = (e: React.MouseEvent) => { e.preventDefault() e.currentTarget.scrollLeft = 0 - }, []) - - const parseEnvVarLine = useCallback((line: string): UIEnvironmentVariable | null => { - const trimmed = line.trim() - - if (!trimmed || trimmed.startsWith('#')) return null - - const withoutExport = trimmed.replace(/^export\s+/, '') - - const equalIndex = withoutExport.indexOf('=') - if (equalIndex === -1 || equalIndex === 0) return null - - const potentialKey = withoutExport.substring(0, equalIndex).trim() - if (!isValidEnvVarName(potentialKey)) return null - - let value = withoutExport.substring(equalIndex + 1) + } - const looksLikeBase64Key = /^[A-Za-z0-9+/]+$/.test(potentialKey) && !potentialKey.includes('_') - const valueIsJustPadding = /^=+$/.test(value.trim()) - if (looksLikeBase64Key && valueIsJustPadding && potentialKey.length > 20) { - return null - } + const handleSingleValuePaste = (text: string, index: number, inputType: 'key' | 'value') => { + setEnvVars((prev) => { + const newEnvVars = [...prev] + newEnvVars[index] = { ...newEnvVars[index], [inputType]: text } + return newEnvVars + }) + } - const trimmedValue = value.trim() - if ( - !trimmedValue.startsWith('"') && - !trimmedValue.startsWith("'") && - !trimmedValue.startsWith('`') - ) { - const commentIndex = value.search(/\s#/) - if (commentIndex !== -1) { - value = value.substring(0, commentIndex) + /** + * Paste handler for personal env var rows. + * Only prevents default when it actually handles the paste: KV patterns destructure into new rows, + * plain values overwrite the field. Falls through to native paste if pattern is detected but all + * values are empty (e.g. KEY=), avoiding silently swallowed input. + */ + const handlePaste = (e: React.ClipboardEvent, index: number) => { + const text = e.clipboardData.getData('text').trim() + if (!text) return + + const lines = text.split(/\r?\n/).filter((line) => line.trim()) + if (lines.length === 0) return + + const inputType = (e.target as HTMLInputElement).getAttribute('data-input-type') as + | 'key' + | 'value' + + if (inputType) { + const hasValidEnvVarPattern = lines.some((line) => parseEnvVarLine(line) !== null) + if (!hasValidEnvVarPattern) { + e.preventDefault() + handleSingleValuePaste(text, index, inputType) + return } } - value = value.trim() - - if ( - (value.startsWith('"') && value.endsWith('"')) || - (value.startsWith("'") && value.endsWith("'")) || - (value.startsWith('`') && value.endsWith('`')) - ) { - value = value.slice(1, -1) - } - - return { key: potentialKey, value, id: generateRowId() } - }, []) - - const handleSingleValuePaste = useCallback( - (text: string, index: number, inputType: 'key' | 'value') => { + const parsedVars = parseValidEnvVars(lines) + if (parsedVars.length > 0) { + e.preventDefault() setEnvVars((prev) => { - const newEnvVars = [...prev] - newEnvVars[index][inputType] = text - return newEnvVars + const existingVars = prev.filter((v) => v.key || v.value) + return [...existingVars, ...parsedVars, createEmptyEnvVar()] }) - }, - [] - ) + scrollToBottom() + } + } - const handleKeyValuePaste = useCallback( - (lines: string[]) => { - const parsedVars = lines - .map(parseEnvVarLine) - .filter((parsed): parsed is UIEnvironmentVariable => parsed !== null) - .filter(({ key, value }) => key && value) + /** + * Paste handler for workspace new-row inputs. + * Only prevents default when pasted text contains KEY=VALUE patterns; otherwise defers to + * native browser paste so cursor/selection semantics are preserved for plain values. + */ + const handleWorkspacePaste = (e: React.ClipboardEvent, _index: number) => { + const text = e.clipboardData.getData('text').trim() + if (!text) return - if (parsedVars.length > 0) { - setEnvVars((prev) => { - const existingVars = prev.filter((v) => v.key || v.value) - return [...existingVars, ...parsedVars, createEmptyEnvVar()] - }) - scrollToBottom() - } - }, - [parseEnvVarLine, scrollToBottom] - ) + const lines = text.split(/\r?\n/).filter((line) => line.trim()) + if (lines.length === 0) return - const handlePaste = useCallback( - (e: React.ClipboardEvent, index: number) => { - const text = e.clipboardData.getData('text').trim() - if (!text) return + const inputType = (e.target as HTMLInputElement).getAttribute('data-input-type') as + | 'key' + | 'value' - const lines = text.split('\n').filter((line) => line.trim()) - if (lines.length === 0) return + if (inputType) { + const hasValidEnvVarPattern = lines.some((line) => parseEnvVarLine(line) !== null) + if (!hasValidEnvVarPattern) return + } + const parsedVars = parseValidEnvVars(lines) + if (parsedVars.length > 0) { e.preventDefault() + setNewWorkspaceRows((prev) => { + const existing = prev.filter((v) => v.key || v.value) + return [...existing, ...parsedVars, createEmptyEnvVar()] + }) + scrollToBottom() + } + } - const inputType = (e.target as HTMLInputElement).getAttribute('data-input-type') as - | 'key' - | 'value' - - if (inputType) { - const hasValidEnvVarPattern = lines.some((line) => parseEnvVarLine(line) !== null) - if (!hasValidEnvVarPattern) { - handleSingleValuePaste(text, index, inputType) - return - } - } - - handleKeyValuePaste(lines) - }, - [parseEnvVarLine, handleSingleValuePaste, handleKeyValuePaste] - ) - - const resetToSaved = useCallback(() => { + const resetToSaved = () => { setEnvVars(JSON.parse(JSON.stringify(initialVarsRef.current))) setWorkspaceVars({ ...initialWorkspaceVarsRef.current }) setNewWorkspaceRows([createEmptyEnvVar()]) setShowUnsavedChanges(false) - }, []) + } const handleCancel = resetToSaved - const handleSave = useCallback(async () => { + const handleSave = async () => { if (isListSaving) return const prevInitialVars = [...initialVarsRef.current] @@ -1042,10 +1056,9 @@ export function CredentialsManager() { queryClient.invalidateQueries({ queryKey: workspaceCredentialKeys.lists() }) } } - // eslint-disable-next-line react-hooks/exhaustive-deps -- mutation objects and queryClient are stable (TanStack Query v5) - }, [isListSaving, envVars, workspaceVars, newWorkspaceRows, workspaceId]) + } - const handleDiscardAndNavigate = useCallback(() => { + const handleDiscardAndNavigate = () => { shouldBlockNavRef.current = false resetNavGuard() resetToSaved() @@ -1056,117 +1069,119 @@ export function CredentialsManager() { pendingNavigationUrlRef.current = null router.push(url) } - }, [router, resetToSaved, resetNavGuard]) - - const renderEnvVarRow = useCallback( - (envVar: UIEnvironmentVariable, originalIndex: number) => { - const isConflict = !!envVar.key && allWorkspaceKeys.has(envVar.key) - const keyError = validateEnvVarKey(envVar.key) - const maskedValueStyle = - focusedValueIndex !== originalIndex && !isConflict - ? ({ WebkitTextSecurity: 'disc' } as React.CSSProperties) - : undefined - - const isComplete = Boolean(envVar.key && envVar.value) - const hasCredential = isComplete && envKeyToCredential.has(envVar.key) - - const hasContent = Boolean(envVar.key || envVar.value) - - return ( -
- updateEnvVar(originalIndex, 'key', e.target.value)} - onPaste={(e) => handlePaste(e, originalIndex)} - placeholder='API_KEY' - name={`env_variable_name_${envVar.id || originalIndex}_${Math.random()}`} - autoComplete='off' - autoCapitalize='off' - spellCheck='false' - readOnly - onFocus={(e) => e.target.removeAttribute('readOnly')} - className={`h-9 ${isConflict ? CONFLICT_CLASS : ''} ${keyError ? 'border-[var(--text-error)]' : ''}`} - /> -
- updateEnvVar(originalIndex, 'value', e.target.value)} - type='text' - onFocus={(e) => { - if (!isConflict) { - e.target.removeAttribute('readOnly') - handleValueFocus(originalIndex, e) - } - }} - onClick={handleValueClick} - onBlur={() => setFocusedValueIndex(null)} - onPaste={(e) => handlePaste(e, originalIndex)} - placeholder={isConflict ? 'Workspace override active' : 'Enter value'} - disabled={isConflict} - aria-disabled={isConflict} - name={`env_variable_value_${envVar.id || originalIndex}_${Math.random()}`} - autoComplete='off' - autoCapitalize='off' - spellCheck='false' - readOnly={isConflict} - style={maskedValueStyle} - className={`h-9 ${isComplete ? '' : 'col-span-2'} ${isConflict ? `cursor-not-allowed ${CONFLICT_CLASS}` : ''}`} - /> - {isComplete && ( - + } + + const renderEnvVarRow = (envVar: UIEnvironmentVariable, originalIndex: number) => { + const isConflict = !!envVar.key && allWorkspaceKeys.has(envVar.key) + const keyError = validateEnvVarKey(envVar.key) + const maskedValueStyle = + focusedValueIndex !== originalIndex && !isConflict + ? ({ WebkitTextSecurity: 'disc' } as React.CSSProperties) + : undefined + + const isComplete = Boolean(envVar.key && envVar.value) + const hasCredential = isComplete && envKeyToCredential.has(envVar.key) + + const hasContent = Boolean(envVar.key || envVar.value) + + return ( +
+ updateEnvVar(originalIndex, 'key', e.target.value)} + onPaste={(e) => handlePaste(e, originalIndex)} + placeholder='API_KEY' + name={`env_variable_name_${envVar.id || originalIndex}_${Math.random()}`} + autoComplete='off' + autoCapitalize='off' + spellCheck='false' + readOnly + onFocus={(e) => e.target.removeAttribute('readOnly')} + className={cn( + 'h-9', + isConflict && CONFLICT_CLASS, + keyError && 'border-[var(--text-error)]' )} - - - - - {hasContent && Delete secret} - - {keyError && ( -
- {keyError} -
+ /> +
+ updateEnvVar(originalIndex, 'value', e.target.value)} + type='text' + onFocus={(e) => { + if (!isConflict) { + e.target.removeAttribute('readOnly') + handleValueFocus(originalIndex, e) + } + }} + onClick={handleValueClick} + onBlur={() => setFocusedValueIndex(null)} + onPaste={(e) => handlePaste(e, originalIndex)} + placeholder={isConflict ? 'Workspace override active' : 'Enter value'} + disabled={isConflict} + aria-disabled={isConflict} + name={`env_variable_value_${envVar.id || originalIndex}_${Math.random()}`} + autoComplete='off' + autoCapitalize='off' + spellCheck='false' + readOnly={isConflict} + style={maskedValueStyle} + className={cn( + 'h-9', + !isComplete && 'col-span-2', + isConflict && 'cursor-not-allowed', + isConflict && CONFLICT_CLASS )} - {isConflict && !keyError && ( -
+ {isComplete && ( + + )} + + +
- )} -
- ) - }, - [ - allWorkspaceKeys, - focusedValueIndex, - updateEnvVar, - handlePaste, - handleValueFocus, - handleValueClick, - removeEnvVar, - handleViewDetails, - envKeyToCredential, - ] - ) + + + + {hasContent && Delete secret} + + {keyError && ( +
+ {keyError} +
+ )} + {isConflict && !keyError && ( +
+ Workspace variable with the same name overrides this. Rename your personal key to use + it. +
+ )} +
+ ) + } const isPendingNavigation = pendingNavigationUrlRef.current !== null @@ -1208,9 +1223,10 @@ export function CredentialsManager() { Display Name - + {copyIdSuccess ? 'Copied!' : 'Copy credential ID'} @@ -1439,7 +1455,6 @@ export function CredentialsManager() { ) } - // List view return ( <>
@@ -1493,7 +1508,7 @@ export function CredentialsManager() { isLoading || !hasChanges || hasConflicts || hasInvalidKeys || isListSaving } variant='primary' - className={`${hasConflicts || hasInvalidKeys ? 'cursor-not-allowed opacity-50' : ''}`} + className={cn((hasConflicts || hasInvalidKeys) && 'cursor-not-allowed opacity-50')} > {isListSaving ? 'Saving...' : 'Save'} @@ -1515,8 +1530,8 @@ export function CredentialsManager() {
-
- +
+ {Array.from({ length: 2 }, (_, i) => (
@@ -1529,13 +1544,16 @@ export function CredentialsManager() {
) : ( -
+
{(!searchTerm.trim() || filteredWorkspaceEntries.length > 0 || filteredNewWorkspaceRows.length > 0) && ( <>
Workspace
@@ -1569,16 +1587,20 @@ export function CredentialsManager() { envVar={row} index={originalIndex} onUpdate={updateNewWorkspaceRow} + onPaste={handleWorkspacePaste} /> ))} -
+
)} {(!searchTerm.trim() || filteredEnvVars.length > 0) && ( <>
Personal
@@ -1597,7 +1619,10 @@ export function CredentialsManager() { Object.keys(workspaceVars).length > 0 || newWorkspaceRows.length > 0) && (
No secrets found matching “{searchTerm}”
diff --git a/apps/sim/lib/credentials/environment.ts b/apps/sim/lib/credentials/environment.ts index ad4bed88876..d9dbdce8c9c 100644 --- a/apps/sim/lib/credentials/environment.ts +++ b/apps/sim/lib/credentials/environment.ts @@ -100,11 +100,10 @@ async function upsertCredentialAdminMember(credentialId: string, adminUserId: st async function ensureWorkspaceCredentialMemberships( credentialId: string, - workspaceId: string, + memberUserIds: string[], ownerUserId: string ) { - const workspaceMemberUserIds = await getWorkspaceMemberUserIds(workspaceId) - if (!workspaceMemberUserIds.length) return + if (!memberUserIds.length) return const existingMemberships = await db .select({ @@ -117,14 +116,14 @@ async function ensureWorkspaceCredentialMemberships( .where( and( eq(credentialMember.credentialId, credentialId), - inArray(credentialMember.userId, workspaceMemberUserIds) + inArray(credentialMember.userId, memberUserIds) ) ) const byUserId = new Map(existingMemberships.map((row) => [row.userId, row])) const now = new Date() - for (const memberUserId of workspaceMemberUserIds) { + for (const memberUserId of memberUserIds) { const targetRole = memberUserId === ownerUserId ? 'admin' : 'member' const existing = byUserId.get(memberUserId) if (existing) { @@ -164,11 +163,14 @@ export async function syncWorkspaceEnvCredentials(params: { actingUserId: string }) { const { workspaceId, envKeys, actingUserId } = params - const [workspaceRow] = await db - .select({ ownerId: workspace.ownerId }) - .from(workspace) - .where(eq(workspace.id, workspaceId)) - .limit(1) + const [[workspaceRow], memberUserIds] = await Promise.all([ + db + .select({ ownerId: workspace.ownerId }) + .from(workspace) + .where(eq(workspace.id, workspaceId)) + .limit(1), + getWorkspaceMemberUserIds(workspaceId), + ]) if (!workspaceRow) return @@ -217,7 +219,7 @@ export async function syncWorkspaceEnvCredentials(params: { } for (const credentialId of credentialIdsToEnsureMembership) { - await ensureWorkspaceCredentialMemberships(credentialId, workspaceId, workspaceRow.ownerId) + await ensureWorkspaceCredentialMemberships(credentialId, memberUserIds, workspaceRow.ownerId) } if (normalizedKeys.length > 0) { @@ -238,6 +240,97 @@ export async function syncWorkspaceEnvCredentials(params: { .where(and(eq(credential.workspaceId, workspaceId), eq(credential.type, 'env_workspace'))) } +/** + * Creates credential records and bulk-inserts memberships for newly added workspace env keys. + * Use this instead of `syncWorkspaceEnvCredentials` when the caller knows exactly which keys are new. + */ +export async function createWorkspaceEnvCredentials(params: { + workspaceId: string + newKeys: string[] + actingUserId: string +}): Promise { + const { workspaceId, newKeys, actingUserId } = params + const keys = Array.from(new Set(newKeys.filter(Boolean))) + if (keys.length === 0) return + + const [[workspaceRow], memberUserIds] = await Promise.all([ + db + .select({ ownerId: workspace.ownerId }) + .from(workspace) + .where(eq(workspace.id, workspaceId)) + .limit(1), + getWorkspaceMemberUserIds(workspaceId), + ]) + + if (!workspaceRow) return + + const ownerUserId = workspaceRow.ownerId + const now = new Date() + const createdIds: string[] = [] + + for (const envKey of keys) { + const createdId = generateId() + try { + await db.insert(credential).values({ + id: createdId, + workspaceId, + type: 'env_workspace', + displayName: envKey, + envKey, + createdBy: actingUserId, + createdAt: now, + updatedAt: now, + }) + createdIds.push(createdId) + } catch (error: unknown) { + const code = getPostgresErrorCode(error) + if (code !== '23505') throw error + } + } + + if (createdIds.length === 0 || memberUserIds.length === 0) return + + // Bulk-insert memberships for all new credentials × all workspace members in one query + const membershipValues = createdIds.flatMap((credentialId) => + memberUserIds.map((memberUserId) => ({ + id: generateId(), + credentialId, + userId: memberUserId, + role: (memberUserId === ownerUserId ? 'admin' : 'member') as 'admin' | 'member', + status: 'active' as const, + joinedAt: now, + invitedBy: ownerUserId, + createdAt: now, + updatedAt: now, + })) + ) + + await db.insert(credentialMember).values(membershipValues).onConflictDoNothing() +} + +/** + * Deletes credential records (and their memberships via cascade) for removed workspace env keys. + * Use this instead of `syncWorkspaceEnvCredentials` when the caller knows exactly which keys were deleted. + */ +export async function deleteWorkspaceEnvCredentials(params: { + workspaceId: string + removedKeys: string[] +}): Promise { + const { workspaceId, removedKeys } = params + const keys = removedKeys.filter(Boolean) + if (keys.length === 0) return + + await db + .delete(credential) + .where( + and( + eq(credential.workspaceId, workspaceId), + eq(credential.type, 'env_workspace'), + inArray(credential.envKey, keys) + ) + ) +} + export async function syncPersonalEnvCredentialsForUser(params: { userId: string envKeys: string[] diff --git a/apps/sim/lib/environment/utils.ts b/apps/sim/lib/environment/utils.ts index 226e2cb33b7..7442506b8f1 100644 --- a/apps/sim/lib/environment/utils.ts +++ b/apps/sim/lib/environment/utils.ts @@ -5,9 +5,9 @@ import { generateId } from '@sim/utils/id' import { eq, inArray } from 'drizzle-orm' import { decryptSecret, encryptSecret } from '@/lib/core/security/encryption' import { + createWorkspaceEnvCredentials, getAccessibleEnvCredentials, syncPersonalEnvCredentialsForUser, - syncWorkspaceEnvCredentials, } from '@/lib/credentials/environment' const logger = createLogger('EnvironmentUtils') @@ -305,7 +305,8 @@ export async function upsertWorkspaceEnvVars( set: { variables: merged, updatedAt: new Date() }, }) - await syncWorkspaceEnvCredentials({ workspaceId, envKeys: Object.keys(merged), actingUserId }) + const newKeys = Object.keys(newVars).filter((k) => !(k in existingWsEncrypted)) + await createWorkspaceEnvCredentials({ workspaceId, newKeys, actingUserId }) return updatedKeys }