@thkl/agrid 0.1.5 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +268 -4
- package/fesm2022/thkl-agrid.mjs +2256 -181
- package/fesm2022/thkl-agrid.mjs.map +1 -1
- package/package.json +4 -4
- package/types/thkl-agrid.d.ts +730 -27
- package/types/thkl-agrid.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thkl-agrid.mjs","sources":["../../../src/app/agrid/agrid.utils.ts","../../../src/app/agrid/rendering/agrid-cell.component.ts","../../../src/app/agrid/infrastructure/agrid-browser.adapter.ts","../../../src/app/agrid/selection/agrid-clipboard.handler.ts","../../../src/app/agrid/columns/agrid-column-layout.model.ts","../../../src/app/agrid/agrid-localization.ts","../../../src/app/agrid/columns/agrid-column-menu.component.ts","../../../src/app/agrid/columns/agrid-column-menu.component.html","../../../src/app/agrid/columns/agrid-column-menu.controller.ts","../../../src/app/agrid/columns/agrid-column-reorder.controller.ts","../../../src/app/agrid/columns/agrid-column-sizing.controller.ts","../../../src/app/agrid/columns/agrid-column-state.service.ts","../../../src/app/agrid/rows/agrid-drag.handler.ts","../../../src/app/agrid/editing/agrid-edit.controller.ts","../../../src/app/agrid/selection/agrid-find.controller.ts","../../../src/app/agrid/selection/agrid-find-panel.component.ts","../../../src/app/agrid/selection/agrid-find-panel.component.html","../../../src/app/agrid/rows/agrid-group.controller.ts","../../../src/app/agrid/rows/agrid-tree.controller.ts","../../../src/app/agrid/selection/agrid-navigation.controller.ts","../../../src/app/agrid/rendering/agrid-presentation.service.ts","../../../src/app/agrid/agrid-control.ts","../../../src/app/agrid/agrid-datasource.ts","../../../src/app/agrid/agrid-provider.ts","../../../src/app/agrid/rows/agrid-projection.model.ts","../../../src/app/agrid/selection/agrid-range.controller.ts","../../../src/app/agrid/rows/agrid-row.controller.ts","../../../src/app/agrid/editing/agrid-sidebar.controller.ts","../../../src/app/agrid/editing/agrid-sidebar.component.ts","../../../src/app/agrid/editing/agrid-sidebar.component.html","../../../src/app/agrid/agrid.component.ts","../../../src/app/agrid/agrid.component.html","../../../src/app/agrid/agrid.types.ts","../../../src/app/agrid/thkl-agrid.ts"],"sourcesContent":["import { ColumnFilter } from './agrid-control';\nimport { ColDef, GridItem, TreeRowItem, ValueOption } from './agrid.types';\n\n// Display resolution\n\n// Matches YYYY-MM-DD with optional time component — strict enough to avoid false positives.\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$/;\n\n/** Returns true if the value is a Date object or an ISO date string. */\nexport function looksLikeDate(raw: unknown): boolean {\n if (raw instanceof Date) return true;\n if (typeof raw === 'string') return ISO_DATE_RE.test(raw.trim());\n return false;\n}\n\n/**\n * Formats a raw value as a human-readable date string.\n * Accepts Date objects and ISO strings.\n * Returns empty string for null/undefined, raw string if unparseable.\n */\nexport function formatDateValue(raw: unknown, locale?: string, calendarDate = false): string {\n if (raw == null || raw === '') return '';\n const dateInputValue = calendarDate ? getDateInputValue(raw) : '';\n const d = dateInputValue\n ? new Date(`${dateInputValue}T00:00:00.000Z`)\n : raw instanceof Date ? raw : new Date(raw as string);\n if (isNaN(d.getTime())) return String(raw);\n return d.toLocaleDateString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n ...(calendarDate ? { timeZone: 'UTC' } : {}),\n });\n}\n\n/** Converts a supported date value to the `YYYY-MM-DD` format required by date inputs. */\nexport function getDateInputValue(raw: unknown): string {\n if (raw == null || raw === '') return '';\n const date = raw instanceof Date ? raw : new Date(raw as string);\n return Number.isNaN(date.getTime()) ? '' : date.toISOString().slice(0, 10);\n}\n\n/**\n * Converts a date input value back to the storage form used by the original value.\n *\n * `Date` objects remain `Date` objects. ISO timestamps retain their original time and zone\n * suffix, while date-only strings and previously empty values remain date-only strings.\n */\nexport function coerceDateInputValue(value: string, originalValue: unknown): unknown {\n if (value === '') return '';\n if (originalValue instanceof Date) return new Date(`${value}T00:00:00.000Z`);\n if (\n typeof originalValue === 'string'\n && /^\\d{4}-\\d{2}-\\d{2}T/.test(originalValue)\n ) {\n return `${value}${originalValue.slice(10)}`;\n }\n return value;\n}\n\n/** Resolve the display string for a raw cell value via ValueOption label, formatter, or coercion. */\nexport function getDisplayForField(col: ColDef | undefined, raw: unknown, locale?: string): string {\n if (!col) return String(raw ?? '');\n if (col.values?.length) {\n const opt = col.values.find(v =>\n typeof v === 'string' ? v === raw : (v as ValueOption).value === raw\n );\n if (opt !== undefined) return typeof opt === 'string' ? opt : (opt as ValueOption).label;\n }\n if (col.formatter) return col.formatter(raw);\n if (col.type === 'date' || looksLikeDate(raw)) {\n return formatDateValue(raw, locale, col.type === 'date');\n }\n return String(raw ?? '');\n}\n\n/** Returns whether a virtual-scroll item represents a data row. */\nexport function isDataRowItem(item: GridItem): item is { row: Record<string, unknown>; originalIndex: number } {\n return typeof item === 'object' && item !== null && 'row' in item;\n}\n\n/** Returns whether a virtual-scroll item represents a group header. */\nexport function isGroupHeaderItem(item: GridItem): item is { groupLabel: string; count: number; collapsed: boolean } {\n return typeof item === 'object' && item !== null && 'groupLabel' in item;\n}\n\n/**\n * Returns whether a virtual-scroll item represents a tree row.\n *\n * Tree rows also pass {@link isDataRowItem} (they carry `row` + `originalIndex`); this guard\n * additionally narrows to the indentation/expansion fields via the `level` discriminator.\n */\nexport function isTreeRowItem<T extends object>(item: GridItem<T>): item is TreeRowItem<T> {\n return typeof item === 'object' && item !== null && 'level' in item;\n}\n\n// Filtering\n\n/** Apply text substring and value-set filters, returning the surviving row indices. */\nexport function applyTextAndValueFilters(\n rows: Record<string, unknown>[],\n indices: number[],\n filters: Record<string, ColumnFilter>,\n colMap: Map<string, ColDef>,\n locale?: string,\n): number[] {\n let result = indices;\n for (const [field, filter] of Object.entries(filters)) {\n const col = colMap.get(field);\n if (filter.text) {\n const lc = filter.text.toLowerCase();\n result = result.filter(i => getDisplayForField(col, rows[i][field], locale).toLowerCase().includes(lc));\n }\n if (filter.selectedValues !== null) {\n const allowed = new Set(filter.selectedValues);\n result = result.filter(i => allowed.has(String(rows[i][field] ?? '')));\n }\n }\n return result;\n}\n\n// Sorting\n\n/**\n * Sort indices by one or more columns in priority order.\n * Each entry is `[field, ColumnFilter]`; the first entry has the highest priority.\n * Ties are broken by subsequent entries.\n */\nexport function applySortToIndices(\n rows: Record<string, unknown>[],\n indices: number[],\n sortEntries: [string, ColumnFilter][],\n colMap: Map<string, ColDef>,\n locale?: string,\n): number[] {\n if (sortEntries.length === 0) return indices;\n\n interface SortKey {\n display: string;\n dateLike: boolean;\n dateValue: number;\n numericValue: number | null;\n }\n\n const collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });\n const fields = sortEntries.map(([field, filter]) => ({\n field,\n direction: filter.sort === 'desc' ? -1 : 1,\n col: colMap.get(field),\n }));\n const decorated = indices.map((index, position) => ({\n index,\n position,\n keys: fields.map(({ field, col }): SortKey => {\n const raw = rows[index][field];\n const dateLike = col?.type === 'date' || looksLikeDate(raw);\n const dateValue = dateLike\n ? raw instanceof Date ? raw.getTime() : new Date(raw as string).getTime()\n : Number.NaN;\n const numericValue = col?.type === 'number'\n && !col.formatter\n && !col.values?.length\n && typeof raw === 'number'\n && Number.isFinite(raw)\n ? raw\n : null;\n return {\n display: dateLike ? '' : getDisplayForField(col, raw, locale),\n dateLike,\n dateValue: Number.isNaN(dateValue) ? -1 : dateValue,\n numericValue,\n };\n }),\n }));\n\n decorated.sort((a, b) => {\n for (let fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) {\n const keyA = a.keys[fieldIndex];\n const keyB = b.keys[fieldIndex];\n let comparison: number;\n if (keyA.dateLike || keyB.dateLike) {\n comparison = keyA.dateValue - keyB.dateValue;\n } else if (keyA.numericValue !== null && keyB.numericValue !== null) {\n comparison = keyA.numericValue - keyB.numericValue;\n } else {\n comparison = collator.compare(keyA.display, keyB.display);\n }\n if (comparison !== 0) {\n return comparison * fields[fieldIndex].direction;\n }\n }\n return a.position - b.position;\n });\n\n return decorated.map(item => item.index);\n}\n\n// Grouping\n\n/**\n * Bucket rows by the display value of `groupField`, sort group keys alphabetically,\n * optionally sort within groups by a secondary sort, and interleave group-header items.\n * Does NOT append the add-row null sentinel — the caller does that.\n */\nexport function buildGroupedItems(\n rows: Record<string, unknown>[],\n indices: number[],\n groupField: string,\n colMap: Map<string, ColDef>,\n sortEntries: [string, ColumnFilter][],\n expandedLabels: Set<string>,\n locale?: string,\n): GridItem[] {\n const groupCol = colMap.get(groupField);\n\n const groups = new Map<string, number[]>();\n for (const i of indices) {\n const key = getDisplayForField(groupCol, rows[i][groupField], locale);\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(i);\n }\n\n const sortedKeys = [...groups.keys()].sort((a, b) =>\n a.localeCompare(b, locale, { sensitivity: 'base' })\n );\n\n const nonGroupSorts = sortEntries.filter(([f]) => f !== groupField);\n if (nonGroupSorts.length > 0) {\n for (const [, groupRows] of groups) {\n const sorted = applySortToIndices(rows, groupRows, nonGroupSorts, colMap, locale);\n groupRows.splice(0, groupRows.length, ...sorted);\n }\n }\n\n const items: GridItem[] = [];\n for (const key of sortedKeys) {\n const groupRows = groups.get(key)!;\n const isExpanded = expandedLabels.has(key);\n items.push({ groupLabel: key, count: groupRows.length, collapsed: !isExpanded });\n if (isExpanded) {\n for (const i of groupRows) items.push({ row: rows[i], originalIndex: i });\n }\n }\n return items;\n}\n\n/** Row accessors required to flatten a hierarchy. @internal */\nexport interface TreeAccessors<T extends object> {\n getId: (row: T) => string | number;\n getParentId: (row: T) => string | number | null | undefined;\n}\n\n/**\n * Flatten a parent/child hierarchy into a depth-first list of {@link TreeRowItem}s for the\n * virtual scroll list, honoring the expanded-id set.\n *\n * `indices` is the already filtered and sorted set of source-array positions; sibling order\n * follows that order. A row is treated as a **root** when its parent id is `null`/`undefined`\n * or when that parent is not present in `indices` (orphan). Children of a collapsed row are\n * omitted. Cycles and rows visited more than once are guarded so the walk always terminates.\n *\n * @param rows The full data-source array.\n * @param indices Filtered/sorted source positions to include, in display order.\n * @param accessors `getId` / `getParentId` for the rows.\n * @param expandedIds Ids whose children should be rendered.\n * @param forceExpandedIds Ids forced open regardless of `expandedIds` — used to reveal the\n * ancestor path of filter matches. Optional.\n */\nexport function buildTreeItems<T extends object>(\n rows: T[],\n indices: number[],\n accessors: TreeAccessors<T>,\n expandedIds: Set<string | number>,\n forceExpandedIds?: Set<string | number>,\n): GridItem<T>[] {\n const { getId, getParentId } = accessors;\n\n const includedIds = new Set<string | number>();\n for (const i of indices) includedIds.add(getId(rows[i]));\n\n // Bucket each included row under its parent, preserving the incoming (sorted) order.\n const childrenByParent = new Map<string | number, number[]>();\n const roots: number[] = [];\n for (const i of indices) {\n const parentId = getParentId(rows[i]);\n if (parentId == null || !includedIds.has(parentId)) {\n roots.push(i);\n continue;\n }\n const siblings = childrenByParent.get(parentId);\n if (siblings) siblings.push(i);\n else childrenByParent.set(parentId, [i]);\n }\n\n const items: GridItem<T>[] = [];\n const visited = new Set<string | number>();\n\n const visit = (index: number, level: number): void => {\n const row = rows[index];\n const id = getId(row);\n if (visited.has(id)) return; // cycle / duplicate-parent guard\n visited.add(id);\n\n const children = childrenByParent.get(id);\n const expandable = !!children?.length;\n const expanded = expandable && (expandedIds.has(id) || !!forceExpandedIds?.has(id));\n items.push({ row, originalIndex: index, level, expandable, expanded });\n\n if (expanded && children) {\n for (const childIndex of children) visit(childIndex, level + 1);\n }\n };\n\n for (const rootIndex of roots) visit(rootIndex, 0);\n return items;\n}\n\n// Selection range\n\n/** Build the set of original indices spanning from `fromOrig` to `toOrig` in display order. */\nexport function buildSelectionRange(fromOrig: number, toOrig: number, items: GridItem[]): Set<number> {\n const fromDisp = items.findIndex(item => isDataRowItem(item) && item.originalIndex === fromOrig);\n const toDisp = items.findIndex(item => isDataRowItem(item) && item.originalIndex === toOrig);\n if (fromDisp === -1 || toDisp === -1) return new Set();\n const [lo, hi] = [Math.min(fromDisp, toDisp), Math.max(fromDisp, toDisp)];\n const next = new Set<number>();\n for (let i = lo; i <= hi; i++) {\n const item = items[i];\n if (isDataRowItem(item)) next.add(item.originalIndex);\n }\n return next;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ColDef, ValueOption } from '../agrid.types';\nimport {\n coerceDateInputValue,\n formatDateValue,\n getDateInputValue,\n looksLikeDate,\n} from '../agrid.utils';\n\n/**\n * Individual cell component used inside `AgridComponent`.\n *\n * Renders a read-only span when not editing, and an `<input>` or `<select>`\n * (for columns with `ColDef.values`) when in edit mode.\n *\n * Not intended for direct use — `AgridComponent` manages all inputs and outputs.\n */\n@Component({\n selector: 'agrid-cell',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'gridcell',\n '[class.selected]': 'selected()',\n '[class.editing]': 'editing()',\n '[class.ag-cell--tree]': 'treeCell()',\n '[attr.aria-readonly]': 'col().editable === false ? \"true\" : null',\n '(click)': 'activate.emit($event)',\n '(dblclick)': 'startEdit.emit()',\n tabindex: '-1',\n },\n template: `\n @if (editing()) {\n @if (col().values?.length) {\n <select\n #editSelect\n class=\"ag-cell-select\"\n (change)=\"onSelectChange($event)\"\n >\n @for (opt of valueOptions(); track opt.label; let idx = $index) {\n <option [value]=\"idx\" [selected]=\"idx === selectedOptionIndex()\">{{ opt.label }}</option>\n }\n </select>\n } @else {\n <input\n #editInput\n class=\"ag-cell-input\"\n [type]=\"col().type === 'date' ? 'date' : col().type === 'number' ? 'number' : 'text'\"\n [value]=\"editorValue()\"\n (input)=\"onInput($event)\"\n />\n }\n } @else {\n @if (treeCell()) {\n <span class=\"ag-tree-prefix\" [style.padding-left.px]=\"treeLevel() * treeIndent\">\n @if (treeExpandable()) {\n <button\n type=\"button\"\n class=\"ag-tree-twisty\"\n [class.ag-tree-twisty--expanded]=\"treeExpanded()\"\n [attr.aria-label]=\"treeExpanded() ? 'Collapse' : 'Expand'\"\n (click)=\"onTreeToggle($event)\"\n >▶</button>\n } @else {\n <span class=\"ag-tree-twisty-spacer\"></span>\n }\n </span>\n }\n @if (col().cellRenderer) {\n <span class=\"ag-cell-value\" [innerHTML]=\"renderedHtml()\"></span>\n } @else {\n <span class=\"ag-cell-value\">{{ displayValue() }}</span>\n }\n }\n `,\n styleUrl: './agrid-cell.component.css',\n})\nexport class AgridCellComponent {\n /** Column definition for this cell. */\n col = input.required<ColDef>();\n\n /** Absolute row index within the data source. */\n rowIndex = input.required<number>();\n\n /** Column index within `colDefs`. */\n colIndex = input.required<number>();\n\n /** Current field value from the data source (displayed when not editing). */\n value = input.required<unknown>();\n\n /** Full row data — passed to `cellRenderer` when set. */\n row = input<Record<string, unknown>>({});\n\n /** Locale used for built-in date formatting. */\n locale = input<string | undefined>(undefined);\n\n /** Whether this cell has the active selection outline. */\n selected = input<boolean>(false);\n\n /** Whether this cell is currently in edit mode. */\n editing = input<boolean>(false);\n\n /** Whether this cell is the tree column and should render indentation + a twisty. */\n treeCell = input<boolean>(false);\n\n /** Depth of the row in the tree (drives indentation). Root rows are `0`. */\n treeLevel = input<number>(0);\n\n /** Whether the row has children and can be expanded/collapsed. */\n treeExpandable = input<boolean>(false);\n\n /** Whether the row is currently expanded. */\n treeExpanded = input<boolean>(false);\n\n /** Emitted when the user clicks the expand/collapse twisty. */\n treeToggle = output<void>();\n\n /** Indentation in pixels applied per tree level. */\n readonly treeIndent = 16;\n\n /**\n * Optional character to pre-fill the edit input when the user presses a printable key\n * while the cell is selected (type-to-start-editing behavior).\n */\n seedChar = input<string>('');\n\n /**\n * Emitted on single click — the grid selects this cell.\n * For `values` columns the grid also enters edit mode immediately.\n */\n activate = output<MouseEvent>();\n\n /** Emitted on double-click — the grid enters edit mode. */\n startEdit = output<void>();\n\n /**\n * Emitted on every keystroke inside the edit input or on every select change.\n * The grid stores the latest value in `currentDraft` so it can commit on Tab / Enter.\n */\n draftChange = output<unknown>();\n\n /** Live draft value managed by the cell during an active edit. */\n readonly draft = signal<unknown>('');\n\n /** String value accepted by the active native input element. */\n readonly editorValue = computed((): string => {\n const draft = this.draft();\n return this.col().type === 'date'\n ? getDateInputValue(draft)\n : String(draft ?? '');\n });\n\n readonly renderedHtml = computed((): string => {\n const renderer = this.col().cellRenderer;\n if (!renderer) return '';\n return renderer({ value: this.value(), row: this.row() });\n });\n\n /**\n * Normalized list of value options (always `{ label, rawValue }` regardless of whether\n * `ColDef.values` is `string[]` or `ValueOption[]`).\n */\n readonly valueOptions = computed(() => {\n const vals = this.col().values ?? [];\n return vals.map(v =>\n typeof v === 'string'\n ? { label: v, rawValue: v as unknown }\n : { label: (v as ValueOption).label, rawValue: (v as ValueOption).value }\n );\n });\n\n /**\n * The string shown in the cell when not editing.\n * Priority: ValueOption label → `ColDef.formatter` → raw string.\n */\n readonly displayValue = computed((): string => {\n const raw = this.value();\n const col = this.col();\n\n if (col.values?.length) {\n const opt = col.values.find(v =>\n typeof v === 'string' ? v === raw : (v as ValueOption).value === raw\n );\n if (opt !== undefined) return typeof opt === 'string' ? opt : (opt as ValueOption).label;\n }\n\n if (col.formatter) return col.formatter(raw);\n if (col.type === 'date' || looksLikeDate(raw)) {\n return formatDateValue(raw, this.locale(), col.type === 'date');\n }\n return String(raw ?? '');\n });\n\n /**\n * Index of the currently selected option in `valueOptions`.\n * Used to drive `<option [value]=\"idx\" [selected]=\"idx === selectedOptionIndex()\">`.\n * Index-based approach avoids string/type coercion for non-string raw values.\n */\n readonly selectedOptionIndex = computed((): number => {\n const raw = this.draft();\n return this.valueOptions().findIndex(o => o.rawValue === raw);\n });\n\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('editInput');\n private readonly selectEl = viewChild<ElementRef<HTMLSelectElement>>('editSelect');\n\n constructor() {\n effect(() => {\n if (this.editing()) {\n const seed = this.seedChar();\n const isDate = this.col().type === 'date';\n const existingDate = isDate ? getDateInputValue(this.value()) : '';\n const dateInitial = existingDate || (isDate && seed === '' ? new Date().toISOString().slice(0, 10) : '');\n const initialValue = isDate\n ? dateInitial\n : seed !== '' ? seed : this.value();\n this.draft.set(initialValue);\n\n setTimeout(() => {\n const input = this.inputEl()?.nativeElement;\n if (input) {\n const displaySeed = isDate\n ? dateInitial\n : seed !== '' ? seed : String(this.value() ?? '');\n input.value = displaySeed;\n input.focus();\n if (input.type === 'text' && !seed) input.select();\n else if (input.type === 'text') {\n const len = displaySeed.length;\n input.setSelectionRange(len, len);\n }\n return;\n }\n\n const sel = this.selectEl()?.nativeElement;\n if (sel) {\n const idx = this.selectedOptionIndex();\n if (idx >= 0) sel.value = String(idx);\n sel.focus();\n try {\n (sel as HTMLSelectElement & { showPicker?: () => void }).showPicker?.();\n } catch {\n sel.click();\n }\n }\n });\n }\n });\n }\n\n /** Emit a tree expand/collapse request without selecting or editing the cell. */\n onTreeToggle(event: MouseEvent): void {\n event.stopPropagation();\n this.treeToggle.emit();\n }\n\n /** Forward `<input>` changes to the grid. */\n onInput(event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n const draft = this.col().type === 'date'\n ? coerceDateInputValue(val, this.value())\n : val;\n this.draft.set(draft);\n this.draftChange.emit(draft);\n }\n\n /**\n * Forward `<select>` changes to the grid.\n * Maps the option index back to the raw value (preserves original type — number, object, etc.).\n */\n onSelectChange(event: Event): void {\n const idx = Number((event.target as HTMLSelectElement).value);\n const opts = this.valueOptions();\n const rawValue = opts[idx]?.rawValue ?? '';\n this.draft.set(rawValue);\n this.draftChange.emit(rawValue);\n }\n}\n","/** Guarded access to browser-only APIs used by the grid. @internal */\nexport class AgridBrowserAdapter {\n /** Creates an adapter using injected browser globals or the current environment. */\n constructor(\n private readonly doc: Document | null =\n typeof document === 'undefined' ? null : document,\n private readonly win: Window | null =\n typeof window === 'undefined' ? null : window,\n ) {}\n\n /** Returns whether both document and window APIs are available. */\n get available(): boolean {\n return this.doc !== null && this.win !== null;\n }\n\n /** Registers a document event listener when a document is available. */\n addDocumentListener<K extends keyof DocumentEventMap>(\n type: K,\n listener: (event: DocumentEventMap[K]) => void,\n ): void {\n this.doc?.addEventListener(type, listener as EventListener);\n }\n\n /** Removes a previously registered document event listener. */\n removeDocumentListener<K extends keyof DocumentEventMap>(\n type: K,\n listener: (event: DocumentEventMap[K]) => void,\n ): void {\n this.doc?.removeEventListener(type, listener as EventListener);\n }\n\n /** Returns the element stack at viewport coordinates. */\n elementsFromPoint(x: number, y: number): Element[] {\n return this.doc?.elementsFromPoint?.(x, y) ?? [];\n }\n\n /** Appends an element to the document body when available. */\n appendToBody(element: HTMLElement): boolean {\n if (!this.doc?.body) return false;\n this.doc.body.appendChild(element);\n return true;\n }\n\n /** Sets cursor and text-selection styles on the document body. */\n setBodyInteraction(cursor: string, userSelect: string): void {\n if (!this.doc?.body) return;\n this.doc.body.style.cursor = cursor;\n this.doc.body.style.userSelect = userSelect;\n }\n\n /** Returns the viewport width or infinity during server rendering. */\n viewportWidth(): number {\n return this.win?.innerWidth ?? Number.POSITIVE_INFINITY;\n }\n\n /** Returns computed styles when a window is available. */\n computedStyle(element: Element): CSSStyleDeclaration | null {\n return this.win?.getComputedStyle?.(element) ?? null;\n }\n\n /** Creates a 2D canvas context for text measurement. */\n createCanvasContext(): CanvasRenderingContext2D | null {\n return this.doc?.createElement('canvas').getContext('2d') ?? null;\n }\n\n /** Schedules a callback with the environment timer. */\n schedule(callback: () => void, delay = 0): ReturnType<typeof setTimeout> {\n return setTimeout(callback, delay);\n }\n\n /** Writes text to the system clipboard, returning whether it succeeded. */\n async writeClipboard(text: string): Promise<boolean> {\n try {\n const clipboard = this.win?.navigator.clipboard;\n if (!clipboard?.writeText) return false;\n await clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Downloads text through a temporary object URL and anchor element. */\n downloadText(filename: string, text: string, mimeType: string): boolean {\n const urlApi = (this.win as unknown as { URL?: typeof URL } | null)?.URL\n ?? (typeof URL === 'undefined' ? null : URL);\n if (!this.doc?.body || !urlApi?.createObjectURL) return false;\n let url: string | null = null;\n let anchor: HTMLAnchorElement | null = null;\n try {\n url = urlApi.createObjectURL(new Blob([text], { type: mimeType }));\n anchor = this.doc.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.style.display = 'none';\n this.doc.body.appendChild(anchor);\n anchor.click();\n return true;\n } catch {\n return false;\n } finally {\n anchor?.remove();\n if (url) urlApi.revokeObjectURL(url);\n }\n }\n}\n","import { Signal, WritableSignal } from '@angular/core';\nimport { AgridControl, HistoryEntry } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridEditEvent, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Rectangular selection represented by source row and visible column positions. @internal */\nexport type CellRange = { anchor: CellPosition; focus: CellPosition };\n\ntype VisibleCellBounds = {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridClipboardHandler}. @internal */\nexport interface AgridClipboardHandlerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n markedRowIndices: Signal<ReadonlySet<number>>;\n isCellEditable: (col: ColDef) => boolean;\n onCellEdit: (event: GridEditEvent) => void;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n}\n\n/** Handles selection serialization and spreadsheet-style clipboard paste operations. @internal */\nexport class AgridClipboardHandler {\n constructor(private readonly opts: AgridClipboardHandlerOptions) {}\n\n /** Writes the current cell or range selection to a clipboard event as TSV. */\n copy(event: ClipboardEvent): void {\n const text = this.getSelectedTsv();\n if (!text) return;\n event.clipboardData?.setData('text/plain', text);\n event.preventDefault();\n }\n\n /** Reads plain text from a clipboard event and pastes it at the selection. */\n paste(event: ClipboardEvent): void {\n const text = event.clipboardData?.getData('text/plain');\n if (!text || !this.opts.selectedCell()) return;\n event.preventDefault();\n this.pasteTextAtSelection(text);\n }\n\n /** Serializes the current cell or range selection as tab-separated text. */\n getSelectedTsv(): string {\n const bounds = this.getVisibleRangeBounds();\n const selected = this.opts.selectedCell();\n const marked = this.opts.markedRowIndices();\n if (!bounds && !selected && marked.size === 0) return '';\n\n const rowStart = bounds?.rowStart ?? (\n selected ? this.findDisplayIndex(selected.rowIndex) : -1\n );\n const rowEnd = bounds?.rowEnd ?? rowStart;\n const colStart = bounds?.colStart ?? selected?.colIndex ?? 0;\n const colEnd = bounds?.colEnd ?? selected?.colIndex\n ?? this.opts.visibleColDefs().length - 1;\n const rows = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const dataRows = this.opts.dataSource().rows();\n const lines: string[] = [];\n const copiedIndices = new Set<number>();\n\n if (rowStart >= 0) {\n for (let displayIndex = rowStart; displayIndex <= rowEnd; displayIndex++) {\n const item = rows[displayIndex];\n if (!isDataRowItem(item)) continue;\n lines.push(this.serializeRow(item.row, cols, colStart, colEnd));\n copiedIndices.add(item.originalIndex);\n }\n }\n\n for (const originalIndex of [...marked].sort((a, b) => a - b)) {\n if (copiedIndices.has(originalIndex)) continue;\n const row = dataRows[originalIndex];\n if (!row) continue;\n lines.push(this.serializeRow(row, cols, colStart, colEnd));\n }\n\n return lines.join('\\n');\n }\n\n private serializeRow(\n row: Record<string, unknown>,\n cols: ColDef[],\n colStart: number,\n colEnd: number,\n ): string {\n const cells: string[] = [];\n for (let colIndex = colStart; colIndex <= colEnd; colIndex++) {\n const col = cols[colIndex];\n if (!col) continue;\n cells.push(this.escapeTsvValue(\n getDisplayForField(col, row[col.field], this.opts.locale())\n ));\n }\n return cells.join('\\t');\n }\n\n /** Applies delimited text to editable cells beginning at the active selection. */\n pasteTextAtSelection(text: string): void {\n const bounds = this.getActiveSelectionBounds();\n if (!bounds) return;\n const start = this.positionFromVisibleCell(bounds.rowStart, bounds.colStart);\n const rows = this.parseDelimitedText(text);\n if (rows.length === 0) return;\n\n const items = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const dataSource = this.opts.dataSource();\n let lastPosition = start;\n const historyEntries: HistoryEntry[] = [];\n\n for (let rowOffset = 0; rowOffset < rows.length; rowOffset++) {\n const item = items[bounds.rowStart + rowOffset];\n if (!isDataRowItem(item)) continue;\n for (let colOffset = 0; colOffset < rows[rowOffset].length; colOffset++) {\n const colIndex = start.colIndex + colOffset;\n const col = cols[colIndex];\n if (!col || !this.opts.isCellEditable(col)) continue;\n const oldValue = dataSource.getRow(item.originalIndex)[col.field];\n const newValue = this.coercePastedValue(rows[rowOffset][colOffset], col);\n if (oldValue === newValue) continue;\n\n dataSource.patchRow(item.originalIndex, { [col.field]: newValue });\n const edit = {\n rowIndex: item.originalIndex,\n field: col.field,\n oldValue,\n newValue,\n };\n historyEntries.push(edit);\n this.opts.onCellEdit({\n position: { rowIndex: item.originalIndex, colIndex },\n field: col.field,\n oldValue,\n newValue,\n });\n lastPosition = { rowIndex: item.originalIndex, colIndex };\n }\n }\n\n this.opts.control()?.pushEditBatch(historyEntries);\n this.opts.selectedRange.set({ anchor: start, focus: lastPosition });\n this.opts.selectedCell.set(lastPosition);\n this.opts.scrollToCell(this.findDisplayIndex(lastPosition.rowIndex), lastPosition.colIndex);\n }\n\n private getVisibleRangeBounds(): VisibleCellBounds | null {\n const range = this.opts.selectedRange();\n if (!range) return null;\n const anchorDisplayIndex = this.findDisplayIndex(range.anchor.rowIndex);\n const focusDisplayIndex = this.findDisplayIndex(range.focus.rowIndex);\n if (anchorDisplayIndex < 0 || focusDisplayIndex < 0) return null;\n return {\n rowStart: Math.min(anchorDisplayIndex, focusDisplayIndex),\n rowEnd: Math.max(anchorDisplayIndex, focusDisplayIndex),\n colStart: Math.min(range.anchor.colIndex, range.focus.colIndex),\n colEnd: Math.max(range.anchor.colIndex, range.focus.colIndex),\n };\n }\n\n private getActiveSelectionBounds(): VisibleCellBounds | null {\n const range = this.getVisibleRangeBounds();\n if (range) return range;\n const selected = this.opts.selectedCell();\n if (!selected) return null;\n const displayIndex = this.findDisplayIndex(selected.rowIndex);\n if (displayIndex < 0) return null;\n return {\n rowStart: displayIndex,\n rowEnd: displayIndex,\n colStart: selected.colIndex,\n colEnd: selected.colIndex,\n };\n }\n\n private findDisplayIndex(originalIndex: number): number {\n return this.opts.filteredItems().findIndex(\n item => isDataRowItem(item) && item.originalIndex === originalIndex\n );\n }\n\n private positionFromVisibleCell(displayIndex: number, colIndex: number): CellPosition {\n const item = this.opts.filteredItems()[displayIndex];\n if (isDataRowItem(item)) return { rowIndex: item.originalIndex, colIndex };\n return this.opts.selectedCell() ?? { rowIndex: 0, colIndex };\n }\n\n private escapeTsvValue(value: string): string {\n return /[\"\\t\\n\\r]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n }\n\n private parseDelimitedText(text: string): string[][] {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').replace(/\\n$/, '');\n const delimiter = normalized.includes('\\t') ? '\\t' : ',';\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = '';\n let quoted = false;\n\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized[i];\n if (quoted) {\n if (char === '\"' && normalized[i + 1] === '\"') {\n cell += '\"';\n i++;\n } else if (char === '\"') {\n quoted = false;\n } else {\n cell += char;\n }\n } else if (char === '\"') {\n quoted = true;\n } else if (char === delimiter) {\n row.push(cell);\n cell = '';\n } else if (char === '\\n') {\n row.push(cell);\n rows.push(row);\n row = [];\n cell = '';\n } else {\n cell += char;\n }\n }\n\n row.push(cell);\n rows.push(row);\n return rows.filter(values => values.length > 1 || values[0] !== '');\n }\n\n private coercePastedValue(value: string, col: ColDef): unknown {\n if (col.values?.length) {\n const match = col.values.find(option =>\n typeof option === 'string'\n ? option === value\n : option.label === value || String(option.value) === value\n );\n if (match !== undefined) return typeof match === 'string' ? match : match.value;\n }\n if (col.type === 'number') {\n const numberValue = Number(value);\n return value.trim() === '' || Number.isNaN(numberValue) ? value : numberValue;\n }\n return value;\n }\n}\n","import { Signal, computed } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef, HeaderGroup } from '../agrid.types';\n\n/** One contiguous segment in the optional grouped-header row. @internal */\nexport interface AgridHeaderGroupRun {\n key: string;\n id: string | null;\n label: string;\n fields: string[];\n span: number;\n}\n\n/** Reactive inputs required by {@link AgridColumnLayoutModel}. @internal */\nexport interface AgridColumnLayoutOptions {\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n headerGroups: Signal<HeaderGroup[]>;\n showControlColumn: Signal<boolean>;\n controlColumnWidth: Signal<number>;\n getColumnWidth: (col: ColDef) => number;\n getColumnWidthToken: (col: ColDef) => string;\n}\n\n/**\n * Computes visible, ordered, pinned, and scrollable columns plus pane dimensions.\n * @internal\n */\nexport class AgridColumnLayoutModel {\n constructor(private readonly opts: AgridColumnLayoutOptions) {}\n\n /** Columns visible after hidden state, ordering, and left-pinning are applied. */\n readonly visibleColDefs = computed(() => {\n const control = this.opts.control();\n let columns = control\n ? this.opts.colDefs().filter(col => !control.hiddenColumns().has(col.field))\n : this.opts.colDefs().filter(col => !col.hidden);\n\n if (control) {\n const order = control.columnOrder();\n if (order.length > 0) {\n const orderMap = new Map(order.map((field, index) => [field, index]));\n columns = [...columns].sort((a, b) =>\n (orderMap.get(a.field) ?? Infinity) - (orderMap.get(b.field) ?? Infinity)\n );\n }\n const pinned = control.pinnedColumns();\n if (pinned.size > 0) {\n columns = [\n ...columns.filter(col => pinned.has(col.field)),\n ...columns.filter(col => !pinned.has(col.field)),\n ];\n }\n } else {\n const pinned = columns.filter(col => col.pinned === 'left');\n if (pinned.length > 0) {\n columns = [...pinned, ...columns.filter(col => col.pinned !== 'left')];\n }\n }\n return columns;\n });\n\n /** Visible columns pinned to the left edge. */\n readonly pinnedColDefs = computed(() => {\n const control = this.opts.control();\n if (control) {\n const pinned = control.pinnedColumns();\n return pinned.size > 0\n ? this.visibleColDefs().filter(col => pinned.has(col.field))\n : [];\n }\n return this.visibleColDefs().filter(col => col.pinned === 'left');\n });\n\n /** Visible columns pinned to the right edge. */\n readonly rightPinnedColDefs = computed(() => {\n const control = this.opts.control();\n if (control) {\n const pinned = control.pinnedRightColumns();\n return pinned.size > 0\n ? this.visibleColDefs().filter(col => pinned.has(col.field))\n : [];\n }\n return this.visibleColDefs().filter(col => col.pinned === 'right');\n });\n\n /** Visible columns rendered in the horizontally scrollable pane. */\n readonly scrollableColDefs = computed(() => {\n const left = new Set(this.pinnedColDefs().map(col => col.field));\n const right = new Set(this.rightPinnedColDefs().map(col => col.field));\n return this.visibleColDefs().filter(col => !left.has(col.field) && !right.has(col.field));\n });\n\n readonly hasPinnedPane = computed(() =>\n this.opts.showControlColumn() || this.pinnedColDefs().length > 0\n );\n readonly hasRightPinnedPane = computed(() => this.rightPinnedColDefs().length > 0);\n readonly hasFilterableColumns = computed(() =>\n this.visibleColDefs().some(col => col.filterable)\n );\n readonly hasHeaderGroups = computed(() =>\n this.visibleColDefs().some(col => this.groupLabel(col.group) !== null)\n );\n\n readonly pinnedHeaderGroupRuns = computed(() =>\n this.buildHeaderGroupRuns(this.pinnedColDefs(), 'left')\n );\n readonly scrollableHeaderGroupRuns = computed(() =>\n this.buildHeaderGroupRuns(this.scrollableColDefs(), 'center')\n );\n readonly rightHeaderGroupRuns = computed(() =>\n this.buildHeaderGroupRuns(this.rightPinnedColDefs(), 'right')\n );\n\n readonly gridTemplateColumns = computed(() => {\n const columns = this.widthTokens(this.visibleColDefs());\n return this.opts.showControlColumn()\n ? `${this.opts.controlColumnWidth()}px ${columns}`\n : columns;\n });\n\n readonly pinnedGridTemplateColumns = computed(() => {\n const columns = this.widthTokens(this.pinnedColDefs());\n if (this.opts.showControlColumn()) {\n const controlWidth = `${this.opts.controlColumnWidth()}px`;\n return columns ? `${controlWidth} ${columns}` : controlWidth;\n }\n return columns;\n });\n\n readonly scrollableGridTemplateColumns = computed(() =>\n this.widthTokens(this.scrollableColDefs())\n );\n readonly rightGridTemplateColumns = computed(() =>\n this.widthTokens(this.rightPinnedColDefs())\n );\n\n readonly totalWidth = computed(() =>\n this.width(this.visibleColDefs())\n + (this.opts.showControlColumn() ? this.opts.controlColumnWidth() : 0)\n );\n readonly pinnedPaneWidth = computed(() =>\n this.width(this.pinnedColDefs())\n + (this.opts.showControlColumn() ? this.opts.controlColumnWidth() : 0)\n );\n readonly rightPinnedPaneWidth = computed(() => this.width(this.rightPinnedColDefs()));\n readonly scrollableTotalWidth = computed(() => this.width(this.scrollableColDefs()));\n\n private width(columns: ColDef[]): number {\n return columns.reduce((sum, col) => sum + this.opts.getColumnWidth(col), 0);\n }\n\n private widthTokens(columns: ColDef[]): string {\n return columns.map(col => this.opts.getColumnWidthToken(col)).join(' ');\n }\n\n private buildHeaderGroupRuns(columns: ColDef[], pane: string): AgridHeaderGroupRun[] {\n const runs: AgridHeaderGroupRun[] = [];\n for (const col of columns) {\n const label = this.groupLabel(col.group);\n const id = label === null ? null : col.group ?? null;\n const previous = runs[runs.length - 1];\n if (id !== null && previous?.id === id) {\n previous.fields.push(col.field);\n previous.span++;\n continue;\n }\n runs.push({\n key: `${pane}:${col.field}`,\n id,\n label: label ?? '',\n fields: [col.field],\n span: 1,\n });\n }\n return runs;\n }\n\n private groupLabel(groupId: string | undefined): string | null {\n if (!groupId) return null;\n return this.opts.headerGroups().find(group => group.id === groupId)?.label ?? null;\n }\n}\n","/** Built-in locale identifiers supplied by the grid. */\nexport type AgridLocaleKey = 'en' | 'de';\n\n/** Complete set of user-facing strings and label factories used by the grid. */\nexport interface AgridLocaleText {\n actions: string;\n addRow: string;\n aggregate: string;\n aggregateAvg: string;\n aggregateCount: string;\n aggregateMax: string;\n aggregateMin: string;\n aggregateSum: string;\n autosizeColumn: string;\n blank: string;\n clearAllFilters: string;\n clearFilter: string;\n clearSort: string;\n close: string;\n columnMenu: string;\n columns: string;\n detail: string;\n hiddenColumn: string;\n copyCellValue: string;\n copyRow: string;\n confirmDeleteRow: string;\n confirmNo: string;\n confirmYes: string;\n deleteRow: string;\n filterPlaceholder: string;\n findPlaceholder: string;\n firstPage: string;\n grid: string;\n groupBy: (header: string) => string;\n hideColumn: string;\n insertRowAbove: string;\n insertRowBelow: string;\n lastPage: string;\n loading: string;\n markRow: string;\n next: string;\n noRows: string;\n pagination: string;\n pinColumn: string;\n pinColumnRight: string;\n unpinColumnRight: string;\n previous: string;\n resizeColumn: string;\n rows: (count: number) => string;\n searchValuesPlaceholder: string;\n selectAll: string;\n sortOnlyByThis: string;\n sortAscending: string;\n sortDescending: string;\n ungroup: string;\n unpinColumn: string;\n save: string;\n}\n\n/** Partial locale text supplied to {@link AgridProvider.addLocalization}. */\nexport type AgridLocaleTextOverrides = Partial<AgridLocaleText>;\n\n/** Built-in English and German grid translations. */\nexport const AGRID_LOCALE_TEXT: Record<AgridLocaleKey, AgridLocaleText> = {\n en: {\n actions: 'Actions',\n addRow: 'Add row',\n aggregate: 'Aggregate',\n aggregateAvg: 'Average',\n aggregateCount: 'Count',\n aggregateMax: 'Maximum',\n aggregateMin: 'Minimum',\n aggregateSum: 'Sum',\n autosizeColumn: 'Autosize column',\n blank: '(blank)',\n clearAllFilters: 'Clear all filters',\n clearFilter: 'Clear filter',\n clearSort: 'Clear sort',\n close: 'Close',\n columnMenu: 'Column menu',\n columns: 'Columns',\n detail: 'Detail',\n hiddenColumn: '(hidden)',\n copyCellValue: 'Copy cell',\n copyRow: 'Copy row',\n confirmDeleteRow: 'Sure to delete?',\n confirmNo: 'No',\n confirmYes: 'Yes',\n deleteRow: 'Delete row',\n filterPlaceholder: 'Filter...',\n findPlaceholder: 'Find',\n firstPage: 'First page',\n grid: 'Data grid',\n groupBy: header => `Group by ${header}`,\n hideColumn: 'Hide column',\n insertRowAbove: 'Insert row above',\n insertRowBelow: 'Insert row below',\n lastPage: 'Last page',\n loading: 'Loading...',\n markRow: 'Mark row for copying',\n next: 'Next',\n noRows: 'No rows to display',\n pagination: 'Pagination',\n pinColumn: 'Pin left',\n pinColumnRight: 'Pin right',\n unpinColumnRight: 'Unpin right',\n previous: 'Previous',\n resizeColumn: 'Resize column',\n rows: count => `${count} ${count === 1 ? 'row' : 'rows'}`,\n searchValuesPlaceholder: 'Search values...',\n selectAll: '(Select All)',\n sortOnlyByThis: 'Sort only by this column',\n sortAscending: 'Sort ascending',\n sortDescending: 'Sort descending',\n ungroup: 'Ungroup',\n unpinColumn: 'Unpin column',\n save: 'Save',\n },\n de: {\n actions: 'Aktionen',\n addRow: 'Zeile hinzufügen',\n aggregate: 'Aggregat',\n aggregateAvg: 'Durchschnitt',\n aggregateCount: 'Anzahl',\n aggregateMax: 'Maximum',\n aggregateMin: 'Minimum',\n aggregateSum: 'Summe',\n autosizeColumn: 'Spaltenbreite anpassen',\n blank: '(leer)',\n clearAllFilters: 'Alle Filter löschen',\n clearFilter: 'Filter löschen',\n clearSort: 'Sortierung löschen',\n close: 'Schließen',\n columnMenu: 'Spaltenmenü',\n columns: 'Spalten',\n detail: 'Details',\n hiddenColumn: '(ausgeblendet)',\n copyCellValue: 'Zelle kopieren',\n copyRow: 'Zeile kopieren',\n confirmDeleteRow: 'Wirklich löschen?',\n confirmNo: 'Nein',\n confirmYes: 'Ja',\n deleteRow: 'Zeile löschen',\n filterPlaceholder: 'Filtern...',\n findPlaceholder: 'Suchen',\n firstPage: 'Erste Seite',\n grid: 'Datentabelle',\n groupBy: header => `Nach ${header} gruppieren`,\n hideColumn: 'Spalte ausblenden',\n insertRowAbove: 'Zeile darüber einfügen',\n insertRowBelow: 'Zeile darunter einfügen',\n lastPage: 'Letzte Seite',\n loading: 'Wird geladen...',\n markRow: 'Zeile zum Kopieren markieren',\n next: 'Weiter',\n noRows: 'Keine Zeilen vorhanden',\n pagination: 'Seitennavigation',\n pinColumn: 'Links fixieren',\n pinColumnRight: 'Rechts fixieren',\n unpinColumnRight: 'Rechts lösen',\n previous: 'Zurück',\n resizeColumn: 'Spaltenbreite ändern',\n rows: count => `${count} ${count === 1 ? 'Zeile' : 'Zeilen'}`,\n searchValuesPlaceholder: 'Werte suchen...',\n selectAll: '(Alle auswählen)',\n sortOnlyByThis: 'Nur nach dieser Spalte sortieren',\n sortAscending: 'Aufsteigend sortieren',\n sortDescending: 'Absteigend sortieren',\n ungroup: 'Gruppierung aufheben',\n unpinColumn: 'Fixierung lösen',\n save: 'Speichern',\n },\n};\n\n/** Resolves 'auto' to the browser's navigator.language, falling back to 'en-US'. */\nexport function resolveLocale(locale: string): string {\n if (locale !== 'auto') return locale;\n return (typeof navigator !== 'undefined' ? navigator.language : null) ?? 'en-US';\n}\n\n/**\n * Resolves built-in locale text and merges the best matching custom overrides.\n *\n * Matching prefers an exact locale key, then a primary-language match.\n */\nexport function resolveAgridLocaleText(\n locale: string | undefined,\n localizations: ReadonlyMap<string, AgridLocaleTextOverrides>,\n): AgridLocaleText {\n const resolved = resolveLocale(locale ?? 'auto');\n const normalized = resolved.toLowerCase();\n const primaryTag = normalized.split('-')[0];\n\n const base = normalized.startsWith('de') ? AGRID_LOCALE_TEXT.de : AGRID_LOCALE_TEXT.en;\n\n // Prefer exact match (case-insensitive), fall back to primary-language match (e.g. 'fr' matches 'fr-FR')\n let overrides: AgridLocaleTextOverrides | undefined;\n for (const [key, value] of localizations) {\n const k = key.toLowerCase();\n if (k === normalized) { overrides = value; break; }\n if (!overrides && k.split('-')[0] === primaryTag) { overrides = value; }\n }\n\n return { ...base, ...overrides };\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\n\n/** Display model for one value-filter option in the column menu. */\nexport interface AgridColumnMenuValueItem {\n /** Human-readable value label shown in the menu. */\n label: string;\n /** Raw value string used by the filter state. */\n rawStr: string;\n /** Whether this value is present in the current cross-filtered row set. */\n active: boolean;\n /** Whether this value is currently selected in the value filter. */\n selected: boolean;\n}\n\n/** Floating column menu for sort, column actions, grouping, and value filters. */\n@Component({\n selector: 'agrid-column-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-column-menu.component.html',\n styleUrl: './agrid-column-menu.component.css',\n})\nexport class AgridColumnMenuComponent {\n /** Localized labels used in the menu. */\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n\n /** Fixed viewport x-position for the menu. */\n x = input.required<number>();\n\n /** Fixed viewport y-position for the menu. */\n y = input.required<number>();\n\n /** Header label for the active column. */\n header = input.required<string>();\n\n /** Current sort direction for the active column. */\n sortDir = input<'asc' | 'desc' | null>(null);\n\n /** Whether sort controls are available for this grid. */\n sortable = input<boolean>(true);\n\n /** Whether stateful column actions should be shown. */\n showColumnActions = input<boolean>(false);\n\n /** Current pin state of the active column. */\n pinned = input<'left' | 'right' | false>(false);\n\n /** Whether the active column supports grouping. */\n groupable = input<boolean>(false);\n\n /** Whether the grid is currently grouped by the active column. */\n grouped = input<boolean>(false);\n\n /** Whether the active column supports value-filter controls. */\n filterable = input<boolean>(false);\n\n /** Whether to show the Excel-style distinct-value picker. */\n showValueFilter = input<boolean>(true);\n\n /** Current search text for the value-filter option list. */\n search = input<string>('');\n\n /** Whether the value filter currently allows every value. */\n allSelected = input<boolean>(true);\n\n /** Visible value-filter option rows. */\n valueItems = input<AgridColumnMenuValueItem[]>([]);\n\n /** 1-based priority of this column in the current multi-sort stack (0 = not sorted). */\n sortPriority = input<number>(0);\n\n /** Whether more than one column is currently sorted. */\n hasMultiSort = input<boolean>(false);\n\n /**\n * Emits a sort direction — toggles this column in the multi-sort stack\n * (adds if not sorted, clears if same direction clicked again).\n */\n sort = output<'asc' | 'desc'>();\n\n /** Emits to replace all sorts with only this column at the given direction. */\n resetSort = output<'asc' | 'desc'>();\n\n /** Requests autosizing the active column. */\n autosize = output<void>();\n\n /** Requests toggling left-pin for the active column. */\n togglePin = output<void>();\n\n /** Requests toggling right-pin for the active column. */\n togglePinRight = output<void>();\n\n /** Requests hiding the active column. */\n hide = output<void>();\n\n /** Requests toggling grouping for the active column. */\n toggleGroup = output<void>();\n\n /** Requests clearing filter and sort state for the active column. */\n clearFilter = output<void>();\n\n /** Requests clearing filter and sort state for every column. */\n clearAll = output<void>();\n\n /** Emits value-filter search text changes. */\n searchChange = output<string>();\n\n /** Requests selecting or deselecting all value-filter options. */\n toggleAll = output<void>();\n\n /** Requests toggling one value-filter option by raw string value. */\n toggleValue = output<string>();\n\n /** Active aggregate function for this column set via the control, or `null` if none. */\n aggregate = input<'sum' | 'avg' | 'min' | 'max' | 'count' | null>(null);\n\n /** Emits the aggregate to set, or `null` to clear it. */\n setAggregate = output<'sum' | 'avg' | 'min' | 'max' | 'count' | null>();\n\n readonly aggregateOptions = computed(() => {\n const t = this.localeText();\n return [\n { value: 'sum' as const, symbol: 'Σ', label: t.aggregateSum },\n { value: 'avg' as const, symbol: 'Ø', label: t.aggregateAvg },\n { value: 'min' as const, symbol: '↓', label: t.aggregateMin },\n { value: 'max' as const, symbol: '↑', label: t.aggregateMax },\n { value: 'count' as const, symbol: '#', label: t.aggregateCount },\n ];\n });\n}\n","<div\n class=\"ag-filter-menu\"\n role=\"dialog\"\n [attr.aria-label]=\"localeText().columnMenu + ': ' + header()\"\n [style.left.px]=\"x()\"\n [style.top.px]=\"y()\"\n (click)=\"$event.stopPropagation()\"\n>\n @if (sortable()) {\n <div class=\"ag-filter-menu-section\">\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"sortDir() === 'asc'\"\n (click)=\"sort.emit('asc')\"\n >\n ↑ {{ localeText().sortAscending }}\n @if (sortPriority() > 0) {\n <span class=\"ag-sort-priority-badge\">{{ sortPriority() }}</span>\n }\n </button>\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"sortDir() === 'desc'\"\n (click)=\"sort.emit('desc')\"\n >\n ↓ {{ localeText().sortDescending }}\n @if (sortPriority() > 0) {\n <span class=\"ag-sort-priority-badge\">{{ sortPriority() }}</span>\n }\n </button>\n @if (hasMultiSort() && sortPriority() > 0) {\n <button class=\"ag-filter-menu-item ag-filter-menu-item--muted\" (click)=\"resetSort.emit(sortDir()!)\">{{ localeText().sortOnlyByThis }}</button>\n }\n @if (sortDir()) {\n <button class=\"ag-filter-menu-item\" (click)=\"sort.emit(sortDir()!)\">{{ localeText().clearSort }}</button>\n }\n </div>\n }\n\n @if (showColumnActions()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <button class=\"ag-filter-menu-item\" (click)=\"autosize.emit()\">↔ {{ localeText().autosizeColumn }}</button>\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"pinned() === 'left'\"\n (click)=\"togglePin.emit()\"\n >⊣ {{ pinned() === 'left' ? localeText().unpinColumn : localeText().pinColumn }}</button>\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"pinned() === 'right'\"\n (click)=\"togglePinRight.emit()\"\n >⊢ {{ pinned() === 'right' ? localeText().unpinColumnRight : localeText().pinColumnRight }}</button>\n <button class=\"ag-filter-menu-item\" (click)=\"hide.emit()\">{{ localeText().hideColumn }}</button>\n </div>\n }\n\n @if (showColumnActions()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <span class=\"ag-filter-menu-aggregate-label\">{{ localeText().aggregate }}</span>\n <div class=\"ag-filter-menu-aggregate-btns\">\n @for (opt of aggregateOptions(); track opt.value) {\n <button\n class=\"ag-aggregate-btn\"\n [class.ag-aggregate-btn--active]=\"aggregate() === opt.value\"\n [title]=\"opt.label\"\n (click)=\"setAggregate.emit(aggregate() === opt.value ? null : opt.value)\"\n >{{ opt.symbol }}</button>\n }\n </div>\n </div>\n }\n\n @if (groupable()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"grouped()\"\n (click)=\"toggleGroup.emit()\"\n >{{ grouped() ? '⊟ ' + localeText().ungroup : '⊞ ' + localeText().groupBy(header()) }}</button>\n </div>\n }\n\n @if (filterable()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <button class=\"ag-filter-menu-item ag-filter-menu-item--muted\" (click)=\"clearFilter.emit()\">\n ✕ {{ localeText().clearFilter }}\n </button>\n <button class=\"ag-filter-menu-item ag-filter-menu-item--muted\" (click)=\"clearAll.emit()\">\n ✕ {{ localeText().clearAllFilters }}\n </button>\n </div>\n\n @if (showValueFilter()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <input\n class=\"ag-filter-menu-search\"\n [value]=\"search()\"\n (input)=\"searchChange.emit($any($event.target).value)\"\n [placeholder]=\"localeText().searchValuesPlaceholder\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n\n <div class=\"ag-filter-menu-values\">\n <label class=\"ag-filter-menu-value\">\n <input\n type=\"checkbox\"\n [checked]=\"allSelected()\"\n (change)=\"toggleAll.emit()\"\n />\n <span class=\"ag-filter-menu-value-label\">{{ localeText().selectAll }}</span>\n </label>\n @for (item of valueItems(); track item.rawStr) {\n <label\n class=\"ag-filter-menu-value\"\n [class.ag-filter-menu-value--inactive]=\"!item.active\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"item.selected\"\n [disabled]=\"!item.active\"\n (change)=\"toggleValue.emit(item.rawStr)\"\n />\n <span class=\"ag-filter-menu-value-label\">{{ item.label || localeText().blank }}</span>\n </label>\n }\n </div>\n }\n }\n</div>\n","import { DestroyRef, Signal, computed, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridColumnMenuValueItem } from './agrid-column-menu.component';\nimport { AgridControl } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { ColDef, FilterChangeEvent, SortChangeEvent, ValueOption } from '../agrid.types';\n\n/** Position and target field of the open column menu. @internal */\nexport type AgridColumnMenuState = {\n field: string;\n x: number;\n y: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridColumnMenuController}. @internal */\nexport interface AgridColumnMenuControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n colDefs: Signal<ColDef[]>;\n serverSideFiltering: Signal<boolean>;\n filterDebounceMs: Signal<number>;\n sortOption: Signal<'single' | 'multi' | 'none'>;\n effectiveSortOrder: () => string[];\n autosizeColumn: (col: ColDef) => void;\n onFilterChange: (event: FilterChangeEvent) => void;\n onSortChange: (event: SortChangeEvent) => void;\n}\n\n/** Owns column-menu state, filters, sorting, and menu-triggered column mutations. @internal */\nexport class AgridColumnMenuController {\n readonly menu = signal<AgridColumnMenuState | null>(null);\n readonly search = signal('');\n\n readonly items = computed<{ label: string; rawStr: string }[]>(() => {\n const menu = this.menu();\n if (!menu) return [];\n const col = this.getColDef(menu.field);\n if (!col?.filterable) return [];\n const values = col?.values;\n if (values?.length) {\n return values\n .map(value => typeof value === 'string'\n ? { label: value, rawStr: value }\n : {\n label: (value as ValueOption).label,\n rawStr: String((value as ValueOption).value),\n })\n .sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }));\n }\n\n const rows = this.opts.dataSource().rows();\n const rawValues = [...new Set(rows.map(row => String(row[menu.field] ?? '')))];\n return rawValues\n .map(rawStr => ({\n label: col?.formatter ? col.formatter(rawStr) : rawStr,\n rawStr,\n }))\n .sort((a, b) =>\n a.label.localeCompare(b.label, undefined, { numeric: true, sensitivity: 'base' }),\n );\n });\n\n readonly visibleItems = computed(() => {\n const search = this.search().toLowerCase();\n return this.items().filter(item => !search || item.label.toLowerCase().includes(search));\n });\n\n readonly activeValues = computed(() => {\n const menu = this.menu();\n if (!menu) return new Set<string>();\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n let indices = rows.map((_, index) => index);\n if (control) {\n for (const [field, filter] of Object.entries(control.filters())) {\n if (field === menu.field) continue;\n if (filter.text) {\n const search = filter.text.toLowerCase();\n indices = indices.filter(index =>\n String(rows[index][field] ?? '').toLowerCase().includes(search),\n );\n }\n if (filter.selectedValues !== null) {\n const allowed = new Set(filter.selectedValues);\n indices = indices.filter(index => allowed.has(String(rows[index][field] ?? '')));\n }\n }\n }\n return new Set(indices.map(index => String(rows[index][menu.field] ?? '')));\n });\n\n readonly valueItems = computed<AgridColumnMenuValueItem[]>(() => {\n const menu = this.menu();\n if (!menu) return [];\n return this.visibleItems().map(item => ({\n ...item,\n active: this.activeValues().has(item.rawStr),\n selected: this.isValueSelected(menu.field, item.rawStr),\n }));\n });\n\n private readonly filterDebounces = new Map<string, ReturnType<typeof setTimeout>>();\n\n constructor(\n private readonly opts: AgridColumnMenuControllerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => {\n for (const timer of this.filterDebounces.values()) clearTimeout(timer);\n this.filterDebounces.clear();\n });\n }\n\n /** Returns the active text filter for a field. */\n getTextFilter(field: string): string {\n return this.opts.control()?.getFilter(field).text ?? '';\n }\n\n /** Returns the active sort direction, respecting disabled sorting. */\n getSort(field: string): 'asc' | 'desc' | null {\n return this.opts.sortOption() === 'none'\n ? null\n : this.opts.control()?.getFilter(field).sort ?? null;\n }\n\n /** Returns a field's one-based position in the sort stack. */\n getSortPriority(field: string): number {\n return this.opts.control()?.getSortPriority(field) ?? 0;\n }\n\n /** Returns whether multiple sort fields are currently active. */\n hasMultiSort(): boolean {\n return this.opts.sortOption() === 'multi' && this.opts.effectiveSortOrder().length > 1;\n }\n\n /** Returns whether the value filter currently includes every value. */\n isAllSelected(field: string): boolean {\n return this.opts.control()?.getFilter(field).selectedValues === null;\n }\n\n /** Returns whether a raw value survives filters on other columns. */\n isValueActive(rawStr: string): boolean {\n return this.activeValues().has(rawStr);\n }\n\n /** Returns whether a raw value is selected by the field's value filter. */\n isValueSelected(field: string, value: string): boolean {\n const selected = this.opts.control()?.getFilter(field).selectedValues;\n return selected == null || selected.includes(value);\n }\n\n /** Returns whether a field has active filter or sort state. */\n hasActiveFilter(field: string): boolean {\n return this.opts.control()?.hasActiveFilter(field) ?? false;\n }\n\n /** Updates a text filter and emits its debounced server-side event. */\n onTextFilterChange(event: Event, field: string): void {\n const value = (event.target as HTMLInputElement).value;\n this.opts.control()?.setTextFilter(field, value);\n if (!this.opts.serverSideFiltering()) return;\n\n this.cancelFilterDebounce(field);\n const delay = this.opts.filterDebounceMs();\n if (delay === 0) {\n this.opts.onFilterChange({ field, value });\n return;\n }\n this.filterDebounces.set(field, setTimeout(() => {\n this.filterDebounces.delete(field);\n this.opts.onFilterChange({ field, value });\n }, delay));\n }\n\n /** Opens the column menu at a viewport position. */\n open(event: MouseEvent, field: string): void {\n event.stopPropagation();\n this.search.set('');\n this.menu.set({\n field,\n x: Math.min(event.clientX, this.browser.viewportWidth() - 220),\n y: event.clientY,\n });\n }\n\n /** Closes the column menu. */\n close(): void {\n this.menu.set(null);\n }\n\n /** Updates the distinct-value search text. */\n setSearch(value: string): void {\n this.search.set(value);\n }\n\n /** Applies or clears a sort according to the configured sorting mode. */\n sort(field: string, direction: 'asc' | 'desc'): void {\n const control = this.opts.control();\n if (!control || this.opts.sortOption() === 'none') return;\n if (control.getFilter(field).sort === direction) {\n const previous = control.getFilter(field);\n control.clearFilter(field);\n if (previous.text) control.setTextFilter(field, previous.text);\n if (previous.selectedValues !== null) {\n control.setSelectedValues(field, previous.selectedValues);\n }\n if (this.opts.serverSideFiltering()) {\n this.opts.onSortChange({ field, direction: null });\n }\n } else if (this.opts.sortOption() === 'single') {\n const previousFields = control.sortOrder().filter(sortedField => sortedField !== field);\n control.setSort(field, direction);\n if (this.opts.serverSideFiltering()) {\n for (const previousField of previousFields) {\n this.opts.onSortChange({ field: previousField, direction: null });\n }\n this.opts.onSortChange({ field, direction });\n }\n } else {\n control.addSort(field, direction);\n if (this.opts.serverSideFiltering()) {\n this.opts.onSortChange({ field, direction });\n }\n }\n this.close();\n }\n\n /** Clears filter and sort state for one field. */\n clearFilter(field: string): void {\n const control = this.opts.control();\n if (!control) return;\n this.cancelFilterDebounce(field);\n const previous = control.getFilter(field);\n control.clearFilter(field);\n if (this.opts.serverSideFiltering()) {\n if (previous.text) this.opts.onFilterChange({ field, value: '' });\n if (previous.sort) this.opts.onSortChange({ field, direction: null });\n }\n this.close();\n }\n\n /** Replaces the multi-sort stack with one field and direction. */\n resetSort(field: string, direction: 'asc' | 'desc'): void {\n const control = this.opts.control();\n if (!control || this.opts.sortOption() !== 'multi') return;\n const previousFields = control.sortOrder().filter(sortedField => sortedField !== field);\n control.setSort(field, direction);\n if (this.opts.serverSideFiltering()) {\n for (const previousField of previousFields) {\n this.opts.onSortChange({ field: previousField, direction: null });\n }\n this.opts.onSortChange({ field, direction });\n }\n this.close();\n }\n\n /** Toggles grouping by a field. */\n toggleGroupBy(field: string): void {\n const control = this.opts.control();\n if (!control) return;\n control.setGroupBy(control.groupByField() === field ? null : field);\n this.close();\n }\n\n /** Clears filter and sort state for every field. */\n clearAll(): void {\n const control = this.opts.control();\n if (!control) return;\n for (const field of this.filterDebounces.keys()) this.cancelFilterDebounce(field);\n const previous = control.filters();\n control.clearAllFilters();\n if (this.opts.serverSideFiltering()) {\n for (const [field, filter] of Object.entries(previous)) {\n if (filter.text) this.opts.onFilterChange({ field, value: '' });\n if (filter.sort) this.opts.onSortChange({ field, direction: null });\n }\n }\n this.close();\n }\n\n /** Selects or deselects every distinct value for a field. */\n toggleAll(field: string): void {\n const control = this.opts.control();\n if (!control) return;\n control.setSelectedValues(\n field,\n control.getFilter(field).selectedValues === null ? [] : null,\n );\n }\n\n /** Toggles one raw value in a field's value filter. */\n toggleValue(field: string, rawStr: string): void {\n const control = this.opts.control();\n if (!control) return;\n const allValues = this.items().map(item => item.rawStr);\n const current = control.getFilter(field).selectedValues ?? allValues;\n const next = current.includes(rawStr)\n ? current.filter(value => value !== rawStr)\n : [...current, rawStr];\n control.setSelectedValues(field, next.length === allValues.length ? null : next);\n }\n\n /** Toggles left pinning for a field. */\n togglePin(field: string): void {\n this.opts.control()?.togglePinned(field);\n this.close();\n }\n\n /** Toggles right pinning for a field. */\n togglePinRight(field: string): void {\n this.opts.control()?.togglePinnedRight(field);\n this.close();\n }\n\n /** Autosizes a field and closes the menu. */\n autosize(field: string): void {\n const col = this.getColDef(field);\n if (!col) return;\n this.opts.autosizeColumn(col);\n this.close();\n }\n\n /** Sets a built-in aggregate for a field. */\n setAggregate(\n field: string,\n aggregate: 'sum' | 'avg' | 'min' | 'max' | 'count' | null,\n ): void {\n this.opts.control()?.setAggregate(field, aggregate);\n this.close();\n }\n\n /** Hides a field and closes the menu. */\n hideColumn(field: string): void {\n this.opts.control()?.setColumnVisibility(field, false);\n this.close();\n }\n\n /** Toggles field visibility from the sidebar column list. */\n toggleColumnVisibility(field: string): void {\n this.opts.control()?.toggleColumnVisibility(field);\n }\n\n /** Sets visibility for several fields from a sidebar header-group toggle. */\n setColumnsVisibility(fields: string[], visible: boolean): void {\n const control = this.opts.control();\n if (!control) return;\n for (const field of fields) {\n control.setColumnVisibility(field, visible);\n }\n }\n\n private getColDef(field: string): ColDef | undefined {\n return this.opts.colDefs().find(col => col.field === field);\n }\n\n private cancelFilterDebounce(field: string): void {\n const timer = this.filterDebounces.get(field);\n if (timer === undefined) return;\n clearTimeout(timer);\n this.filterDebounces.delete(field);\n }\n}\n","import { DestroyRef, Signal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef } from '../agrid.types';\n\n/** View state for the floating column header shown during a reorder drag. @internal */\nexport interface AgridColumnDragPreview {\n field: string;\n fields: string[];\n label: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ntype AgridColumnDropTarget = {\n field: string;\n left: number;\n right: number;\n top: number;\n bottom: number;\n};\n\n/** Dependencies required by {@link AgridColumnReorderController}. @internal */\nexport interface AgridColumnReorderControllerOptions {\n control: Signal<AgridControl | null>;\n visibleColDefs: Signal<ColDef[]>;\n getColDef: (field: string) => ColDef | undefined;\n}\n\n/** Owns column header drag/drop state and column reordering. @internal */\nexport class AgridColumnReorderController {\n private readonly dragFields = signal<string[]>([]);\n private readonly dragOverField = signal<string | null>(null);\n private readonly dragInsertBefore = signal(true);\n readonly preview = signal<AgridColumnDragPreview | null>(null);\n private dragStartFields: string[] = [];\n private dragLabel = '';\n private dragStartX = 0;\n private dragStartY = 0;\n private pointerOffsetX = 0;\n private pointerOffsetY = 0;\n private draggedWidth = 0;\n private draggedHeight = 0;\n private dropTargets: AgridColumnDropTarget[] = [];\n\n constructor(\n private readonly opts: AgridColumnReorderControllerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this.cancel());\n }\n\n /** Arms a column reorder gesture for an unlocked header. */\n start(event: PointerEvent, field: string): void {\n const col = this.opts.getColDef(field);\n this.startFields(event, [field], col?.header ?? field);\n }\n\n /** Arms a grouped-header reorder gesture for a contiguous field segment. */\n startGroup(event: PointerEvent, fields: readonly string[], label: string): void {\n this.startFields(event, fields, label);\n }\n\n private startFields(event: PointerEvent, fields: readonly string[], label: string): void {\n if (!this.opts.control() || event.button !== 0) return;\n if (fields.length === 0 || fields.some(field => this.opts.getColDef(field)?.locked)) return;\n const header = event.currentTarget as HTMLElement | null;\n const rect = header?.getBoundingClientRect();\n this.dragStartFields = [...fields];\n this.dragLabel = label;\n this.dragStartX = event.clientX;\n this.dragStartY = event.clientY;\n this.draggedWidth = rect?.width ?? 0;\n this.draggedHeight = rect?.height ?? 32;\n this.pointerOffsetX = rect ? event.clientX - rect.left : 0;\n this.pointerOffsetY = rect ? event.clientY - rect.top : 0;\n this.dropTargets = this.captureDropTargets(header);\n this.browser.addDocumentListener('pointermove', this.dragMove);\n this.browser.addDocumentListener('pointerup', this.dragUp);\n this.browser.addDocumentListener('pointercancel', this.dragCancel);\n }\n\n /** Returns whether the field is currently being dragged. */\n isDragging(field: string): boolean {\n return this.dragFields().includes(field);\n }\n\n /** Returns the active drop-indicator side for a field. */\n getDropSide(field: string): 'before' | 'after' | null {\n if (this.dragOverField() !== field || this.dragFields().includes(field)) return null;\n return this.dragInsertBefore() ? 'before' : 'after';\n }\n\n /** Horizontal translation used to animate headers away from the pending insertion gap. */\n getHeaderOffset(field: string): number {\n const movingFields = this.dragFields();\n const overField = this.dragOverField();\n if (movingFields.length === 0 || !overField || movingFields.includes(field)\n || this.draggedWidth <= 0) return 0;\n\n const fields = this.opts.visibleColDefs().map(col => col.field);\n const fromIndex = fields.findIndex(value => movingFields.includes(value));\n const remaining = fields.filter(value => !movingFields.includes(value));\n const overIndex = remaining.indexOf(overField);\n const fieldIndex = remaining.indexOf(field);\n if (fromIndex < 0 || overIndex < 0 || fieldIndex < 0) return 0;\n\n const insertionIndex = overIndex + (this.dragInsertBefore() ? 0 : 1);\n if (insertionIndex < fromIndex && fieldIndex >= insertionIndex && fieldIndex < fromIndex) {\n return this.draggedWidth;\n }\n if (insertionIndex > fromIndex && fieldIndex >= fromIndex && fieldIndex < insertionIndex) {\n return -this.draggedWidth;\n }\n return 0;\n }\n\n private readonly dragMove = (event: PointerEvent): void => {\n if (this.dragStartFields.length === 0) return;\n if (this.dragFields().length === 0) {\n if (Math.abs(event.clientX - this.dragStartX) < 5) return;\n this.dragFields.set([...this.dragStartFields]);\n this.preview.set({\n field: this.dragStartFields[0],\n fields: [...this.dragStartFields],\n label: this.dragLabel,\n x: event.clientX - this.pointerOffsetX,\n y: event.clientY - this.pointerOffsetY,\n width: this.draggedWidth,\n height: this.draggedHeight,\n });\n } else {\n this.preview.update(preview => preview ? {\n ...preview,\n x: event.clientX - this.pointerOffsetX,\n y: event.clientY - this.pointerOffsetY,\n } : null);\n }\n const hovered = this.getHoveredHeaderCell(event.clientX, event.clientY);\n if (hovered && !this.dragFields().includes(hovered.field)) {\n this.dragOverField.set(hovered.field);\n this.dragInsertBefore.set(hovered.insertBefore);\n } else {\n this.dragOverField.set(null);\n }\n };\n\n private readonly dragUp = (): void => {\n this.removeListeners();\n const from = this.dragFields();\n const to = this.dragOverField();\n if (from.length > 0 && to) {\n this.opts.control()?.moveColumns(\n this.opts.visibleColDefs().map(col => col.field),\n from,\n to,\n this.dragInsertBefore(),\n );\n }\n this.dragFields.set([]);\n this.dragOverField.set(null);\n this.dragInsertBefore.set(true);\n this.preview.set(null);\n this.dragStartFields = [];\n this.dragLabel = '';\n this.dropTargets = [];\n };\n\n private readonly dragCancel = (): void => this.cancel();\n\n private cancel(): void {\n this.removeListeners();\n this.dragFields.set([]);\n this.dragOverField.set(null);\n this.dragInsertBefore.set(true);\n this.preview.set(null);\n this.dragStartFields = [];\n this.dragLabel = '';\n this.dropTargets = [];\n }\n\n private removeListeners(): void {\n this.browser.removeDocumentListener('pointermove', this.dragMove);\n this.browser.removeDocumentListener('pointerup', this.dragUp);\n this.browser.removeDocumentListener('pointercancel', this.dragCancel);\n }\n\n private getHoveredHeaderCell(x: number, _y: number): { field: string; insertBefore: boolean } | null {\n const target = this.dropTargets.find(rect => x >= rect.left && x <= rect.right);\n return target\n ? { field: target.field, insertBefore: x < target.left + (target.right - target.left) / 2 }\n : null;\n }\n\n private captureDropTargets(header: HTMLElement | null): AgridColumnDropTarget[] {\n const root = header?.closest('.ag-wrapper') ?? header?.ownerDocument;\n if (!root) return [];\n return [...root.querySelectorAll<HTMLElement>('.ag-header-cell[data-col-field]')]\n .map(element => {\n const field = element.dataset['colField'];\n const rect = element.getBoundingClientRect();\n return field ? {\n field,\n left: rect.left,\n right: rect.right,\n top: rect.top,\n bottom: rect.bottom,\n } : null;\n })\n .filter((target): target is AgridColumnDropTarget => target !== null);\n }\n\n}\n","import { DestroyRef, Signal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Dependencies required by {@link AgridColumnSizingController}. @internal */\nexport interface AgridColumnSizingOptions {\n control: Signal<AgridControl | null>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n scrollableColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n isColumnPinned: (field: string) => boolean;\n wrapperElement: () => HTMLElement;\n scrollerElement: () => HTMLElement;\n}\n\n/**\n * Owns column widths, resize interactions, autosizing, and horizontal visibility.\n * @internal\n */\nexport class AgridColumnSizingController {\n private readonly localWidths = signal<Record<string, number>>({});\n private resizeState: { field: string; startX: number; startWidth: number } | null = null;\n\n constructor(\n private readonly opts: AgridColumnSizingOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this.finishResize());\n }\n\n /** Returns a column's effective fixed width, or `0` for flexible columns. */\n getWidth(col: ColDef): number {\n const override = this.widthOverride(col.field);\n if (override !== undefined) return override;\n return col.width == null || col.width === -1 ? 0 : col.width;\n }\n\n /** Returns the CSS grid width token for a column. */\n getWidthToken(col: ColDef): string {\n const override = this.widthOverride(col.field);\n if (override !== undefined) return `${override}px`;\n return col.width == null || col.width === -1 ? '1fr' : `${col.width}px`;\n }\n\n /** Stores a clamped runtime width in the control or local fallback state. */\n setWidth(field: string, width: number): void {\n const control = this.opts.control();\n if (control) {\n control.setColumnWidth(field, width);\n } else {\n this.localWidths.update(widths => ({\n ...widths,\n [field]: Math.max(40, width),\n }));\n }\n }\n\n /** Starts pointer-driven resizing for an unlocked column. */\n startResize(event: MouseEvent, col: ColDef): void {\n if (col.locked) return;\n event.preventDefault();\n event.stopPropagation();\n const renderedWidth = (event.currentTarget as HTMLElement)\n .closest<HTMLElement>('.ag-header-cell')\n ?.getBoundingClientRect().width;\n this.resizeState = {\n field: col.field,\n startX: event.clientX,\n startWidth: this.getWidth(col) || renderedWidth || 100,\n };\n this.browser.setBodyInteraction('col-resize', 'none');\n this.browser.addDocumentListener('mousemove', this.resizeMove);\n this.browser.addDocumentListener('mouseup', this.resizeUp);\n }\n\n /** Adjusts an unlocked column width with keyboard arrow keys. */\n resizeFromKeyboard(event: KeyboardEvent, col: ColDef): void {\n if (col.locked || (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')) return;\n event.preventDefault();\n const delta = event.key === 'ArrowLeft' ? -10 : 10;\n this.setWidth(col.field, this.getWidth(col) + delta);\n }\n\n /** Sizes one unlocked column to fit its header and visible values. */\n autosizeColumn(col: ColDef): void {\n if (col.locked) return;\n const context = this.getAutosizeContext();\n if (!context) return;\n this.setWidth(col.field, this.measureAutosizeWidth(col, context));\n }\n\n /** Sizes every unlocked visible column to its current content. */\n autosizeAllColumns(): void {\n const context = this.getAutosizeContext();\n if (!context) return;\n for (const col of this.opts.visibleColDefs()) {\n if (!col.locked) this.setWidth(col.field, this.measureAutosizeWidth(col, context));\n }\n }\n\n /** Horizontally scrolls an unpinned column into view. */\n scrollColumnToKeepVisible(colIndex: number): void {\n const col = this.opts.visibleColDefs()[colIndex];\n if (!col || this.opts.isColumnPinned(col.field)) return;\n\n const scroller = this.opts.scrollerElement();\n const { start, end } = this.getScrollableColumnBounds(col.field);\n const maxScrollLeft = Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n let nextScrollLeft = scroller.scrollLeft;\n\n if (start < nextScrollLeft) {\n nextScrollLeft = start;\n } else if (end > nextScrollLeft + scroller.clientWidth) {\n nextScrollLeft = end - scroller.clientWidth;\n }\n\n nextScrollLeft = Math.max(0, Math.min(maxScrollLeft, nextScrollLeft));\n if (nextScrollLeft !== scroller.scrollLeft) scroller.scrollLeft = nextScrollLeft;\n }\n\n private readonly resizeMove = (event: MouseEvent): void => {\n if (!this.resizeState) return;\n this.setWidth(\n this.resizeState.field,\n this.resizeState.startWidth + (event.clientX - this.resizeState.startX),\n );\n };\n\n private readonly resizeUp = (): void => this.finishResize();\n\n private finishResize(): void {\n this.resizeState = null;\n this.browser.setBodyInteraction('', '');\n this.browser.removeDocumentListener('mousemove', this.resizeMove);\n this.browser.removeDocumentListener('mouseup', this.resizeUp);\n }\n\n private widthOverride(field: string): number | undefined {\n return this.opts.control()?.columnWidths()[field] ?? this.localWidths()[field];\n }\n\n private getScrollableColumnBounds(field: string): { start: number; end: number } {\n let start = 0;\n for (const col of this.opts.scrollableColDefs()) {\n const width = this.getWidth(col);\n if (col.field === field) return { start, end: start + width };\n start += width;\n }\n return { start: 0, end: 0 };\n }\n\n private measureAutosizeWidth(\n col: ColDef,\n context: CanvasRenderingContext2D,\n ): number {\n const values = [col.header];\n for (const item of this.opts.filteredItems()) {\n if (!isDataRowItem(item)) continue;\n values.push(getDisplayForField(col, item.row[col.field], this.opts.locale()));\n }\n const measured = values.reduce(\n (max, value) => Math.max(max, context.measureText(value).width),\n 0,\n );\n return Math.max(40, Math.min(500, Math.ceil(measured + 42)));\n }\n\n private getAutosizeContext(): CanvasRenderingContext2D | null {\n const context = this.browser.createCanvasContext();\n if (!context) return null;\n const style = this.browser.computedStyle(this.opts.wrapperElement());\n if (style) context.font = `${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n return context;\n }\n}\n","import { Signal } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef } from '../agrid.types';\n\n/** Reactive column state consumed by {@link AgridColumnStateService}. @internal */\nexport interface AgridColumnStateOptions {\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n pinnedColDefs: Signal<ColDef[]>;\n rightPinnedColDefs: Signal<ColDef[]>;\n showControlColumn: Signal<boolean>;\n}\n\n/** Provides template-facing column lookup, pinning, visibility, and ARIA state. @internal */\nexport class AgridColumnStateService {\n constructor(private readonly opts: AgridColumnStateOptions) {}\n\n /** Finds a column definition by field name. */\n getColDef(field: string): ColDef | undefined {\n return this.opts.colDefs().find(col => col.field === field);\n }\n\n /** Returns a field's zero-based index among visible columns. */\n getVisibleColIndex(field: string): number {\n return this.opts.visibleColDefs().findIndex(col => col.field === field);\n }\n\n /** Converts a visible data-column index to a one-based ARIA index. */\n getAriaColIndex(colIndex: number): number {\n return colIndex + 1 + (this.opts.showControlColumn() ? 1 : 0);\n }\n\n /** Returns whether a field is hidden by the grid control. */\n isColumnHidden(field: string): boolean {\n return this.opts.control()?.isColumnHidden(field) ?? false;\n }\n\n /** Returns whether the grid is grouped by the field. */\n isGroupedByField(field: string): boolean {\n return this.opts.control()?.groupByField() === field;\n }\n\n /** Returns whether a field is pinned to the left. */\n isColumnPinned(field: string): boolean {\n return this.opts.pinnedColDefs().some(col => col.field === field);\n }\n\n /** Returns whether a field is pinned to the right. */\n isColumnPinnedRight(field: string): boolean {\n return this.opts.rightPinnedColDefs().some(col => col.field === field);\n }\n\n /** Returns the field's current pin side, or `false` when unpinned. */\n getColumnPinState(field: string): 'left' | 'right' | false {\n if (this.isColumnPinned(field)) return 'left';\n if (this.isColumnPinnedRight(field)) return 'right';\n return false;\n }\n\n /** Returns whether the field is the first right-pinned column. */\n isFirstRightPinnedColumn(field: string): boolean {\n const cols = this.opts.rightPinnedColDefs();\n return cols.length > 0 && cols[0].field === field;\n }\n\n /** Returns whether the field is the last left-pinned column. */\n isLastPinnedColumn(field: string): boolean {\n const cols = this.opts.pinnedColDefs();\n return cols.length > 0 && cols[cols.length - 1].field === field;\n }\n}\n","import { DestroyRef, Signal, WritableSignal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { ColDef, GridItem, RowReorderEvent } from '../agrid.types';\nimport { buildSelectionRange, getDisplayForField } from '../agrid.utils';\n\n/** Dependencies and callbacks required by {@link AgridDragHandler}. @internal */\nexport interface AgridDragHandlerOptions {\n dataSource: Signal<AgridDataSource>;\n filteredItems: () => GridItem[];\n locale: () => string | undefined;\n selectedIndices: WritableSignal<Set<number>>;\n onReorder: (event: RowReorderEvent) => void;\n onSelectionChange: () => void;\n}\n\n/**\n * Handles both row-reorder drag and drag-select. The two share `_getHoveredRow`\n * and the same pointer-event lifecycle pattern, so they live together.\n *\n * Signals exposed here are read by the component's `displayItems` computed\n * to render the ghost row during a reorder drag.\n *\n * @internal\n */\nexport class AgridDragHandler {\n readonly reorderOriginalIndex = signal<number | null>(null);\n readonly reorderOverIndex = signal<number | null>(null);\n readonly reorderInsertBefore = signal<boolean>(true);\n\n private _overlayEl: HTMLElement | null = null;\n private _offsetX = 0;\n private _offsetY = 0;\n private _dragSelAnchor: number | null = null;\n\n constructor(\n private readonly opts: AgridDragHandlerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this._cleanupReorder());\n destroyRef.onDestroy(() => this._cancelDragSelect());\n }\n\n /** Starts a row reorder gesture and creates its floating preview. */\n startReorder(event: PointerEvent, originalIndex: number): void {\n event.preventDefault();\n event.stopPropagation();\n const rowEl = (event.currentTarget as HTMLElement).closest<HTMLElement>('.ag-row');\n if (!rowEl) return;\n const rect = rowEl.getBoundingClientRect();\n this.reorderOriginalIndex.set(originalIndex);\n this._offsetX = event.clientX - rect.left;\n this._offsetY = event.clientY - rect.top;\n\n const overlay = rowEl.cloneNode(true) as HTMLElement;\n overlay.removeAttribute('data-original-index');\n Object.assign(overlay.style, {\n position: 'fixed', top: `${rect.top}px`, left: `${rect.left}px`,\n width: `${rect.width}px`, height: `${rect.height}px`,\n pointerEvents: 'none', zIndex: '9999', background: '#fff',\n border: '1px solid #1a73e8', borderRadius: '4px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.15)', overflow: 'hidden',\n opacity: '0.95', cursor: 'grabbing',\n });\n if (!this.browser.appendToBody(overlay)) {\n this._clearReorder();\n return;\n }\n this._overlayEl = overlay;\n this.browser.addDocumentListener('pointermove', this._reorderMove);\n this.browser.addDocumentListener('pointerup', this._reorderUp);\n this.browser.addDocumentListener('pointercancel', this._reorderCancel);\n }\n\n /** Returns the formatted value shown in a reorder ghost cell. */\n getGhostDisplay(col: ColDef): string {\n const idx = this.reorderOriginalIndex();\n if (idx === null) return '';\n return getDisplayForField(col, this.opts.dataSource().rows()[idx]?.[col.field], this.opts.locale());\n }\n\n private readonly _reorderMove = (e: PointerEvent): void => {\n if (this._overlayEl) {\n this._overlayEl.style.top = `${e.clientY - this._offsetY}px`;\n this._overlayEl.style.left = `${e.clientX - this._offsetX}px`;\n }\n const hovered = this._getHoveredRow(e.clientX, e.clientY);\n if (hovered) {\n if (this.reorderOverIndex() !== hovered.originalIndex) this.reorderOverIndex.set(hovered.originalIndex);\n if (this.reorderInsertBefore() !== hovered.insertBefore) this.reorderInsertBefore.set(hovered.insertBefore);\n } else {\n this.reorderOverIndex.set(null);\n }\n };\n\n private readonly _reorderUp = (_e: PointerEvent): void => {\n this._removeReorderListeners();\n const overlay = this._overlayEl;\n this._overlayEl = null;\n if (overlay) {\n overlay.style.transition = 'opacity 80ms ease';\n overlay.style.opacity = '0';\n this.browser.schedule(() => overlay.remove(), 90);\n }\n const oldIndex = this.reorderOriginalIndex();\n const overIdx = this.reorderOverIndex();\n if (oldIndex !== null && overIdx !== null) {\n const newIndex = this.reorderInsertBefore() ? overIdx : overIdx + 1;\n const shouldEmit = oldIndex !== newIndex;\n this._clearReorder();\n if (shouldEmit) {\n this.opts.onReorder({ row: { ...this.opts.dataSource().rows()[oldIndex] }, oldIndex, newIndex });\n }\n } else {\n this._clearReorder();\n }\n };\n\n private readonly _reorderCancel = (): void => this._cleanupReorder();\n\n private _cleanupReorder(): void {\n this._removeReorderListeners();\n this._overlayEl?.remove();\n this._overlayEl = null;\n this._clearReorder();\n }\n\n private _removeReorderListeners(): void {\n this.browser.removeDocumentListener('pointermove', this._reorderMove);\n this.browser.removeDocumentListener('pointerup', this._reorderUp);\n this.browser.removeDocumentListener('pointercancel', this._reorderCancel);\n }\n\n private _clearReorder(): void {\n this.reorderOriginalIndex.set(null);\n this.reorderOverIndex.set(null);\n this.reorderInsertBefore.set(true);\n }\n\n /** Starts pointer-driven multi-row selection from an anchor row. */\n startDragSelect(originalIndex: number): void {\n this._dragSelAnchor = originalIndex;\n this.browser.addDocumentListener('pointermove', this._dragSelMove);\n this.browser.addDocumentListener('pointerup', this._dragSelUp);\n this.browser.addDocumentListener('pointercancel', this._dragSelCancel);\n }\n\n private readonly _dragSelMove = (e: PointerEvent): void => {\n const anchor = this._dragSelAnchor;\n if (anchor === null) return;\n const hovered = this._getHoveredRow(e.clientX, e.clientY);\n if (!hovered) return;\n this.opts.selectedIndices.set(\n buildSelectionRange(anchor, hovered.originalIndex, this.opts.filteredItems())\n );\n };\n\n private readonly _dragSelUp = (): void => {\n this._removeDragSelectListeners();\n this._dragSelAnchor = null;\n this.opts.onSelectionChange();\n };\n\n private readonly _dragSelCancel = (): void => this._cancelDragSelect();\n\n private _cancelDragSelect(): void {\n this._removeDragSelectListeners();\n this._dragSelAnchor = null;\n }\n\n private _removeDragSelectListeners(): void {\n this.browser.removeDocumentListener('pointermove', this._dragSelMove);\n this.browser.removeDocumentListener('pointerup', this._dragSelUp);\n this.browser.removeDocumentListener('pointercancel', this._dragSelCancel);\n }\n\n private _getHoveredRow(x: number, y: number): { originalIndex: number; insertBefore: boolean } | null {\n for (const el of this.browser.elementsFromPoint(x, y)) {\n const rowEl = (el as HTMLElement).closest<HTMLElement>('.ag-row[data-original-index]');\n if (!rowEl) continue;\n const rect = rowEl.getBoundingClientRect();\n return {\n originalIndex: Number(rowEl.dataset['originalIndex']),\n insertBefore: y < rect.top + rect.height / 2,\n };\n }\n return null;\n }\n}\n","import { Signal, WritableSignal, signal } from '@angular/core';\nimport { CellRange } from '../selection/agrid-clipboard.handler';\nimport { AgridControl, HistoryEntry, HistoryItem } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridEditEvent } from '../agrid.types';\n\n/** Dependencies and callbacks required by {@link AgridEditController}. @internal */\nexport interface AgridEditControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n visibleColDefs: Signal<ColDef[]>;\n readonlyGrid: Signal<boolean>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n findDisplayIndex: (originalIndex: number) => number;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n focusGrid: () => void;\n onCellEdit: (event: GridEditEvent) => void;\n}\n\n/**\n * Owns cell edit state, commit/cancel transitions, and undo/redo application.\n * @internal\n */\nexport class AgridEditController {\n readonly editingCell = signal<CellPosition | null>(null);\n readonly currentDraft = signal<unknown>(null);\n readonly editSeedChar = signal<string>('');\n\n constructor(private readonly opts: AgridEditControllerOptions) {}\n\n /** Returns whether a column can be edited in the current grid state. */\n isCellEditable(col: ColDef | undefined): boolean {\n return !!col && !this.opts.readonlyGrid() && col.editable !== false;\n }\n\n /** Replaces the value currently staged by the active editor. */\n setDraft(value: unknown): void {\n this.currentDraft.set(value);\n }\n\n /** Starts editing a cell, optionally seeded by a typed character. */\n start(originalIndex: number, colIndex: number, seedChar: string): void {\n const col = this.opts.visibleColDefs()[colIndex];\n if (!this.isCellEditable(col)) return;\n const currentValue = this.opts.dataSource().getRow(originalIndex)[col.field];\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: originalIndex, colIndex });\n let initialDraft: unknown;\n if (seedChar !== '') {\n initialDraft = seedChar;\n } else if (col.type === 'date' && (currentValue == null || currentValue === '')) {\n initialDraft = new Date().toISOString().slice(0, 10);\n } else {\n initialDraft = currentValue;\n }\n this.currentDraft.set(initialDraft);\n this.editSeedChar.set(seedChar);\n this.editingCell.set({ rowIndex: originalIndex, colIndex });\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n if (displayIndex >= 0) this.opts.scrollToCell(displayIndex, colIndex);\n }\n\n /** Commits the staged value and records the edit in history. */\n commit(): void {\n const position = this.editingCell();\n if (!position) return;\n const col = this.opts.visibleColDefs()[position.colIndex];\n if (!col) {\n this.cancel();\n return;\n }\n\n const oldValue = this.opts.dataSource().getRow(position.rowIndex)[col.field];\n const newValue = this.currentDraft();\n if (oldValue !== newValue) {\n this.opts.dataSource().patchRow(position.rowIndex, { [col.field]: newValue });\n this.opts.control()?.pushEdit({\n rowIndex: position.rowIndex,\n field: col.field,\n oldValue,\n newValue,\n });\n this.opts.onCellEdit({ position, field: col.field, oldValue, newValue });\n }\n this.clearEditState();\n this.opts.focusGrid();\n }\n\n /** Discards the active edit without changing row data. */\n cancel(): void {\n this.clearEditState();\n }\n\n /** Applies the previous edit-history value to the data source. */\n undo(): void {\n const item = this.opts.control()?.undo();\n if (item) this.applyHistoryItem(item, 'oldValue');\n }\n\n /** Reapplies the next edit-history value to the data source. */\n redo(): void {\n const item = this.opts.control()?.redo();\n if (item) this.applyHistoryItem(item, 'newValue');\n }\n\n /** Reconciles active edit coordinates after a row is removed. */\n onRowRemoved(originalIndex: number): void {\n const editing = this.editingCell();\n if (editing?.rowIndex === originalIndex) {\n this.clearEditState();\n } else if (editing && editing.rowIndex > originalIndex) {\n this.editingCell.set({ ...editing, rowIndex: editing.rowIndex - 1 });\n }\n }\n\n private applyHistoryItem(item: HistoryItem, valueKey: 'oldValue' | 'newValue'): void {\n const entries = Array.isArray(item) ? item : [item];\n const ordered = valueKey === 'oldValue' ? [...entries].reverse() : entries;\n for (const entry of ordered) this.applyHistoryEntry(entry, entry[valueKey]);\n }\n\n private applyHistoryEntry(entry: HistoryEntry, value: unknown): void {\n const oldValue = this.opts.dataSource().getRow(entry.rowIndex)[entry.field];\n this.opts.dataSource().patchRow(entry.rowIndex, { [entry.field]: value });\n const colIndex = this.opts.visibleColDefs().findIndex(col => col.field === entry.field);\n this.opts.onCellEdit({\n position: { rowIndex: entry.rowIndex, colIndex },\n field: entry.field,\n oldValue,\n newValue: value,\n });\n }\n\n private clearEditState(): void {\n this.editingCell.set(null);\n this.editSeedChar.set('');\n }\n}\n","import { Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { CellPosition, ColDef, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Location of a formatted-value match in source and display coordinates. @internal */\nexport type AgridFindMatch = {\n rowIndex: number;\n displayIndex: number;\n colIndex: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridFindController}. @internal */\nexport interface AgridFindControllerOptions {\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n focusGrid: () => void;\n}\n\n/** Owns in-grid find state, formatted-value matching, and match navigation. @internal */\nexport class AgridFindController {\n readonly open = signal(false);\n readonly query = signal('');\n readonly activeIndex = signal(-1);\n\n readonly matches = computed<AgridFindMatch[]>(() => {\n const query = this.query().trim().toLowerCase();\n if (!query) return [];\n const cols = this.opts.visibleColDefs();\n const matches: AgridFindMatch[] = [];\n this.opts.filteredItems().forEach((item, displayIndex) => {\n if (!isDataRowItem(item)) return;\n for (let colIndex = 0; colIndex < cols.length; colIndex++) {\n const col = cols[colIndex];\n const value = getDisplayForField(col, item.row[col.field], this.opts.locale()).toLowerCase();\n if (value.includes(query)) {\n matches.push({ rowIndex: item.originalIndex, displayIndex, colIndex });\n }\n }\n });\n return matches;\n });\n\n constructor(private readonly opts: AgridFindControllerOptions) {}\n\n /** Opens the find panel. */\n show(): void {\n this.open.set(true);\n }\n\n /** Closes the find panel and returns focus to the grid. */\n close(): void {\n this.open.set(false);\n this.opts.focusGrid();\n }\n\n /** Replaces the search query and selects its first match. */\n setQuery(value: string): void {\n this.query.set(value);\n this.activeIndex.set(-1);\n this.goToMatch(1);\n }\n\n /** Selects the next or previous match, wrapping at either end. */\n goToMatch(direction: 1 | -1): void {\n const matches = this.matches();\n if (matches.length === 0) {\n this.activeIndex.set(-1);\n return;\n }\n const current = this.activeIndex();\n const next = current < 0\n ? (direction === 1 ? 0 : matches.length - 1)\n : (current + direction + matches.length) % matches.length;\n this.activeIndex.set(next);\n const match = matches[next];\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: match.rowIndex, colIndex: match.colIndex });\n this.opts.scrollToCell(match.displayIndex, match.colIndex);\n }\n\n /** Returns whether a cell matches the current query. */\n isMatchCell(originalIndex: number, colIndex: number): boolean {\n return this.matches().some(\n match => match.rowIndex === originalIndex && match.colIndex === colIndex,\n );\n }\n\n /** Returns whether a cell is the currently active match. */\n isActiveMatchCell(originalIndex: number, colIndex: number): boolean {\n const match = this.matches()[this.activeIndex()];\n return !!match && match.rowIndex === originalIndex && match.colIndex === colIndex;\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\n\n/** Floating find panel used by `AgridComponent` for in-grid search navigation. */\n@Component({\n selector: 'agrid-find-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-find-panel.component.html',\n styleUrl: './agrid-find-panel.component.css',\n})\nexport class AgridFindPanelComponent implements AfterViewInit {\n /** Localized labels used in the find panel. */\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n\n /** Current find query shown in the input. */\n query = input<string>('');\n\n /** Number of cells matching the current query. */\n matchCount = input<number>(0);\n\n /** Zero-based active match index, or `-1` when no match is active. */\n activeIndex = input<number>(-1);\n\n /** Emits whenever the user changes the find query. */\n queryChange = output<string>();\n\n /** Requests navigation to the next match. */\n next = output<void>();\n\n /** Requests navigation to the previous match. */\n previous = output<void>();\n\n /** Requests closing the find panel. */\n close = output<void>();\n\n private readonly findInput = viewChild.required<ElementRef<HTMLInputElement>>('findInput');\n\n /** Focuses and selects the find input after Angular has rendered the panel. */\n ngAfterViewInit(): void {\n setTimeout(() => {\n const input = this.findInput().nativeElement;\n input.focus();\n input.select();\n });\n }\n\n /** Returns the compact `active / total` label displayed next to the input. */\n countLabel(): string {\n const count = this.matchCount();\n return count === 0 ? '0 / 0' : `${this.activeIndex() + 1} / ${count}`;\n }\n\n /** Handles Enter, Shift+Enter, and Escape while preventing grid-level key handling. */\n onKeyDown(event: KeyboardEvent): void {\n event.stopPropagation();\n if (event.key === 'Enter') {\n event.preventDefault();\n event.shiftKey ? this.previous.emit() : this.next.emit();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this.close.emit();\n }\n }\n}\n","<div class=\"ag-find-panel\" role=\"search\" (click)=\"$event.stopPropagation()\">\n <input\n #findInput\n class=\"ag-find-input\"\n [value]=\"query()\"\n (input)=\"queryChange.emit($any($event.target).value)\"\n (keydown)=\"onKeyDown($event)\"\n [placeholder]=\"localeText().findPlaceholder\"\n [attr.aria-label]=\"localeText().findPlaceholder\"\n />\n <span class=\"ag-find-count\" aria-live=\"polite\">{{ countLabel() }}</span>\n <button class=\"ag-find-btn\" [title]=\"localeText().previous\" [attr.aria-label]=\"localeText().previous\"\n (click)=\"previous.emit()\">↑</button>\n <button class=\"ag-find-btn\" [title]=\"localeText().next\" [attr.aria-label]=\"localeText().next\"\n (click)=\"next.emit()\">↓</button>\n <button class=\"ag-find-btn\" [title]=\"localeText().close\" [attr.aria-label]=\"localeText().close\"\n (click)=\"close.emit()\">✕</button>\n</div>\n","import { Signal, signal } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { GridItem, GroupAction } from '../agrid.types';\nimport { isGroupHeaderItem } from '../agrid.utils';\n\n/** Expanded group labels associated with the active grouping field. @internal */\nexport type AgridExpandedGroups = {\n field: string | null;\n labels: Set<string>;\n};\n\n/** Dependencies required by {@link AgridGroupController}. @internal */\nexport interface AgridGroupControllerOptions {\n control: Signal<AgridControl | null>;\n groupDescription: Signal<((label: string) => string) | null>;\n}\n\n/** Owns group expansion state and the group-action context menu. @internal */\nexport class AgridGroupController {\n readonly expandedGroups = signal<AgridExpandedGroups>({\n field: null,\n labels: new Set(),\n });\n readonly actionsMenu = signal<{ x: number; y: number; label: string } | null>(null);\n\n constructor(private readonly opts: AgridGroupControllerOptions) {}\n\n /** Toggles one group label within the active grouping field. */\n toggle(label: string): void {\n const groupField = this.opts.control()?.groupByField() ?? null;\n this.expandedGroups.update(state => {\n const labels = state.field === groupField ? new Set(state.labels) : new Set<string>();\n if (labels.has(label)) labels.delete(label);\n else labels.add(label);\n return { field: groupField, labels };\n });\n }\n\n /** Expands every group header present in the supplied projection. */\n expandAll(items: GridItem[]): void {\n const groupField = this.opts.control()?.groupByField() ?? null;\n if (!groupField) return;\n const labels = new Set<string>();\n for (const item of items) {\n if (isGroupHeaderItem(item)) labels.add(item.groupLabel);\n }\n this.expandedGroups.set({ field: groupField, labels });\n }\n\n /** Collapses all groups for the active grouping field. */\n collapseAll(): void {\n const groupField = this.opts.control()?.groupByField() ?? null;\n this.expandedGroups.set({ field: groupField, labels: new Set() });\n }\n\n /** Returns the configured description for a group label. */\n getDescription(label: string): string {\n return this.opts.groupDescription()?.(label) ?? '';\n }\n\n /** Opens the action menu for a group label. */\n openActionsMenu(event: MouseEvent, label: string): void {\n event.stopPropagation();\n this.actionsMenu.set({ x: event.clientX, y: event.clientY, label });\n }\n\n /** Closes the group action menu. */\n closeActionsMenu(): void {\n this.actionsMenu.set(null);\n }\n\n /** Runs a group action and closes its menu. */\n runAction(action: GroupAction, label: string): void {\n action.action(label);\n this.closeActionsMenu();\n }\n}\n","import { signal } from '@angular/core';\n\n/**\n * Owns the expand/collapse state of a hierarchical (tree) grid.\n *\n * Expansion is keyed by **node id** (from {@link AgridTreeConfig.getId}), independent of any\n * column or grouping field, so it works at arbitrary depth. Ids that no longer exist in the\n * data simply never match and are harmless, so the state does not need to be reset when the\n * underlying rows change.\n *\n * Mirrors {@link AgridGroupController} in spirit but is intentionally option-free — the grid\n * component supplies node ids to {@link expandAll} from the current data source.\n * @internal\n */\nexport class AgridTreeController {\n /** Ids of the nodes that are currently expanded (their children are visible). */\n readonly expandedIds = signal<Set<string | number>>(new Set());\n\n /** Returns `true` when the node with `id` is currently expanded. */\n isExpanded(id: string | number): boolean {\n return this.expandedIds().has(id);\n }\n\n /** Toggle the expanded state of a single node. */\n toggle(id: string | number): void {\n this.expandedIds.update(ids => {\n const next = new Set(ids);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }\n\n /** Explicitly expand or collapse a single node. */\n setExpanded(id: string | number, expanded: boolean): void {\n this.expandedIds.update(ids => {\n if (expanded === ids.has(id)) return ids;\n const next = new Set(ids);\n if (expanded) next.add(id);\n else next.delete(id);\n return next;\n });\n }\n\n /** Expand every node in `ids` (typically all expandable nodes in the data source). */\n expandAll(ids: Iterable<string | number>): void {\n this.expandedIds.set(new Set(ids));\n }\n\n /** Collapse every node. */\n collapseAll(): void {\n this.expandedIds.set(new Set());\n }\n}\n","import { Signal, WritableSignal } from '@angular/core';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { AgridControl } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridItem, NewRecord } from '../agrid.types';\nimport { isDataRowItem, isGroupHeaderItem } from '../agrid.utils';\n\n/** Minimal vertical viewport API used by grid navigation. @internal */\nexport interface AgridVerticalViewport {\n /** Returns the current vertical scroll offset in pixels. */\n measureScrollOffset(): number;\n /** Returns the visible viewport height in pixels. */\n getViewportSize(): number;\n /** Scrolls the viewport to an absolute vertical offset. */\n scrollToOffset(offset: number): void;\n}\n\n/** Dependencies and callbacks required by {@link AgridNavigationController}. @internal */\nexport interface AgridNavigationControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n filteredSortedIndices: Signal<number[]>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n rowHeight: Signal<number>;\n allowAddRows: Signal<boolean>;\n autoAddRows: Signal<boolean>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n editingCell: Signal<CellPosition | null>;\n isEditing: (originalIndex: number, colIndex: number) => boolean;\n startEdit: (originalIndex: number, colIndex: number, seedChar: string) => void;\n commitEdit: () => void;\n cancelEdit: () => void;\n undoEdit: () => void;\n redoEdit: () => void;\n extendRangeTo: (originalIndex: number, colIndex: number) => void;\n openFind: () => void;\n focusGrid: () => void;\n viewport: () => AgridVerticalViewport;\n scrollColumnToKeepVisible: (colIndex: number) => void;\n onPrepareAddRecord: (event: Pick<NewRecord, 'index' | 'data'>) => void;\n}\n\n/**\n * Owns grid keyboard navigation, cell activation, add-row creation, and visibility scrolling.\n * @internal\n */\nexport class AgridNavigationController {\n constructor(private readonly opts: AgridNavigationControllerOptions) {}\n\n /** Activates a cell, optionally extending the current range selection. */\n activateCell(originalIndex: number, colIndex: number, event?: MouseEvent): void {\n if (this.opts.isEditing(originalIndex, colIndex)) return;\n this.opts.cancelEdit();\n if (event?.shiftKey && this.opts.selectedCell()) {\n this.opts.extendRangeTo(originalIndex, colIndex);\n this.opts.focusGrid();\n return;\n }\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: originalIndex, colIndex });\n const col = this.opts.visibleColDefs()[colIndex];\n if (col.values?.length) this.opts.startEdit(originalIndex, colIndex, '');\n else this.opts.focusGrid();\n }\n\n /** Creates and selects a row from the add-row placeholder. */\n activateAddRow(): void {\n this.opts.cancelEdit();\n this.addRowAndSelect();\n }\n\n /** Clears cell and range navigation when focus moves to a grid control. */\n deactivateCell(): void {\n this.opts.cancelEdit();\n this.opts.selectedCell.set(null);\n this.opts.selectedRange.set(null);\n }\n\n /** Inserts an initialized blank row and emits the preparation callback. */\n insertRowAt(atIndex: number): void {\n const emptyRow = this.buildEmptyRow();\n const insertedIndex = this.opts.dataSource().addRow(emptyRow, atIndex);\n this.opts.onPrepareAddRecord({ index: insertedIndex, data: emptyRow });\n }\n\n /** Handles grid-level navigation, editing, history, find, and add-row shortcuts. */\n handleKeyDown(event: KeyboardEvent): void {\n if ((event.target as Element)?.closest('.ag-sidebar, .ag-filter-input, .ag-filter-menu')) return;\n\n if ((event.ctrlKey || event.metaKey) && !event.altKey && event.key.toLowerCase() === 'f') {\n event.preventDefault();\n this.opts.openFind();\n return;\n }\n\n if ((event.ctrlKey || event.metaKey) && !event.altKey) {\n if (event.key === 'z') {\n event.preventDefault();\n event.shiftKey ? this.opts.redoEdit() : this.opts.undoEdit();\n return;\n }\n if (event.key === 'y') {\n event.preventDefault();\n this.opts.redoEdit();\n return;\n }\n }\n\n if (this.opts.editingCell()) {\n switch (event.key) {\n case 'Tab':\n event.preventDefault();\n this.opts.commitEdit();\n this.moveSelection(0, event.shiftKey ? -1 : 1);\n break;\n case 'Enter':\n event.preventDefault();\n this.opts.commitEdit();\n this.moveSelection(1, 0);\n break;\n case 'Escape':\n event.preventDefault();\n this.opts.cancelEdit();\n this.opts.focusGrid();\n break;\n }\n return;\n }\n\n const sel = this.opts.selectedCell();\n const isOnAddRow = this.opts.allowAddRows()\n && !this.opts.autoAddRows()\n && sel?.rowIndex === this.opts.dataSource().length;\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault();\n this.moveSelection(-1, 0, event.shiftKey);\n break;\n case 'ArrowDown':\n event.preventDefault();\n this.moveSelection(1, 0, event.shiftKey);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.moveSelection(0, -1, event.shiftKey);\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.moveSelection(0, 1, event.shiftKey);\n break;\n case 'Tab':\n event.preventDefault();\n this.moveSelection(0, event.shiftKey ? -1 : 1);\n break;\n case 'Enter':\n case 'F2':\n event.preventDefault();\n if (sel) {\n if (isOnAddRow) this.addRowAndSelect();\n else this.opts.startEdit(sel.rowIndex, sel.colIndex, '');\n }\n break;\n default:\n if (sel && event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n if (isOnAddRow) this.addRowAndSelect();\n else this.opts.startEdit(sel.rowIndex, sel.colIndex, event.key);\n }\n }\n }\n\n /** Finds a data row's current index in the projected display items. */\n findDisplayIndex(originalIndex: number): number {\n return this.opts.filteredItems().findIndex(\n item => isDataRowItem(item) && item.originalIndex === originalIndex,\n );\n }\n\n /** Navigates client pagination as needed and reveals a data-source row. */\n revealRow(originalIndex: number): void {\n const filteredIndex = this.opts.filteredSortedIndices().indexOf(originalIndex);\n if (filteredIndex < 0) return;\n\n const ctrl = this.opts.control();\n const pageSize = ctrl?.pageSize() ?? 0;\n if (ctrl && pageSize > 0 && ctrl.totalRows() === 0 && !ctrl.groupByField()) {\n ctrl.setPage(Math.floor(filteredIndex / pageSize) + 1);\n }\n\n setTimeout(() => {\n const displayIndex = this.findDisplayIndex(originalIndex);\n if (displayIndex >= 0) this.scrollToKeepVisible(displayIndex, 0);\n });\n }\n\n /** Scrolls a display row and optional column into the visible viewport. */\n scrollToKeepVisible(displayIndex: number, colIndex: number | null = null): void {\n const viewport = this.opts.viewport();\n const itemSize = this.opts.rowHeight();\n const scrollOffset = viewport.measureScrollOffset();\n const viewportSize = viewport.getViewportSize();\n if (displayIndex * itemSize < scrollOffset) {\n viewport.scrollToOffset(displayIndex * itemSize);\n } else if ((displayIndex + 1) * itemSize > scrollOffset + viewportSize) {\n viewport.scrollToOffset((displayIndex + 1) * itemSize - viewportSize);\n }\n\n if (colIndex !== null) this.opts.scrollColumnToKeepVisible(colIndex);\n }\n\n private moveSelection(dRow: number, dCol: number, extendRange = false): void {\n const items = this.opts.filteredItems();\n if (items.length === 0) {\n if (\n this.opts.allowAddRows()\n && this.opts.autoAddRows()\n && this.opts.dataSource().length === 0\n ) {\n this.addRowAndSelect();\n }\n return;\n }\n const cols = this.opts.visibleColDefs().length;\n let di = this.selectedDisplayIndex();\n let ci = this.opts.selectedCell()?.colIndex ?? 0;\n if (di === -1) {\n di = 0;\n ci = 0;\n }\n let newDi = di + dRow;\n let newCi = ci + dCol;\n const onAddRow = items[newDi] === null;\n if (!onAddRow) {\n if (newCi < 0) {\n newDi--;\n newCi = cols - 1;\n }\n if (newCi >= cols) {\n newDi++;\n newCi = 0;\n }\n }\n\n const skipDir = dRow < 0 ? -1 : 1;\n let skipDi = newDi;\n while (skipDi >= 0 && skipDi < items.length && isGroupHeaderItem(items[skipDi])) skipDi += skipDir;\n if (skipDi >= 0 && skipDi < items.length) newDi = skipDi;\n\n if (this.opts.autoAddRows() && newDi >= items.length) {\n const emptyRow = this.buildEmptyRow();\n const insertedIndex = this.opts.dataSource().addRow(emptyRow);\n const colIndex = Math.min(newCi, cols - 1);\n const newDisplayIdx = this.findDisplayIndex(insertedIndex);\n this.opts.selectedCell.set({ rowIndex: insertedIndex, colIndex });\n if (newDisplayIdx >= 0) this.scrollToKeepVisible(newDisplayIdx, colIndex);\n this.opts.focusGrid();\n this.opts.onPrepareAddRecord({ index: insertedIndex, data: emptyRow });\n return;\n }\n\n newDi = Math.max(0, Math.min(items.length - 1, newDi));\n newCi = Math.max(0, Math.min(cols - 1, newCi));\n const newItem = items[newDi];\n if (newItem === null) {\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: this.opts.dataSource().length, colIndex: 0 });\n } else if (isDataRowItem(newItem)) {\n if (extendRange) {\n this.opts.extendRangeTo(newItem.originalIndex, newCi);\n } else {\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: newItem.originalIndex, colIndex: newCi });\n }\n }\n this.scrollToKeepVisible(newDi, newCi);\n this.opts.focusGrid();\n }\n\n private selectedDisplayIndex(): number {\n const sel = this.opts.selectedCell();\n if (!sel) return -1;\n const items = this.opts.filteredItems();\n if (sel.rowIndex >= this.opts.dataSource().length) return items.length - 1;\n return items.findIndex(item => isDataRowItem(item) && item.originalIndex === sel.rowIndex);\n }\n\n private addRowAndSelect(): void {\n const emptyRow = this.buildEmptyRow();\n const insertedIndex = this.opts.dataSource().addRow(emptyRow);\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: insertedIndex, colIndex: 0 });\n this.opts.focusGrid();\n const displayIdx = this.findDisplayIndex(insertedIndex);\n if (displayIdx >= 0) this.scrollToKeepVisible(displayIdx, 0);\n this.opts.onPrepareAddRecord({ index: insertedIndex, data: emptyRow });\n }\n\n private buildEmptyRow(): Record<string, unknown> {\n const row: Record<string, unknown> = {};\n for (const col of this.opts.colDefs()) row[col.field] = col.type === 'number' ? 0 : '';\n return row;\n }\n}\n","import { Signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Reactive display state required by {@link AgridPresentationService}. @internal */\nexport interface AgridPresentationOptions {\n control: Signal<AgridControl | null>;\n visibleColDefs: Signal<ColDef[]>;\n filteredItems: Signal<GridItem[]>;\n locale: Signal<string>;\n}\n\n/**\n * Provides display formatting and CSV export without coupling them to the grid component.\n * @internal\n */\nexport class AgridPresentationService {\n constructor(\n private readonly opts: AgridPresentationOptions,\n private readonly browser = new AgridBrowserAdapter(),\n ) {}\n\n /** Returns the formatted tooltip text for a cell value. */\n getCellTitle(col: ColDef, value: unknown): string {\n return getDisplayForField(col, value, this.opts.locale());\n }\n\n /** Resolves dynamic CSS classes configured for a cell. */\n getCellClass(col: ColDef, value: unknown, row: Record<string, unknown>): string {\n return col.cellClass?.({ value, row }) ?? '';\n }\n\n /** Returns the compact label for a built-in aggregate. */\n getAggregateLabel(col: ColDef): string {\n const aggregate = this.opts.control()?.aggregates()[col.field] ?? col.aggregate;\n if (!aggregate || typeof aggregate === 'function') return '';\n return { sum: 'Σ', avg: 'Ø', min: '↓', max: '↑', count: '#' }[aggregate] ?? '';\n }\n\n /** Returns whether a column has a static or runtime aggregate. */\n hasAggregate(col: ColDef): boolean {\n return this.opts.control()?.aggregates()[col.field] !== undefined || !!col.aggregate;\n }\n\n /** Formats a computed footer value for display. */\n getFooterDisplay(col: ColDef, value: unknown): string {\n if (value == null || value === '') return '';\n if (col.formatter) return col.formatter(value);\n if (typeof value === 'number') return value.toLocaleString(this.opts.locale());\n return String(value);\n }\n\n /** Downloads the currently projected rows and visible columns as CSV. */\n exportCsv(filename: string): void {\n const cols = this.opts.visibleColDefs();\n const rows = this.opts.filteredItems()\n .filter(isDataRowItem)\n .map(item => item.row);\n const escape = (value: string): string =>\n /[,\"\\n\\r]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n const header = cols.map(col => escape(col.header)).join(',');\n const locale = this.opts.locale();\n const body = rows\n .map(row => cols\n .map(col => escape(getDisplayForField(col, row[col.field], locale)))\n .join(','))\n .join('\\n');\n this.browser.downloadText(\n filename,\n `${header}\\n${body}`,\n 'text/csv;charset=utf-8;',\n );\n }\n}\n","import { Signal, computed, signal } from '@angular/core';\n\n/**\n * A single reversible cell edit stored in the undo/redo history.\n * Both `oldValue` and `newValue` are the raw values as stored in the data source.\n */\nexport interface HistoryEntry {\n rowIndex: number;\n field: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\n/** A single undo/redo history item. Multi-cell operations are stored as one batch. */\nexport type HistoryItem = HistoryEntry | HistoryEntry[];\n\n/**\n * Per-column filter state stored inside {@link AgridControl}.\n *\n * All three fields are independent — text, value selection, and sort are ANDed together\n * when computing the visible rows.\n */\nexport interface ColumnFilter {\n /** Free-text substring filter (case-insensitive). Empty string = no text filter. */\n text: string;\n /**\n * Allowed values for the value-picker filter.\n * - `null` → all values pass (no value filter active)\n * - `string[]` → only rows whose field value is in this list are shown\n */\n selectedValues: string[] | null;\n /** Sort direction, or `null` when this column is not sorted. */\n sort: 'asc' | 'desc' | null;\n}\n\n/** Serializable snapshot of the grid's UI state. Used with `toJSON` / `fromJSON`. */\nexport interface AgridControlState {\n /** Per-field column width overrides in pixels. */\n columnWidths: Record<string, number>;\n /** Per-field filter and sort state. Fields with default state may be omitted. */\n filters: Record<string, ColumnFilter>;\n /** When `true`, rows can be reordered by dragging the control-column handle. */\n allowRowReorder?: boolean;\n /** Field to group rows by, or `null` / omitted for no grouping. */\n groupByField?: string | null;\n /** Fields that are currently hidden from the grid view. */\n hiddenColumns?: string[];\n /** Ordered list of field names defining the column display order. */\n columnOrder?: string[];\n /** Fields that are pinned to the left edge. */\n pinnedColumns?: string[];\n /** Fields that are pinned to the right edge. */\n pinnedRightColumns?: string[];\n /** Ordered list of field names currently sorted, from highest to lowest priority. */\n sortOrder?: string[];\n /** Number of rows per page. `0` means no pagination (show all rows). */\n pageSize?: number;\n /** Current page (1-based). */\n currentPage?: number;\n /**\n * Total row count supplied by the server. When greater than zero the grid enters\n * server-side pagination mode: it no longer slices rows locally and instead emits\n * a `(pageChange)` event so the host can fetch the correct slice.\n */\n totalRows?: number;\n /** Per-field aggregate function set via the column menu. Only built-in string values are serializable. */\n aggregates?: Record<string, 'sum' | 'avg' | 'min' | 'max' | 'count'>;\n}\n\n/**\n * Signal-based container for mutable grid UI state such as column widths and active filters.\n *\n * Assign an instance to `AgridProvider.control` so the grid can store runtime state\n * in a place the host component can persist across sessions.\n *\n * @example\n * ```ts\n * // Restore saved state:\n * readonly ctrl = AgridControl.fromJSON(\n * JSON.parse(localStorage.getItem('grid') ?? '{}')\n * );\n *\n * // Save on demand:\n * localStorage.setItem('grid', JSON.stringify(this.ctrl.toJSON()));\n * ```\n */\nexport class AgridControl {\n private readonly _columnWidths = signal<Record<string, number>>({});\n private readonly _filters = signal<Record<string, ColumnFilter>>({});\n private readonly _allowRowReorder = signal<boolean>(false);\n private readonly _groupByField = signal<string | null>(null);\n private readonly _hiddenColumns = signal<Set<string>>(new Set());\n private readonly _columnOrder = signal<string[]>([]);\n private readonly _pinnedColumns = signal<Set<string>>(new Set());\n private readonly _pinnedRightColumns = signal<Set<string>>(new Set());\n private readonly _pageSize = signal<number>(0);\n private readonly _currentPage = signal<number>(1);\n private readonly _totalRows = signal<number>(0);\n private readonly _aggregates = signal<Record<string, 'sum' | 'avg' | 'min' | 'max' | 'count'>>({});\n private readonly _sortOrder = signal<string[]>([]);\n\n /** @param state Optional initial state, e.g. deserialized from storage. */\n constructor(state?: Partial<AgridControlState>) {\n if (state?.columnWidths) this._columnWidths.set({ ...state.columnWidths });\n if (state?.filters) this._filters.set({ ...state.filters });\n if (state?.allowRowReorder) this._allowRowReorder.set(state.allowRowReorder);\n if (state?.groupByField !== undefined) this._groupByField.set(state.groupByField ?? null);\n if (state?.hiddenColumns?.length) this._hiddenColumns.set(new Set(state.hiddenColumns));\n if (state?.columnOrder?.length) this._columnOrder.set([...state.columnOrder]);\n if (state?.pinnedColumns?.length) this._pinnedColumns.set(new Set(state.pinnedColumns));\n if (state?.pinnedRightColumns?.length) this._pinnedRightColumns.set(new Set(state.pinnedRightColumns));\n if (state?.pageSize) this._pageSize.set(state.pageSize);\n if (state?.currentPage) this._currentPage.set(state.currentPage);\n if (state?.totalRows) this._totalRows.set(state.totalRows);\n if (state?.aggregates) this._aggregates.set({ ...state.aggregates });\n if (state?.sortOrder?.length) this._sortOrder.set([...state.sortOrder]);\n }\n\n /**\n * When `true`, the control column shows a drag handle and rows can be\n * reordered by dragging. Requires `showControlColumn` to be enabled on the grid.\n */\n readonly allowRowReorder: Signal<boolean> = this._allowRowReorder.asReadonly();\n\n /** Enable or disable row reordering at runtime. */\n setAllowRowReorder(value: boolean): void {\n this._allowRowReorder.set(value);\n }\n\n /**\n * The field currently used to group rows, or `null` when grouping is off.\n * When set, rows are bucketed by the display value of this field and a header\n * row is inserted before each group. Secondary sorts still apply within groups.\n */\n readonly groupByField: Signal<string | null> = this._groupByField.asReadonly();\n\n /**\n * Enable grouping by `field`, or pass `null` to turn grouping off.\n */\n setGroupBy(field: string | null): void {\n this._groupByField.set(field);\n }\n\n /**\n * Reactive set of field names that are currently hidden.\n * An empty set means all columns are visible.\n */\n readonly hiddenColumns: Signal<Set<string>> = this._hiddenColumns.asReadonly();\n\n /** Return `true` when the given field is currently hidden. */\n isColumnHidden(field: string): boolean {\n return this._hiddenColumns().has(field);\n }\n\n /**\n * Show or hide a column by field name.\n * Hiding a column does not clear its filter or sort — they resume when it is shown again.\n */\n setColumnVisibility(field: string, visible: boolean): void {\n this._hiddenColumns.update(set => {\n const next = new Set(set);\n if (visible) next.delete(field);\n else next.add(field);\n return next;\n });\n }\n\n /** Toggle the visibility of a column. */\n toggleColumnVisibility(field: string): void {\n this.setColumnVisibility(field, this.isColumnHidden(field));\n }\n\n // ── Column order ──────────────────────────────────────────────────────────\n\n /**\n * Ordered list of field names that defines the left-to-right column display order.\n * An empty array means \"use the original `colDefs` order\".\n */\n readonly columnOrder: Signal<string[]> = this._columnOrder.asReadonly();\n\n /** Replace the entire column order with a new list of field names. */\n setColumnOrder(fields: string[]): void {\n this._columnOrder.set([...fields]);\n }\n\n /**\n * Move `fromField` to a new position relative to `toField`.\n * `currentVisibleOrder` should be the current `visibleColDefs` field array so the\n * operation works correctly whether or not an order has been set before.\n */\n moveColumn(currentVisibleOrder: string[], fromField: string, toField: string, insertBefore: boolean): void {\n this.moveColumns(currentVisibleOrder, [fromField], toField, insertBefore);\n }\n\n /**\n * Move an ordered block of fields to a new position relative to `toField`.\n * Fields absent from `currentVisibleOrder` are ignored.\n */\n moveColumns(\n currentVisibleOrder: string[],\n fromFields: readonly string[],\n toField: string,\n insertBefore: boolean,\n ): void {\n const order = [...currentVisibleOrder];\n const moving = order.filter(field => fromFields.includes(field));\n if (moving.length === 0 || moving.includes(toField)) return;\n const remaining = order.filter(field => !moving.includes(field));\n const toIdx = remaining.indexOf(toField);\n if (toIdx === -1) return;\n remaining.splice(insertBefore ? toIdx : toIdx + 1, 0, ...moving);\n this._columnOrder.set(remaining);\n }\n\n // ── Pinned columns ────────────────────────────────────────────────────────\n\n /** Reactive set of field names currently pinned to the left edge. */\n readonly pinnedColumns: Signal<Set<string>> = this._pinnedColumns.asReadonly();\n\n /** Return `true` when the given field is pinned. */\n isPinned(field: string): boolean {\n return this._pinnedColumns().has(field);\n }\n\n /** Pin or unpin a column to the left edge. Pinning left auto-unpins right. */\n setPinned(field: string, pinned: boolean): void {\n this._pinnedColumns.update(set => {\n const next = new Set(set);\n if (pinned) next.add(field); else next.delete(field);\n return next;\n });\n if (pinned) this._pinnedRightColumns.update(s => { const n = new Set(s); n.delete(field); return n; });\n }\n\n /** Toggle left-pin state of a column. */\n togglePinned(field: string): void {\n this.setPinned(field, !this.isPinned(field));\n }\n\n // ── Right pinning ─────────────────────────────────────────────────────────\n\n /** Reactive set of field names currently pinned to the right edge. */\n readonly pinnedRightColumns: Signal<Set<string>> = this._pinnedRightColumns.asReadonly();\n\n /** Return `true` when the given field is pinned to the right edge. */\n isPinnedRight(field: string): boolean {\n return this._pinnedRightColumns().has(field);\n }\n\n /** Pin or unpin a column to the right edge. Pinning right auto-unpins left. */\n setPinnedRight(field: string, pinned: boolean): void {\n this._pinnedRightColumns.update(set => {\n const next = new Set(set);\n if (pinned) next.add(field); else next.delete(field);\n return next;\n });\n if (pinned) this._pinnedColumns.update(s => { const n = new Set(s); n.delete(field); return n; });\n }\n\n /** Toggle right-pin state of a column. */\n togglePinnedRight(field: string): void {\n this.setPinnedRight(field, !this.isPinnedRight(field));\n }\n\n // ── Pagination ────────────────────────────────────────────────────────────\n\n /** Number of rows per page. `0` means all rows are shown (no pagination). */\n readonly pageSize: Signal<number> = this._pageSize.asReadonly();\n\n /** Current page number (1-based). */\n readonly currentPage: Signal<number> = this._currentPage.asReadonly();\n\n /** Set rows per page. Pass `0` to disable pagination. Resets to page 1. */\n setPageSize(size: number): void {\n this._pageSize.set(Math.max(0, size));\n this._currentPage.set(1);\n }\n\n /** Navigate to a specific page (1-based). Clamped to valid range by the grid. */\n setPage(page: number): void {\n this._currentPage.set(Math.max(1, page));\n }\n\n /**\n * Set the total number of rows available on the server.\n * When greater than zero the grid switches to **server-side pagination mode**:\n * - Rows in the data source are shown as-is (no local slicing).\n * - `totalPages` is derived from this value instead of the local row count.\n * - A `(pageChange)` event is emitted whenever the user navigates to a new page.\n *\n * Pass `0` to return to client-side pagination.\n */\n setTotalRows(count: number): void {\n this._totalRows.set(Math.max(0, count));\n }\n\n /**\n * Total server-side row count. `0` means client-side mode (grid slices locally).\n */\n readonly totalRows: Signal<number> = this._totalRows.asReadonly();\n\n // ── Aggregates ────────────────────────────────────────────────────────────\n\n /** Per-field aggregate overrides set via the column menu. */\n readonly aggregates: Signal<Record<string, 'sum' | 'avg' | 'min' | 'max' | 'count'>> = this._aggregates.asReadonly();\n\n /**\n * Set or clear the aggregate function for a column.\n * Pass `null` to remove the aggregate (hides the footer cell for that column).\n */\n setAggregate(field: string, fn: 'sum' | 'avg' | 'min' | 'max' | 'count' | null): void {\n this._aggregates.update(a => {\n const next = { ...a };\n if (fn === null) delete next[field];\n else next[field] = fn;\n return next;\n });\n }\n\n // ── Undo / redo history ────────────────────────────────────────────────────\n\n private readonly _history = signal<HistoryItem[]>([]);\n private readonly _historyPointer = signal<number>(-1);\n private static readonly MAX_HISTORY = 100;\n\n /** `true` when there is at least one edit that can be undone. */\n readonly canUndo = computed(() => this._historyPointer() >= 0);\n\n /** `true` when there is at least one edit that can be re-applied. */\n readonly canRedo = computed(() => this._historyPointer() < this._history().length - 1);\n\n /**\n * Record a committed cell edit in the history.\n * Calling this discards any redo entries that came after the current pointer.\n * Called automatically by the grid after every cell commit.\n */\n pushEdit(entry: HistoryEntry): void {\n this.pushHistoryItem(entry);\n }\n\n /** Record a multi-cell edit as one undo/redo step. */\n pushEditBatch(entries: HistoryEntry[]): void {\n if (entries.length === 0) return;\n this.pushHistoryItem(entries.length === 1 ? entries[0] : [...entries]);\n }\n\n private pushHistoryItem(item: HistoryItem): void {\n const pointer = this._historyPointer();\n const base = this._history().slice(0, pointer + 1);\n base.push(item);\n const trimmed = base.length > AgridControl.MAX_HISTORY\n ? base.slice(base.length - AgridControl.MAX_HISTORY)\n : base;\n this._history.set(trimmed);\n this._historyPointer.set(trimmed.length - 1);\n }\n\n /**\n * Move one step back in history and return the entry to reverse, or `null` if\n * already at the beginning. The caller is responsible for applying `oldValue`\n * back to the data source.\n */\n undo(): HistoryItem | null {\n const p = this._historyPointer();\n if (p < 0) return null;\n this._historyPointer.set(p - 1);\n return this._history()[p];\n }\n\n /**\n * Move one step forward in history and return the entry to re-apply, or `null`\n * if already at the end. The caller is responsible for applying `newValue` back\n * to the data source.\n */\n redo(): HistoryItem | null {\n const p = this._historyPointer();\n const h = this._history();\n if (p >= h.length - 1) return null;\n this._historyPointer.set(p + 1);\n return h[p + 1];\n }\n\n /** Clear the entire undo/redo history. */\n clearHistory(): void {\n this._history.set([]);\n this._historyPointer.set(-1);\n }\n\n /**\n * Reactive map of `field → pixel width`.\n * Only fields whose width was explicitly overridden are present; the grid falls\n * back to `ColDef.width` for fields not in this map.\n */\n readonly columnWidths: Signal<Record<string, number>> = this._columnWidths.asReadonly();\n\n /**\n * Reactive map of `field → ColumnFilter`.\n * Only fields with at least one active filter/sort condition are present.\n */\n readonly filters: Signal<Record<string, ColumnFilter>> = this._filters.asReadonly();\n\n // ── Column widths ──────────────────────────────────────────────────────────\n\n /**\n * Return the effective width for a column, falling back to `defaultWidth`\n * if no override exists.\n */\n getColumnWidth(field: string, defaultWidth: number): number {\n return this._columnWidths()[field] ?? defaultWidth;\n }\n\n /**\n * Set the width for a column. Enforces a minimum of 40 px.\n * Called by the grid when the user drags a resize handle.\n */\n setColumnWidth(field: string, width: number): void {\n this._columnWidths.update(w => ({ ...w, [field]: Math.max(40, width) }));\n }\n\n // ── Filters & sort ─────────────────────────────────────────────────────────\n\n /**\n * Return the current filter state for a field.\n * Returns a default (inactive) filter when no state is stored for the field.\n */\n getFilter(field: string): ColumnFilter {\n return this._filters()[field] ?? { text: '', selectedValues: null, sort: null };\n }\n\n /**\n * Set the free-text filter for a column.\n * An empty string removes the text filter for that column.\n */\n setTextFilter(field: string, text: string): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...this.getFilter(field), text },\n }));\n }\n\n /**\n * Set the value-picker selection for a column.\n * Pass `null` to show all values (clear the value filter).\n */\n setSelectedValues(field: string, values: string[] | null): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...this.getFilter(field), selectedValues: values },\n }));\n }\n\n /** Ordered list of sorted field names, from highest to lowest priority. */\n readonly sortOrder: Signal<string[]> = this._sortOrder.asReadonly();\n\n /** Return the 1-based sort priority of a field, or `0` if it is not sorted. */\n getSortPriority(field: string): number {\n const idx = this._sortOrder().indexOf(field);\n return idx === -1 ? 0 : idx + 1;\n }\n\n /**\n * Set the sort direction for a column, clearing all other sorts.\n * Pass `null` to remove the sort entirely.\n * For multi-column sort use {@link addSort}.\n */\n setSort(field: string, sort: 'asc' | 'desc' | null): void {\n this._filters.update(f => {\n const next: Record<string, ColumnFilter> = {};\n for (const [k, v] of Object.entries(f)) {\n next[k] = k === field ? { ...v, sort } : { ...v, sort: null };\n }\n if (!next[field]) next[field] = { text: '', selectedValues: null, sort };\n return next;\n });\n this._sortOrder.set(sort ? [field] : []);\n }\n\n /**\n * Add a column to the multi-sort stack or update its direction.\n * If the column is already sorted, only its direction is updated (priority unchanged).\n * If not yet sorted, it is appended as the lowest-priority sort key.\n */\n addSort(field: string, sort: 'asc' | 'desc'): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...(f[field] ?? { text: '', selectedValues: null }), sort },\n }));\n this._sortOrder.update(order =>\n order.includes(field) ? order : [...order, field]\n );\n }\n\n /**\n * Remove all active filters and sort for a single column.\n */\n clearFilter(field: string): void {\n this._filters.update(f => {\n const next = { ...f };\n delete next[field];\n return next;\n });\n this._sortOrder.update(o => o.filter(f => f !== field));\n }\n\n /** Remove all active filters and sorts for every column. */\n clearAllFilters(): void {\n this._filters.set({});\n this._sortOrder.set([]);\n }\n\n /**\n * Return `true` when the given field has any active filter or sort.\n * Useful for showing a visual indicator on the column header.\n */\n hasActiveFilter(field: string): boolean {\n const f = this.getFilter(field);\n return !!(f.text || f.selectedValues !== null || f.sort);\n }\n\n /** Return `true` when ANY column has an active filter or sort. */\n hasAnyActiveFilter(): boolean {\n return Object.values(this._filters()).some(\n f => f.text || f.selectedValues !== null || f.sort\n );\n }\n\n // ── Serialization ──────────────────────────────────────────────────────────\n\n /** Serialize current state to a plain object suitable for JSON storage. */\n toJSON(): AgridControlState {\n return {\n columnWidths: { ...this._columnWidths() },\n filters: { ...this._filters() },\n allowRowReorder: this._allowRowReorder(),\n groupByField: this._groupByField() ?? undefined,\n hiddenColumns: [...this._hiddenColumns()],\n columnOrder: [...this._columnOrder()],\n pinnedColumns: [...this._pinnedColumns()],\n pinnedRightColumns: [...this._pinnedRightColumns()],\n pageSize: this._pageSize(),\n currentPage: this._currentPage(),\n totalRows: this._totalRows(),\n aggregates: { ...this._aggregates() },\n sortOrder: [...this._sortOrder()],\n };\n }\n\n /** Restore an `AgridControl` from a previously serialized state. */\n static fromJSON(state: Partial<AgridControlState>): AgridControl {\n return new AgridControl(state);\n }\n}\n","import { Signal, WritableSignal, isWritableSignal, linkedSignal, signal } from '@angular/core';\n\n/**\n * Signal-based data container shared between the grid and the host component.\n *\n * Both the grid and the host component hold a reference to the same `AgridDataSource`\n * instance. Mutations made by either side (e.g. the grid calling `patchRow` when a cell\n * is committed, or the host calling `setData` to load fresh data) are immediately reflected\n * in the grid because {@link rows} is a readonly Angular signal.\n *\n * @example\n * ```ts\n * readonly ds = new AgridDataSource(generateRows(1000));\n *\n * // Later — update one row from outside the grid:\n * this.ds.patchRow(5, { salary: 99000 });\n * ```\n */\nexport class AgridDataSource<T extends object = any> {\n private readonly _linkedRows = signal<Signal<T[]> | null>(null);\n private readonly _rows = linkedSignal<T[]>(() => this._linkedRows()?.() ?? []);\n private _writableLinkedRows: WritableSignal<T[]> | null = null;\n private readonly _rowAdded = signal<{ index: number; sequence: number } | null>(null);\n private _changeSequence = 0;\n\n /**\n * @param initialData Rows to seed the data source with.\n * The array is shallow-copied so external mutations do not affect the source.\n */\n constructor(initialData: T[] = []) {\n this._rows.set([...initialData]);\n }\n\n /**\n * Readonly signal of the current row array.\n * Read it inside Angular templates or `computed()` to react to changes automatically.\n */\n readonly rows: Signal<T[]> = this._rows.asReadonly();\n\n /** Latest row insertion, used by attached grids to reveal the inserted row. */\n readonly rowAdded: Signal<{ index: number; sequence: number } | null> =\n this._rowAdded.asReadonly();\n\n /**\n * Link an external row signal to this data source.\n *\n * Whenever `source` changes, its array becomes the current datasource value without an\n * intermediate effect or array copy. If `source` is writable, datasource mutations are written\n * back to it automatically. Mutations remain local when linking a readonly signal.\n */\n linkSignal(source: Signal<T[]>): void {\n this._writableLinkedRows = isWritableSignal(source)\n ? source as WritableSignal<T[]>\n : null;\n this._linkedRows.set(source);\n }\n\n /**\n * Replace the entire row array.\n * Triggers a full grid re-render via the signal.\n */\n setData(rows: T[]): void {\n this.setRows([...rows]);\n }\n\n /**\n * Overwrite the row at `index` with a new row object.\n * Use {@link patchRow} when you only want to change specific fields.\n */\n updateRow(index: number, row: T): void {\n this.updateRows(rows => {\n const next = [...rows];\n next[index] = row;\n return next;\n });\n }\n\n /**\n * Merge `patch` into the existing row at `index`, leaving other fields untouched.\n * The grid calls this internally when a cell edit is committed.\n */\n patchRow(index: number, patch: Partial<T>): void {\n this.updateRows(rows => {\n const next = [...rows];\n next[index] = { ...next[index], ...patch } as T;\n return next;\n });\n }\n\n /**\n * Insert a row into the data source and return the index at which it was inserted.\n *\n * @param row The row object to insert.\n * @param atIndex Optional insertion index. Defaults to the end of the array.\n * @returns The index the row was inserted at.\n */\n addRow(row: T, atIndex?: number): number {\n let insertedAt!: number;\n this.updateRows(rows => {\n if (atIndex === undefined) {\n insertedAt = rows.length;\n return [...rows, row];\n }\n insertedAt = atIndex;\n const next = [...rows];\n next.splice(atIndex, 0, row);\n return next;\n });\n this._rowAdded.set({ index: insertedAt, sequence: ++this._changeSequence });\n return insertedAt;\n }\n\n /**\n * Remove the row at `index`.\n * The grid adjusts `selectedCell` and `editingCell` internally when a deletion occurs\n * via the control column context menu.\n */\n removeRow(index: number): void {\n this.updateRows(rows => rows.filter((_, i) => i !== index));\n }\n\n /**\n * Move the row at `from` to position `to` (insert-before semantics).\n * Designed to be called directly from a `(rowReorder)` handler:\n * ```ts\n * onReorder(e: RowReorderEvent) { this.ds.moveRow(e.oldIndex, e.newIndex); }\n * ```\n */\n moveRow(from: number, to: number): void {\n if (from === to) return;\n this.updateRows(rows => {\n const arr = [...rows];\n const [item] = arr.splice(from, 1);\n arr.splice(to > from ? to - 1 : to, 0, item);\n return arr;\n });\n }\n\n /** Return the current row at `index` (non-reactive snapshot). */\n getRow(index: number): T {\n return this._rows()[index];\n }\n\n /** Current number of rows (non-reactive snapshot). */\n get length(): number {\n return this._rows().length;\n }\n\n private updateRows(update: (rows: T[]) => T[]): void {\n this.setRows(update(this._rows()));\n }\n\n private setRows(rows: T[]): void {\n this._writableLinkedRows?.set(rows);\n this._rows.set(rows);\n }\n}\n","import { signal, WritableSignal } from '@angular/core';\nimport { AgridControl } from './agrid-control';\nimport { AgridDataSource } from './agrid-datasource';\nimport { AgridLocaleTextOverrides } from './agrid-localization';\nimport {\n AGridOptions,\n AgridTreeConfig,\n CellContextMenuItem,\n ColDef,\n GroupAction,\n HeaderGroup,\n} from './agrid.types';\n\n/** Configuration used to create an {@link AgridProvider}. */\nexport interface AgridProviderConfig<T extends object = any> extends Partial<AGridOptions> {\n /** Row data source. A new empty data source is created when omitted. */\n datasource?: AgridDataSource<T>;\n /** Stateful grid control. A default control is created when omitted. */\n control?: AgridControl;\n /** Initial column definitions in display order. */\n columns?: ColDef<T>[];\n /** Labels used by columns with a matching `group` identifier. */\n headerGroups?: HeaderGroup[];\n /**\n * Render rows as a hierarchical tree. When set, rows are nested by the configured\n * parent/child accessors and an expand/collapse twisty is shown on `treeField`.\n * Mutually exclusive with grouping and pagination.\n */\n treeConfig?: AgridTreeConfig<T>;\n /** Row height in pixels. Must be fixed for CDK virtual scroll. @default 32 */\n rowHeight?: number;\n /** Minimum height of the grid host element (e.g. `'200px'`). */\n minHeight?: string;\n /** Maximum height of the grid host element (e.g. `'500px'`). */\n maxHeight?: string;\n /** Show a `+ Add row` placeholder at the bottom. */\n allowAddRows?: boolean;\n /** Automatically insert a blank row when navigating past the last real row. */\n autoAddRows?: boolean;\n /** Show a 24 px control column with a drag handle and right-click context menu. */\n showControlColumn?: boolean;\n /** Show row-marking checkboxes in a 48 px control column for clipboard inclusion. @default false */\n enableRowMarking?: boolean;\n /** Show the sidebar panel. */\n showSidebar?: boolean;\n /** Automatically open the detail panel when a row is selected. */\n autoOpenDetail?: boolean;\n /**\n * Emit filter and sort changes for server processing instead of applying them locally.\n * The Excel-style value picker is hidden in this mode. @default false\n */\n serverSideFiltering?: boolean;\n /** Delay before emitting server-side text filter changes. Set to `0` to disable. @default 300 */\n filterDebounceMs?: number;\n /**\n * Sorting behavior: one active column, multiple columns, or disabled entirely.\n * @default 'multi'\n */\n sortOption?: 'single' | 'multi' | 'none';\n /**\n * Row selection mode.\n * - `'none'` — no selection (default)\n * - `'single'` — click to select/deselect\n * - `'multi'` — Ctrl+click toggles, Shift+click extends range, click+drag sweeps\n */\n rowSelection?: 'single' | 'multi' | 'none';\n /** Returns a short description string shown next to the group label. */\n groupDescription?: ((label: string) => string) | null;\n /** Actions shown in the group header's `⋮` menu. */\n groupActions?: GroupAction[];\n /**\n * Extra items appended to the cell right-click context menu.\n * Pass `null` entries to insert separator lines.\n */\n cellMenuItems?: (CellContextMenuItem<T> | null)[];\n /** Shade every other row slightly for easier reading. @default false */\n zebraStripes?: boolean;\n /** Show a color marker on cells changed through grid editing. @default false */\n showChangedCellIndicator?: boolean;\n /** Ask for confirmation before grid row-delete actions. @default false */\n confirmRowDelete?: boolean;\n /** Make the entire grid read-only. @default false */\n readonly?: boolean;\n\n /** Restrict editing to the sidebar editor instead of inline cells. */\n useSidebarEditor?: boolean;\n\n /** Show a loading overlay over the grid body. @default false */\n loading?: boolean;\n /** Message shown when the grid has no rows to display. */\n emptyText?: string;\n}\n\n/**\n * Bundles a grid's data source, control state, columns, and display options.\n *\n * Create one provider per independent grid instance. A provider may be selected\n * from an array when a component renders multiple grids.\n */\nexport class AgridProvider<T extends object = any> {\n /** Mutable row data consumed by the grid. */\n datasource: AgridDataSource<T>;\n /** Runtime UI state and imperative grid controls. */\n control: AgridControl;\n /** Reactive column definitions in display order. */\n readonly columns: WritableSignal<ColDef<T>[]>;\n /** Header-group labels referenced by column definitions. */\n headerGroups: HeaderGroup[];\n /** Tree configuration, or `null` when the grid is not in tree mode. */\n treeConfig: AgridTreeConfig<T> | null;\n /** Shared grid options such as locale. */\n options: AGridOptions;\n\n private readonly _localizations = new Map<string, AgridLocaleTextOverrides>();\n\n /** Read-only view of registered per-locale text overrides. Used by the grid to resolve locale text. */\n get localizations(): ReadonlyMap<string, AgridLocaleTextOverrides> {\n return this._localizations;\n }\n\n /**\n * Register locale-specific label overrides. Call multiple times for multiple locales.\n * When `locale` is `'auto'`, the grid matches the browser language against registered locales\n * (exact match first, then primary-language match, e.g. `'fr'` matches a browser locale of `'fr-FR'`).\n *\n * @example\n * provider.addLocalization('fr-FR', { addRow: 'Ajouter une ligne', noRows: 'Aucune donnée' });\n */\n addLocalization(locale: string, overrides: AgridLocaleTextOverrides): this {\n this._localizations.set(locale, overrides);\n return this;\n }\n\n /** Fixed virtual-scroll row height in pixels. */\n rowHeight: number;\n /** Minimum CSS height of the grid host. */\n minHeight?: string;\n /** Maximum CSS height of the grid host. */\n maxHeight?: string;\n /** Whether the add-row placeholder is shown. */\n allowAddRows: boolean;\n /** Whether the control column is rendered. */\n showControlColumn: boolean;\n /** Whether rows can be marked for inclusion in clipboard copies. */\n enableRowMarking: boolean;\n /** Whether the sidebar is available. */\n showSidebar: boolean;\n /** Whether selecting a row automatically opens its detail panel. */\n autoOpenDetail: boolean;\n /** Whether filter and sort operations are delegated to the host. */\n serverSideFiltering: boolean;\n /** Delay before server-side filter events are emitted. */\n filterDebounceMs: number;\n /** Enabled sorting mode. */\n sortOption: 'single' | 'multi' | 'none';\n /** Toggle auto-add-rows without recreating the provider. @default signal(false) */\n readonly autoAddRows: WritableSignal<boolean>;\n /** Enabled row-selection mode. */\n rowSelection: 'single' | 'multi' | 'none';\n /** Optional description shown beside each group heading. */\n groupDescription: ((label: string) => string) | null;\n /** Actions available from group headers. */\n groupActions: GroupAction[];\n /** Additional cell context-menu entries. */\n cellMenuItems: (CellContextMenuItem<T> | null)[];\n /** Whether alternating data rows receive stripe styling. */\n zebraStripes: boolean;\n /** Whether committed cell changes receive a visual marker. */\n showChangedCellIndicator: boolean;\n /** Whether grid row-delete actions require in-row confirmation. */\n confirmRowDelete: boolean;\n /** Optional empty-state text override. */\n emptyText?: string;\n /** Whether edits are restricted to the sidebar editor. */\n useSidebarEditor: boolean;\n\n /** Toggle the loading overlay without recreating the provider. @default signal(false) */\n readonly loading: WritableSignal<boolean>;\n /** Toggle readonly mode without recreating the provider. @default signal(false) */\n readonly readonlyGrid: WritableSignal<boolean>;\n\n /** Creates a provider from the supplied data, state, columns, and display options. */\n constructor(config: AgridProviderConfig<T> = {}) {\n this.options = { locale: config.locale ?? 'auto' };\n this.datasource = config.datasource ?? new AgridDataSource<T>([]);\n this.control = config.control ?? new AgridControl({ allowRowReorder: true });\n this.columns = signal(config.columns ?? []);\n this.headerGroups = config.headerGroups ?? [];\n this.treeConfig = config.treeConfig ?? null;\n\n this.rowHeight = config.rowHeight ?? 32;\n this.minHeight = config.minHeight;\n this.maxHeight = config.maxHeight;\n this.allowAddRows = config.allowAddRows ?? false;\n this.autoAddRows = signal(config.autoAddRows ?? false);\n this.showControlColumn = config.showControlColumn ?? false;\n this.enableRowMarking = config.enableRowMarking ?? false;\n this.showSidebar = config.showSidebar ?? false;\n this.autoOpenDetail = config.autoOpenDetail ?? false;\n this.serverSideFiltering = config.serverSideFiltering ?? false;\n this.filterDebounceMs = Math.max(0, config.filterDebounceMs ?? 300);\n this.sortOption = config.sortOption ?? 'multi';\n this.rowSelection = config.rowSelection ?? 'none';\n this.groupDescription = config.groupDescription ?? null;\n this.groupActions = config.groupActions ?? [];\n this.cellMenuItems = config.cellMenuItems ?? [];\n this.zebraStripes = config.zebraStripes ?? false;\n this.showChangedCellIndicator = config.showChangedCellIndicator ?? false;\n this.confirmRowDelete = config.confirmRowDelete ?? false;\n this.emptyText = config.emptyText;\n this.loading = signal(config.loading ?? false);\n this.readonlyGrid = signal(config.readonly ?? false);\n this.useSidebarEditor = config.useSidebarEditor ?? false;\n }\n\n /** Returns the current reactive row array. */\n getGridData(): T[] {\n return this.datasource.rows();\n }\n}\n","import { Signal, computed } from '@angular/core';\nimport { AgridControl, ColumnFilter } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { AgridTreeConfig, ColDef, GridItem } from '../agrid.types';\nimport {\n applySortToIndices,\n applyTextAndValueFilters,\n buildGroupedItems,\n buildTreeItems,\n} from '../agrid.utils';\n\n/** Expanded labels associated with the current grouping field. @internal */\nexport interface AgridGroupExpansionState {\n field: string | null;\n labels: Set<string>;\n}\n\n/** Reactive inputs required by {@link AgridProjectionModel}. @internal */\nexport interface AgridProjectionOptions {\n dataSource: Signal<AgridDataSource>;\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n serverSideFiltering: Signal<boolean>;\n sortOption: Signal<'single' | 'multi' | 'none'>;\n allowAddRows: Signal<boolean>;\n autoAddRows: Signal<boolean>;\n expandedGroups: Signal<AgridGroupExpansionState>;\n /** Tree configuration, or `null` when the grid is not in tree mode. */\n treeConfig: Signal<AgridTreeConfig | null>;\n /** Expanded node ids when tree mode is active. */\n expandedTreeIds: Signal<Set<string | number>>;\n}\n\n/**\n * Computes the visible row projection and aggregate state from grid data and controls.\n * @internal\n */\nexport class AgridProjectionModel {\n constructor(private readonly opts: AgridProjectionOptions) {}\n\n /** Filtered and sorted source indices before pagination or grouping. */\n readonly filteredSortedIndices = computed<number[]>(() => {\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n const colMap = this.columnMap();\n let indices = rows.map((_, index) => index);\n\n if (!control || this.opts.serverSideFiltering()) return indices;\n\n const filters = control.filters();\n indices = applyTextAndValueFilters(\n rows,\n indices,\n filters,\n colMap,\n this.opts.locale(),\n );\n if (control.groupByField()) return indices;\n\n const sortEntries = this.sortEntries(filters);\n return sortEntries.length\n ? applySortToIndices(rows, indices, sortEntries, colMap, this.opts.locale())\n : indices;\n });\n\n /** Total filtered row count, unaffected by client-side pagination. */\n readonly filteredRowCount = computed(() => this.filteredSortedIndices().length);\n\n /** All source indices in active sort order, ignoring filters. Used for tree ancestor ordering. */\n private readonly allSortedIndices = computed<number[]>(() => {\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n const indices = rows.map((_, index) => index);\n if (!control || this.opts.serverSideFiltering()) return indices;\n const sortEntries = this.sortEntries(control.filters());\n return sortEntries.length\n ? applySortToIndices(rows, indices, sortEntries, this.columnMap(), this.opts.locale())\n : indices;\n });\n\n /** Total page count using server total when server-side pagination is active. */\n readonly totalPages = computed(() => {\n const control = this.opts.control();\n const pageSize = control?.pageSize() ?? 0;\n if (pageSize <= 0) return 1;\n const count = (control?.totalRows() ?? 0) > 0\n ? control!.totalRows()\n : this.filteredSortedIndices().length;\n return Math.max(1, Math.ceil(count / pageSize));\n });\n\n /** Whether client or server pagination controls should be rendered. */\n readonly showPagination = computed(() => {\n const control = this.opts.control();\n if (this.opts.treeConfig()) return false;\n return (control?.pageSize() ?? 0) > 0 && !control?.groupByField();\n });\n\n /** Whether at least one visible column has an aggregate footer. */\n readonly showFooter = computed(() => {\n const aggregates = this.opts.control()?.aggregates() ?? {};\n return this.opts.visibleColDefs().some(col => col.aggregate || aggregates[col.field]);\n });\n\n /** Aggregate values computed over all filtered rows, before pagination. */\n readonly footerValues = computed<Record<string, unknown>>(() => {\n const rows = this.opts.dataSource().rows();\n const indices = this.filteredSortedIndices();\n const controlAggregates = this.opts.control()?.aggregates() ?? {};\n const result: Record<string, unknown> = {};\n\n for (const col of this.opts.visibleColDefs()) {\n const aggregate: ColDef['aggregate'] = controlAggregates[col.field] ?? col.aggregate;\n if (!aggregate) continue;\n const values = indices.map(index => rows[index][col.field]);\n if (typeof aggregate === 'function') {\n result[col.field] = (aggregate as (values: unknown[]) => unknown)(values);\n continue;\n }\n\n const numbers = values.map(Number).filter(value => !Number.isNaN(value));\n switch (aggregate) {\n case 'sum':\n result[col.field] = numbers.reduce((sum, value) => sum + value, 0);\n break;\n case 'avg':\n result[col.field] = numbers.length\n ? numbers.reduce((sum, value) => sum + value, 0) / numbers.length\n : null;\n break;\n case 'min':\n result[col.field] = numbers.length ? Math.min(...numbers) : null;\n break;\n case 'max':\n result[col.field] = numbers.length ? Math.max(...numbers) : null;\n break;\n case 'count':\n result[col.field] = values.filter(value => value != null && value !== '').length;\n break;\n }\n }\n return result;\n });\n\n /** Filtered, sorted, paginated, and optionally grouped virtual-scroll items. */\n readonly filteredItems = computed<GridItem[]>(() => {\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n let indices = this.filteredSortedIndices();\n\n // Tree mode takes precedence over grouping/pagination: the already filtered-and-sorted\n // indices are flattened into a hierarchy honoring the expanded-id set.\n const treeConfig = this.opts.treeConfig();\n if (treeConfig) {\n const expandedIds = this.opts.expandedTreeIds();\n\n // When a text/value filter is active, keep the ancestors of every match visible (and\n // force their path open) so deep matches don't vanish under filtered-out parents.\n const filters = control?.filters() ?? {};\n const filterActive = !this.opts.serverSideFiltering()\n && Object.values(filters).some(f => f.text || f.selectedValues !== null);\n\n if (filterActive && treeConfig.keepAncestorsOnFilter !== false) {\n const { getId, getParentId } = treeConfig;\n const idToIndex = new Map<string | number, number>();\n rows.forEach((row, index) => idToIndex.set(getId(row), index));\n\n const visible = new Set<number>(indices);\n const forced = new Set<string | number>();\n for (const matched of indices) {\n let parentId = getParentId(rows[matched]);\n while (parentId != null && idToIndex.has(parentId)) {\n const parentIndex = idToIndex.get(parentId)!;\n forced.add(parentId);\n if (visible.has(parentIndex)) break; // chain already added by an earlier match\n visible.add(parentIndex);\n parentId = getParentId(rows[parentIndex]);\n }\n }\n\n const ordered = this.allSortedIndices().filter(index => visible.has(index));\n const items = buildTreeItems(rows, ordered, treeConfig, expandedIds, forced);\n this.appendAddRow(items);\n return items;\n }\n\n const items = buildTreeItems(rows, indices, treeConfig, expandedIds);\n this.appendAddRow(items);\n return items;\n }\n\n if (control) {\n const groupField = control.groupByField();\n const pageSize = control.pageSize();\n const serverPagination = control.totalRows() > 0;\n if (pageSize > 0 && !serverPagination && !groupField) {\n const page = Math.max(1, Math.min(control.currentPage(), this.totalPages()));\n indices = indices.slice((page - 1) * pageSize, page * pageSize);\n }\n\n if (groupField) {\n const expansion = this.opts.expandedGroups();\n const expandedLabels = expansion.field === groupField\n ? expansion.labels\n : new Set<string>();\n const filters = control.filters();\n const sortEntries = this.opts.serverSideFiltering()\n ? []\n : this.sortEntries(filters);\n const items = buildGroupedItems(\n rows,\n indices,\n groupField,\n this.columnMap(),\n sortEntries,\n expandedLabels,\n this.opts.locale(),\n );\n this.appendAddRow(items);\n return items;\n }\n }\n\n const items: GridItem[] = indices.map(originalIndex => ({\n row: rows[originalIndex],\n originalIndex,\n }));\n this.appendAddRow(items);\n return items;\n });\n\n /** Returns sorted fields after applying the configured sorting mode. */\n effectiveSortOrder(): string[] {\n const option = this.opts.sortOption();\n if (option === 'none') return [];\n const order = this.opts.control()?.sortOrder() ?? [];\n return option === 'single' ? order.slice(-1) : order;\n }\n\n private columnMap(): Map<string, ColDef> {\n return new Map(this.opts.colDefs().map(col => [col.field, col]));\n }\n\n private sortEntries(filters: Record<string, ColumnFilter>): [string, ColumnFilter][] {\n return this.effectiveSortOrder()\n .map(field => [field, filters[field]] as [string, ColumnFilter])\n .filter(([, filter]) => !!filter?.sort);\n }\n\n private appendAddRow(items: GridItem[]): void {\n if (this.opts.allowAddRows() && !this.opts.autoAddRows()) items.push(null);\n }\n}\n","import { DestroyRef, Signal, WritableSignal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { AgridControl, HistoryEntry } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridEditEvent, GridItem } from '../agrid.types';\nimport { isDataRowItem } from '../agrid.utils';\n\n/** Rectangular bounds in projected row and visible column coordinates. @internal */\nexport type VisibleCellBounds = {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridRangeController}. @internal */\nexport interface AgridRangeControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n isCellEditable: (col: ColDef) => boolean;\n cancelEdit: () => void;\n findDisplayIndex: (originalIndex: number) => number;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n onCellEdit: (event: GridEditEvent) => void;\n}\n\n/** Owns cell-range calculations and fill-handle drag/application behavior. @internal */\nexport class AgridRangeController {\n readonly fillPreviewBounds = signal<VisibleCellBounds | null>(null);\n private fillDragSource: VisibleCellBounds | null = null;\n\n constructor(\n private readonly opts: AgridRangeControllerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this.cancelFill());\n }\n\n /** Extends the current range focus to a source row and visible column. */\n extendTo(rowIndex: number, colIndex: number): void {\n const selected = this.opts.selectedCell();\n const anchor = this.opts.selectedRange()?.anchor ?? selected ?? { rowIndex, colIndex };\n const focus = { rowIndex, colIndex };\n this.opts.selectedCell.set(focus);\n this.opts.selectedRange.set({ anchor, focus });\n }\n\n /** Returns selected range bounds in projected display coordinates. */\n getVisibleRangeBounds(): VisibleCellBounds | null {\n const range = this.opts.selectedRange();\n if (!range) return null;\n const anchorDisplayIndex = this.opts.findDisplayIndex(range.anchor.rowIndex);\n const focusDisplayIndex = this.opts.findDisplayIndex(range.focus.rowIndex);\n if (anchorDisplayIndex < 0 || focusDisplayIndex < 0) return null;\n return {\n rowStart: Math.min(anchorDisplayIndex, focusDisplayIndex),\n rowEnd: Math.max(anchorDisplayIndex, focusDisplayIndex),\n colStart: Math.min(range.anchor.colIndex, range.focus.colIndex),\n colEnd: Math.max(range.anchor.colIndex, range.focus.colIndex),\n };\n }\n\n /** Returns range bounds, falling back to the active cell. */\n getActiveSelectionBounds(): VisibleCellBounds | null {\n const range = this.getVisibleRangeBounds();\n if (range) return range;\n const selected = this.opts.selectedCell();\n if (!selected) return null;\n const displayIndex = this.opts.findDisplayIndex(selected.rowIndex);\n if (displayIndex < 0) return null;\n return {\n rowStart: displayIndex,\n rowEnd: displayIndex,\n colStart: selected.colIndex,\n colEnd: selected.colIndex,\n };\n }\n\n /** Returns whether a cell is inside the selected range. */\n isRangeSelected(originalIndex: number, colIndex: number): boolean {\n const range = this.getVisibleRangeBounds();\n if (!range) return false;\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n return displayIndex >= range.rowStart && displayIndex <= range.rowEnd\n && colIndex >= range.colStart && colIndex <= range.colEnd;\n }\n\n /** Returns whether a cell owns the selection's fill handle. */\n isFillHandleCell(originalIndex: number, colIndex: number): boolean {\n const bounds = this.getActiveSelectionBounds();\n if (!bounds) return false;\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n return displayIndex === bounds.rowEnd && colIndex === bounds.colEnd;\n }\n\n /** Returns whether a cell is inside the pending fill extension. */\n isFillPreviewCell(originalIndex: number, colIndex: number): boolean {\n const source = this.fillDragSource;\n const target = this.fillPreviewBounds();\n if (!source || !target) return false;\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n const insideTarget = displayIndex >= target.rowStart && displayIndex <= target.rowEnd\n && colIndex >= target.colStart && colIndex <= target.colEnd;\n const insideSource = displayIndex >= source.rowStart && displayIndex <= source.rowEnd\n && colIndex >= source.colStart && colIndex <= source.colEnd;\n return insideTarget && !insideSource;\n }\n\n /** Starts a fill-handle drag from the active selection corner. */\n startFill(event: PointerEvent, originalIndex: number, colIndex: number): void {\n if (event.button !== 0 || !this.isFillHandleCell(originalIndex, colIndex)) return;\n if (!this.isFillHandleHit(event)) return;\n const bounds = this.getActiveSelectionBounds();\n if (!bounds) return;\n event.preventDefault();\n event.stopPropagation();\n this.opts.cancelEdit();\n this.fillDragSource = bounds;\n this.fillPreviewBounds.set(null);\n this.browser.addDocumentListener('pointermove', this.fillDragMove);\n this.browser.addDocumentListener('pointerup', this.fillDragUp);\n this.browser.addDocumentListener('pointercancel', this.fillDragCancel);\n }\n\n /** Repeats source values across the target range as one history operation. */\n applyFill(source: VisibleCellBounds, target: VisibleCellBounds): void {\n const items = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const sourceRows = this.getDataDisplayIndices(source.rowStart, source.rowEnd);\n const targetRows = this.getDataDisplayIndices(target.rowStart, target.rowEnd);\n if (sourceRows.length === 0 || targetRows.length === 0) return;\n\n const sourceValues = sourceRows.map(displayIndex => {\n const item = items[displayIndex];\n return isDataRowItem(item)\n ? cols.slice(source.colStart, source.colEnd + 1).map(col => item.row[col.field])\n : [];\n });\n\n let lastPosition: CellPosition | null = null;\n const historyEntries: HistoryEntry[] = [];\n for (let rowOffset = 0; rowOffset < targetRows.length; rowOffset++) {\n const displayIndex = targetRows[rowOffset];\n const item = items[displayIndex];\n if (!isDataRowItem(item)) continue;\n for (let colIndex = target.colStart; colIndex <= target.colEnd; colIndex++) {\n const insideSource = displayIndex >= source.rowStart && displayIndex <= source.rowEnd\n && colIndex >= source.colStart && colIndex <= source.colEnd;\n if (insideSource) continue;\n const col = cols[colIndex];\n if (!col || !this.opts.isCellEditable(col)) continue;\n const sourceRowIndex = rowOffset % sourceValues.length;\n const sourceRowValues = sourceValues[sourceRowIndex];\n if (sourceRowValues.length === 0) continue;\n const sourceColIndex = (colIndex - source.colStart) % sourceRowValues.length;\n const oldValue = this.opts.dataSource().getRow(item.originalIndex)[col.field];\n const newValue = sourceRowValues[sourceColIndex];\n if (oldValue === newValue) continue;\n\n this.opts.dataSource().patchRow(item.originalIndex, { [col.field]: newValue });\n historyEntries.push({\n rowIndex: item.originalIndex,\n field: col.field,\n oldValue,\n newValue,\n });\n this.opts.onCellEdit({\n position: { rowIndex: item.originalIndex, colIndex },\n field: col.field,\n oldValue,\n newValue,\n });\n lastPosition = { rowIndex: item.originalIndex, colIndex };\n }\n }\n\n this.opts.control()?.pushEditBatch(historyEntries);\n const targetItem = items[target.rowEnd];\n if (isDataRowItem(targetItem)) {\n this.opts.selectedCell.set({ rowIndex: targetItem.originalIndex, colIndex: target.colEnd });\n this.opts.selectedRange.set({\n anchor: this.positionFromVisibleCell(source.rowStart, source.colStart),\n focus: { rowIndex: targetItem.originalIndex, colIndex: target.colEnd },\n });\n } else if (lastPosition) {\n this.opts.selectedCell.set(lastPosition);\n }\n }\n\n private readonly fillDragMove = (event: PointerEvent): void => {\n const source = this.fillDragSource;\n if (!source) return;\n const target = this.getHoveredCellPosition(event.clientX, event.clientY);\n if (!target) {\n this.fillPreviewBounds.set(null);\n return;\n }\n const targetDisplayIndex = this.opts.findDisplayIndex(target.rowIndex);\n if (targetDisplayIndex < 0) {\n this.fillPreviewBounds.set(null);\n return;\n }\n const rowEnd = Math.max(source.rowEnd, targetDisplayIndex);\n const colEnd = Math.max(source.colEnd, target.colIndex);\n if (rowEnd === source.rowEnd && colEnd === source.colEnd) {\n this.fillPreviewBounds.set(null);\n return;\n }\n this.fillPreviewBounds.set({\n rowStart: source.rowStart,\n rowEnd,\n colStart: source.colStart,\n colEnd,\n });\n this.opts.scrollToCell(rowEnd, colEnd);\n };\n\n private readonly fillDragUp = (): void => {\n this.stopFillListeners();\n const source = this.fillDragSource;\n const target = this.fillPreviewBounds();\n this.fillDragSource = null;\n this.fillPreviewBounds.set(null);\n if (source && target) this.applyFill(source, target);\n };\n\n private readonly fillDragCancel = (): void => this.cancelFill();\n\n private cancelFill(): void {\n this.stopFillListeners();\n this.fillDragSource = null;\n this.fillPreviewBounds.set(null);\n }\n\n private stopFillListeners(): void {\n this.browser.removeDocumentListener('pointermove', this.fillDragMove);\n this.browser.removeDocumentListener('pointerup', this.fillDragUp);\n this.browser.removeDocumentListener('pointercancel', this.fillDragCancel);\n }\n\n private isFillHandleHit(event: PointerEvent): boolean {\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n return event.clientX >= rect.right - 8 && event.clientY >= rect.bottom - 8;\n }\n\n private getHoveredCellPosition(x: number, y: number): CellPosition | null {\n for (const element of this.browser.elementsFromPoint(x, y)) {\n const cell = (element as HTMLElement)\n .closest<HTMLElement>('agrid-cell[data-cell-row][data-cell-col]');\n if (!cell) continue;\n const rowIndex = Number(cell.dataset['cellRow']);\n const colIndex = Number(cell.dataset['cellCol']);\n if (Number.isFinite(rowIndex) && Number.isFinite(colIndex)) {\n return { rowIndex, colIndex };\n }\n }\n return null;\n }\n\n private getDataDisplayIndices(start: number, end: number): number[] {\n const items = this.opts.filteredItems();\n const indices: number[] = [];\n for (let displayIndex = start; displayIndex <= end; displayIndex++) {\n if (isDataRowItem(items[displayIndex])) indices.push(displayIndex);\n }\n return indices;\n }\n\n private positionFromVisibleCell(displayIndex: number, colIndex: number): CellPosition {\n const item = this.opts.filteredItems()[displayIndex];\n if (isDataRowItem(item)) return { rowIndex: item.originalIndex, colIndex };\n return this.opts.selectedCell() ?? { rowIndex: 0, colIndex };\n }\n}\n","import { Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridDataSource } from '../agrid-datasource';\nimport {\n CellPosition,\n ColDef,\n GridItem,\n RecordEditEvent,\n RowClickEvent,\n RowSelectEvent,\n} from '../agrid.types';\nimport { buildSelectionRange, getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Dependencies and callbacks required by {@link AgridRowController}. @internal */\nexport interface AgridRowControllerOptions {\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n markedRowIndices: Signal<ReadonlySet<number>>;\n rowSelection: Signal<'none' | 'single' | 'multi'>;\n selectedCell: WritableSignal<CellPosition | null>;\n editingCell: Signal<CellPosition | null>;\n insertRowAt: (index: number) => void;\n startDragSelect: (originalIndex: number) => void;\n onRowSelect: (event: RowSelectEvent | null) => void;\n onRowClick: (event: RowClickEvent) => void;\n onRowRemoved: (event: Pick<RecordEditEvent, 'index' | 'data'>) => void;\n onEditRowRemoved: (originalIndex: number) => void;\n closeFilterMenu: () => void;\n closeGroupActionsMenu: () => void;\n}\n\n/** Screen position and row targeted by the row context menu. @internal */\nexport type AgridRowContextMenu = { x: number; y: number; rowIndex: number };\n\n/** Screen position and cell data targeted by the cell context menu. @internal */\nexport type AgridCellContextMenu = {\n x: number;\n y: number;\n rowIndex: number;\n colIndex: number;\n field: string;\n value: unknown;\n row: Record<string, unknown>;\n};\n\n/**\n * Owns row selection, row/cell context menus, and row-level operations.\n * @internal\n */\nexport class AgridRowController {\n readonly contextMenu = signal<AgridRowContextMenu | null>(null);\n readonly cellContextMenu = signal<AgridCellContextMenu | null>(null);\n readonly selectedIndices = signal<Set<number>>(new Set());\n readonly selectedRowIndices: Signal<ReadonlySet<number>> =\n this.selectedIndices.asReadonly() as Signal<ReadonlySet<number>>;\n readonly selectedRowIndex = computed<number | null>(() => {\n const selected = this.selectedIndices();\n return selected.size > 0 ? [...selected][0] : null;\n });\n\n private selectionPivot: number | null = null;\n\n constructor(\n private readonly opts: AgridRowControllerOptions,\n private readonly browser = new AgridBrowserAdapter(),\n ) {}\n\n /** Returns whether the data-source row is currently selected. */\n isRowSelected(originalIndex: number): boolean {\n return this.selectedIndices().has(originalIndex);\n }\n\n /** Returns whether a virtual item is a selected data row. */\n isPinnedPaneRowSelected(item: GridItem): boolean {\n return isDataRowItem(item) && this.isRowSelected(item.originalIndex);\n }\n\n /** Clears all selected rows and emits the selection change. */\n clearSelection(): void {\n if (this.selectedIndices().size === 0) return;\n this.selectedIndices.set(new Set());\n this.opts.onRowSelect(null);\n }\n\n /** Applies pointer selection semantics for the configured selection mode. */\n selectFromPointer(event: PointerEvent, originalIndex: number, allowDragSelect: boolean): void {\n const mode = this.opts.rowSelection();\n if (mode === 'none' || event.button !== 0) return;\n\n if (mode === 'single') {\n const already = this.selectedIndices().has(originalIndex);\n this.selectedIndices.set(already ? new Set() : new Set([originalIndex]));\n this.emitSelection();\n return;\n }\n\n const ctrl = event.ctrlKey || event.metaKey;\n const shift = event.shiftKey;\n\n if (ctrl) {\n const next = new Set(this.selectedIndices());\n if (next.has(originalIndex)) next.delete(originalIndex);\n else next.add(originalIndex);\n this.selectedIndices.set(next);\n this.selectionPivot = originalIndex;\n this.emitSelection();\n } else if (shift && this.selectionPivot !== null) {\n this.selectedIndices.set(\n buildSelectionRange(this.selectionPivot, originalIndex, this.opts.filteredItems()),\n );\n this.emitSelection();\n } else {\n if (!(event.target instanceof HTMLSelectElement)) event.preventDefault();\n this.selectedIndices.set(new Set([originalIndex]));\n this.selectionPivot = originalIndex;\n if (allowDragSelect) this.opts.startDragSelect(originalIndex);\n else this.emitSelection();\n }\n }\n\n /** Emits a row click unless a cell edit is active. */\n clickRow(item: { row: Record<string, unknown>; originalIndex: number }): void {\n if (this.opts.editingCell()) return;\n this.opts.onRowClick({ row: item.row, originalIndex: item.originalIndex });\n }\n\n /** Opens the row context menu at the pointer position. */\n openRowContextMenu(event: MouseEvent, originalIndex: number): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenu.set({ x: event.clientX, y: event.clientY, rowIndex: originalIndex });\n }\n\n /** Closes the row context menu. */\n closeContextMenu(): void {\n this.contextMenu.set(null);\n }\n\n /** Opens the cell context menu and closes conflicting menus. */\n openCellContextMenu(\n event: MouseEvent,\n rowIndex: number,\n colIndex: number,\n col: ColDef,\n row: Record<string, unknown>,\n ): void {\n event.preventDefault();\n event.stopPropagation();\n this.closeContextMenu();\n this.opts.closeFilterMenu();\n this.opts.closeGroupActionsMenu();\n this.cellContextMenu.set({\n x: event.clientX,\n y: event.clientY,\n rowIndex,\n colIndex,\n field: col.field,\n value: row[col.field],\n row,\n });\n }\n\n /** Closes the cell context menu. */\n closeCellContextMenu(): void {\n this.cellContextMenu.set(null);\n }\n\n /** Copies a cell plus the same field from marked rows to the clipboard. */\n copyCellToClipboard(originalIndex: number, col: ColDef): void {\n const rows = this.opts.dataSource().rows();\n const text = this.copyIndices(originalIndex)\n .map(index => getDisplayForField(col, rows[index]?.[col.field], this.opts.locale()))\n .join('\\n');\n void this.browser.writeClipboard(text);\n this.closeCellContextMenu();\n }\n\n /** Copies a row plus all marked rows as tab-separated text. */\n copyRowToClipboard(originalIndex: number): void {\n const rows = this.opts.dataSource().rows();\n const cols = this.opts.visibleColDefs();\n const text = this.copyIndices(originalIndex)\n .map(index => cols\n .map(col => getDisplayForField(col, rows[index]?.[col.field], this.opts.locale()))\n .join('\\t'))\n .join('\\n');\n void this.browser.writeClipboard(text);\n this.closeCellContextMenu();\n }\n\n private copyIndices(primaryIndex: number): number[] {\n const length = this.opts.dataSource().length;\n const indices = [primaryIndex];\n for (const index of [...this.opts.markedRowIndices()].sort((a, b) => a - b)) {\n if (index !== primaryIndex && index >= 0 && index < length) indices.push(index);\n }\n return indices;\n }\n\n /** Inserts a row through the grid's central insertion callback. */\n insertRowAt(index: number): void {\n this.opts.insertRowAt(index);\n this.closeCellContextMenu();\n }\n\n /** Removes a row and reconciles selection and editing indices. */\n deleteRow(originalIndex: number): void {\n const removedRow = this.opts.dataSource().getRow(originalIndex);\n this.opts.dataSource().removeRow(originalIndex);\n\n const selectedCell = this.opts.selectedCell();\n if (selectedCell?.rowIndex === originalIndex) {\n this.opts.selectedCell.set(null);\n } else if (selectedCell && selectedCell.rowIndex > originalIndex) {\n this.opts.selectedCell.update(cell => cell ? { ...cell, rowIndex: cell.rowIndex - 1 } : null);\n }\n\n this.opts.onEditRowRemoved(originalIndex);\n\n if (this.selectedIndices().has(originalIndex)) {\n this.selectedIndices.update(indices => {\n const next = new Set(indices);\n next.delete(originalIndex);\n return next;\n });\n this.emitSelection();\n }\n this.contextMenu.set(null);\n this.opts.onRowRemoved({ index: originalIndex, data: removedRow });\n }\n\n /** Emits the current selected rows, or `null` when selection is empty. */\n emitSelection(): void {\n const indices = this.selectedIndices();\n if (indices.size === 0) {\n this.opts.onRowSelect(null);\n return;\n }\n const rows = this.opts.dataSource().rows();\n this.opts.onRowSelect({\n rows: [...indices].map(index => ({ row: rows[index], originalIndex: index })),\n });\n }\n}\n","import { Signal, computed, signal } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { AgridSidebarEdit } from './agrid-sidebar.component';\nimport { ColDef, GridEditEvent, ValueOption } from '../agrid.types';\nimport { coerceDateInputValue } from '../agrid.utils';\n\n/** Dependencies and callbacks required by {@link AgridSidebarController}. @internal */\nexport interface AgridSidebarControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n selectedRowIndex: Signal<number | null>;\n autoOpenDetail: Signal<boolean>;\n useSidebarEditor: Signal<boolean>;\n onFieldChange: (event: GridEditEvent) => void;\n onCellEdit: (event: GridEditEvent) => void;\n}\n\n/** Owns sidebar visibility, selected-row projection, and detail-panel edits. @internal */\nexport class AgridSidebarController {\n readonly open = signal(false);\n readonly tab = signal<'columns' | 'detail'>('columns');\n readonly row = computed<Record<string, unknown> | null>(() => {\n const index = this.opts.selectedRowIndex();\n return index === null ? null : this.opts.dataSource().rows()[index] ?? null;\n });\n readonly hiddenColumns = computed<ReadonlySet<string>>(\n () => this.opts.control()?.hiddenColumns() ?? new Set<string>(),\n );\n\n constructor(private readonly opts: AgridSidebarControllerOptions) {}\n\n /** Opens the detail tab when automatic detail display is enabled. */\n syncAutoOpen(): void {\n if (this.opts.autoOpenDetail() && this.opts.selectedRowIndex() !== null) {\n this.open.set(true);\n this.tab.set('detail');\n }\n }\n\n /** Toggles sidebar visibility without changing the active tab. */\n toggle(): void {\n this.open.update(value => !value);\n }\n\n /** Opens the sidebar. */\n openSidebar(): void {\n this.open.set(true);\n }\n\n /** Closes the sidebar. */\n closeSidebar(): void {\n this.open.set(false);\n }\n\n /** Selects a tab, or closes the sidebar when selecting its active tab. */\n selectTab(tab: 'columns' | 'detail'): void {\n if (this.open() && this.tab() === tab) {\n this.open.set(false);\n } else {\n this.tab.set(tab);\n this.open.set(true);\n }\n }\n\n /** Commits an edit emitted by the sidebar component. */\n edit(event: AgridSidebarEdit): void {\n this.commitEdit(event.field, event.col, event.value);\n }\n\n /** Returns the currently selected data-source row index. */\n selectedRowIndex(): number | null {\n return this.opts.selectedRowIndex();\n }\n\n /** Coerces and commits a sidebar field value to the selected row. */\n commitEdit(field: string, col: ColDef, stringValue: string): void {\n const index = this.opts.selectedRowIndex();\n if (index === null) return;\n let newValue: unknown = stringValue;\n if (col.type === 'number') {\n newValue = stringValue === '' ? null : Number(stringValue);\n } else if (col.type === 'date') {\n newValue = coerceDateInputValue(\n stringValue,\n this.opts.dataSource().getRow(index)[field],\n );\n } else if (col.values?.length) {\n const option = col.values.find(value =>\n typeof value === 'string'\n ? value === stringValue\n : String((value as ValueOption).value) === stringValue,\n );\n newValue = option === undefined\n ? stringValue\n : typeof option === 'string' ? option : (option as ValueOption).value;\n }\n\n const oldValue = this.opts.dataSource().getRow(index)[field];\n if (oldValue === newValue) return;\n this.opts.dataSource().patchRow(index, { [field]: newValue });\n const colIndex = this.opts.visibleColDefs().findIndex(column => column.field === field);\n this.opts.control()?.pushEdit({ rowIndex: index, field, oldValue, newValue });\n const event = {\n position: { rowIndex: index, colIndex },\n field,\n oldValue,\n newValue,\n };\n this.opts.onFieldChange(event);\n if (!this.opts.useSidebarEditor()) {\n this.opts.onCellEdit(event);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\nimport { getDateInputValue, getDisplayForField, looksLikeDate } from '../agrid.utils';\nimport { ColDef, HeaderGroup } from '../agrid.types';\n\n/** Field edit emitted by the sidebar detail form. @internal */\nexport interface AgridSidebarEdit {\n /** Data field being edited. */\n field: string;\n /** Column definition controlling value coercion and editability. */\n col: ColDef;\n /** Raw string value produced by the form control. */\n value: string;\n}\n\n/** Display and edit model for one sidebar detail field. @internal */\nexport interface AgridSidebarDetailField {\n /** Human-readable field label. */\n label: string;\n /** Formatted read-only display value. */\n value: string;\n /** Original value stored in the row. */\n rawValue: unknown;\n /** String value supplied to the field editor. */\n inputValue: string;\n /** Whether the corresponding grid column is hidden. */\n hidden: boolean;\n /** Whether the field can be edited in the current grid state. */\n editable: boolean;\n /** Column definition associated with the field. */\n col: ColDef;\n}\n\n/** Visibility change requested from a grouped sidebar column entry. @internal */\nexport interface AgridSidebarGroupToggle {\n /** Fields belonging to the selected header group. */\n fields: string[];\n /** Requested visibility for every field in the group. */\n visible: boolean;\n}\n\n/** Grouped or standalone entry rendered in the sidebar column tree. @internal */\nexport type AgridSidebarColumnEntry =\n | { kind: 'column'; col: ColDef }\n | { kind: 'group'; id: string; label: string; columns: ColDef[] };\n\n/** Sidebar view for column visibility and selected-row details. @internal */\n@Component({\n selector: 'agrid-sidebar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-sidebar.component.html',\n styleUrl: './agrid-sidebar.component.css',\n})\nexport class AgridSidebarComponent {\n open = input<boolean>(false);\n activeTab = input<'columns' | 'detail'>('columns');\n columns = input<ColDef[]>([]);\n headerGroups = input<HeaderGroup[]>([]);\n row = input<Record<string, unknown> | null>(null);\n hiddenColumns = input<ReadonlySet<string>>(new Set());\n locale = input<string | undefined>(undefined);\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n readonlyGrid = input<boolean>(false);\n useSidebarEditor = input<boolean>(false);\n\n close = output<void>();\n tabChange = output<'columns' | 'detail'>();\n toggleColumn = output<string>();\n toggleColumnGroup = output<AgridSidebarGroupToggle>();\n detailEdit = output<AgridSidebarEdit>();\n save = output<AgridSidebarDetailField[]>();\n\n readonly columnEntries = computed<AgridSidebarColumnEntry[]>(() => {\n const groupLabels = new Map(this.headerGroups().map(group => [group.id, group.label]));\n const entries: AgridSidebarColumnEntry[] = [];\n const groupedEntries = new Map<string, Extract<AgridSidebarColumnEntry, { kind: 'group' }>>();\n\n for (const col of this.columns()) {\n const groupId = col.group;\n const groupLabel = groupId ? groupLabels.get(groupId) : undefined;\n if (!groupId || !groupLabel) {\n entries.push({ kind: 'column', col });\n continue;\n }\n\n let entry = groupedEntries.get(groupId);\n if (!entry) {\n entry = { kind: 'group', id: groupId, label: groupLabel, columns: [] };\n groupedEntries.set(groupId, entry);\n entries.push(entry);\n }\n entry.columns.push(col);\n }\n\n return entries;\n });\n\n /** Whether every column in a group is currently visible. */\n isGroupVisible(columns: ColDef[]): boolean {\n const hidden = this.hiddenColumns();\n return columns.every(col => !hidden.has(col.field));\n }\n\n /** Whether a group contains both visible and hidden columns. */\n isGroupPartiallyVisible(columns: ColDef[]): boolean {\n const hidden = this.hiddenColumns();\n const visibleCount = columns.filter(col => !hidden.has(col.field)).length;\n return visibleCount > 0 && visibleCount < columns.length;\n }\n\n /** Emits a visibility request for all columns belonging to a group. */\n onGroupToggle(columns: ColDef[], event: Event): void {\n this.toggleColumnGroup.emit({\n fields: columns.map(col => col.field),\n visible: (event.target as HTMLInputElement).checked,\n });\n }\n\n readonly detailFields = computed<AgridSidebarDetailField[] | null>(() => {\n const row = this.row();\n if (!row) return null;\n const locale = this.locale();\n const readonlyGrid = this.readonlyGrid();\n const hiddenColumns = this.hiddenColumns();\n return this.columns().map(col => {\n const rawValue = row[col.field];\n let inputValue = String(rawValue ?? '');\n if (col.type === 'date' || looksLikeDate(rawValue)) {\n inputValue = getDateInputValue(rawValue);\n }\n return {\n label: col.header,\n value: getDisplayForField(col, rawValue, locale),\n rawValue,\n inputValue,\n hidden: hiddenColumns.has(col.field),\n editable: !readonlyGrid && col.editable !== false,\n col,\n };\n });\n });\n}\n","@if (open()) {\n <div class=\"ag-sidebar\" role=\"region\"\n [attr.aria-label]=\"activeTab() === 'columns' ? localeText().columns : localeText().detail\">\n <div class=\"ag-sidebar-header\">\n <span>{{ activeTab() === 'columns' ? localeText().columns : localeText().detail }}</span>\n <button class=\"ag-sidebar-close\" (click)=\"close.emit()\" [title]=\"localeText().close\"\n [attr.aria-label]=\"localeText().close\">✕</button>\n </div>\n\n @if (activeTab() === 'columns') {\n @for (entry of columnEntries(); track entry.kind === 'group' ? 'group-' + entry.id : 'column-' + entry.col.field) {\n @if (entry.kind === 'group') {\n <div class=\"ag-sidebar-group\">\n <label class=\"ag-sidebar-item ag-sidebar-group-label\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupVisible(entry.columns)\"\n [indeterminate]=\"isGroupPartiallyVisible(entry.columns)\"\n (change)=\"onGroupToggle(entry.columns, $event)\"\n />\n {{ entry.label }}\n </label>\n <div class=\"ag-sidebar-group-children\">\n @for (col of entry.columns; track col.field) {\n <label class=\"ag-sidebar-item ag-sidebar-group-child\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"!hiddenColumns().has(col.field)\"\n (change)=\"toggleColumn.emit(col.field)\"\n />\n {{ col.header }}\n </label>\n }\n </div>\n </div>\n } @else {\n <label class=\"ag-sidebar-item\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"!hiddenColumns().has(entry.col.field)\"\n (change)=\"toggleColumn.emit(entry.col.field)\"\n />\n {{ entry.col.header }}\n </label>\n }\n }\n } @else {\n @if (detailFields(); as fields) {\n @for (field of fields; track field.col.field) {\n <div class=\"ag-detail-field\">\n <span class=\"ag-detail-label\">\n {{ field.label }}\n @if (field.hidden) {\n <span class=\"ag-detail-hidden\">{{ localeText().hiddenColumn }}</span>\n }\n </span>\n @if ((field.editable || useSidebarEditor()) && field.col.values?.length) {\n <select\n class=\"ag-detail-input\"\n (change)=\"detailEdit.emit({\n field: field.col.field,\n col: field.col,\n value: $any($event.target).value\n })\"\n >\n @for (opt of field.col.values; track $index) {\n @if ($any(opt).value !== undefined) {\n <option [value]=\"$any(opt).value\" [selected]=\"$any(opt).value === field.rawValue\">\n {{ $any(opt).label }}\n </option>\n } @else {\n <option [value]=\"opt\" [selected]=\"opt === field.rawValue\">{{ opt }}</option>\n }\n }\n </select>\n } @else if (field.editable || useSidebarEditor()) {\n <input\n class=\"ag-detail-input\"\n [type]=\"field.col.type === 'number' ? 'number' : field.col.type === 'date' ? 'date' : 'text'\"\n [value]=\"field.inputValue\"\n (change)=\"detailEdit.emit({\n field: field.col.field,\n col: field.col,\n value: $any($event.target).value\n })\"\n />\n } @else {\n <span class=\"ag-detail-value\">{{ field.value }}</span>\n }\n </div>\n }\n @if (useSidebarEditor()) {\n <div class=\"ag-detail-field\">\n <button class=\"ag-button\" (click)=\"save.emit(fields)\">{{ localeText().save }}</button>\n </div>\n }\n } @else {\n <div class=\"ag-detail-empty\">{{ localeText().noRows }}</div>\n }\n }\n </div>\n}\n\n<div class=\"ag-sidebar-strip\">\n <button\n class=\"ag-sidebar-strip-btn\"\n [class.active]=\"open() && activeTab() === 'columns'\"\n [attr.aria-pressed]=\"open() && activeTab() === 'columns'\"\n (click)=\"tabChange.emit('columns')\"\n >{{ localeText().columns }}</button>\n <button\n class=\"ag-sidebar-strip-btn\"\n [class.active]=\"open() && activeTab() === 'detail'\"\n [attr.aria-pressed]=\"open() && activeTab() === 'detail'\"\n (click)=\"tabChange.emit('detail')\"\n >{{ localeText().detail }}</button>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Signal,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { AgridCellComponent } from './rendering/agrid-cell.component';\nimport { AgridBrowserAdapter } from './infrastructure/agrid-browser.adapter';\nimport { AgridClipboardHandler, CellRange } from './selection/agrid-clipboard.handler';\nimport { AgridColumnLayoutModel } from './columns/agrid-column-layout.model';\nimport { AgridColumnMenuComponent } from './columns/agrid-column-menu.component';\nimport { AgridColumnMenuController } from './columns/agrid-column-menu.controller';\nimport { AgridColumnReorderController } from './columns/agrid-column-reorder.controller';\nimport { AgridColumnSizingController } from './columns/agrid-column-sizing.controller';\nimport { AgridColumnStateService } from './columns/agrid-column-state.service';\nimport { AgridControl } from './agrid-control';\nimport { AgridDataSource } from './agrid-datasource';\nimport { AgridDragHandler } from './rows/agrid-drag.handler';\nimport { AgridEditController } from './editing/agrid-edit.controller';\nimport { AgridFindController } from './selection/agrid-find.controller';\nimport { AgridFindPanelComponent } from './selection/agrid-find-panel.component';\nimport { AgridGroupController } from './rows/agrid-group.controller';\nimport { AgridTreeController } from './rows/agrid-tree.controller';\nimport { AgridLocaleText, resolveAgridLocaleText, resolveLocale } from './agrid-localization';\nimport { AgridNavigationController } from './selection/agrid-navigation.controller';\nimport { AgridPresentationService } from './rendering/agrid-presentation.service';\nimport { AgridProvider } from './agrid-provider';\nimport { AgridProjectionModel } from './rows/agrid-projection.model';\nimport { AgridRangeController } from './selection/agrid-range.controller';\nimport { AgridCellContextMenu, AgridRowController } from './rows/agrid-row.controller';\nimport { AgridSidebarController } from './editing/agrid-sidebar.controller';\nimport {\n AgridSidebarComponent,\n AgridSidebarDetailField,\n AgridSidebarEdit,\n} from './editing/agrid-sidebar.component';\nimport {\n isDataRowItem as isDataRowItemFn,\n isGroupHeaderItem as isGroupHeaderItemFn,\n isTreeRowItem as isTreeRowItemFn,\n} from './agrid.utils';\nimport {\n AgridField, CellContextMenuItem, CellPosition, ColDef, FilterChangeEvent, GridEditEvent,\n GridItem, GroupAction, NewRecord, PageChangeEvent, RecordEditEvent, RowClickEvent,\n RowReorderEvent, RowSelectEvent, RowUpdateEvent, SortChangeEvent,\n} from './agrid.types';\n\n// Re-export for backward compatibility with existing imports of GridItem from this file.\nexport type { GridItem };\n\n/**\n * Excel-like data grid for Angular 21.\n *\n * ## Minimal setup\n * ```html\n * <agrid [provider]=\"gridProvider\" />\n * ```\n *\n * ### Keyboard shortcuts\n * | Key | Action |\n * |-----|--------|\n * | Arrow keys | Move selection |\n * | Tab / Shift+Tab | Move right / left (wraps rows) |\n * | Enter / F2 | Enter edit mode |\n * | Printable key | Enter edit mode with seeded character |\n * | Escape | Cancel edit |\n * | Tab / Enter (while editing) | Commit and move right / down |\n */\n@Component({\n selector: 'agrid',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ScrollingModule,\n AgridCellComponent,\n AgridColumnMenuComponent,\n AgridFindPanelComponent,\n AgridSidebarComponent,\n ],\n templateUrl: './agrid.component.html',\n styleUrl: './agrid.component.css',\n host: {\n '[class.ag-zebra]': 'zebraStripes()',\n '[style.min-height]': 'minHeight()',\n '[style.max-height]': 'maxHeight()',\n },\n})\nexport class AgridComponent<T extends object = any> {\n\n // ── Inputs ───────────────────────────────────────────────────────────────────\n\n /** Grid provider containing columns, data source, control, and options. */\n provider = input<AgridProvider<T>>(new AgridProvider<T>());\n\n // All display / behaviour options are read from the provider.\n readonly rowHeight = computed(() => this.provider().rowHeight);\n readonly minHeight = computed(() => this.provider().minHeight);\n readonly maxHeight = computed(() => this.provider().maxHeight);\n readonly allowAddRows = computed(() => this.provider().allowAddRows);\n readonly autoAddRows = computed(() => this.provider().autoAddRows());\n readonly enableRowMarking = computed(() => this.provider().enableRowMarking);\n readonly showControlColumn = computed(() =>\n this.provider().showControlColumn || this.enableRowMarking()\n );\n readonly controlColumnWidth = computed(() => this.enableRowMarking() ? 48 : 24);\n readonly showSidebar = computed(() => this.provider().showSidebar);\n readonly autoOpenDetail = computed(() => this.provider().autoOpenDetail);\n readonly serverSideFiltering = computed(() => this.provider().serverSideFiltering);\n readonly filterDebounceMs = computed(() => this.provider().filterDebounceMs);\n readonly sortOption = computed(() => this.provider().sortOption);\n readonly rowSelection = computed(() => this.provider().rowSelection);\n readonly groupDescription = computed(() => this.provider().groupDescription);\n readonly groupActions = computed(() => this.provider().groupActions);\n readonly cellMenuItems = computed(() => this.provider().cellMenuItems);\n readonly headerGroups = computed(() => this.provider().headerGroups);\n readonly treeConfig = computed(() => this.provider().treeConfig);\n readonly zebraStripes = computed(() => this.provider().zebraStripes);\n readonly showChangedCellIndicator = computed(\n () => this.provider().showChangedCellIndicator,\n );\n readonly confirmRowDelete = computed(() => this.provider().confirmRowDelete);\n readonly readonlyGrid = computed(() => this.provider().readonlyGrid());\n readonly loading = computed(() => this.provider().loading());\n readonly emptyText = computed(() => this.provider().emptyText);\n readonly useSidebarEditor = computed(() => this.provider().useSidebarEditor);\n\n /** Column definitions from the active provider. */\n readonly colDefs = computed<ColDef[]>(\n () => this.provider().columns() as unknown as ColDef[],\n );\n\n /** Signal-based data container from the active provider. */\n readonly dataSource = computed<AgridDataSource>(() => this.provider().datasource);\n\n /** Grid UI state container from the active provider. */\n readonly control = computed<AgridControl | null>(() => this.provider().control);\n\n /** Resolved locale code used for date formatting and built-in localization lookup. 'auto' is replaced with navigator.language. */\n readonly locale = computed<string>(() => resolveLocale(this.provider().options.locale));\n\n /** Resolved built-in locale text merged with provider customizations. */\n readonly localeText = computed<AgridLocaleText>(() =>\n resolveAgridLocaleText(this.provider().options.locale, this.provider().localizations)\n );\n\n /** Effective empty-state label. */\n readonly emptyTextLabel = computed<string>(() => this.emptyText() ?? this.localeText().noRows);\n\n // ── Outputs ──────────────────────────────────────────────────────────────────\n\n /** Emitted after the user commits a cell edit. */\n cellEdit = output<GridEditEvent<T>>();\n\n /**\n * Emitted after an edit changes a row.\n * Includes the row index, current data, provider, and data source.\n */\n recordEdit = output<RecordEditEvent<T>>();\n\n /** Emitted after a row is removed, with its former index and captured row data. */\n rowRemoved = output<RecordEditEvent<T>>();\n\n /** Emitted when the grid inserts a blank row. Use `dataSource.patchRow()` to populate it. */\n prepareAddRecord = output<NewRecord<T>>();\n\n /** Emitted when the user finishes dragging a row. Call `dataSource.moveRow()` to apply. */\n rowReorder = output<RowReorderEvent<T>>();\n\n /** Emitted when the row selection changes. `null` = selection cleared. */\n rowSelect = output<RowSelectEvent<T> | null>();\n\n rowDoubleClicked = output<RowClickEvent<T>>();\n\n /** Emitted when the user single-clicks a data row. */\n rowClick = output<RowClickEvent<T>>();\n\n /**\n * Emitted once after a changed row is left during inline editing, or when the sidebar editor\n * save button is used.\n */\n rowChanged = output<RowUpdateEvent<T>>();\n /**\n * Emitted when the user navigates to a new page in **server-side pagination mode**\n * (i.e. when `AgridControl.totalRows` is greater than zero).\n * The host should fetch the indicated row slice and update the data source.\n */\n pageChange = output<PageChangeEvent>();\n\n /** Emitted when a header filter changes in server-side filtering mode. */\n filterChange = output<FilterChangeEvent>();\n\n /** Emitted when a column sort changes in server-side filtering mode. */\n sortChange = output<SortChangeEvent>();\n\n // ── Public state ─────────────────────────────────────────────────────────────\n\n /** Currently focused cell, or `null`. */\n readonly selectedCell = signal<CellPosition | null>(null);\n\n /** Original index of the row awaiting delete confirmation, or `null`. */\n readonly pendingDeleteRow = signal<number | null>(null);\n\n private readonly markedIndices = signal<Set<number>>(new Set());\n\n /** Original datasource indices marked for inclusion in copy operations. */\n readonly markedRowIndices: Signal<ReadonlySet<number>> =\n this.markedIndices.asReadonly() as Signal<ReadonlySet<number>>;\n\n /** Horizontal position of the delete prompt inside the scrollable row. */\n readonly deleteConfirmationLeft = signal(0);\n\n /** Visible width available to the delete prompt. */\n readonly deleteConfirmationWidth = signal(0);\n\n /** Rectangular cell range selected by Shift+arrow or Shift+click. */\n readonly selectedRange = signal<CellRange | null>(null);\n\n /** Fill-handle drag preview bounds, in visible row/column coordinates. */\n get fillPreviewBounds() { return this.rangeController.fillPreviewBounds; }\n\n /** Position of the cell in edit mode, or `null`. */\n get editingCell() { return this.editController.editingCell; }\n\n /** Draft value while editing — committed on Tab/Enter, discarded on Escape. */\n get currentDraft() { return this.editController.currentDraft; }\n\n /** Seed character typed to enter edit mode (e.g. pressing 'A'). */\n get editSeedChar() { return this.editController.editSeedChar; }\n\n /** Toggle the sidebar open/closed. */\n toggleSidebar(): void { this.sidebarController.toggle(); }\n\n /** @internal */\n onSidebarStripClick(tab: 'columns' | 'detail'): void {\n this.sidebarController.selectTab(tab);\n }\n\n /** @internal */\n onSidebarDetailEdit(event: AgridSidebarEdit): void {\n this.sidebarController.edit(event);\n }\n\n /** @internal Commit an edit made via the detail panel. */\n commitDetailEdit(field: string, col: ColDef, stringValue: string): void {\n this.sidebarController.commitEdit(field, col, stringValue);\n }\n\n onSidebarDetailSave(_event: AgridSidebarDetailField[]): void {\n const originalIndex = this.sidebarController.selectedRowIndex();\n if (originalIndex === null) return;\n this.emitRowChanged(originalIndex);\n this.emitRecordEdit(originalIndex);\n this.sidebarController.closeSidebar();\n }\n\n /**\n * Download the currently visible, filtered rows as a CSV file.\n * Uses display values (ValueOption labels, formatters) and respects column visibility.\n * Group header rows are excluded — only data rows are exported.\n *\n * @param filename Output filename, defaults to `'export.csv'`.\n */\n exportCsv(filename = 'export.csv'): void {\n this.presentation.exportCsv(filename);\n }\n\n /** @internal */ goToFirstPage(): void { this.control()?.setPage(1); }\n /** @internal */ goToLastPage(): void { this.control()?.setPage(this.totalPages()); }\n /** @internal */ goToNextPage(): void { const c = this.control(); if (c) c.setPage(Math.min(c.currentPage() + 1, this.totalPages())); }\n /** @internal */ goToPrevPage(): void { const c = this.control(); if (c) c.setPage(Math.max(c.currentPage() - 1, 1)); }\n\n /** Resize every visible column to fit its header and current row values. */\n autosizeAllColumns(): void {\n this.columnSizing.autosizeAllColumns();\n }\n\n /**\n * Clears changed-cell markers after persistence succeeds.\n * Omit `originalIndex` to clear every marker; omit `fields` to clear the whole row.\n */\n clearChangedCells(originalIndex?: number, fields?: readonly string[]): void {\n if (originalIndex === undefined) {\n this.changedCells.set(new Set());\n return;\n }\n\n const fieldSet = fields ? new Set(fields) : null;\n this.changedCells.update(current => {\n const next = new Set(current);\n for (const key of current) {\n const marker = this.parseChangedCellKey(key);\n if (marker.rowIndex === originalIndex && (!fieldSet || fieldSet.has(marker.field))) {\n next.delete(key);\n }\n }\n return next;\n });\n }\n\n /** @internal Whether a cell has an unsaved-change marker. */\n isCellChanged(originalIndex: number, field: string): boolean {\n return this.changedCells().has(this.changedCellKey(originalIndex, field));\n }\n\n /** @internal Full display value for a cell — used as the `title` tooltip attribute. */\n getCellTitle(col: ColDef, value: unknown): string {\n return this.presentation.getCellTitle(col, value);\n }\n\n /** @internal Dynamic CSS class string for a cell from `ColDef.cellClass`. */\n getCellClass(col: ColDef, value: unknown, row: Record<string, unknown>): string {\n return this.presentation.getCellClass(col, value, row);\n }\n\n /** @internal Short symbol shown before the footer aggregate value. */\n getAggregateLabel(col: ColDef): string {\n return this.presentation.getAggregateLabel(col);\n }\n\n /** @internal Whether a column has a static or control-configured aggregate. */\n hasAggregate(col: ColDef): boolean {\n return this.presentation.hasAggregate(col);\n }\n\n /** @internal Formatted footer value — uses the column formatter when set, otherwise locale number. */\n getFooterDisplay(col: ColDef, value: unknown): string {\n return this.presentation.getFooterDisplay(col, value);\n }\n\n // ── Internal signals ─────────────────────────────────────────────────────────\n\n private readonly groupController = new AgridGroupController({\n control: this.control,\n groupDescription: this.groupDescription,\n });\n\n readonly treeController = new AgridTreeController();\n\n // ── Derived state ─────────────────────────────────────────────────────────────\n\n readonly allowRowReorder = computed(() =>\n (this.control()?.allowRowReorder() ?? false) && !this.control()?.groupByField()\n );\n\n /** `true` when there is a committed edit that can be undone (Ctrl+Z). */\n readonly canUndo = computed(() => this.control()?.canUndo() ?? false);\n\n /** `true` when there is a previously undone edit that can be re-applied (Ctrl+Y / Ctrl+Shift+Z). */\n readonly canRedo = computed(() => this.control()?.canRedo() ?? false);\n\n private readonly columnLayout = new AgridColumnLayoutModel({\n control: this.control,\n colDefs: this.colDefs,\n headerGroups: this.headerGroups,\n showControlColumn: this.showControlColumn,\n controlColumnWidth: this.controlColumnWidth,\n getColumnWidth: col => this.getColumnWidth(col),\n getColumnWidthToken: col => this.getColumnWidthToken(col),\n });\n\n /** Columns currently visible after hidden state, ordering, and pinning are applied. */\n readonly visibleColDefs = this.columnLayout.visibleColDefs;\n /** Columns currently pinned to the left in display order. */\n readonly pinnedColDefs = this.columnLayout.pinnedColDefs;\n /** Columns currently pinned to the right in display order. */\n readonly rightPinnedColDefs = this.columnLayout.rightPinnedColDefs;\n /** Columns rendered in the horizontally scrollable pane. */\n readonly scrollableColDefs = this.columnLayout.scrollableColDefs;\n readonly rightGridTemplateColumns = this.columnLayout.rightGridTemplateColumns;\n readonly rightPinnedPaneWidth = this.columnLayout.rightPinnedPaneWidth;\n readonly hasRightPinnedPane = this.columnLayout.hasRightPinnedPane;\n readonly hasPinnedPane = this.columnLayout.hasPinnedPane;\n readonly hasFilterableColumns = this.columnLayout.hasFilterableColumns;\n readonly hasHeaderGroups = this.columnLayout.hasHeaderGroups;\n readonly pinnedHeaderGroupRuns = this.columnLayout.pinnedHeaderGroupRuns;\n readonly scrollableHeaderGroupRuns = this.columnLayout.scrollableHeaderGroupRuns;\n readonly rightHeaderGroupRuns = this.columnLayout.rightHeaderGroupRuns;\n\n private readonly columnState = new AgridColumnStateService({\n control: this.control,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n pinnedColDefs: this.pinnedColDefs,\n rightPinnedColDefs: this.rightPinnedColDefs,\n showControlColumn: this.showControlColumn,\n });\n\n private readonly projection: AgridProjectionModel = new AgridProjectionModel({\n dataSource: this.dataSource,\n control: this.control,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n serverSideFiltering: this.serverSideFiltering,\n sortOption: this.sortOption,\n allowAddRows: this.allowAddRows,\n autoAddRows: this.autoAddRows,\n expandedGroups: this.groupController.expandedGroups,\n treeConfig: this.treeConfig,\n expandedTreeIds: this.treeController.expandedIds,\n });\n\n private readonly editController = new AgridEditController({\n control: this.control,\n dataSource: this.dataSource,\n visibleColDefs: this.visibleColDefs,\n readonlyGrid: this.readonlyGrid,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n findDisplayIndex: originalIndex => this.findDisplayIndex(originalIndex),\n scrollToCell: (displayIndex, colIndex) => this.scrollToKeepVisible(displayIndex, colIndex),\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n onCellEdit: event => this.emitEditEvents(event),\n });\n\n /** Total filtered row count regardless of current page. */\n readonly filteredRowCount = this.projection.filteredRowCount;\n\n /** Total number of pages given the current filter and page size. */\n readonly totalPages = this.projection.totalPages;\n\n readonly showPagination = this.projection.showPagination;\n\n /** Number of semantic header rows currently rendered. */\n readonly headerRowCount = computed(() => this.hasHeaderGroups() ? 2 : 1);\n\n /** Number of rendered semantic rows, including header rows. */\n readonly ariaRowCount = computed(() =>\n this.displayItems().length + this.headerRowCount() + (this.showFooter() ? 1 : 0)\n );\n\n /** Number of visible semantic columns, including the optional control column. */\n readonly ariaColCount = computed(() =>\n this.visibleColDefs().length + (this.showControlColumn() ? 1 : 0)\n );\n\n /** True when no rows or group headers are visible (ignores add-row sentinel and ghost). */\n readonly isEmpty = computed(() =>\n !this.loading() && this.filteredItems().every(item => item === null || item === 'ghost')\n );\n\n /**\n * @internal Effective aggregate for the column menu — string values only.\n * Custom function aggregates from ColDef can't be represented in the menu so they return null.\n */\n getEffectiveAggregate(col: ColDef): 'sum' | 'avg' | 'min' | 'max' | 'count' | null {\n const ctrlAgg = this.control()?.aggregates()[col.field];\n if (ctrlAgg !== undefined) return ctrlAgg;\n const colAgg = col.aggregate;\n return typeof colAgg === 'string' ? colAgg : null;\n }\n\n /** True when at least one visible column has an aggregate function (from ColDef or control). */\n readonly showFooter = this.projection.showFooter;\n\n /** Computed aggregate value per column field, over currently filtered rows. */\n readonly footerValues = this.projection.footerValues;\n\n readonly gridTemplateColumns = this.columnLayout.gridTemplateColumns;\n readonly pinnedGridTemplateColumns = this.columnLayout.pinnedGridTemplateColumns;\n readonly scrollableGridTemplateColumns = this.columnLayout.scrollableGridTemplateColumns;\n readonly totalWidth = this.columnLayout.totalWidth;\n readonly pinnedPaneWidth = this.columnLayout.pinnedPaneWidth;\n readonly scrollableTotalWidth = this.columnLayout.scrollableTotalWidth;\n\n /**\n * Filtered, sorted, and optionally grouped row list for `*cdkVirtualFor`.\n * Appends `null` when the explicit add-row placeholder is active.\n */\n readonly filteredItems: Signal<GridItem[]> = this.projection.filteredItems;\n\n /** Virtual scroll source — injects ghost row during a reorder drag. */\n /** Maps originalIndex → true if the data row should receive the odd-row stripe. Counts only data rows, so group headers don't shift the pattern. */\n readonly dataRowIsOdd = computed<Map<number, boolean>>(() => {\n const map = new Map<number, boolean>();\n let rank = 0;\n for (const item of this.filteredItems()) {\n if (isDataRowItemFn(item)) map.set(item.originalIndex, (rank++ % 2) !== 0);\n }\n return map;\n });\n\n readonly displayItems = computed<GridItem[]>(() => {\n const items = this.filteredItems();\n const dragIdx = this.dragHandler.reorderOriginalIndex();\n if (dragIdx === null) return items;\n\n const sourcePos = items.findIndex(item => isDataRowItemFn(item) && item.originalIndex === dragIdx);\n const withoutSource: GridItem[] = sourcePos === -1\n ? [...items]\n : [...items.slice(0, sourcePos), ...items.slice(sourcePos + 1)];\n\n const overIdx = this.dragHandler.reorderOverIndex();\n if (overIdx === null) return withoutSource;\n\n const targetPos = withoutSource.findIndex(item => isDataRowItemFn(item) && item.originalIndex === overIdx);\n if (targetPos === -1) return withoutSource;\n\n const insertAt = this.dragHandler.reorderInsertBefore() ? targetPos : targetPos + 1;\n const result = [...withoutSource];\n result.splice(insertAt, 0, 'ghost');\n return result;\n });\n\n // ── Menu signals ─────────────────────────────────────────────────────────────\n\n readonly groupActionsMenu = this.groupController.actionsMenu;\n\n // ── Infrastructure ────────────────────────────────────────────────────────────\n\n private readonly viewport = viewChild.required<CdkVirtualScrollViewport>('scrollViewport');\n private readonly pinnedViewport = viewChild<CdkVirtualScrollViewport>('pinnedViewport');\n private readonly rightPinnedViewport = viewChild<CdkVirtualScrollViewport>('rightPinnedViewport');\n private readonly wrapperEl = viewChild.required<ElementRef<HTMLDivElement>>('wrapper');\n private readonly horizontalScrollerEl =\n viewChild.required<ElementRef<HTMLDivElement>>('horizontalScroller');\n private readonly destroyRef = inject(DestroyRef);\n private readonly _hostEl = inject(ElementRef<HTMLElement>);\n private readonly browser = new AgridBrowserAdapter();\n\n private readonly rangeController = new AgridRangeController({\n control: this.control,\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n isCellEditable: col => this.isCellEditable(col),\n cancelEdit: () => this.cancelCurrent(),\n findDisplayIndex: originalIndex => this.findDisplayIndex(originalIndex),\n scrollToCell: (displayIndex, colIndex) => this.scrollToKeepVisible(displayIndex, colIndex),\n onCellEdit: event => this.emitEditEvents(event),\n }, this.destroyRef);\n\n private readonly columnSizing = new AgridColumnSizingController({\n control: this.control,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n scrollableColDefs: this.scrollableColDefs,\n locale: this.locale,\n isColumnPinned: field => this.isColumnPinned(field),\n wrapperElement: () => this.wrapperEl().nativeElement,\n scrollerElement: () => this.horizontalScrollerEl().nativeElement,\n }, this.destroyRef);\n\n private readonly columnMenuController = new AgridColumnMenuController({\n control: this.control,\n dataSource: this.dataSource,\n colDefs: this.colDefs,\n serverSideFiltering: this.serverSideFiltering,\n filterDebounceMs: this.filterDebounceMs,\n sortOption: this.sortOption,\n effectiveSortOrder: () => this.projection.effectiveSortOrder(),\n autosizeColumn: col => this.columnSizing.autosizeColumn(col),\n onFilterChange: event => this.filterChange.emit(event),\n onSortChange: event => this.sortChange.emit(event),\n }, this.destroyRef);\n\n readonly filterMenu = this.columnMenuController.menu;\n readonly filterMenuSearch = this.columnMenuController.search;\n readonly filterMenuItems = this.columnMenuController.items;\n readonly filterMenuVisibleItems = this.columnMenuController.visibleItems;\n readonly filterMenuActiveValues = this.columnMenuController.activeValues;\n readonly columnMenuValueItems = this.columnMenuController.valueItems;\n\n private readonly presentation = new AgridPresentationService({\n control: this.control,\n visibleColDefs: this.visibleColDefs,\n filteredItems: this.filteredItems,\n locale: this.locale,\n });\n\n private readonly findController = new AgridFindController({\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n scrollToCell: (displayIndex, colIndex) =>\n this.navigationController.scrollToKeepVisible(displayIndex, colIndex),\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n });\n\n readonly findOpen = this.findController.open;\n readonly findQuery = this.findController.query;\n readonly findActiveIndex = this.findController.activeIndex;\n readonly findMatches = this.findController.matches;\n\n private readonly navigationController = new AgridNavigationController({\n control: this.control,\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n filteredSortedIndices: this.projection.filteredSortedIndices,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n rowHeight: this.rowHeight,\n allowAddRows: this.allowAddRows,\n autoAddRows: this.autoAddRows,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n editingCell: this.editController.editingCell,\n isEditing: (originalIndex, colIndex) => this.isEditing(originalIndex, colIndex),\n startEdit: (originalIndex, colIndex, seedChar) =>\n this.editController.start(originalIndex, colIndex, seedChar),\n commitEdit: () => this.editController.commit(),\n cancelEdit: () => this.editController.cancel(),\n undoEdit: () => this.editController.undo(),\n redoEdit: () => this.editController.redo(),\n extendRangeTo: (originalIndex, colIndex) =>\n this.rangeController.extendTo(originalIndex, colIndex),\n openFind: () => this.findController.show(),\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n viewport: () => this.viewport(),\n scrollColumnToKeepVisible: colIndex =>\n this.columnSizing.scrollColumnToKeepVisible(colIndex),\n onPrepareAddRecord: event => this.prepareAddRecord.emit({\n ...event,\n provider: this.provider(),\n datasource: this.dataSource(),\n }),\n });\n\n private readonly rowController = new AgridRowController({\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n markedRowIndices: this.markedRowIndices,\n rowSelection: this.rowSelection,\n selectedCell: this.selectedCell,\n editingCell: this.editController.editingCell,\n insertRowAt: index => {\n this.reconcileMarkedRowsAfterInsertion(index);\n this.navigationController.insertRowAt(index);\n },\n startDragSelect: originalIndex => this.dragHandler.startDragSelect(originalIndex),\n onRowSelect: event => this.rowSelect.emit(event),\n onRowClick: event => this.rowClick.emit(event),\n onRowRemoved: event => {\n this.reconcileDirtyInlineRowsAfterRemoval(event.index);\n this.reconcileMarkedRowsAfterRemoval(event.index);\n this.rowRemoved.emit(this.createRecordEvent(event.index, event.data));\n },\n onEditRowRemoved: originalIndex => this.editController.onRowRemoved(originalIndex),\n closeFilterMenu: () => this.columnMenuController.close(),\n closeGroupActionsMenu: () => this.closeGroupActionsMenu(),\n });\n\n readonly selectedRowIndices = this.rowController.selectedRowIndices;\n readonly selectedRowIndex = this.rowController.selectedRowIndex;\n readonly contextMenu = this.rowController.contextMenu;\n readonly cellContextMenuState = this.rowController.cellContextMenu;\n\n private readonly sidebarController = new AgridSidebarController({\n control: this.control,\n dataSource: this.dataSource,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n selectedRowIndex: this.selectedRowIndex,\n autoOpenDetail: this.autoOpenDetail,\n useSidebarEditor: this.useSidebarEditor,\n onFieldChange: event => this.markCellChanged(event),\n onCellEdit: event => this.emitSidebarEditEvents(event),\n });\n\n readonly sidebarOpen = this.sidebarController.open;\n readonly sidebarTab = this.sidebarController.tab;\n readonly sidebarRow = this.sidebarController.row;\n readonly sidebarHiddenColumns = this.sidebarController.hiddenColumns;\n\n private readonly clipboardHandler = new AgridClipboardHandler({\n control: this.control,\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n markedRowIndices: this.markedRowIndices,\n isCellEditable: col => this.isCellEditable(col),\n onCellEdit: event => this.emitEditEvents(event),\n scrollToCell: (displayIndex, colIndex) => this.scrollToKeepVisible(displayIndex, colIndex),\n });\n\n readonly dragHandler = new AgridDragHandler({\n dataSource: this.dataSource,\n filteredItems: () => this.filteredItems(),\n locale: () => this.locale(),\n selectedIndices: this.rowController.selectedIndices,\n onReorder: e => {\n this.reconcileMarkedRowsAfterMove(e.oldIndex, e.newIndex);\n this.rowReorder.emit(e);\n },\n onSelectionChange: () => this.rowController.emitSelection(),\n }, this.destroyRef);\n\n private readonly columnReorder = new AgridColumnReorderController({\n control: this.control,\n visibleColDefs: this.visibleColDefs,\n getColDef: field => this.getColDef(field),\n }, this.destroyRef);\n\n readonly columnDragPreview = this.columnReorder.preview;\n\n /** @internal Start a column header drag. */\n onColHeaderPointerDown(event: PointerEvent, field: string): void {\n this.columnReorder.start(event, field);\n }\n\n /** @internal Start dragging all columns in one contiguous grouped-header segment. */\n onHeaderGroupPointerDown(event: PointerEvent, fields: string[], label: string): void {\n this.columnReorder.startGroup(event, fields, label);\n }\n\n /** @internal Whether any field in a grouped-header segment is being dragged. */\n isHeaderGroupDragging(fields: string[]): boolean {\n return fields.some(field => this.columnReorder.isDragging(field));\n }\n\n /** @internal Whether a grouped-header segment contains a locked column. */\n isHeaderGroupLocked(fields: string[]): boolean {\n return fields.some(field => this.getColDef(field)?.locked);\n }\n\n /** @internal Whether the given column header is being dragged. */\n isColDragging(field: string): boolean {\n return this.columnReorder.isDragging(field);\n }\n\n /** @internal Template helper for drop-indicator class. */\n getColDropSide(field: string): 'before' | 'after' | null {\n return this.columnReorder.getDropSide(field);\n }\n\n /** @internal Horizontal animation offset for a header during column reordering. */\n getColReorderOffset(field: string): number {\n return this.columnReorder.getHeaderOffset(field);\n }\n\n // ── Setup ─────────────────────────────────────────────────────────────────────\n\n private readonly _seededControls = new WeakSet<AgridControl>();\n private readonly dirtyInlineRows = new Set<number>();\n private dirtyRowsDataSource: AgridDataSource | null = null;\n private readonly changedCells = signal<ReadonlySet<string>>(new Set());\n private changedCellsDataSource: AgridDataSource | null = null;\n\n private emitEditEvents(event: GridEditEvent): void {\n this.cellEdit.emit(event as GridEditEvent<T>);\n this.emitRecordEdit(event.position.rowIndex);\n this.markInlineRowDirty(event.position.rowIndex);\n this.markCellChanged(event);\n }\n\n private emitSidebarEditEvents(event: GridEditEvent): void {\n this.cellEdit.emit(event as GridEditEvent<T>);\n this.emitRecordEdit(event.position.rowIndex);\n }\n\n private emitRecordEdit(index: number): void {\n const datasource = this.dataSource();\n const event = this.createRecordEvent(index, datasource.getRow(index));\n queueMicrotask(() => this.recordEdit.emit(event));\n }\n\n private markInlineRowDirty(index: number): void {\n const datasource = this.dataSource();\n if (this.dirtyRowsDataSource !== datasource) {\n this.dirtyInlineRows.clear();\n this.dirtyRowsDataSource = datasource;\n }\n this.dirtyInlineRows.add(index);\n }\n\n private markCellChanged(event: GridEditEvent): void {\n if (!this.showChangedCellIndicator()) return;\n const datasource = this.dataSource();\n if (this.changedCellsDataSource !== datasource) {\n this.changedCells.set(new Set());\n this.changedCellsDataSource = datasource;\n }\n this.changedCells.update(current => {\n const next = new Set(current);\n next.add(this.changedCellKey(event.position.rowIndex, event.field));\n return next;\n });\n }\n\n private changedCellKey(rowIndex: number, field: string): string {\n return JSON.stringify([rowIndex, field]);\n }\n\n private parseChangedCellKey(key: string): { rowIndex: number; field: string } {\n const [rowIndex, field] = JSON.parse(key) as [number, string];\n return { rowIndex, field };\n }\n\n private flushDirtyInlineRows(activeRowIndex: number | null = null): void {\n const datasource = this.dataSource();\n if (this.dirtyRowsDataSource !== datasource) {\n this.dirtyInlineRows.clear();\n this.dirtyRowsDataSource = datasource;\n return;\n }\n\n for (const index of [...this.dirtyInlineRows].sort((a, b) => a - b)) {\n if (index === activeRowIndex) continue;\n this.dirtyInlineRows.delete(index);\n if (index >= 0 && index < datasource.length) this.emitRowChanged(index);\n }\n }\n\n private reconcileDirtyInlineRowsAfterRemoval(removedIndex: number): void {\n const shifted = new Set<number>();\n for (const index of this.dirtyInlineRows) {\n if (index < removedIndex) shifted.add(index);\n else if (index > removedIndex) shifted.add(index - 1);\n }\n this.dirtyInlineRows.clear();\n for (const index of shifted) this.dirtyInlineRows.add(index);\n this.reconcileChangedCellsAfterRemoval(removedIndex);\n }\n\n private reconcileChangedCellsAfterRemoval(removedIndex: number): void {\n const shifted = new Set<string>();\n for (const key of this.changedCells()) {\n const marker = this.parseChangedCellKey(key);\n if (marker.rowIndex < removedIndex) shifted.add(key);\n else if (marker.rowIndex > removedIndex) {\n shifted.add(this.changedCellKey(marker.rowIndex - 1, marker.field));\n }\n }\n this.changedCells.set(shifted);\n }\n\n private emitRowChanged(originalIndex: number): void {\n this.rowChanged.emit({\n row: this.dataSource().getRow(originalIndex),\n originalIndex,\n } as RowUpdateEvent<T>);\n }\n\n private createRecordEvent(index: number, data: Record<string, unknown>): RecordEditEvent {\n const datasource = this.dataSource();\n return {\n index,\n data,\n provider: this.provider(),\n datasource,\n };\n }\n\n constructor() {\n effect(() => this.sidebarController.syncAutoOpen());\n\n effect(() => {\n const datasource = this.dataSource();\n if (this.changedCellsDataSource === datasource) return;\n this.changedCellsDataSource = datasource;\n this.changedCells.set(new Set());\n });\n\n effect(() => {\n const activeRowIndex = this.selectedCell()?.rowIndex ?? null;\n this.flushDirtyInlineRows(activeRowIndex);\n });\n\n afterNextRender(() => {\n const wrapper = this.wrapperEl().nativeElement;\n const onKeyDown = (event: KeyboardEvent) => this.onKeyDown(event);\n wrapper.addEventListener('keydown', onKeyDown, { capture: true });\n this.destroyRef.onDestroy(() =>\n wrapper.removeEventListener('keydown', onKeyDown, { capture: true })\n );\n });\n\n // Emit pageChange whenever page or pageSize changes in server-side pagination mode.\n effect(() => {\n const ctrl = this.control();\n if (!ctrl || ctrl.totalRows() <= 0 || ctrl.pageSize() <= 0) return;\n const page = ctrl.currentPage();\n const pageSize = ctrl.pageSize();\n const totalRows = ctrl.totalRows();\n const startRow = (page - 1) * pageSize;\n const endRow = Math.min(page * pageSize, totalRows) - 1;\n this.pageChange.emit({ page, pageSize, startRow, endRow });\n });\n\n effect(() => {\n const added = this.dataSource().rowAdded();\n if (!added) return;\n this.navigationController.revealRow(added.index);\n });\n\n // Deselect when clicking outside the grid.\n const onOutsidePointerDown = (e: PointerEvent) => {\n if (!this._hostEl.nativeElement.contains(e.target as Node)) {\n queueMicrotask(() => this.flushDirtyInlineRows());\n }\n if (this.rowSelection() === 'none') return;\n if (this.selectedRowIndices().size === 0) return;\n if (this._hostEl.nativeElement.contains(e.target as Node)) return;\n this.rowController.clearSelection();\n };\n this.browser.addDocumentListener('pointerdown', onOutsidePointerDown);\n this.destroyRef.onDestroy(() => {\n this.browser.removeDocumentListener('pointerdown', onOutsidePointerDown);\n });\n\n // Re-sync pinned pane scroll after displayItems changes — CDK independently adjusts\n // each viewport when item count changes (group/ungroup, collapse), which can leave\n // the panes offset by one row.\n effect(() => {\n this.displayItems();\n setTimeout(() => {\n const viewport = this.viewport();\n viewport.checkViewportSize();\n this.pinnedViewport()?.checkViewportSize();\n this.rightPinnedViewport()?.checkViewportSize();\n\n const offset = viewport.measureScrollOffset();\n this.pinnedViewport()?.scrollToOffset(offset);\n this.rightPinnedViewport()?.scrollToOffset(offset);\n }, 0);\n });\n\n // Seed ColDef.hidden and ColDef.pinned into the control once per control instance.\n effect(() => {\n const ctrl = this.control();\n const cols = this.colDefs();\n if (!ctrl || this._seededControls.has(ctrl)) return;\n this._seededControls.add(ctrl);\n for (const col of cols) {\n if (col.hidden) ctrl.setColumnVisibility(col.field, false);\n if (col.pinned === 'left') ctrl.setPinned(col.field, true);\n if (col.pinned === 'right') ctrl.setPinnedRight(col.field, true);\n }\n });\n }\n\n // ── Template helpers — type guards ────────────────────────────────────────────\n\n /** @internal */\n isDataRowItem(item: GridItem): item is { row: Record<string, unknown>; originalIndex: number } {\n return isDataRowItemFn(item);\n }\n\n /** @internal */\n isGroupHeaderItem(item: GridItem): item is { groupLabel: string; count: number; collapsed: boolean } {\n return isGroupHeaderItemFn(item);\n }\n\n /** @internal */\n getItemOriginalIndex(item: GridItem): number | null {\n return isDataRowItemFn(item) ? item.originalIndex : null;\n }\n\n // ── Template helpers — tree ───────────────────────────────────────────────────\n\n /** @internal True when `col` is the configured tree column. */\n isTreeCell(col: ColDef): boolean {\n return this.treeConfig()?.treeField === col.field;\n }\n\n /** @internal Tree depth of a row item (0 when not a tree row). */\n treeRowLevel(item: GridItem): number {\n return isTreeRowItemFn(item) ? item.level : 0;\n }\n\n /** @internal Whether a tree row has children and can be expanded. */\n treeRowExpandable(item: GridItem): boolean {\n return isTreeRowItemFn(item) && item.expandable;\n }\n\n /** @internal Whether a tree row is currently expanded. */\n treeRowExpanded(item: GridItem): boolean {\n return isTreeRowItemFn(item) && item.expanded;\n }\n\n /** @internal Toggle the expand/collapse state of a tree row from its twisty. */\n onTreeToggle(item: GridItem): void {\n const config = this.treeConfig();\n if (!config || !isTreeRowItemFn(item)) return;\n this.treeController.toggle(config.getId(item.row as T));\n }\n\n /** Expand every expandable node in the tree. No-op when not in tree mode. */\n expandAllNodes(): void {\n const config = this.treeConfig();\n if (!config) return;\n const expandable = new Set<string | number>();\n for (const row of this.dataSource().rows()) {\n const parentId = config.getParentId(row as T);\n if (parentId != null) expandable.add(parentId);\n }\n this.treeController.expandAll(expandable);\n }\n\n /** Collapse every node in the tree. No-op when not in tree mode. */\n collapseAllNodes(): void {\n this.treeController.collapseAll();\n }\n\n /** @internal CDK trackBy — arrow to preserve `this`. */\n readonly trackByItem = (_di: number, item: GridItem): string | number => {\n if (item === 'ghost') return '__ghost__';\n if (item === null) return -1;\n if (isGroupHeaderItemFn(item)) return `__group__${item.groupLabel}`;\n return item.originalIndex;\n };\n\n // ── Template helpers — cell/selection state ───────────────────────────────────\n\n /** @internal */\n isSelected(originalIndex: number, ci: number): boolean {\n const sel = this.selectedCell();\n return sel?.rowIndex === originalIndex && sel?.colIndex === ci;\n }\n\n /** @internal */\n isEditing(originalIndex: number, ci: number): boolean {\n const ed = this.editingCell();\n return ed?.rowIndex === originalIndex && ed?.colIndex === ci;\n }\n\n /** @internal */\n getSeedChar(originalIndex: number, ci: number): string {\n return this.isEditing(originalIndex, ci) ? this.editSeedChar() : '';\n }\n\n /** @internal */\n isAddRowSelected(): boolean {\n const sel = this.selectedCell();\n return this.allowAddRows() && sel?.rowIndex === this.dataSource().length;\n }\n\n /** @internal */\n isRowSelected(originalIndex: number): boolean {\n return this.rowController.isRowSelected(originalIndex);\n }\n\n /** @internal Selection class for the separate pinned/control viewport. */\n isPinnedPaneRowSelected(item: GridItem): boolean {\n return this.rowController.isPinnedPaneRowSelected(item);\n }\n\n // ── Template helpers — filter menu ────────────────────────────────────────────\n\n /** @internal */\n /** @internal 1-based sort priority for a column, 0 if not sorted. */\n getSortPriority(field: string): number { return this.columnMenuController.getSortPriority(field); }\n\n /** @internal Whether more than one column is currently sorted. */\n hasMultiSort(): boolean {\n return this.columnMenuController.hasMultiSort();\n }\n\n getTextFilter(field: string): string { return this.columnMenuController.getTextFilter(field); }\n\n /** @internal */\n getSort(field: string): 'asc' | 'desc' | null {\n return this.columnMenuController.getSort(field);\n }\n\n /** @internal */\n isMenuAllSelected(field: string): boolean {\n return this.columnMenuController.isAllSelected(field);\n }\n\n /** @internal */\n isMenuValueActive(rawStr: string): boolean {\n return this.columnMenuController.isValueActive(rawStr);\n }\n\n /** @internal */\n isMenuValueSelected(field: string, value: string): boolean {\n return this.columnMenuController.isValueSelected(field, value);\n }\n\n /** @internal */\n hasActiveFilter(field: string): boolean {\n return this.columnMenuController.hasActiveFilter(field);\n }\n\n /** @internal */\n getColDef(field: string): ColDef | undefined { return this.columnState.getColDef(field); }\n\n /** @internal */\n getVisibleColIndex(field: string): number {\n return this.columnState.getVisibleColIndex(field);\n }\n\n /** @internal Convert a zero-based visible data-column index to a one-based ARIA index. */\n getAriaColIndex(colIndex: number): number {\n return this.columnState.getAriaColIndex(colIndex);\n }\n\n /** @internal */\n isColumnHidden(field: string): boolean { return this.columnState.isColumnHidden(field); }\n\n /** @internal */\n isGroupedByField(field: string): boolean { return this.columnState.isGroupedByField(field); }\n\n /** @internal */\n isColumnPinned(field: string): boolean {\n return this.columnState.isColumnPinned(field);\n }\n\n isColumnPinnedRight(field: string): boolean {\n return this.columnState.isColumnPinnedRight(field);\n }\n\n /** Returns `'left'`, `'right'`, or `false` — used by the column menu. */\n getColumnPinState(field: string): 'left' | 'right' | false {\n return this.columnState.getColumnPinState(field);\n }\n\n isFirstRightPinnedColumn(field: string): boolean {\n return this.columnState.isFirstRightPinnedColumn(field);\n }\n\n /** @internal Returns `true` for the rightmost pinned column (used to draw the separator shadow). */\n isLastPinnedColumn(field: string): boolean {\n return this.columnState.isLastPinnedColumn(field);\n }\n\n // ── Row selection ─────────────────────────────────────────────────────────────\n\n /** @internal */\n onRowPointerDown(event: PointerEvent, originalIndex: number): void {\n this.rowController.selectFromPointer(event, originalIndex, true);\n }\n\n /** @internal Emits rowClick when the user single-clicks a data row outside of a cell editor. */\n onRowClick(event: MouseEvent, item: { row: Record<string, unknown>; originalIndex: number }): void {\n this.rowController.clickRow(item);\n }\n\n // ── Cell interaction ──────────────────────────────────────────────────────────\n\n /** @internal */\n onActivate(originalIndex: number, ci: number, event?: MouseEvent): void {\n this.navigationController.activateCell(originalIndex, ci, event);\n }\n\n /** @internal */\n onActivateAddRow(): void {\n this.navigationController.activateAddRow();\n }\n\n /** @internal */\n onStartEdit(originalIndex: number, ci: number): void {\n const row = this.dataSource().rows()[originalIndex];\n this.rowDoubleClicked.emit({ row, originalIndex });\n if (this.isEditing(originalIndex, ci)) return;\n this.enterEdit(originalIndex, ci, '');\n }\n\n /** @internal */\n onDraftChange(value: unknown): void { this.editController.setDraft(value); }\n\n /** @internal Starts a fill-handle drag from the bottom-right corner of the selection. */\n onCellPointerDown(event: PointerEvent, originalIndex: number, colIndex: number): void {\n this.rangeController.startFill(event, originalIndex, colIndex);\n }\n\n /** @internal Main keyboard handler delegated from the wrapper div. */\n onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.pendingDeleteRow() !== null) {\n event.preventDefault();\n event.stopPropagation();\n this.cancelRowDelete();\n return;\n }\n this.navigationController.handleKeyDown(event);\n }\n\n /** @internal Clears cell navigation while a header filter control owns focus. */\n onGridFocusIn(event: FocusEvent): void {\n if ((event.target as Element | null)?.closest('.ag-filter-input, .ag-filter-menu')) {\n this.navigationController.deactivateCell();\n }\n }\n\n /** Open the find panel and focus its input. */\n openFind(): void {\n this.findController.show();\n }\n\n /** @internal */\n closeFind(): void {\n this.findController.close();\n }\n\n /** @internal */\n onFindInput(value: string): void {\n this.findController.setQuery(value);\n }\n\n /** @internal */\n goToFindMatch(direction: 1 | -1): void {\n this.findController.goToMatch(direction);\n }\n\n // ── Row reorder ───────────────────────────────────────────────────────────────\n\n /** @internal Ghost cell display during a reorder drag. */\n getGhostCellDisplay(col: ColDef): string { return this.dragHandler.getGhostDisplay(col); }\n\n /** @internal Delegates to AgridDragHandler. */\n onHandlePointerDown(event: PointerEvent, originalIndex: number): void {\n if (!this.allowRowReorder()) return;\n this.dragHandler.startReorder(event, originalIndex);\n }\n\n /** @internal Handles the control column without letting the row receive a second pointer event. */\n onControlPointerDown(event: PointerEvent, originalIndex: number): void {\n event.stopPropagation();\n if (this.allowRowReorder()) {\n this.onHandlePointerDown(event, originalIndex);\n return;\n }\n this.rowController.selectFromPointer(event, originalIndex, false);\n }\n\n /** @internal Toggle whether a row is included in subsequent copy operations. */\n toggleRowMarked(originalIndex: number): void {\n this.markedIndices.update(indices => {\n const next = new Set(indices);\n if (next.has(originalIndex)) next.delete(originalIndex);\n else next.add(originalIndex);\n return next;\n });\n }\n\n /** @internal Returns whether a row is marked for copying. */\n isRowMarked(originalIndex: number): boolean {\n return this.markedIndices().has(originalIndex);\n }\n\n /** Clear every row marked for clipboard inclusion. */\n clearMarkedRows(): void {\n this.markedIndices.set(new Set());\n }\n\n /** @internal Copy the active range or cell as TSV. */\n onCopy(event: ClipboardEvent): void {\n this.clipboardHandler.copy(event);\n }\n\n /** @internal Paste TSV/CSV-like plain text into the current cell. */\n onPaste(event: ClipboardEvent): void {\n if (this.editingCell()) return;\n this.clipboardHandler.paste(event);\n }\n\n // ── Column resize ─────────────────────────────────────────────────────────────\n\n /** @internal Starts pointer-based column resizing. */\n onResizeStart(event: MouseEvent, col: ColDef): void {\n this.columnSizing.startResize(event, col);\n }\n\n /** @internal Resize a column from its keyboard-accessible separator handle. */\n onResizeKeyDown(event: KeyboardEvent, col: ColDef): void {\n this.columnSizing.resizeFromKeyboard(event, col);\n }\n\n /** @internal Autosize a column to fit its header and currently visible row values. */\n onAutosizeColumn(event: MouseEvent, col: ColDef): void {\n if (col.locked) return;\n event.preventDefault();\n event.stopPropagation();\n this.columnSizing.autosizeColumn(col);\n const selected = this.selectedCell();\n if (selected) this.columnSizing.scrollColumnToKeepVisible(selected.colIndex);\n }\n\n // ── Row context menu ──────────────────────────────────────────────────────────\n\n /** @internal */\n onControlContextMenu(event: MouseEvent, originalIndex: number): void {\n this.rowController.openRowContextMenu(event, originalIndex);\n }\n\n /** @internal */\n closeContextMenu(): void { this.rowController.closeContextMenu(); }\n\n /** @internal */\n onCellContextMenu(event: MouseEvent, rowIndex: number, colIndex: number, col: ColDef, row: Record<string, unknown>): void {\n this.rowController.openCellContextMenu(event, rowIndex, colIndex, col, row);\n }\n\n /** @internal */\n closeCellContextMenu(): void { this.rowController.closeCellContextMenu(); }\n\n /** @internal Runs a typed provider context-menu action against erased controller state. */\n runCellMenuItem(item: CellContextMenuItem<T>, menu: AgridCellContextMenu): void {\n item.action({\n value: menu.value as T[AgridField<T>],\n row: menu.row as unknown as T,\n field: menu.field as AgridField<T>,\n originalIndex: menu.rowIndex,\n });\n this.closeCellContextMenu();\n }\n\n /** @internal Copy one field from the target and marked rows. */\n copyCellToClipboard(originalIndex: number, col: ColDef): void {\n this.rowController.copyCellToClipboard(originalIndex, col);\n }\n\n /** @internal Copy the target and marked rows using all visible fields. */\n copyRowToClipboard(originalIndex: number): void {\n this.rowController.copyRowToClipboard(originalIndex);\n }\n\n /** @internal Insert a blank row at a specific position and emit prepareAddRecord. */\n insertRowAt(atIndex: number): void {\n this.rowController.insertRowAt(atIndex);\n }\n\n /** Start confirmation or immediately delete the row at `originalIndex`. */\n deleteRow(originalIndex: number): void {\n if (this.confirmRowDelete()) {\n this.updateDeleteConfirmationPosition();\n this.pendingDeleteRow.set(originalIndex);\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n this.browser.schedule(() => {\n (this._hostEl.nativeElement as HTMLElement)\n .querySelector<HTMLButtonElement>('[data-delete-confirm-no]')\n ?.focus();\n });\n return;\n }\n this.deleteRowImmediately(originalIndex);\n }\n\n /** @internal Returns whether this row is awaiting delete confirmation. */\n isRowPendingDelete(originalIndex: number): boolean {\n return this.pendingDeleteRow() === originalIndex;\n }\n\n /** @internal Delete the row currently awaiting confirmation. */\n confirmPendingRowDelete(): void {\n const originalIndex = this.pendingDeleteRow();\n if (originalIndex === null) return;\n this.pendingDeleteRow.set(null);\n this.deleteRowImmediately(originalIndex);\n }\n\n /** @internal Cancel the active row-delete confirmation. */\n cancelRowDelete(): void {\n this.pendingDeleteRow.set(null);\n this.wrapperEl().nativeElement.focus();\n }\n\n private deleteRowImmediately(originalIndex: number): void {\n this.rowController.deleteRow(originalIndex);\n this.rowController.closeCellContextMenu();\n }\n\n private updateDeleteConfirmationPosition(): void {\n const scroller = this.horizontalScrollerEl().nativeElement;\n this.deleteConfirmationLeft.set(scroller.scrollLeft);\n this.deleteConfirmationWidth.set(scroller.clientWidth);\n }\n\n // ── Group expand / collapse ───────────────────────────────────────────────────\n\n /** @internal */\n onGroupHeaderClick(label: string): void {\n this.groupController.toggle(label);\n }\n\n /** Expand all groups. No-op when grouping is not active. */\n expandGroups(): void {\n this.groupController.expandAll(this.filteredItems());\n }\n\n /** Collapse all groups. No-op when grouping is not active. */\n collapseGroups(): void {\n this.groupController.collapseAll();\n }\n\n /** @internal */\n getGroupDescription(label: string): string {\n return this.groupController.getDescription(label);\n }\n\n /** @internal */\n openGroupActionsMenu(event: MouseEvent, label: string): void {\n this.groupController.openActionsMenu(event, label);\n }\n\n /** @internal */\n closeGroupActionsMenu(): void { this.groupController.closeActionsMenu(); }\n\n /** @internal */\n onGroupAction(action: GroupAction, label: string): void {\n this.groupController.runAction(action, label);\n }\n\n // ── Filter row & menu ─────────────────────────────────────────────────────────\n\n /** @internal */\n onTextFilterChange(event: Event, field: string): void {\n this.columnMenuController.onTextFilterChange(event, field);\n }\n\n /** @internal */\n openFilterMenu(event: MouseEvent, field: string): void {\n this.columnMenuController.open(event, field);\n }\n\n /** @internal */\n closeFilterMenu(): void { this.columnMenuController.close(); }\n\n /** @internal */\n onFilterMenuSearch(value: string): void {\n this.columnMenuController.setSearch(value);\n }\n\n /** @internal */\n onMenuSort(field: string, dir: 'asc' | 'desc'): void {\n this.columnMenuController.sort(field, dir);\n }\n\n /** @internal */\n onMenuClearFilter(field: string): void {\n this.columnMenuController.clearFilter(field);\n }\n\n /** @internal */\n /** @internal Replace the entire sort stack with a single sort on this column. */\n onMenuResetSort(field: string, dir: 'asc' | 'desc'): void {\n this.columnMenuController.resetSort(field, dir);\n }\n\n onMenuToggleGroupBy(field: string): void {\n this.columnMenuController.toggleGroupBy(field);\n }\n\n /** @internal */\n onMenuClearAll(): void {\n this.columnMenuController.clearAll();\n }\n\n /** @internal */\n onMenuToggleAll(field: string): void {\n this.columnMenuController.toggleAll(field);\n }\n\n /** @internal */\n onMenuToggleValue(field: string, rawStr: string): void {\n this.columnMenuController.toggleValue(field, rawStr);\n }\n\n /** @internal */\n onSidebarToggleColumn(field: string): void {\n this.columnMenuController.toggleColumnVisibility(field);\n }\n\n /** @internal Sets every column in a sidebar header group to the requested visibility. */\n onSidebarToggleColumnGroup(fields: string[], visible: boolean): void {\n this.columnMenuController.setColumnsVisibility(fields, visible);\n }\n\n /** @internal Mirrors vertical scrolling from the main viewport into both pinned panes. */\n onBodyScroll(): void {\n const offset = this.viewport().measureScrollOffset();\n this.pinnedViewport()?.scrollToOffset(offset);\n this.rightPinnedViewport()?.scrollToOffset(offset);\n }\n\n /** @internal Keeps the row-delete prompt visible while columns scroll horizontally. */\n onHorizontalScroll(): void {\n this.updateDeleteConfirmationPosition();\n }\n\n /** @internal */\n onRightPinnedBodyScroll(): void {\n const right = this.rightPinnedViewport();\n if (!right) return;\n const offset = right.measureScrollOffset();\n if (Math.abs(offset - this.viewport().measureScrollOffset()) < 1) return;\n this.viewport().scrollToOffset(offset);\n this.pinnedViewport()?.scrollToOffset(offset);\n }\n\n /** @internal */\n onMenuTogglePin(field: string): void {\n this.columnMenuController.togglePin(field);\n }\n\n /** @internal */\n onMenuTogglePinRight(field: string): void {\n this.columnMenuController.togglePinRight(field);\n }\n\n /** @internal */\n onMenuAutosizeColumn(field: string): void {\n this.columnMenuController.autosize(field);\n }\n\n /** @internal */\n onMenuSetAggregate(field: string, agg: 'sum' | 'avg' | 'min' | 'max' | 'count' | null): void {\n this.columnMenuController.setAggregate(field, agg);\n }\n\n /** @internal */\n onMenuHideColumn(field: string): void {\n this.columnMenuController.hideColumn(field);\n }\n\n // ── Private helpers ───────────────────────────────────────────────────────────\n\n private findDisplayIndex(originalIndex: number): number {\n return this.navigationController.findDisplayIndex(originalIndex);\n }\n\n private reconcileMarkedRowsAfterInsertion(insertedIndex: number): void {\n if (this.markedIndices().size === 0) return;\n this.markedIndices.update(indices => new Set(\n [...indices].map(index => index >= insertedIndex ? index + 1 : index)\n ));\n }\n\n private reconcileMarkedRowsAfterRemoval(removedIndex: number): void {\n if (this.markedIndices().size === 0) return;\n this.markedIndices.update(indices => new Set(\n [...indices]\n .filter(index => index !== removedIndex)\n .map(index => index > removedIndex ? index - 1 : index)\n ));\n }\n\n private reconcileMarkedRowsAfterMove(oldIndex: number, newIndex: number): void {\n if (this.markedIndices().size === 0 || oldIndex === newIndex) return;\n const destination = newIndex > oldIndex ? newIndex - 1 : newIndex;\n this.markedIndices.update(indices => new Set([...indices].map(index => {\n if (index === oldIndex) return destination;\n if (oldIndex < destination && index > oldIndex && index <= destination) return index - 1;\n if (destination < oldIndex && index >= destination && index < oldIndex) return index + 1;\n return index;\n })));\n }\n\n private isCellEditable(col: ColDef): boolean {\n return this.editController.isCellEditable(col);\n }\n\n private enterEdit(originalIndex: number, ci: number, seedChar: string): void {\n this.editController.start(originalIndex, ci, seedChar);\n }\n\n private cancelCurrent(): void {\n this.editController.cancel();\n }\n\n /** @internal */\n isRangeSelected(originalIndex: number, colIndex: number): boolean {\n return this.rangeController.isRangeSelected(originalIndex, colIndex);\n }\n\n /** @internal */\n isFindMatchCell(originalIndex: number, colIndex: number): boolean {\n return this.findController.isMatchCell(originalIndex, colIndex);\n }\n\n /** @internal */\n isActiveFindMatchCell(originalIndex: number, colIndex: number): boolean {\n return this.findController.isActiveMatchCell(originalIndex, colIndex);\n }\n\n /** @internal */\n isFillHandleCell(originalIndex: number, colIndex: number): boolean {\n return this.rangeController.isFillHandleCell(originalIndex, colIndex);\n }\n\n /** @internal */\n isFillPreviewCell(originalIndex: number, colIndex: number): boolean {\n return this.rangeController.isFillPreviewCell(originalIndex, colIndex);\n }\n\n private scrollToKeepVisible(displayIndex: number, colIndex: number | null = null): void {\n this.navigationController.scrollToKeepVisible(displayIndex, colIndex);\n }\n\n /** @internal Current rendered width for a column. */\n getColumnWidth(col: ColDef): number {\n return this.columnSizing.getWidth(col);\n }\n\n private getColumnWidthToken(col: ColDef): string {\n return this.columnSizing.getWidthToken(col);\n }\n\n}\n","<div #wrapper class=\"ag-wrapper\" tabindex=\"0\" role=\"grid\" [attr.aria-label]=\"localeText().grid\"\n [attr.aria-rowcount]=\"ariaRowCount()\" [attr.aria-colcount]=\"ariaColCount()\"\n [attr.aria-multiselectable]=\"rowSelection() === 'multi' ? 'true' : null\"\n [attr.aria-readonly]=\"readonlyGrid() ? 'true' : null\"\n [attr.aria-busy]=\"loading() ? 'true' : null\" (copy)=\"onCopy($event)\" (paste)=\"onPaste($event)\"\n (focusin)=\"onGridFocusIn($event)\"\n (click)=\"closeContextMenu(); closeCellContextMenu(); closeFilterMenu(); closeGroupActionsMenu()\">\n <div class=\"ag-main-area\">\n <div class=\"ag-grid-split\" [class.ag-has-right-pane]=\"hasRightPinnedPane()\">\n @if (hasPinnedPane()) {\n <div class=\"ag-pinned-pane\" [style.width.px]=\"pinnedPaneWidth()\">\n @if (hasHeaderGroups()) {\n <div class=\"ag-header-groups ag-header-groups--pinned\" role=\"row\" aria-rowindex=\"1\"\n [style.grid-template-columns]=\"pinnedGridTemplateColumns()\" [style.width.px]=\"pinnedPaneWidth()\">\n @if (showControlColumn()) {\n <div class=\"ag-header-group-cell ag-header-group-cell--empty\"></div>\n }\n @for (run of pinnedHeaderGroupRuns(); track run.key) {\n <div class=\"ag-header-group-cell\" role=\"columnheader\"\n [attr.data-header-group]=\"run.id\"\n [class.ag-header-group-cell--empty]=\"!run.id\"\n [class.ag-header-group-cell--locked]=\"isHeaderGroupLocked(run.fields)\"\n [class.ag-header-group-cell--dragging]=\"isHeaderGroupDragging(run.fields)\"\n [style.grid-column]=\"'span ' + run.span\"\n (pointerdown)=\"run.id && onHeaderGroupPointerDown($event, run.fields, run.label)\">\n {{ run.label }}\n </div>\n }\n </div>\n }\n <div class=\"ag-header ag-header--pinned\" role=\"row\" [attr.aria-rowindex]=\"headerRowCount()\"\n [class.ag-header--with-filters]=\"hasFilterableColumns()\"\n [style.grid-template-columns]=\"pinnedGridTemplateColumns()\" [style.width.px]=\"pinnedPaneWidth()\">\n @if (showControlColumn()) {\n <div class=\"ag-header-cell ag-control-header\" role=\"columnheader\" aria-colindex=\"1\">\n <div class=\"ag-header-cell-top\"></div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\"></div>\n }\n </div>\n }\n @for (col of pinnedColDefs(); track col.field) {\n <div class=\"ag-header-cell ag-header-cell--pinned\" role=\"columnheader\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [attr.aria-sort]=\"getSort(col.field) === 'asc' ? 'ascending' : getSort(col.field) === 'desc' ? 'descending' : 'none'\"\n [class.ag-header-cell--filtered]=\"hasActiveFilter(col.field)\"\n [class.ag-header-cell--dragging]=\"isColDragging(col.field)\"\n [class.ag-header-cell--drop-before]=\"getColDropSide(col.field) === 'before'\"\n [class.ag-header-cell--drop-after]=\"getColDropSide(col.field) === 'after'\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-header-cell--pinned-last]=\"isLastPinnedColumn(col.field)\" [attr.data-col-field]=\"col.field\"\n (pointerdown)=\"onColHeaderPointerDown($event, col.field)\">\n <div class=\"ag-header-cell-top\">\n <span class=\"ag-header-cell-label\">{{ col.header }}</span>\n @if (getSort(col.field); as dir) {\n <span class=\"ag-sort-badge\">{{ dir === 'asc' ? '↑' : '↓' }}@if (hasMultiSort()) {<sup\n class=\"ag-sort-priority\">{{ getSortPriority(col.field) }}</sup>}</span>\n }\n <button class=\"ag-header-menu-btn\" [class.ag-header-menu-btn--active]=\"hasActiveFilter(col.field)\"\n [title]=\"localeText().columnMenu\" [attr.aria-label]=\"localeText().columnMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\" aria-haspopup=\"menu\"\n (click)=\"openFilterMenu($event, col.field)\"\n (pointerdown)=\"$event.stopPropagation()\">▾</button>\n </div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\">\n @if (col.filterable) {\n <input class=\"ag-filter-input\" [value]=\"getTextFilter(col.field)\"\n (input)=\"onTextFilterChange($event, col.field)\" (click)=\"$event.stopPropagation()\"\n [placeholder]=\"localeText().filterPlaceholder\"\n [attr.aria-label]=\"localeText().filterPlaceholder + ' ' + col.header\" />\n }\n </div>\n }\n <div class=\"ag-resize-handle\" role=\"separator\" [attr.tabindex]=\"col.locked ? -1 : 0\"\n aria-orientation=\"vertical\" [attr.aria-disabled]=\"col.locked ? 'true' : null\"\n [attr.aria-label]=\"localeText().resizeColumn + ': ' + col.header\"\n [attr.aria-valuenow]=\"getColumnWidth(col)\" (keydown)=\"onResizeKeyDown($event, col)\"\n (mousedown)=\"onResizeStart($event, col)\"\n (pointerdown)=\"$event.stopPropagation()\" (dblclick)=\"onAutosizeColumn($event, col)\"></div>\n </div>\n }\n </div>\n\n <cdk-virtual-scroll-viewport #pinnedViewport class=\"ag-body ag-pinned-body\" [itemSize]=\"rowHeight()\"\n [style.width.px]=\"pinnedPaneWidth()\">\n <div *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\" role=\"row\"\n [attr.aria-rowindex]=\"di + headerRowCount() + 1\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-add-row--selected]=\"item === null && isAddRowSelected()\" [class.ag-ghost-row]=\"item === 'ghost'\"\n [class.ag-group-header-row]=\"isGroupHeaderItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isPinnedPaneRowSelected(item)\"\n [class.ag-row--marked]=\"isDataRowItem(item) && isRowMarked(item.originalIndex)\"\n [class.ag-row--pending-delete]=\"isDataRowItem(item) && isRowPendingDelete(item.originalIndex)\"\n [attr.data-original-index]=\"getItemOriginalIndex(item)\" [style.height.px]=\"rowHeight()\"\n [style.grid-template-columns]=\"isDataRowItem(item) || item === 'ghost' ? pinnedGridTemplateColumns() : null\"\n (pointerdown)=\"isDataRowItem(item) && onRowPointerDown($event, item.originalIndex)\"\n (click)=\"isDataRowItem(item) && onRowClick($event, item)\">\n @if (isDataRowItem(item)) {\n @if (showControlColumn()) {\n <div class=\"ag-control-cell\" role=\"rowheader\" aria-colindex=\"1\"\n [class.ag-control-cell--reorder]=\"allowRowReorder()\"\n (contextmenu)=\"onControlContextMenu($event, item.originalIndex)\" (click)=\"$event.stopPropagation()\"\n (pointerdown)=\"onControlPointerDown($event, item.originalIndex)\">\n @if (enableRowMarking()) {\n <input class=\"ag-row-marker\" type=\"checkbox\" [checked]=\"isRowMarked(item.originalIndex)\"\n [attr.aria-label]=\"localeText().markRow\"\n (pointerdown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRowMarked(item.originalIndex)\" />\n }\n </div>\n }\n @for (col of pinnedColDefs(); track col.field) {\n @let ci = getVisibleColIndex(col.field);\n <agrid-cell [col]=\"col\" [rowIndex]=\"item.originalIndex\" [colIndex]=\"ci\" [value]=\"item.row[col.field]\"\n [row]=\"item.row\" [locale]=\"locale()\" [attr.title]=\"getCellTitle(col, item.row[col.field])\"\n [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\"\n [attr.data-col-field]=\"col.field\"\n [attr.aria-colindex]=\"getAriaColIndex(ci)\"\n [attr.aria-selected]=\"isSelected(item.originalIndex, ci) || isRangeSelected(item.originalIndex, ci)\"\n [selected]=\"isSelected(item.originalIndex, ci)\" [editing]=\"isEditing(item.originalIndex, ci)\"\n [seedChar]=\"getSeedChar(item.originalIndex, ci)\"\n [treeCell]=\"isTreeCell(col)\" [treeLevel]=\"treeRowLevel(item)\"\n [treeExpandable]=\"treeRowExpandable(item)\" [treeExpanded]=\"treeRowExpanded(item)\"\n [class.ag-cell--range-selected]=\"isRangeSelected(item.originalIndex, ci)\"\n [class.ag-cell--fill-preview]=\"isFillPreviewCell(item.originalIndex, ci)\"\n [class.ag-cell--fill-handle]=\"isFillHandleCell(item.originalIndex, ci)\"\n [class.ag-cell--find-match]=\"isFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--find-active]=\"isActiveFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--changed]=\"isCellChanged(item.originalIndex, col.field)\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class]=\"getCellClass(col, item.row[col.field], item.row)\" [class.ag-cell--pinned]=\"true\"\n [class.ag-cell--pinned-last]=\"isLastPinnedColumn(col.field)\"\n (pointerdown)=\"onCellPointerDown($event, item.originalIndex, ci)\"\n (activate)=\"onActivate(item.originalIndex, ci, $event)\" (startEdit)=\"onStartEdit(item.originalIndex, ci)\"\n (draftChange)=\"onDraftChange($event)\" (treeToggle)=\"onTreeToggle(item)\"\n (contextmenu)=\"onCellContextMenu($event, item.originalIndex, ci, col, item.row)\" />\n }\n } @else if (item === null) {\n <div class=\"ag-pinned-row-spacer\"></div>\n } @else if (item === 'ghost') {\n @if (showControlColumn()) {\n <div class=\"ag-control-cell ag-control-cell--reorder ag-ghost-handle\"></div>\n }\n @for (col of pinnedColDefs(); track col.field) {\n <div class=\"ag-ghost-cell ag-cell--pinned\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-cell--pinned-last]=\"isLastPinnedColumn(col.field)\">{{\n getGhostCellDisplay(col) }}</div>\n }\n } @else {\n <div class=\"ag-pinned-group-spacer\"></div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\"\n [attr.aria-rowindex]=\"displayItems().length + headerRowCount() + 1\"\n [style.grid-template-columns]=\"pinnedGridTemplateColumns()\">\n @if (showControlColumn()) {\n <div class=\"ag-footer-cell ag-footer-cell--control\" role=\"gridcell\" aria-colindex=\"1\"></div>\n }\n @for (col of pinnedColDefs(); track col.field) {\n <div class=\"ag-footer-cell\" role=\"gridcell\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [class.ag-footer-cell--pinned-last]=\"isLastPinnedColumn(col.field)\">\n @if (hasAggregate(col)) {\n <span class=\"ag-footer-label\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, footerValues()[col.field]) }}\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"ag-scroll-pane\">\n <div #horizontalScroller class=\"ag-horizontal-scroll\" (scroll)=\"onHorizontalScroll()\">\n @if (hasHeaderGroups()) {\n <div class=\"ag-header-groups\" role=\"row\" aria-rowindex=\"1\"\n [style.grid-template-columns]=\"scrollableGridTemplateColumns()\"\n [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (run of scrollableHeaderGroupRuns(); track run.key) {\n <div class=\"ag-header-group-cell\" role=\"columnheader\"\n [attr.data-header-group]=\"run.id\"\n [class.ag-header-group-cell--empty]=\"!run.id\"\n [class.ag-header-group-cell--locked]=\"isHeaderGroupLocked(run.fields)\"\n [class.ag-header-group-cell--dragging]=\"isHeaderGroupDragging(run.fields)\"\n [style.grid-column]=\"'span ' + run.span\"\n (pointerdown)=\"run.id && onHeaderGroupPointerDown($event, run.fields, run.label)\">\n {{ run.label }}\n </div>\n }\n </div>\n }\n <div class=\"ag-header\" role=\"row\" [attr.aria-rowindex]=\"headerRowCount()\"\n [class.ag-header--with-filters]=\"hasFilterableColumns()\"\n [style.grid-template-columns]=\"scrollableGridTemplateColumns()\"\n [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (col of scrollableColDefs(); track col.field) {\n <div class=\"ag-header-cell\" role=\"columnheader\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [attr.aria-sort]=\"getSort(col.field) === 'asc' ? 'ascending' : getSort(col.field) === 'desc' ? 'descending' : 'none'\"\n [class.ag-header-cell--filtered]=\"hasActiveFilter(col.field)\"\n [class.ag-header-cell--dragging]=\"isColDragging(col.field)\"\n [class.ag-header-cell--drop-before]=\"getColDropSide(col.field) === 'before'\"\n [class.ag-header-cell--drop-after]=\"getColDropSide(col.field) === 'after'\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [attr.data-col-field]=\"col.field\" (pointerdown)=\"onColHeaderPointerDown($event, col.field)\">\n <div class=\"ag-header-cell-top\">\n <span class=\"ag-header-cell-label\">{{ col.header }}</span>\n @if (getSort(col.field); as dir) {\n <span class=\"ag-sort-badge\">{{ dir === 'asc' ? '↑' : '↓' }}@if (hasMultiSort()) {<sup\n class=\"ag-sort-priority\">{{ getSortPriority(col.field) }}</sup>}</span>\n }\n @if (isGroupedByField(col.field)) {\n <span class=\"ag-sort-badge\">⊟</span>\n }\n <button class=\"ag-header-menu-btn\" [class.ag-header-menu-btn--active]=\"hasActiveFilter(col.field)\"\n [title]=\"localeText().columnMenu\" [attr.aria-label]=\"localeText().columnMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\" aria-haspopup=\"menu\"\n (click)=\"openFilterMenu($event, col.field)\"\n (pointerdown)=\"$event.stopPropagation()\">▾</button>\n </div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\">\n @if (col.filterable) {\n <input class=\"ag-filter-input\" [value]=\"getTextFilter(col.field)\"\n (input)=\"onTextFilterChange($event, col.field)\" (click)=\"$event.stopPropagation()\"\n [placeholder]=\"localeText().filterPlaceholder\"\n [attr.aria-label]=\"localeText().filterPlaceholder + ' ' + col.header\" />\n }\n </div>\n }\n <div class=\"ag-resize-handle\" role=\"separator\" [attr.tabindex]=\"col.locked ? -1 : 0\"\n aria-orientation=\"vertical\" [attr.aria-disabled]=\"col.locked ? 'true' : null\"\n [attr.aria-label]=\"localeText().resizeColumn + ': ' + col.header\"\n [attr.aria-valuenow]=\"getColumnWidth(col)\" (keydown)=\"onResizeKeyDown($event, col)\"\n (mousedown)=\"onResizeStart($event, col)\"\n (pointerdown)=\"$event.stopPropagation()\" (dblclick)=\"onAutosizeColumn($event, col)\"></div>\n </div>\n }\n </div>\n\n <cdk-virtual-scroll-viewport #scrollViewport class=\"ag-body\" [itemSize]=\"rowHeight()\"\n [style.min-width.px]=\"scrollableTotalWidth()\" (scroll)=\"onBodyScroll()\">\n <div *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\" role=\"row\"\n [attr.aria-rowindex]=\"di + headerRowCount() + 1\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-add-row--selected]=\"item === null && isAddRowSelected()\" [class.ag-ghost-row]=\"item === 'ghost'\"\n [class.ag-group-header-row]=\"isGroupHeaderItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex)\"\n [class.ag-row--marked]=\"isDataRowItem(item) && isRowMarked(item.originalIndex)\"\n [class.ag-row--pending-delete]=\"isDataRowItem(item) && isRowPendingDelete(item.originalIndex)\"\n [attr.data-original-index]=\"getItemOriginalIndex(item)\" [style.height.px]=\"rowHeight()\"\n [style.grid-template-columns]=\"isDataRowItem(item) || item === 'ghost' ? scrollableGridTemplateColumns() : null\"\n (pointerdown)=\"isDataRowItem(item) && onRowPointerDown($event, item.originalIndex)\"\n (click)=\"isDataRowItem(item) && onRowClick($event, item)\">\n @if (isDataRowItem(item)) {\n @for (col of scrollableColDefs(); track col.field) {\n @let ci = getVisibleColIndex(col.field);\n <agrid-cell [col]=\"col\" [rowIndex]=\"item.originalIndex\" [colIndex]=\"ci\" [value]=\"item.row[col.field]\"\n [row]=\"item.row\" [locale]=\"locale()\" [attr.title]=\"getCellTitle(col, item.row[col.field])\"\n [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\"\n [attr.data-col-field]=\"col.field\"\n [attr.aria-colindex]=\"getAriaColIndex(ci)\"\n [attr.aria-selected]=\"isSelected(item.originalIndex, ci) || isRangeSelected(item.originalIndex, ci)\"\n [selected]=\"isSelected(item.originalIndex, ci)\" [editing]=\"isEditing(item.originalIndex, ci)\"\n [seedChar]=\"getSeedChar(item.originalIndex, ci)\"\n [treeCell]=\"isTreeCell(col)\" [treeLevel]=\"treeRowLevel(item)\"\n [treeExpandable]=\"treeRowExpandable(item)\" [treeExpanded]=\"treeRowExpanded(item)\"\n [class.ag-cell--range-selected]=\"isRangeSelected(item.originalIndex, ci)\"\n [class.ag-cell--fill-preview]=\"isFillPreviewCell(item.originalIndex, ci)\"\n [class.ag-cell--fill-handle]=\"isFillHandleCell(item.originalIndex, ci)\"\n [class]=\"getCellClass(col, item.row[col.field], item.row)\"\n [class.ag-cell--changed]=\"isCellChanged(item.originalIndex, col.field)\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-cell--find-match]=\"isFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--find-active]=\"isActiveFindMatchCell(item.originalIndex, ci)\"\n (pointerdown)=\"onCellPointerDown($event, item.originalIndex, ci)\"\n (activate)=\"onActivate(item.originalIndex, ci, $event)\"\n (startEdit)=\"onStartEdit(item.originalIndex, ci)\" (draftChange)=\"onDraftChange($event)\"\n (treeToggle)=\"onTreeToggle(item)\"\n (contextmenu)=\"onCellContextMenu($event, item.originalIndex, ci, col, item.row)\" />\n }\n } @else if (item === null) {\n <div class=\"ag-add-row-label\" (click)=\"onActivateAddRow()\">\n <span class=\"ag-add-row-icon\">+</span> {{ localeText().addRow }}\n </div>\n } @else if (item === 'ghost') {\n @for (col of scrollableColDefs(); track col.field) {\n <div class=\"ag-ghost-cell\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\">{{\n getGhostCellDisplay(col) }}</div>\n }\n } @else {\n <div class=\"ag-group-header-content\" [style.min-width.px]=\"scrollableTotalWidth()\">\n <div class=\"ag-group-header-main\"\n (click)=\"onGroupHeaderClick(item.groupLabel); $event.stopPropagation()\">\n <span class=\"ag-group-icon\" [class.ag-group-icon--expanded]=\"!item.collapsed\">▶</span>\n <span class=\"ag-group-label\">{{ item.groupLabel }}</span>\n @if (groupActions().length > 0) {\n <button class=\"ag-group-actions-btn\" [title]=\"localeText().actions\"\n (click)=\"openGroupActionsMenu($event, item.groupLabel)\">⋮</button>\n }\n <span class=\"ag-group-count\">{{ item.count }}</span>\n @if (getGroupDescription(item.groupLabel); as desc) {\n <span class=\"ag-group-description\">{{ desc }}</span>\n }\n </div>\n </div>\n }\n @if (isDataRowItem(item) && isRowPendingDelete(item.originalIndex)) {\n <div class=\"ag-delete-confirmation\" role=\"alertdialog\"\n [attr.aria-label]=\"localeText().confirmDeleteRow\"\n [style.left.px]=\"deleteConfirmationLeft()\"\n [style.width.px]=\"deleteConfirmationWidth() || null\"\n (pointerdown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\">\n <span class=\"ag-delete-confirmation-text\">{{ localeText().confirmDeleteRow }}</span>\n <button class=\"ag-delete-confirmation-btn ag-delete-confirmation-btn--yes\"\n type=\"button\" (click)=\"confirmPendingRowDelete()\">{{ localeText().confirmYes }}</button>\n <button class=\"ag-delete-confirmation-btn\" type=\"button\" data-delete-confirm-no\n (click)=\"cancelRowDelete()\">{{ localeText().confirmNo }}</button>\n </div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\"\n [attr.aria-rowindex]=\"displayItems().length + headerRowCount() + 1\"\n [style.grid-template-columns]=\"scrollableGridTemplateColumns()\"\n [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (col of scrollableColDefs(); track col.field) {\n <div class=\"ag-footer-cell\" role=\"gridcell\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\">\n @if (hasAggregate(col)) {\n <span class=\"ag-footer-label\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, footerValues()[col.field]) }}\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n @if (hasRightPinnedPane()) {\n <div class=\"ag-pinned-pane ag-pinned-pane--right\" [style.width.px]=\"rightPinnedPaneWidth()\">\n @if (hasHeaderGroups()) {\n <div class=\"ag-header-groups\" role=\"row\" aria-rowindex=\"1\"\n [style.grid-template-columns]=\"rightGridTemplateColumns()\" [style.width.px]=\"rightPinnedPaneWidth()\">\n @for (run of rightHeaderGroupRuns(); track run.key) {\n <div class=\"ag-header-group-cell\" role=\"columnheader\"\n [attr.data-header-group]=\"run.id\"\n [class.ag-header-group-cell--empty]=\"!run.id\"\n [class.ag-header-group-cell--locked]=\"isHeaderGroupLocked(run.fields)\"\n [class.ag-header-group-cell--dragging]=\"isHeaderGroupDragging(run.fields)\"\n [style.grid-column]=\"'span ' + run.span\"\n (pointerdown)=\"run.id && onHeaderGroupPointerDown($event, run.fields, run.label)\">\n {{ run.label }}\n </div>\n }\n </div>\n }\n <div class=\"ag-header\" role=\"row\" [attr.aria-rowindex]=\"headerRowCount()\"\n [class.ag-header--with-filters]=\"hasFilterableColumns()\"\n [style.grid-template-columns]=\"rightGridTemplateColumns()\" [style.width.px]=\"rightPinnedPaneWidth()\">\n @for (col of rightPinnedColDefs(); track col.field) {\n <div class=\"ag-header-cell ag-header-cell--pinned\" role=\"columnheader\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [attr.aria-sort]=\"getSort(col.field) === 'asc' ? 'ascending' : getSort(col.field) === 'desc' ? 'descending' : 'none'\"\n [class.ag-header-cell--filtered]=\"hasActiveFilter(col.field)\"\n [class.ag-header-cell--dragging]=\"isColDragging(col.field)\"\n [class.ag-header-cell--drop-before]=\"getColDropSide(col.field) === 'before'\"\n [class.ag-header-cell--drop-after]=\"getColDropSide(col.field) === 'after'\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-header-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\" [attr.data-col-field]=\"col.field\"\n (pointerdown)=\"onColHeaderPointerDown($event, col.field)\">\n <div class=\"ag-header-cell-top\">\n <span class=\"ag-header-cell-label\">{{ col.header }}</span>\n @if (getSort(col.field); as dir) {\n <span class=\"ag-sort-badge\">{{ dir === 'asc' ? '↑' : '↓' }}@if (hasMultiSort()) {<sup\n class=\"ag-sort-priority\">{{ getSortPriority(col.field) }}</sup>}</span>\n }\n @if (isGroupedByField(col.field)) {\n <span class=\"ag-sort-badge\">'⊟ '</span>\n }\n <button class=\"ag-header-menu-btn\" [class.ag-header-menu-btn--active]=\"hasActiveFilter(col.field)\"\n [title]=\"localeText().columnMenu\" [attr.aria-label]=\"localeText().columnMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\" aria-haspopup=\"menu\"\n (click)=\"openFilterMenu($event, col.field)\"\n (pointerdown)=\"$event.stopPropagation()\">▾</button>\n </div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\">\n @if (col.filterable) {\n <input class=\"ag-filter-input\" [value]=\"getTextFilter(col.field)\"\n (input)=\"onTextFilterChange($event, col.field)\" (click)=\"$event.stopPropagation()\"\n [placeholder]=\"localeText().filterPlaceholder\"\n [attr.aria-label]=\"localeText().filterPlaceholder + ' ' + col.header\" />\n }\n </div>\n }\n <div class=\"ag-resize-handle\" role=\"separator\" [attr.tabindex]=\"col.locked ? -1 : 0\"\n aria-orientation=\"vertical\" [attr.aria-disabled]=\"col.locked ? 'true' : null\"\n [attr.aria-label]=\"localeText().resizeColumn + ': ' + col.header\"\n [attr.aria-valuenow]=\"getColumnWidth(col)\" (keydown)=\"onResizeKeyDown($event, col)\"\n (mousedown)=\"onResizeStart($event, col)\"\n (pointerdown)=\"$event.stopPropagation()\" (dblclick)=\"onAutosizeColumn($event, col)\"></div>\n </div>\n }\n </div>\n\n <cdk-virtual-scroll-viewport #rightPinnedViewport class=\"ag-body ag-pinned-body ag-right-pinned-body\"\n [itemSize]=\"rowHeight()\" [style.width.px]=\"rightPinnedPaneWidth()\" (scroll)=\"onRightPinnedBodyScroll()\">\n <div *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\" role=\"row\"\n [attr.aria-rowindex]=\"di + headerRowCount() + 1\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-ghost-row]=\"item === 'ghost'\" [class.ag-group-header-row]=\"isGroupHeaderItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex)\"\n [class.ag-row--marked]=\"isDataRowItem(item) && isRowMarked(item.originalIndex)\"\n [class.ag-row--pending-delete]=\"isDataRowItem(item) && isRowPendingDelete(item.originalIndex)\"\n [style.height.px]=\"rowHeight()\"\n [style.grid-template-columns]=\"isDataRowItem(item) || item === 'ghost' ? rightGridTemplateColumns() : null\">\n @if (isDataRowItem(item)) {\n @for (col of rightPinnedColDefs(); track col.field) {\n @let ci = getVisibleColIndex(col.field);\n <agrid-cell [col]=\"col\" [rowIndex]=\"item.originalIndex\" [colIndex]=\"ci\" [value]=\"item.row[col.field]\"\n [row]=\"item.row\" [locale]=\"locale()\" [attr.title]=\"getCellTitle(col, item.row[col.field])\"\n [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\"\n [attr.data-col-field]=\"col.field\"\n [attr.aria-colindex]=\"getAriaColIndex(ci)\"\n [attr.aria-selected]=\"isSelected(item.originalIndex, ci) || isRangeSelected(item.originalIndex, ci)\"\n [selected]=\"isSelected(item.originalIndex, ci)\" [editing]=\"isEditing(item.originalIndex, ci)\"\n [seedChar]=\"getSeedChar(item.originalIndex, ci)\"\n [treeCell]=\"isTreeCell(col)\" [treeLevel]=\"treeRowLevel(item)\"\n [treeExpandable]=\"treeRowExpandable(item)\" [treeExpanded]=\"treeRowExpanded(item)\"\n [class]=\"getCellClass(col, item.row[col.field], item.row)\"\n [class.ag-cell--range-selected]=\"isRangeSelected(item.originalIndex, ci)\"\n [class.ag-cell--fill-preview]=\"isFillPreviewCell(item.originalIndex, ci)\"\n [class.ag-cell--fill-handle]=\"isFillHandleCell(item.originalIndex, ci)\"\n [class.ag-cell--changed]=\"isCellChanged(item.originalIndex, col.field)\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-cell--find-match]=\"isFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--find-active]=\"isActiveFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--pinned]=\"true\" [class.ag-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\"\n (pointerdown)=\"onCellPointerDown($event, item.originalIndex, ci)\"\n (activate)=\"onActivate(item.originalIndex, ci, $event)\" (startEdit)=\"onStartEdit(item.originalIndex, ci)\"\n (draftChange)=\"onDraftChange($event)\" (treeToggle)=\"onTreeToggle(item)\"\n (contextmenu)=\"onCellContextMenu($event, item.originalIndex, ci, col, item.row)\" />\n }\n } @else if (item === null) {\n <div class=\"ag-pinned-row-spacer\"></div>\n } @else if (item === 'ghost') {\n @for (col of rightPinnedColDefs(); track col.field) {\n <div class=\"ag-ghost-cell ag-cell--pinned\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\">{{ getGhostCellDisplay(col) }}</div>\n }\n } @else {\n <div class=\"ag-pinned-group-spacer\"></div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\"\n [attr.aria-rowindex]=\"displayItems().length + headerRowCount() + 1\"\n [style.grid-template-columns]=\"rightGridTemplateColumns()\">\n @for (col of rightPinnedColDefs(); track col.field) {\n <div class=\"ag-footer-cell\" role=\"gridcell\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [class.ag-footer-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\">\n @if (hasAggregate(col)) {\n <span class=\"ag-footer-label\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, footerValues()[col.field]) }}\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n @if (loading()) {\n <div class=\"ag-state-overlay\" role=\"status\" aria-live=\"polite\">{{ localeText().loading }}</div>\n } @else if (isEmpty()) {\n <div class=\"ag-state-overlay\" role=\"status\" aria-live=\"polite\">{{ emptyTextLabel() }}</div>\n }\n\n @if (showSidebar()) {\n <agrid-sidebar\n [open]=\"sidebarOpen()\"\n [activeTab]=\"sidebarTab()\"\n [columns]=\"colDefs()\"\n [headerGroups]=\"headerGroups()\"\n [row]=\"sidebarRow()\"\n [hiddenColumns]=\"sidebarHiddenColumns()\"\n [locale]=\"locale()\"\n [localeText]=\"localeText()\"\n [readonlyGrid]=\"readonlyGrid()\"\n [useSidebarEditor]=\"useSidebarEditor()\"\n (close)=\"toggleSidebar()\"\n (tabChange)=\"onSidebarStripClick($event)\"\n (toggleColumn)=\"onSidebarToggleColumn($event)\"\n (toggleColumnGroup)=\"onSidebarToggleColumnGroup($event.fields, $event.visible)\"\n (detailEdit)=\"onSidebarDetailEdit($event)\"\n (save)=\"onSidebarDetailSave($event)\"\n />\n }\n </div><!-- /.ag-main-area -->\n\n @if (showPagination()) {\n <nav class=\"ag-pagination\" [attr.aria-label]=\"localeText().pagination\">\n <button class=\"ag-page-btn\" [attr.aria-label]=\"localeText().firstPage\"\n [disabled]=\"control()!.currentPage() <= 1\" (click)=\"goToFirstPage()\">«</button>\n <button class=\"ag-page-btn\" [attr.aria-label]=\"localeText().previous\"\n [disabled]=\"control()!.currentPage() <= 1\" (click)=\"goToPrevPage()\">‹</button>\n <span class=\"ag-page-info\" aria-live=\"polite\">{{ control()!.currentPage() }} / {{ totalPages() }}</span>\n <button class=\"ag-page-btn\" [disabled]=\"control()!.currentPage() >= totalPages()\"\n [attr.aria-label]=\"localeText().next\"\n (click)=\"goToNextPage()\">›</button>\n <button class=\"ag-page-btn\" [disabled]=\"control()!.currentPage() >= totalPages()\"\n [attr.aria-label]=\"localeText().lastPage\"\n (click)=\"goToLastPage()\">»</button>\n <span class=\"ag-page-count\">{{ localeText().rows(filteredRowCount()) }}</span>\n </nav>\n }\n\n @if (findOpen()) {\n <agrid-find-panel [query]=\"findQuery()\" [matchCount]=\"findMatches().length\" [activeIndex]=\"findActiveIndex()\"\n [localeText]=\"localeText()\" (queryChange)=\"onFindInput($event)\" (previous)=\"goToFindMatch(-1)\"\n (next)=\"goToFindMatch(1)\" (close)=\"closeFind()\" />\n }\n\n <!-- Row context menu -->\n @if (contextMenu(); as menu) {\n <div class=\"ag-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n <button class=\"ag-context-item ag-context-item--danger\" role=\"menuitem\" (click)=\"deleteRow(menu.rowIndex)\">\n {{ localeText().deleteRow }}\n </button>\n </div>\n }\n\n <!-- Cell context menu -->\n @if (cellContextMenuState(); as menu) {\n @let col = getColDef(menu.field)!;\n <div class=\"ag-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"copyCellToClipboard(menu.rowIndex, col)\">{{ localeText().copyCellValue\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"copyRowToClipboard(menu.rowIndex)\">{{ localeText().copyRow }}</button>\n @if (allowAddRows() && !readonlyGrid()) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"insertRowAt(menu.rowIndex)\">{{ localeText().insertRowAbove }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"insertRowAt(menu.rowIndex + 1)\">{{ localeText().insertRowBelow }}</button>\n }\n @if (!readonlyGrid()) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n <button class=\"ag-context-item ag-context-item--danger\" role=\"menuitem\"\n (click)=\"deleteRow(menu.rowIndex)\">{{ localeText().deleteRow }}</button>\n }\n @if (cellMenuItems().length) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n @for (item of cellMenuItems(); track $index) {\n @if (item === null) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n } @else {\n <button class=\"ag-context-item\" role=\"menuitem\" [class.ag-context-item--danger]=\"item.danger\" [disabled]=\"item.disabled\"\n (click)=\"runCellMenuItem(item, menu)\">{{\n item.label }}</button>\n }\n }\n }\n </div>\n }\n\n <!-- Group actions menu -->\n @if (groupActionsMenu(); as menu) {\n <div class=\"ag-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n @for (action of groupActions(); track action.label) {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onGroupAction(action, menu.label)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n\n <!-- Filter dropdown -->\n @if (filterMenu(); as menu) {\n <agrid-column-menu [x]=\"menu.x\" [y]=\"menu.y\" [header]=\"getColDef(menu.field)?.header ?? menu.field\"\n [sortDir]=\"getSort(menu.field)\" [sortable]=\"sortOption() !== 'none'\"\n [showColumnActions]=\"!!control()\" [pinned]=\"getColumnPinState(menu.field)\"\n [groupable]=\"!!getColDef(menu.field)?.groupable\" [grouped]=\"isGroupedByField(menu.field)\"\n [filterable]=\"!!getColDef(menu.field)?.filterable\" [showValueFilter]=\"!serverSideFiltering()\"\n [search]=\"filterMenuSearch()\"\n [allSelected]=\"isMenuAllSelected(menu.field)\"\n [valueItems]=\"serverSideFiltering() || !getColDef(menu.field)?.filterable ? [] : columnMenuValueItems()\"\n [localeText]=\"localeText()\"\n [sortPriority]=\"getSortPriority(menu.field)\" [hasMultiSort]=\"hasMultiSort()\" (sort)=\"onMenuSort(menu.field, $event)\"\n (resetSort)=\"onMenuResetSort(menu.field, $event)\" (autosize)=\"onMenuAutosizeColumn(menu.field)\"\n (togglePin)=\"onMenuTogglePin(menu.field)\" (togglePinRight)=\"onMenuTogglePinRight(menu.field)\"\n (hide)=\"onMenuHideColumn(menu.field)\" (toggleGroup)=\"onMenuToggleGroupBy(menu.field)\"\n (clearFilter)=\"onMenuClearFilter(menu.field)\" (clearAll)=\"onMenuClearAll()\"\n (searchChange)=\"onFilterMenuSearch($event)\" (toggleAll)=\"onMenuToggleAll(menu.field)\"\n (toggleValue)=\"onMenuToggleValue(menu.field, $event)\" [aggregate]=\"getEffectiveAggregate(getColDef(menu.field)!)\"\n (setAggregate)=\"onMenuSetAggregate(menu.field, $event)\" />\n }\n\n @if (columnDragPreview(); as preview) {\n <div class=\"ag-column-drag-preview\"\n [style.left.px]=\"preview.x\" [style.top.px]=\"preview.y\"\n [style.width.px]=\"preview.width\" [style.height.px]=\"preview.height\">\n <span>{{ preview.label }}</span>\n </div>\n }\n</div>\n","import type { AgridDataSource } from './agrid-datasource';\nimport type { AgridProvider } from './agrid-provider';\n\n/** String-valued property names available on a row type. */\nexport type AgridField<T extends object> = Extract<keyof T, string>;\n\n/** Global options shared by grid providers. */\nexport interface AGridOptions {\n /**\n * Locale used for built-in labels, date formatting, and comparisons.\n * Use `'auto'` to resolve the browser locale.\n */\n locale: string;\n}\n\n/**\n * A single item in the cell right-click context menu.\n * Pass `null` in the array to render a separator line.\n */\nexport interface CellContextMenuItem<T extends object = any> {\n /** Label shown in the menu. */\n label: string;\n /** Called when the item is clicked. */\n action: (params: {\n value: T[AgridField<T>];\n row: T;\n field: AgridField<T>;\n originalIndex: number;\n }) => void;\n /** Grays out the item and prevents clicks. */\n disabled?: boolean;\n /** Renders the item in red (destructive action). */\n danger?: boolean;\n}\n\n/**\n * A structured value option used when the data field stores a raw value (e.g. a numeric ID)\n * but the cell should display a human-readable label.\n *\n * @example\n * ```ts\n * values: [\n * { value: 1, label: 'Engineering' },\n * { value: 2, label: 'Sales' },\n * ]\n * ```\n */\nexport interface ValueOption<TValue = unknown> {\n /** Raw value stored in the data source (e.g. `1`, `'ENG'`). */\n value: TValue;\n /** Human-readable label shown in the cell, dropdown, and filter menu. */\n label: string;\n}\n\n/** Width sentinel that makes a column fill the remaining horizontal space. */\nexport const ColDefAutoSize = -1;\n\n/** Label definition for a group displayed above contiguous column headers. */\nexport interface HeaderGroup {\n /** Stable identifier referenced by {@link ColDefBase.group}. */\n id: string;\n /** Text displayed in the grouped header row. */\n label: string;\n}\n\n/** Defines the behavior shared by every typed column. */\nexport interface ColDefBase<T extends object, K extends AgridField<T>> {\n /** Data field name — must match a key in the row object. */\n field: K;\n /** Text displayed in the column header. */\n header: string;\n /** Optional header-group identifier configured through `AgridProvider.headerGroups`. */\n group?: string;\n /**\n * Default column width in pixels. Can be overridden at runtime via {@link AgridControl}.\n * Use `-1` (or omit) to make the column auto-scale and fill available space (`1fr`).\n */\n width?: number;\n /**\n * Semantic type of the field.\n * - `'number'` — blank rows initialize this field to `0` instead of `''`.\n * - `'date'` — uses a native date editor and built-in localized display formatting.\n */\n type?: 'text' | 'number' | 'date';\n /**\n * Set to `false` to make the column read-only.\n * Defaults to `true` (editable) when omitted.\n */\n editable?: boolean;\n /**\n * Fixed list of allowed values shown in a `<select>` dropdown when editing.\n *\n * - `string[]` — simple list; the stored value equals the displayed label.\n * - `ValueOption[]` — structured list; the stored value (`value`) differs from the\n * displayed label (`label`). Useful when the dataset stores IDs but should show names.\n */\n values?: string[] | ValueOption<T[K]>[];\n /**\n * Optional display formatter applied when the column has no `values` list.\n * Receives the raw cell value and returns the string to display in the cell.\n *\n * @example\n * ```ts\n * { field: 'salary', formatter: v => `$${Number(v).toLocaleString()}` }\n * ```\n */\n formatter?: (value: T[K]) => string;\n /**\n * Set to `true` to show a filter input and value-picker in the filter row for this column.\n * At least one filterable column must exist for the filter row to appear.\n */\n filterable?: boolean;\n /**\n * Set to `true` to allow grouping the grid by this column.\n * When set, the filter dropdown shows a \"Group by\" toggle for this column.\n */\n groupable?: boolean;\n /**\n * Set to `true` to hide this column when the grid first renders.\n * The column remains in the dataset and can be re-shown via the sidebar column picker\n * or programmatically via `AgridControl.setColumnVisibility()`.\n */\n hidden?: boolean;\n /**\n * Pin this column to the left edge of the grid so it stays visible during horizontal scroll.\n * Can also be toggled at runtime via `AgridControl.setPinned()`.\n */\n pinned?: 'left' | 'right';\n /**\n * Aggregate function shown in the footer row for this column.\n * Built-in: `'sum'`, `'avg'`, `'min'`, `'max'`, `'count'`.\n * Pass a custom function to compute any value from the visible row values.\n * The footer only appears when at least one column has `aggregate` set.\n *\n * @example\n * ```ts\n * { field: 'salary', aggregate: 'sum' }\n * { field: 'score', aggregate: values => values.filter(v => Number(v) > 90).length }\n * ```\n */\n aggregate?: 'sum' | 'avg' | 'min' | 'max' | 'count' | ((values: unknown[]) => unknown);\n /**\n * Return one or more CSS class names to apply to every cell in this column based on the\n * cell's value and row data. Useful for conditional highlighting without a custom renderer.\n *\n * @example\n * ```ts\n * { field: 'score', cellClass: ({ value }) => Number(value) < 50 ? 'cell-danger' : '' }\n * ```\n */\n cellClass?: (params: { value: T[K]; row: T }) => string;\n /**\n * Set to `true` to prevent the column from being resized, reordered, or autosized.\n * The column can still be hidden, filtered, and sorted.\n */\n locked?: boolean;\n /**\n * Custom cell renderer. Returns an HTML string displayed instead of the plain text value.\n * Angular's built-in HTML sanitization is applied automatically.\n *\n * @example\n * ```ts\n * { field: 'status', cellRenderer: ({ value }) =>\n * `<span class=\"badge badge-${value}\">${value}</span>` }\n * ```\n */\n cellRenderer?: (params: { value: T[K]; row: T }) => string;\n}\n\n/**\n * Defines a column whose `field`, formatter value, renderer value, and row are\n * derived from the supplied row type.\n */\nexport type ColDef<\n T extends object = any,\n K extends AgridField<T> = AgridField<T>,\n> = K extends AgridField<T> ? ColDefBase<T, K> : never;\n\n/**\n * Defines a single action shown in the group header's action menu.\n * Pass an array of these to `<agrid [groupActions]=\"...\">`.\n */\nexport interface GroupAction {\n /** Label shown in the dropdown. */\n label: string;\n /** Called with the group's display label when the item is clicked. */\n action: (groupLabel: string) => void;\n}\n\n/**\n * Internal row item used in the virtual scroll list.\n * - `{ row, originalIndex }` — a real data row\n * - `null` — the add-row placeholder\n * - `'ghost'` — the drop-target ghost inserted while dragging\n * - `{ groupLabel, count, collapsed }` — group header row when grouping is active\n * - `{ row, originalIndex, level, expandable, expanded }` — a tree row when tree mode is active\n */\nexport type GridItem<T extends object = Record<string, unknown>> =\n | { row: T; originalIndex: number }\n | null\n | 'ghost'\n | { groupLabel: string; count: number; collapsed: boolean }\n | TreeRowItem<T>;\n\n/**\n * A data row rendered inside a hierarchical tree.\n *\n * Structurally a superset of the plain `{ row, originalIndex }` data-row item, so it also\n * satisfies {@link GridItem}'s data-row checks — selection, editing, and cell rendering treat\n * it exactly like a flat row. The extra fields drive indentation and the expand/collapse twisty.\n */\nexport interface TreeRowItem<T extends object = Record<string, unknown>> {\n /** The underlying row object from the data source. */\n row: T;\n /** Zero-based index of the row in the (flat) data source. */\n originalIndex: number;\n /** Depth in the tree. Root rows are `0`; each level of nesting adds `1`. */\n level: number;\n /** `true` when this row has at least one child row in the current projection. */\n expandable: boolean;\n /** `true` when this row is expandable and currently expanded (its children are visible). */\n expanded: boolean;\n}\n\n/**\n * Host-supplied configuration that turns the grid into a tree.\n *\n * Hierarchy is expressed over the existing flat row array: every row exposes a stable id and a\n * parent id, so no nested `children` arrays are required and `originalIndex`-based selection and\n * editing keep working unchanged. A row whose `getParentId` is `null`/`undefined` — or whose\n * parent id is not present in the data — is treated as a root.\n *\n * @example\n * ```ts\n * treeConfig: {\n * getId: row => row.id,\n * getParentId: row => row.managerId,\n * treeField: 'name',\n * }\n * ```\n */\nexport interface AgridTreeConfig<T extends object = any> {\n /** Return a stable, unique id for a row. Used as the expansion key and for parent lookups. */\n getId: (row: T) => string | number;\n /** Return the id of a row's parent, or `null`/`undefined` for a root row. */\n getParentId: (row: T) => string | number | null | undefined;\n /** Field whose cell shows the indentation and expand/collapse twisty. */\n treeField: AgridField<T>;\n /** Expand all nodes when the tree first renders. Defaults to `false` (all collapsed). */\n defaultExpanded?: boolean;\n /**\n * When filtering, keep the ancestors of any matching row visible even if they don't match.\n * Defaults to `true`. (Applied by the projection layer, not by {@link GridItem} flattening.)\n */\n keepAncestorsOnFilter?: boolean;\n}\n\n/** Zero-based position of a cell inside the grid. */\nexport interface CellPosition {\n /** Zero-based row index in the data array. */\n rowIndex: number;\n /** Zero-based column index in {@link ColDef} order. */\n colIndex: number;\n}\n\n/** Emitted by `(cellEdit)` after the user commits a cell change. */\nexport type GridEditEvent<T extends object = any> = {\n [K in AgridField<T>]: {\n /** Position of the edited cell. */\n position: CellPosition;\n /** The `ColDef.field` that was changed. */\n field: K;\n /** Previous field value before the edit. */\n oldValue: T[K];\n /** New field value after the edit. */\n newValue: T[K];\n }\n}[AgridField<T>];\n\n/**\n * Emitted asynchronously after an edit changes a row and the data source has been updated.\n *\n * Unlike {@link GridEditEvent}, this row-level event identifies the provider and\n * data source that own the edited record, which is useful when rendering multiple grids.\n */\nexport interface RecordEditEvent<T extends object = any> {\n /** Zero-based index of the edited row in the data source. */\n index: number;\n /** Current row data after the edit has been applied. */\n data: T;\n /** Exact provider instance that emitted the event. */\n provider: AgridProvider<T>;\n /** Exact data source containing the edited row. */\n datasource: AgridDataSource<T>;\n}\n\n/**\n * Compatibility alias for the provider-aware event emitted by `(rowRemoved)`.\n * @deprecated Use {@link RecordEditEvent}.\n */\nexport type RowRemovedEvent<T extends object = any> = RecordEditEvent<T>;\n\n/**\n * Emitted by `(rowSelect)` when the selection changes. `null` means all rows were deselected.\n * In `'single'` mode `rows` always has at most one entry.\n */\nexport interface RowSelectEvent<T extends object = any> {\n /** Selected rows and their original data-source indices. */\n rows: { row: T; originalIndex: number }[];\n}\n\n/** Emitted when the user clicks a data row. */\nexport interface RowClickEvent<T extends object = any> {\n /** Snapshot of the clicked row. */\n row: T;\n /** Zero-based index of the row in the data source. */\n originalIndex: number;\n}\n\n/**\n * Emitted after an inline-edited row is left, or after the user saves through the sidebar editor.\n */\nexport interface RowUpdateEvent<T extends object = any> {\n /** Updated row data. */\n row: T;\n /** Zero-based index of the updated row in the data source. */\n originalIndex: number;\n}\n\n/**\n * Emitted by `(rowReorder)` when the user finishes dragging a row to a new position.\n * The grid does **not** reorder data itself — call `dataSource.moveRow(oldIndex, newIndex)`\n * (or your own equivalent) inside the handler.\n */\nexport interface RowReorderEvent<T extends object = any> {\n /** Snapshot of the row data at drag time. */\n row: T;\n /** Index of the row in the data source before the move. */\n oldIndex: number;\n /**\n * Target position in the data source (insert-before semantics).\n * Pass both `oldIndex` and `newIndex` to {@link AgridDataSource.moveRow}.\n */\n newIndex: number;\n}\n\n/**\n * Emitted by `(pageChange)` when the user navigates to a different page in server-side\n * pagination mode (i.e. when `AgridControl.totalRows` is set to a value greater than zero).\n * The host should fetch the rows for `startRow..endRow` from the server and push them into\n * the data source — the grid itself does not slice or filter the data in this mode.\n */\nexport interface PageChangeEvent {\n /** New page number (1-based). */\n page: number;\n /** Rows per page as configured on `AgridControl`. */\n pageSize: number;\n /** Zero-based index of the first row on this page. */\n startRow: number;\n /** Zero-based index of the last row on this page (inclusive). */\n endRow: number;\n}\n\n/** Emitted when a text filter changes in server-side filtering mode. */\nexport interface FilterChangeEvent {\n /** Field name of the filtered column. */\n field: string;\n /** Current filter text. An empty string clears the filter. */\n value: string;\n}\n\n/** Emitted when a sort changes in server-side filtering mode. */\nexport interface SortChangeEvent {\n /** Field name of the sorted column. */\n field: string;\n /** Current direction. `null` clears the sort. */\n direction: 'asc' | 'desc' | null;\n}\n\n/**\n * Emitted by `(prepareAddRecord)` when the grid has inserted a blank row.\n * Use this to populate the new row with real defaults via {@link AgridDataSource.updateRow} or\n * {@link AgridDataSource.patchRow}.\n */\nexport interface NewRecord<T extends object = any> {\n /** Index at which the blank row was inserted in the data source. */\n index: number;\n /** The empty row object the grid created (field values are `''` / `0` by type). */\n data: T;\n /** Exact provider instance that emitted this event. Useful when rendering multiple grids. */\n provider: AgridProvider<T>;\n /** Exact data source containing the inserted row. */\n datasource: AgridDataSource<T>;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["isDataRowItemFn","isGroupHeaderItemFn","isTreeRowItemFn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"thkl-agrid.mjs","sources":["../../../src/app/agrid/agrid.utils.ts","../../../src/app/agrid/rendering/agrid-cell.component.ts","../../../src/app/agrid/infrastructure/agrid-browser.adapter.ts","../../../src/app/agrid/selection/agrid-clipboard.handler.ts","../../../src/app/agrid/columns/agrid-column-layout.model.ts","../../../src/app/agrid/agrid-localization.ts","../../../src/app/agrid/columns/agrid-column-menu.component.ts","../../../src/app/agrid/columns/agrid-column-menu.component.html","../../../src/app/agrid/columns/agrid-column-menu.controller.ts","../../../src/app/agrid/columns/agrid-column-reorder.controller.ts","../../../src/app/agrid/columns/agrid-column-sizing.controller.ts","../../../src/app/agrid/columns/agrid-column-state.service.ts","../../../src/app/agrid/rows/agrid-drag.handler.ts","../../../src/app/agrid/editing/agrid-edit.controller.ts","../../../src/app/agrid/selection/agrid-find.controller.ts","../../../src/app/agrid/selection/agrid-find-panel.component.ts","../../../src/app/agrid/selection/agrid-find-panel.component.html","../../../src/app/agrid/rows/agrid-group.controller.ts","../../../src/app/agrid/rows/agrid-tree.controller.ts","../../../src/app/agrid/selection/agrid-navigation.controller.ts","../../../src/app/agrid/rendering/agrid-presentation.service.ts","../../../src/app/agrid/rendering/agrid-menu-bar.component.ts","../../../src/app/agrid/rendering/agrid-menu-bar.component.html","../../../src/app/agrid/agrid-control.ts","../../../src/app/agrid/agrid-datasource.ts","../../../src/app/agrid/agrid-provider.ts","../../../src/app/agrid/rows/agrid-projection.model.ts","../../../src/app/agrid/selection/agrid-range.controller.ts","../../../src/app/agrid/rows/agrid-row.controller.ts","../../../src/app/agrid/editing/agrid-sidebar.controller.ts","../../../src/app/agrid/editing/agrid-sidebar.component.ts","../../../src/app/agrid/editing/agrid-sidebar.component.html","../../../src/app/agrid/infrastructure/agrid-variable-row-size.strategy.ts","../../../src/app/agrid/agrid.component.ts","../../../src/app/agrid/agrid.component.html","../../../src/app/agrid/agrid-page-selector.component.ts","../../../src/app/agrid/agrid-page-selector.component.html","../../../src/app/agrid/agrid-tree.component.ts","../../../src/app/agrid/agrid-tree.component.html","../../../src/app/agrid/agrid-tree-provider.ts","../../../src/app/agrid/agrid.types.ts","../../../src/app/agrid/thkl-agrid.ts"],"sourcesContent":["import { ColumnFilter } from './agrid-control';\nimport {\n AgridPathTreeConfig,\n AgridTreeConfig,\n ColDef,\n DetailRowItem,\n GridItem,\n PathTreeNodeItem,\n TreeRowItem,\n ValueOption,\n} from './agrid.types';\n\n// Display resolution\n\n// Matches YYYY-MM-DD with optional time component — strict enough to avoid false positives.\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$/;\n\n/** Returns true if the value is a Date object or an ISO date string. */\nexport function looksLikeDate(raw: unknown): boolean {\n if (raw instanceof Date) return true;\n if (typeof raw === 'string') return ISO_DATE_RE.test(raw.trim());\n return false;\n}\n\n/**\n * Formats a raw value as a human-readable date string.\n * Accepts Date objects and ISO strings.\n * Returns empty string for null/undefined, raw string if unparseable.\n */\nexport function formatDateValue(raw: unknown, locale?: string, calendarDate = false): string {\n if (raw == null || raw === '') return '';\n const dateInputValue = calendarDate ? getDateInputValue(raw) : '';\n const d = dateInputValue\n ? new Date(`${dateInputValue}T00:00:00.000Z`)\n : raw instanceof Date ? raw : new Date(raw as string);\n if (isNaN(d.getTime())) return String(raw);\n return d.toLocaleDateString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n ...(calendarDate ? { timeZone: 'UTC' } : {}),\n });\n}\n\n/** Converts a supported date value to the `YYYY-MM-DD` format required by date inputs. */\nexport function getDateInputValue(raw: unknown): string {\n if (raw == null || raw === '') return '';\n const date = raw instanceof Date ? raw : new Date(raw as string);\n return Number.isNaN(date.getTime()) ? '' : date.toISOString().slice(0, 10);\n}\n\n/**\n * Converts a date input value back to the storage form used by the original value.\n *\n * `Date` objects remain `Date` objects. ISO timestamps retain their original time and zone\n * suffix, while date-only strings and previously empty values remain date-only strings.\n */\nexport function coerceDateInputValue(value: string, originalValue: unknown): unknown {\n if (value === '') return '';\n if (originalValue instanceof Date) return new Date(`${value}T00:00:00.000Z`);\n if (\n typeof originalValue === 'string'\n && /^\\d{4}-\\d{2}-\\d{2}T/.test(originalValue)\n ) {\n return `${value}${originalValue.slice(10)}`;\n }\n return value;\n}\n\n/** Resolve the display string for a raw cell value via ValueOption label, formatter, or coercion. */\nexport function getDisplayForField(col: ColDef | undefined, raw: unknown, locale?: string): string {\n if (!col) return String(raw ?? '');\n if (col.values?.length) {\n const opt = col.values.find(v =>\n typeof v === 'string' ? v === raw : (v as ValueOption).value === raw\n );\n if (opt !== undefined) return typeof opt === 'string' ? opt : (opt as ValueOption).label;\n }\n if (col.formatter) return col.formatter(raw);\n if (col.type === 'date' || looksLikeDate(raw)) {\n return formatDateValue(raw, locale, col.type === 'date');\n }\n return String(raw ?? '');\n}\n\n/** Returns whether a virtual-scroll item represents a data row. */\nexport function isDataRowItem<T extends object>(\n item: GridItem<T>,\n): item is { row: T; originalIndex: number } {\n return typeof item === 'object' && item !== null && 'row' in item && !('detailFor' in item);\n}\n\n/** Returns whether a virtual-scroll item represents a master/detail panel row. */\nexport function isDetailRowItem<T extends object>(item: GridItem<T>): item is DetailRowItem<T> {\n return typeof item === 'object' && item !== null && 'detailFor' in item;\n}\n\n/** Returns whether a virtual-scroll item represents a group header. */\nexport function isGroupHeaderItem(\n item: GridItem,\n): item is { groupLabel: string; count: number; collapsed: boolean; aggregates?: Record<string, unknown> } {\n return typeof item === 'object' && item !== null && 'groupLabel' in item;\n}\n\n/**\n * Returns whether a virtual-scroll item represents a tree row.\n *\n * Tree rows also pass {@link isDataRowItem} (they carry `row` + `originalIndex`); this guard\n * additionally narrows to the indentation/expansion fields via the `level` discriminator.\n */\nexport function isTreeRowItem<T extends object>(item: GridItem<T>): item is TreeRowItem<T> {\n return isDataRowItem(item) && 'level' in item;\n}\n\n/** Returns whether a virtual-scroll item is a generated path-tree branch node. */\nexport function isPathTreeNodeItem(item: GridItem): item is PathTreeNodeItem {\n return typeof item === 'object' && item !== null && 'pathNodeId' in item;\n}\n\n/** Returns whether a tree configuration derives its hierarchy from path segments. */\nexport function isPathTreeConfig<T extends object>(\n config: AgridTreeConfig<T>,\n): config is AgridPathTreeConfig<T> {\n return typeof config.getPath === 'function';\n}\n\n// Filtering\n\n/** Apply text substring and value-set filters, returning the surviving row indices. */\nexport function applyTextAndValueFilters(\n rows: Record<string, unknown>[],\n indices: number[],\n filters: Record<string, ColumnFilter>,\n colMap: Map<string, ColDef>,\n locale?: string,\n): number[] {\n let result = indices;\n for (const [field, filter] of Object.entries(filters)) {\n const col = colMap.get(field);\n if (filter.text) {\n const lc = filter.text.toLowerCase();\n result = result.filter(i => getDisplayForField(col, rows[i][field], locale).toLowerCase().includes(lc));\n }\n if (filter.selectedValues !== null) {\n const allowed = new Set(filter.selectedValues);\n result = result.filter(i => allowed.has(String(rows[i][field] ?? '')));\n }\n if (filter.operator && filter.operand != null && filter.operand !== '') {\n result = result.filter(i => passesConditionFilter(col, rows[i][field], filter, locale));\n }\n }\n return result;\n}\n\n/**\n * Evaluate a text, number, or date condition for one cell value.\n */\nexport function passesConditionFilter(\n col: ColDef | undefined,\n raw: unknown,\n filter: ColumnFilter,\n locale?: string,\n): boolean {\n if (col?.type !== 'number' && col?.type !== 'date') {\n const value = getDisplayForField(col, raw, locale).toLocaleLowerCase(locale);\n const operand = String(filter.operand ?? '').toLocaleLowerCase(locale);\n switch (filter.operator) {\n case 'eq': return value === operand;\n case 'neq': return value !== operand;\n case 'startsWith': return value.startsWith(operand);\n case 'endsWith': return value.endsWith(operand);\n case 'includes': return value.includes(operand);\n case 'notIncludes': return !value.includes(operand);\n case 'like': {\n const escaped = operand.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = escaped.replace(/%/g, '.*').replace(/_/g, '.');\n return new RegExp(`^${pattern}$`, 'u').test(value);\n }\n default: return true;\n }\n }\n\n const isDate = col?.type === 'date' || looksLikeDate(raw);\n const toNum = (v: unknown): number =>\n isDate\n ? (v instanceof Date ? v.getTime() : new Date(v as string).getTime())\n : Number(v);\n const value = toNum(raw);\n if (Number.isNaN(value)) return false;\n const a = toNum(filter.operand);\n if (Number.isNaN(a)) return true;\n switch (filter.operator) {\n case 'eq': return value === a;\n case 'neq': return value !== a;\n case 'gt': return value > a;\n case 'gte': return value >= a;\n case 'lt': return value < a;\n case 'lte': return value <= a;\n case 'between': {\n const b = toNum(filter.operand2);\n if (Number.isNaN(b)) return value >= a;\n return value >= Math.min(a, b) && value <= Math.max(a, b);\n }\n default: return true;\n }\n}\n\n/**\n * Keep only the rows where at least one of the given columns' display value contains\n * `text` (case-insensitive). An empty/whitespace `text` returns the indices unchanged.\n */\nexport function applyQuickFilter(\n rows: Record<string, unknown>[],\n indices: number[],\n text: string,\n cols: ColDef[],\n locale?: string,\n): number[] {\n const q = text.trim().toLowerCase();\n if (!q) return indices;\n return indices.filter(i =>\n cols.some(col => getDisplayForField(col, rows[i][col.field], locale).toLowerCase().includes(q)),\n );\n}\n\n// Sorting\n\n/**\n * Sort indices by one or more columns in priority order.\n * Each entry is `[field, ColumnFilter]`; the first entry has the highest priority.\n * Ties are broken by subsequent entries.\n */\nexport function applySortToIndices(\n rows: Record<string, unknown>[],\n indices: number[],\n sortEntries: [string, ColumnFilter][],\n colMap: Map<string, ColDef>,\n locale?: string,\n): number[] {\n if (sortEntries.length === 0) return indices;\n\n const collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });\n const fields = sortEntries.map(([field, filter]) => {\n const col = colMap.get(field);\n const dateLike = new Uint8Array(indices.length);\n const dateValues = new Float64Array(indices.length);\n const numericValues = new Float64Array(indices.length);\n numericValues.fill(Number.NaN);\n const displayValues = new Array<string>(indices.length);\n\n for (let position = 0; position < indices.length; position++) {\n const index = indices[position];\n const raw = rows[index][field];\n const isDateLike = col?.type === 'date' || looksLikeDate(raw);\n const dateValue = isDateLike\n ? raw instanceof Date ? raw.getTime() : new Date(raw as string).getTime()\n : Number.NaN;\n const numericValue = col?.type === 'number'\n && !col.formatter\n && !col.values?.length\n && typeof raw === 'number'\n && Number.isFinite(raw)\n ? raw\n : Number.NaN;\n dateLike[position] = isDateLike ? 1 : 0;\n dateValues[position] = Number.isNaN(dateValue) ? -1 : dateValue;\n numericValues[position] = numericValue;\n displayValues[position] = isDateLike ? '' : getDisplayForField(col, raw, locale);\n }\n\n return {\n direction: filter.sort === 'desc' ? -1 : 1,\n dateLike,\n dateValues,\n numericValues,\n displayValues,\n };\n });\n const positions = Array.from({ length: indices.length }, (_, position) => position);\n\n positions.sort((a, b) => {\n for (let fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) {\n const field = fields[fieldIndex];\n let comparison: number;\n if (field.dateLike[a] || field.dateLike[b]) {\n comparison = field.dateValues[a] - field.dateValues[b];\n } else if (\n !Number.isNaN(field.numericValues[a])\n && !Number.isNaN(field.numericValues[b])\n ) {\n comparison = field.numericValues[a] - field.numericValues[b];\n } else {\n comparison = collator.compare(field.displayValues[a], field.displayValues[b]);\n }\n if (comparison !== 0) {\n return comparison * field.direction;\n }\n }\n return a - b;\n });\n\n return positions.map(position => indices[position]);\n}\n\n// Grouping\n\n/**\n * Bucket rows by the display value of `groupField`, sort group keys alphabetically,\n * optionally sort within groups by a secondary sort, and interleave group-header items.\n * Does NOT append the add-row null sentinel — the caller does that.\n */\n/** Built-in aggregate function names supported by the footer and group subtotals. */\ntype BuiltinAggregate = 'sum' | 'avg' | 'min' | 'max' | 'count';\n\n/**\n * Compute aggregate values for the given rows across every column that has a static\n * (`ColDef.aggregate`) or control-configured aggregate. Returns a `field → value` map containing\n * only aggregated columns. Shared by the grid footer and per-group subtotals.\n */\nexport function computeAggregates(\n rows: Record<string, unknown>[],\n indices: number[],\n cols: ColDef[],\n controlAggregates: Record<string, BuiltinAggregate>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const col of cols) {\n const aggregate: ColDef['aggregate'] = controlAggregates[col.field] ?? col.aggregate;\n if (!aggregate) continue;\n if (typeof aggregate === 'function') {\n const values = indices.map(index => rows[index][col.field]);\n result[col.field] = (aggregate as (values: unknown[]) => unknown)(values);\n continue;\n }\n\n let count = 0;\n let numericCount = 0;\n let sum = 0;\n let min = Infinity;\n let max = -Infinity;\n for (const index of indices) {\n const raw = rows[index][col.field];\n if (raw != null && raw !== '') count++;\n\n const value = Number(raw);\n if (Number.isNaN(value)) continue;\n numericCount++;\n sum += value;\n if (value < min) min = value;\n if (value > max) max = value;\n }\n\n switch (aggregate) {\n case 'sum':\n result[col.field] = sum;\n break;\n case 'avg':\n result[col.field] = numericCount ? sum / numericCount : null;\n break;\n case 'min':\n result[col.field] = numericCount ? min : null;\n break;\n case 'max':\n result[col.field] = numericCount ? max : null;\n break;\n case 'count':\n result[col.field] = count;\n break;\n }\n }\n return result;\n}\n\nexport function buildGroupedItems(\n rows: Record<string, unknown>[],\n indices: number[],\n groupField: string,\n colMap: Map<string, ColDef>,\n sortEntries: [string, ColumnFilter][],\n expandedLabels: Set<string>,\n locale?: string,\n aggregateCols: ColDef[] = [],\n controlAggregates: Record<string, BuiltinAggregate> = {},\n): GridItem[] {\n const hasAggregates = aggregateCols.some(\n col => controlAggregates[col.field] ?? col.aggregate,\n );\n const groupCol = colMap.get(groupField);\n\n const groups = new Map<string, number[]>();\n for (const i of indices) {\n const key = getDisplayForField(groupCol, rows[i][groupField], locale);\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(i);\n }\n\n const sortedKeys = [...groups.keys()].sort((a, b) =>\n a.localeCompare(b, locale, { sensitivity: 'base' })\n );\n\n const nonGroupSorts = sortEntries.filter(([f]) => f !== groupField);\n if (nonGroupSorts.length > 0) {\n for (const [, groupRows] of groups) {\n const sorted = applySortToIndices(rows, groupRows, nonGroupSorts, colMap, locale);\n groupRows.splice(0, groupRows.length, ...sorted);\n }\n }\n\n const items: GridItem[] = [];\n for (const key of sortedKeys) {\n const groupRows = groups.get(key)!;\n const isExpanded = expandedLabels.has(key);\n const aggregates = hasAggregates\n ? computeAggregates(rows, groupRows, aggregateCols, controlAggregates)\n : undefined;\n items.push({ groupLabel: key, count: groupRows.length, collapsed: !isExpanded, aggregates });\n if (isExpanded) {\n for (const i of groupRows) items.push({ row: rows[i], originalIndex: i });\n }\n }\n return items;\n}\n\n/** Row accessors required to flatten a hierarchy. @internal */\nexport interface TreeAccessors<T extends object> {\n getId: (row: T) => string | number;\n getParentId: (row: T) => string | number | null | undefined;\n}\n\n/**\n * Flatten a parent/child hierarchy into a depth-first list of {@link TreeRowItem}s for the\n * virtual scroll list, honoring the expanded-id set.\n *\n * `indices` is the already filtered and sorted set of source-array positions; sibling order\n * follows that order. A row is treated as a **root** when its parent id is `null`/`undefined`\n * or when that parent is not present in `indices` (orphan). Children of a collapsed row are\n * omitted. Cycles and rows visited more than once are guarded so the walk always terminates.\n *\n * @param rows The full data-source array.\n * @param indices Filtered/sorted source positions to include, in display order.\n * @param accessors `getId` / `getParentId` for the rows.\n * @param expandedIds Ids whose children should be rendered.\n * @param forceExpandedIds Ids forced open regardless of `expandedIds` — used to reveal the\n * ancestor path of filter matches. Optional.\n */\nexport function buildTreeItems<T extends object>(\n rows: T[],\n indices: number[],\n accessors: TreeAccessors<T>,\n expandedIds: Set<string | number>,\n forceExpandedIds?: Set<string | number>,\n): GridItem<T>[] {\n const { getId, getParentId } = accessors;\n\n const includedIds = new Set<string | number>();\n for (const i of indices) includedIds.add(getId(rows[i]));\n\n // Bucket each included row under its parent, preserving the incoming (sorted) order.\n const childrenByParent = new Map<string | number, number[]>();\n const roots: number[] = [];\n for (const i of indices) {\n const parentId = getParentId(rows[i]);\n if (parentId == null || !includedIds.has(parentId)) {\n roots.push(i);\n continue;\n }\n const siblings = childrenByParent.get(parentId);\n if (siblings) siblings.push(i);\n else childrenByParent.set(parentId, [i]);\n }\n\n const items: GridItem<T>[] = [];\n const visited = new Set<string | number>();\n\n const visit = (index: number, level: number): void => {\n const row = rows[index];\n const id = getId(row);\n if (visited.has(id)) return; // cycle / duplicate-parent guard\n visited.add(id);\n\n const children = childrenByParent.get(id);\n const expandable = !!children?.length;\n const expanded = expandable && (expandedIds.has(id) || !!forceExpandedIds?.has(id));\n items.push({ row, originalIndex: index, level, expandable, expanded });\n\n if (expanded && children) {\n for (const childIndex of children) visit(childIndex, level + 1);\n }\n };\n\n for (const rootIndex of roots) visit(rootIndex, 0);\n return items;\n}\n\n/** Stable expansion id for a generated path prefix. */\nexport function pathTreeNodeId(path: readonly (string | number)[]): string {\n return `__agrid_path__${JSON.stringify(path.map(String))}`;\n}\n\nexport function pathTreeNodeUuid(path: readonly (string | number)[]): string {\n const source = JSON.stringify(path.map(String));\n let a = 0x9e3779b9;\n let b = 0x85ebca6b;\n let c = 0xc2b2ae35;\n let d = 0x27d4eb2f;\n\n for (let i = 0; i < source.length; i++) {\n const code = source.charCodeAt(i);\n a = Math.imul(a ^ code, 0x85ebca6b);\n b = Math.imul(b ^ code, 0xc2b2ae35);\n c = Math.imul(c ^ code, 0x27d4eb2f);\n d = Math.imul(d ^ code, 0x165667b1);\n }\n\n const hex = [a, b, c, d]\n .map(value => (value >>> 0).toString(16).padStart(8, '0'))\n .join('')\n .split('');\n hex[12] = '5';\n hex[16] = ((parseInt(hex[16], 16) & 0x3) | 0x8).toString(16);\n return `${hex.slice(0, 8).join('')}-${hex.slice(8, 12).join('')}-${hex.slice(12, 16).join('')}-${hex.slice(16, 20).join('')}-${hex.slice(20, 32).join('')}`;\n}\n\n/** Builds display-only branch nodes and datasource-backed leaves from path segments. */\nexport function buildPathTreeItems<T extends object>(\n rows: T[],\n indices: number[],\n config: AgridPathTreeConfig<T>,\n expandedIds: Set<string | number>,\n forceExpanded = false,\n): GridItem<T>[] {\n type Branch = {\n id: string;\n uuid: string;\n label: string;\n level: number;\n children: Map<string, Branch>;\n leaves: { originalIndex: number; label: string }[];\n };\n\n const roots = new Map<string, Branch>();\n for (const originalIndex of indices) {\n const rawPath = config.getPath(rows[originalIndex]).filter(\n segment => String(segment).length > 0,\n );\n if (rawPath.length === 0) continue;\n const path = rawPath.map(String);\n const formatSegment = (level: number, leaf: boolean): string =>\n config.formatPathSegment?.({\n row: rows[originalIndex],\n segment: rawPath[level],\n level,\n path: rawPath.slice(0, level + 1),\n leaf,\n }) ?? path[level];\n const resolveNodeUuid = (prefix: readonly string[]): string =>\n String(config.nodeUuid?.(rows[originalIndex])\n ?? config.nodeUUid?.(rows[originalIndex])\n ?? pathTreeNodeUuid(prefix));\n let branches = roots;\n for (let level = 0; level < path.length - 1; level++) {\n const prefix = path.slice(0, level + 1);\n const id = pathTreeNodeId(prefix);\n let branch = branches.get(id);\n if (!branch) {\n branch = {\n id,\n uuid: resolveNodeUuid(prefix),\n label: formatSegment(level, false),\n level,\n children: new Map(),\n leaves: [],\n };\n branches.set(id, branch);\n }\n if (level === path.length - 2) {\n branch.leaves.push({\n originalIndex,\n label: formatSegment(path.length - 1, true),\n });\n }\n branches = branch.children;\n }\n if (path.length === 1) {\n const id = pathTreeNodeId([]);\n let branch = roots.get(id);\n if (!branch) {\n branch = {\n id,\n uuid: resolveNodeUuid([]),\n label: '',\n level: -1,\n children: new Map(),\n leaves: [],\n };\n roots.set(id, branch);\n }\n branch.leaves.push({ originalIndex, label: formatSegment(0, true) });\n }\n }\n\n const items: GridItem<T>[] = [];\n const visit = (branch: Branch): void => {\n const isHiddenRoot = branch.level < 0;\n const expanded = forceExpanded || expandedIds.has(branch.id);\n if (!isHiddenRoot) {\n items.push({\n uuid: branch.uuid,\n pathNodeId: branch.id,\n pathLabel: branch.label,\n level: branch.level,\n expandable: true,\n expanded,\n });\n }\n if (!isHiddenRoot && !expanded) return;\n for (const child of branch.children.values()) visit(child);\n for (const leaf of branch.leaves) {\n items.push({\n row: rows[leaf.originalIndex],\n originalIndex: leaf.originalIndex,\n level: isHiddenRoot ? 0 : branch.level + 1,\n expandable: false,\n expanded: false,\n treeLabel: leaf.label,\n });\n }\n };\n for (const branch of roots.values()) visit(branch);\n return items;\n}\n\n// Selection range\n\n/** Build the set of original indices spanning from `fromOrig` to `toOrig` in display order. */\nexport function buildSelectionRange(fromOrig: number, toOrig: number, items: GridItem[]): Set<number> {\n const fromDisp = items.findIndex(item => isDataRowItem(item) && item.originalIndex === fromOrig);\n const toDisp = items.findIndex(item => isDataRowItem(item) && item.originalIndex === toOrig);\n if (fromDisp === -1 || toDisp === -1) return new Set();\n const [lo, hi] = [Math.min(fromDisp, toDisp), Math.max(fromDisp, toDisp)];\n const next = new Set<number>();\n for (let i = lo; i <= hi; i++) {\n const item = items[i];\n if (isDataRowItem(item)) next.add(item.originalIndex);\n }\n return next;\n}\n\n/** Test a complete proposed editor value against a regex input mask. */\nexport function matchesInputMask(value: unknown, mask: RegExp): boolean {\n const flags = mask.flags.replace(/[gy]/g, '');\n return new RegExp(`^(?:${mask.source})$`, flags).test(String(value ?? ''));\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ColDef, ValueOption } from '../agrid.types';\nimport {\n coerceDateInputValue,\n getDisplayForField,\n getDateInputValue,\n matchesInputMask,\n} from '../agrid.utils';\n\n/**\n * Individual cell component used inside `AgridComponent`.\n *\n * Renders a read-only span when not editing, and an `<input>` or `<select>`\n * (for columns with `ColDef.values`) when in edit mode.\n *\n * Not intended for direct use — `AgridComponent` manages all inputs and outputs.\n */\n@Component({\n selector: 'agrid-cell',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'gridcell',\n '[class.selected]': 'selected()',\n '[class.editing]': 'editing()',\n '[class.ag-cell--tree]': 'treeCell()',\n '[class.ag-cell--with-info]': 'showInfoIcon() && !editing()',\n '[attr.aria-readonly]': '!editable() ? \"true\" : null',\n '[attr.title]': 'displayValue()',\n '(click)': 'activate.emit($event)',\n '(dblclick)': 'startEdit.emit()',\n tabindex: '-1',\n },\n template: `\n @if (booleanCell()) {\n <input\n type=\"checkbox\"\n class=\"ag-cell-checkbox\"\n [checked]=\"booleanChecked()\"\n [disabled]=\"!editable()\"\n [attr.aria-label]=\"col().header\"\n (click)=\"onCheckboxClick($event)\"\n (dblclick)=\"$event.stopPropagation()\"\n />\n } @else if (editing()) {\n @if (col().values?.length) {\n <select\n #editSelect\n class=\"ag-cell-select\"\n (change)=\"onSelectChange($event)\"\n >\n @for (opt of valueOptions(); track opt.label; let idx = $index) {\n <option [value]=\"idx\" [selected]=\"idx === selectedOptionIndex()\">{{ opt.label }}</option>\n }\n </select>\n } @else {\n <input\n #editInput\n class=\"ag-cell-input\"\n [class.ag-cell-input--invalid]=\"!!error()\"\n [type]=\"col().type === 'date' ? 'date' : col().type === 'number' ? 'number' : 'text'\"\n [value]=\"editorValue()\"\n (input)=\"onInput($event)\"\n />\n }\n @if (error(); as msg) {\n <span class=\"ag-cell-error\" role=\"alert\">{{ msg }}</span>\n }\n } @else {\n @if (treeCell()) {\n <span class=\"ag-tree-prefix\" [style.padding-left.px]=\"treeLevel() * treeIndent\">\n @if (treeExpandable()) {\n <button\n type=\"button\"\n class=\"ag-tree-twisty\"\n [class.ag-tree-twisty--expanded]=\"treeExpanded()\"\n [attr.aria-label]=\"treeExpanded() ? 'Collapse' : 'Expand'\"\n (click)=\"onTreeToggle($event)\"\n >▶</button>\n } @else {\n <span class=\"ag-tree-twisty-spacer\"></span>\n }\n </span>\n }\n @if (col().cellRenderer) {\n <span class=\"ag-cell-value\" [innerHTML]=\"renderedHtml()\"></span>\n } @else {\n <span class=\"ag-cell-value\">{{ displayValue() }}</span>\n }\n }\n @if (showInfoIcon() && !editing()) {\n <button\n type=\"button\"\n class=\"ag-cell-info\"\n aria-label=\"More information\"\n title=\"More information\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"onInfoClick($event)\"\n (dblclick)=\"$event.stopPropagation()\"\n >?</button>\n }\n `,\n styleUrl: './agrid-cell.component.css',\n})\nexport class AgridCellComponent {\n /** Column definition for this cell. */\n col = input.required<ColDef>();\n\n /** Absolute row index within the data source. */\n rowIndex = input.required<number>();\n\n /** Column index within `colDefs`. */\n colIndex = input.required<number>();\n\n /** Current field value from the data source (displayed when not editing). */\n value = input.required<unknown>();\n\n /** Optional display-only text override; editing still uses the original {@link value}. */\n displayValueOverride = input<string | null>(null);\n\n /** Full row data — passed to `cellRenderer` when set. */\n row = input<Record<string, unknown>>({});\n\n /** Locale used for built-in date formatting. */\n locale = input<string | undefined>(undefined);\n\n /** Whether this cell has the active selection outline. */\n selected = input<boolean>(false);\n\n /** Whether this cell is currently in edit mode. */\n editing = input<boolean>(false);\n\n /** Whether this cell may be edited (drives the boolean checkbox enabled state). */\n editable = input<boolean>(true);\n\n /** Whether a right-aligned information button is visible in this cell. */\n showInfoIcon = input<boolean>(false);\n\n /** Validation error message to show under the editor, or `null` when the value is valid. */\n error = input<string | null>(null);\n\n /** Whether this cell is the tree column and should render indentation + a twisty. */\n treeCell = input<boolean>(false);\n\n /** Depth of the row in the tree (drives indentation). Root rows are `0`. */\n treeLevel = input<number>(0);\n\n /** Whether the row has children and can be expanded/collapsed. */\n treeExpandable = input<boolean>(false);\n\n /** Whether the row is currently expanded. */\n treeExpanded = input<boolean>(false);\n\n /** Emitted when the user clicks the expand/collapse twisty. */\n treeToggle = output<void>();\n\n /** Indentation in pixels applied per tree level. */\n readonly treeIndent = 16;\n\n /**\n * Optional character to pre-fill the edit input when the user presses a printable key\n * while the cell is selected (type-to-start-editing behavior).\n */\n seedChar = input<string>('');\n\n /** Whether an unseeded text editor should select all text when focused. */\n selectTextOnEdit = input<boolean>(true);\n\n /**\n * Emitted on single click — the grid selects this cell.\n * For `values` columns the grid also enters edit mode immediately.\n */\n activate = output<MouseEvent>();\n\n /** Emitted on double-click — the grid enters edit mode. */\n startEdit = output<void>();\n\n /** Emitted when a boolean-column checkbox is toggled, carrying the new value. */\n booleanToggle = output<boolean>();\n\n /** Emitted when the cell's optional information button is clicked. */\n infoClick = output<void>();\n\n /**\n * Emitted on every keystroke inside the edit input or on every select change.\n * The grid stores the latest value in `currentDraft` so it can commit on Tab / Enter.\n */\n draftChange = output<unknown>();\n\n /** Live draft value managed by the cell during an active edit. */\n readonly draft = signal<unknown>('');\n\n /** String value accepted by the active native input element. */\n readonly editorValue = computed((): string => {\n const draft = this.draft();\n if (this.col().type === 'date') {\n return getDateInputValue(draft);\n }\n return String(draft ?? '');\n });\n\n /** Mask selected for the current row and cell, if this is a maskable text column. */\n readonly resolvedInputMask = computed((): RegExp | null => {\n const col = this.col();\n if (!col.inputMask || col.type === 'number' || col.type === 'date' || col.type === 'boolean') {\n return null;\n }\n return col.inputMask({\n row: this.row(),\n value: this.value(),\n column: col,\n }) ?? null;\n });\n\n /** Whether this cell renders as an inline boolean checkbox (no edit mode). */\n readonly booleanCell = computed(\n (): boolean => this.col().type === 'boolean' && !this.col().cellRenderer,\n );\n\n /** Truthiness of the current boolean value (accepts `true`, `'true'`, `1`, `'1'`). */\n readonly booleanChecked = computed((): boolean => {\n const v = this.value();\n return v === true || v === 1 || v === 'true' || v === '1';\n });\n\n readonly renderedHtml = computed((): string => {\n const renderer = this.col().cellRenderer;\n if (!renderer) return '';\n return renderer({ value: this.value(), row: this.row() });\n });\n\n /**\n * Normalized list of value options (always `{ label, rawValue }` regardless of whether\n * `ColDef.values` is `string[]` or `ValueOption[]`).\n */\n readonly valueOptions = computed(() => {\n const vals = this.col().values ?? [];\n return vals.map(v =>\n typeof v === 'string'\n ? { label: v, rawValue: v as unknown }\n : { label: (v as ValueOption).label, rawValue: (v as ValueOption).value }\n );\n });\n\n /**\n * The string shown in the cell when not editing.\n * Priority: ValueOption label → `ColDef.formatter` → raw string.\n */\n readonly displayValue = computed((): string => {\n return this.displayValueOverride()\n ?? getDisplayForField(this.col(), this.value(), this.locale());\n });\n\n /**\n * Index of the currently selected option in `valueOptions`.\n * Used to drive `<option [value]=\"idx\" [selected]=\"idx === selectedOptionIndex()\">`.\n * Index-based approach avoids string/type coercion for non-string raw values.\n */\n readonly selectedOptionIndex = computed((): number => {\n const raw = this.draft();\n return this.valueOptions().findIndex(o => o.rawValue === raw);\n });\n\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('editInput');\n private readonly selectEl = viewChild<ElementRef<HTMLSelectElement>>('editSelect');\n\n constructor() {\n effect(() => {\n if (this.editing()) {\n const seed = this.seedChar();\n const isDate = this.col().type === 'date';\n const existingDate = isDate ? getDateInputValue(this.value()) : '';\n const dateInitial = existingDate || (isDate && seed === '' ? new Date().toISOString().slice(0, 10) : '');\n const initialValue = isDate\n ? dateInitial\n : seed !== '' ? seed : this.value();\n const mask = this.resolvedInputMask();\n const acceptedInitialValue = seed !== '' && mask && !matchesInputMask(initialValue, mask)\n ? this.value()\n : initialValue;\n this.draft.set(acceptedInitialValue);\n\n setTimeout(() => {\n const input = this.inputEl()?.nativeElement;\n if (input) {\n const displaySeed = isDate\n ? dateInitial\n : String(acceptedInitialValue ?? '');\n input.value = displaySeed;\n input.focus();\n if (input.type === 'text' && !seed && this.selectTextOnEdit()) input.select();\n else if (input.type === 'text') {\n const len = displaySeed.length;\n input.setSelectionRange(len, len);\n }\n return;\n }\n\n const sel = this.selectEl()?.nativeElement;\n if (sel) {\n const idx = this.selectedOptionIndex();\n if (idx >= 0) sel.value = String(idx);\n sel.focus();\n try {\n (sel as HTMLSelectElement & { showPicker?: () => void }).showPicker?.();\n } catch {\n sel.click();\n }\n }\n });\n }\n });\n }\n\n /** Toggle a boolean cell's value, driven entirely from data (no DOM toggle). */\n onCheckboxClick(event: MouseEvent): void {\n event.stopPropagation();\n event.preventDefault();\n if (!this.editable()) return;\n this.booleanToggle.emit(!this.booleanChecked());\n }\n\n /** Emit a tree expand/collapse request without selecting or editing the cell. */\n onTreeToggle(event: MouseEvent): void {\n event.stopPropagation();\n this.treeToggle.emit();\n }\n\n /** Emits the information action without activating or editing the cell. */\n onInfoClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.infoClick.emit();\n }\n\n /** Forward `<input>` changes to the grid. */\n onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n const val = input.value;\n const mask = this.resolvedInputMask();\n if (mask && !matchesInputMask(val, mask)) {\n input.value = String(this.draft() ?? '');\n input.setSelectionRange(input.value.length, input.value.length);\n return;\n }\n const draft = this.col().type === 'date'\n ? coerceDateInputValue(val, this.value())\n : val;\n this.draft.set(draft);\n this.draftChange.emit(draft);\n }\n\n /**\n * Forward `<select>` changes to the grid.\n * Maps the option index back to the raw value (preserves original type — number, object, etc.).\n */\n onSelectChange(event: Event): void {\n const idx = Number((event.target as HTMLSelectElement).value);\n const opts = this.valueOptions();\n const rawValue = opts[idx]?.rawValue ?? '';\n this.draft.set(rawValue);\n this.draftChange.emit(rawValue);\n }\n}\n","/** Guarded access to browser-only APIs used by the grid. @internal */\nexport class AgridBrowserAdapter {\n /** Creates an adapter using injected browser globals or the current environment. */\n constructor(\n private readonly doc: Document | null =\n typeof document === 'undefined' ? null : document,\n private readonly win: Window | null =\n typeof window === 'undefined' ? null : window,\n ) {}\n\n /** Returns whether both document and window APIs are available. */\n get available(): boolean {\n return this.doc !== null && this.win !== null;\n }\n\n /** Registers a document event listener when a document is available. */\n addDocumentListener<K extends keyof DocumentEventMap>(\n type: K,\n listener: (event: DocumentEventMap[K]) => void,\n ): void {\n this.doc?.addEventListener(type, listener as EventListener);\n }\n\n /** Removes a previously registered document event listener. */\n removeDocumentListener<K extends keyof DocumentEventMap>(\n type: K,\n listener: (event: DocumentEventMap[K]) => void,\n ): void {\n this.doc?.removeEventListener(type, listener as EventListener);\n }\n\n /** Returns the element stack at viewport coordinates. */\n elementsFromPoint(x: number, y: number): Element[] {\n return this.doc?.elementsFromPoint?.(x, y) ?? [];\n }\n\n /** Appends an element to the document body when available. */\n appendToBody(element: HTMLElement): boolean {\n if (!this.doc?.body) return false;\n this.doc.body.appendChild(element);\n return true;\n }\n\n /** Sets cursor and text-selection styles on the document body. */\n setBodyInteraction(cursor: string, userSelect: string): void {\n if (!this.doc?.body) return;\n this.doc.body.style.cursor = cursor;\n this.doc.body.style.userSelect = userSelect;\n }\n\n /** Returns the viewport width or infinity during server rendering. */\n viewportWidth(): number {\n return this.win?.innerWidth ?? Number.POSITIVE_INFINITY;\n }\n\n /** Returns the viewport height or infinity during server rendering. */\n viewportHeight(): number {\n return this.win?.innerHeight ?? Number.POSITIVE_INFINITY;\n }\n\n /** Returns computed styles when a window is available. */\n computedStyle(element: Element): CSSStyleDeclaration | null {\n return this.win?.getComputedStyle?.(element) ?? null;\n }\n\n /** Creates a 2D canvas context for text measurement. */\n createCanvasContext(): CanvasRenderingContext2D | null {\n return this.doc?.createElement('canvas').getContext('2d') ?? null;\n }\n\n /** Schedules a callback with the environment timer. */\n schedule(callback: () => void, delay = 0): ReturnType<typeof setTimeout> {\n return setTimeout(callback, delay);\n }\n\n /** Writes text to the system clipboard, returning whether it succeeded. */\n async writeClipboard(text: string): Promise<boolean> {\n try {\n const clipboard = this.win?.navigator.clipboard;\n if (!clipboard?.writeText) return false;\n await clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Downloads text through a temporary object URL and anchor element. */\n downloadText(filename: string, text: string, mimeType: string): boolean {\n const urlApi = (this.win as unknown as { URL?: typeof URL } | null)?.URL\n ?? (typeof URL === 'undefined' ? null : URL);\n if (!this.doc?.body || !urlApi?.createObjectURL) return false;\n let url: string | null = null;\n let anchor: HTMLAnchorElement | null = null;\n try {\n url = urlApi.createObjectURL(new Blob([text], { type: mimeType }));\n anchor = this.doc.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.style.display = 'none';\n this.doc.body.appendChild(anchor);\n anchor.click();\n return true;\n } catch {\n return false;\n } finally {\n anchor?.remove();\n if (url) urlApi.revokeObjectURL(url);\n }\n }\n}\n","import { Signal, WritableSignal } from '@angular/core';\nimport { AgridControl, HistoryEntry } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridEditEvent, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Rectangular selection represented by source row and visible column positions. @internal */\nexport type CellRange = { anchor: CellPosition; focus: CellPosition };\n\ntype VisibleCellBounds = {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridClipboardHandler}. @internal */\nexport interface AgridClipboardHandlerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n markedRowIndices: Signal<ReadonlySet<number>>;\n isCellEditable: (col: ColDef, originalIndex: number) => boolean;\n onCellEdit: (event: GridEditEvent) => void;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n}\n\n/** Handles selection serialization and spreadsheet-style clipboard paste operations. @internal */\nexport class AgridClipboardHandler {\n constructor(private readonly opts: AgridClipboardHandlerOptions) {}\n\n /** Writes the current cell or range selection to a clipboard event as TSV. */\n copy(event: ClipboardEvent): void {\n const text = this.getSelectedTsv();\n if (!text) return;\n event.clipboardData?.setData('text/plain', text);\n event.preventDefault();\n }\n\n /** Reads plain text from a clipboard event and pastes it at the selection. */\n paste(event: ClipboardEvent): void {\n const text = event.clipboardData?.getData('text/plain');\n if (!text || !this.opts.selectedCell()) return;\n event.preventDefault();\n this.pasteTextAtSelection(text);\n }\n\n /** Serializes the current cell or range selection as tab-separated text. */\n getSelectedTsv(): string {\n const bounds = this.getVisibleRangeBounds();\n const selected = this.opts.selectedCell();\n const marked = this.opts.markedRowIndices();\n if (!bounds && !selected && marked.size === 0) return '';\n\n const rowStart = bounds?.rowStart ?? (\n selected ? this.findDisplayIndex(selected.rowIndex) : -1\n );\n const rowEnd = bounds?.rowEnd ?? rowStart;\n const colStart = bounds?.colStart ?? selected?.colIndex ?? 0;\n const colEnd = bounds?.colEnd ?? selected?.colIndex\n ?? this.opts.visibleColDefs().length - 1;\n const rows = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const dataRows = this.opts.dataSource().rows();\n const lines: string[] = [];\n const copiedIndices = new Set<number>();\n\n if (rowStart >= 0) {\n for (let displayIndex = rowStart; displayIndex <= rowEnd; displayIndex++) {\n const item = rows[displayIndex];\n if (!isDataRowItem(item)) continue;\n lines.push(this.serializeRow(item.row, cols, colStart, colEnd));\n copiedIndices.add(item.originalIndex);\n }\n }\n\n for (const originalIndex of [...marked].sort((a, b) => a - b)) {\n if (copiedIndices.has(originalIndex)) continue;\n const row = dataRows[originalIndex];\n if (!row) continue;\n lines.push(this.serializeRow(row, cols, colStart, colEnd));\n }\n\n return lines.join('\\n');\n }\n\n private serializeRow(\n row: Record<string, unknown>,\n cols: ColDef[],\n colStart: number,\n colEnd: number,\n ): string {\n const cells: string[] = [];\n for (let colIndex = colStart; colIndex <= colEnd; colIndex++) {\n const col = cols[colIndex];\n if (!col) continue;\n cells.push(this.escapeTsvValue(\n getDisplayForField(col, row[col.field], this.opts.locale())\n ));\n }\n return cells.join('\\t');\n }\n\n /** Applies delimited text to editable cells beginning at the active selection. */\n pasteTextAtSelection(text: string): void {\n const bounds = this.getActiveSelectionBounds();\n if (!bounds) return;\n const start = this.positionFromVisibleCell(bounds.rowStart, bounds.colStart);\n const rows = this.parseDelimitedText(text);\n if (rows.length === 0) return;\n\n const items = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const dataSource = this.opts.dataSource();\n let lastPosition = start;\n const historyEntries: HistoryEntry[] = [];\n\n for (let rowOffset = 0; rowOffset < rows.length; rowOffset++) {\n const item = items[bounds.rowStart + rowOffset];\n if (!isDataRowItem(item)) continue;\n for (let colOffset = 0; colOffset < rows[rowOffset].length; colOffset++) {\n const colIndex = start.colIndex + colOffset;\n const col = cols[colIndex];\n if (!col || !this.opts.isCellEditable(col, item.originalIndex)) continue;\n const oldValue = dataSource.getRow(item.originalIndex)[col.field];\n const newValue = this.coercePastedValue(rows[rowOffset][colOffset], col);\n if (oldValue === newValue) continue;\n\n dataSource.patchRow(item.originalIndex, { [col.field]: newValue });\n const edit = {\n rowIndex: item.originalIndex,\n field: col.field,\n oldValue,\n newValue,\n };\n historyEntries.push(edit);\n this.opts.onCellEdit({\n position: { rowIndex: item.originalIndex, colIndex },\n field: col.field,\n oldValue,\n newValue,\n });\n lastPosition = { rowIndex: item.originalIndex, colIndex };\n }\n }\n\n this.opts.control()?.pushEditBatch(historyEntries);\n this.opts.selectedRange.set({ anchor: start, focus: lastPosition });\n this.opts.selectedCell.set(lastPosition);\n this.opts.scrollToCell(this.findDisplayIndex(lastPosition.rowIndex), lastPosition.colIndex);\n }\n\n private getVisibleRangeBounds(): VisibleCellBounds | null {\n const range = this.opts.selectedRange();\n if (!range) return null;\n const anchorDisplayIndex = this.findDisplayIndex(range.anchor.rowIndex);\n const focusDisplayIndex = this.findDisplayIndex(range.focus.rowIndex);\n if (anchorDisplayIndex < 0 || focusDisplayIndex < 0) return null;\n return {\n rowStart: Math.min(anchorDisplayIndex, focusDisplayIndex),\n rowEnd: Math.max(anchorDisplayIndex, focusDisplayIndex),\n colStart: Math.min(range.anchor.colIndex, range.focus.colIndex),\n colEnd: Math.max(range.anchor.colIndex, range.focus.colIndex),\n };\n }\n\n private getActiveSelectionBounds(): VisibleCellBounds | null {\n const range = this.getVisibleRangeBounds();\n if (range) return range;\n const selected = this.opts.selectedCell();\n if (!selected) return null;\n const displayIndex = this.findDisplayIndex(selected.rowIndex);\n if (displayIndex < 0) return null;\n return {\n rowStart: displayIndex,\n rowEnd: displayIndex,\n colStart: selected.colIndex,\n colEnd: selected.colIndex,\n };\n }\n\n private findDisplayIndex(originalIndex: number): number {\n return this.opts.filteredItems().findIndex(\n item => isDataRowItem(item) && item.originalIndex === originalIndex\n );\n }\n\n private positionFromVisibleCell(displayIndex: number, colIndex: number): CellPosition {\n const item = this.opts.filteredItems()[displayIndex];\n if (isDataRowItem(item)) return { rowIndex: item.originalIndex, colIndex };\n return this.opts.selectedCell() ?? { rowIndex: 0, colIndex };\n }\n\n private escapeTsvValue(value: string): string {\n return /[\"\\t\\n\\r]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n }\n\n private parseDelimitedText(text: string): string[][] {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').replace(/\\n$/, '');\n const delimiter = normalized.includes('\\t') ? '\\t' : ',';\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = '';\n let quoted = false;\n\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized[i];\n if (quoted) {\n if (char === '\"' && normalized[i + 1] === '\"') {\n cell += '\"';\n i++;\n } else if (char === '\"') {\n quoted = false;\n } else {\n cell += char;\n }\n } else if (char === '\"') {\n quoted = true;\n } else if (char === delimiter) {\n row.push(cell);\n cell = '';\n } else if (char === '\\n') {\n row.push(cell);\n rows.push(row);\n row = [];\n cell = '';\n } else {\n cell += char;\n }\n }\n\n row.push(cell);\n rows.push(row);\n return rows.filter(values => values.length > 1 || values[0] !== '');\n }\n\n private coercePastedValue(value: string, col: ColDef): unknown {\n if (col.values?.length) {\n const match = col.values.find(option =>\n typeof option === 'string'\n ? option === value\n : option.label === value || String(option.value) === value\n );\n if (match !== undefined) return typeof match === 'string' ? match : match.value;\n }\n if (col.type === 'number') {\n const numberValue = Number(value);\n return value.trim() === '' || Number.isNaN(numberValue) ? value : numberValue;\n }\n return value;\n }\n}\n","import { Signal, computed } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef, HeaderGroup } from '../agrid.types';\n\n/** One contiguous segment in the optional grouped-header row. @internal */\nexport interface AgridHeaderGroupRun {\n key: string;\n id: string | null;\n label: string;\n fields: string[];\n span: number;\n}\n\n/** Reactive inputs required by {@link AgridColumnLayoutModel}. @internal */\nexport interface AgridColumnLayoutOptions {\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n headerGroups: Signal<HeaderGroup[]>;\n showControlColumn: Signal<boolean>;\n controlColumnWidth: Signal<number>;\n getColumnWidth: (col: ColDef) => number;\n getColumnWidthToken: (col: ColDef) => string;\n}\n\n/**\n * Computes visible, ordered, pinned, and scrollable columns plus pane dimensions.\n * @internal\n */\nexport class AgridColumnLayoutModel {\n constructor(private readonly opts: AgridColumnLayoutOptions) {}\n\n /** Columns visible after hidden state, ordering, and left-pinning are applied. */\n readonly visibleColDefs = computed(() => {\n const control = this.opts.control();\n let columns = control\n ? this.opts.colDefs().filter(col => !control.hiddenColumns().has(col.field))\n : this.opts.colDefs().filter(col => !col.hidden);\n\n if (control) {\n const order = control.columnOrder();\n if (order.length > 0) {\n const orderMap = new Map(order.map((field, index) => [field, index]));\n columns = [...columns].sort((a, b) =>\n (orderMap.get(a.field) ?? Infinity) - (orderMap.get(b.field) ?? Infinity)\n );\n }\n const pinned = control.pinnedColumns();\n if (pinned.size > 0) {\n columns = [\n ...columns.filter(col => pinned.has(col.field)),\n ...columns.filter(col => !pinned.has(col.field)),\n ];\n }\n } else {\n const pinned = columns.filter(col => col.pinned === 'left');\n if (pinned.length > 0) {\n columns = [...pinned, ...columns.filter(col => col.pinned !== 'left')];\n }\n }\n return columns;\n });\n\n /** Visible columns pinned to the left edge. */\n readonly pinnedColDefs = computed(() => {\n const control = this.opts.control();\n if (control) {\n const pinned = control.pinnedColumns();\n return pinned.size > 0\n ? this.visibleColDefs().filter(col => pinned.has(col.field))\n : [];\n }\n return this.visibleColDefs().filter(col => col.pinned === 'left');\n });\n\n /** Visible columns pinned to the right edge. */\n readonly rightPinnedColDefs = computed(() => {\n const control = this.opts.control();\n if (control) {\n const pinned = control.pinnedRightColumns();\n return pinned.size > 0\n ? this.visibleColDefs().filter(col => pinned.has(col.field))\n : [];\n }\n return this.visibleColDefs().filter(col => col.pinned === 'right');\n });\n\n /** Visible columns rendered in the horizontally scrollable pane. */\n readonly scrollableColDefs = computed(() => {\n const left = new Set(this.pinnedColDefs().map(col => col.field));\n const right = new Set(this.rightPinnedColDefs().map(col => col.field));\n return this.visibleColDefs().filter(col => !left.has(col.field) && !right.has(col.field));\n });\n\n readonly hasPinnedPane = computed(() =>\n this.opts.showControlColumn() || this.pinnedColDefs().length > 0\n );\n readonly hasRightPinnedPane = computed(() => this.rightPinnedColDefs().length > 0);\n readonly hasFilterableColumns = computed(() =>\n this.visibleColDefs().some(col => col.filterable)\n );\n readonly hasHeaderGroups = computed(() =>\n this.visibleColDefs().some(col => this.groupLabel(col.group) !== null)\n );\n\n readonly pinnedHeaderGroupRuns = computed(() =>\n this.buildHeaderGroupRuns(this.pinnedColDefs(), 'left')\n );\n readonly scrollableHeaderGroupRuns = computed(() =>\n this.buildHeaderGroupRuns(this.scrollableColDefs(), 'center')\n );\n readonly rightHeaderGroupRuns = computed(() =>\n this.buildHeaderGroupRuns(this.rightPinnedColDefs(), 'right')\n );\n\n readonly gridTemplateColumns = computed(() => {\n const columns = this.widthTokens(this.visibleColDefs());\n return this.opts.showControlColumn()\n ? `${this.opts.controlColumnWidth()}px ${columns}`\n : columns;\n });\n\n readonly pinnedGridTemplateColumns = computed(() => {\n const columns = this.widthTokens(this.pinnedColDefs());\n if (this.opts.showControlColumn()) {\n const controlWidth = `${this.opts.controlColumnWidth()}px`;\n return columns ? `${controlWidth} ${columns}` : controlWidth;\n }\n return columns;\n });\n\n readonly scrollableGridTemplateColumns = computed(() =>\n this.widthTokens(this.scrollableColDefs())\n );\n readonly rightGridTemplateColumns = computed(() =>\n this.widthTokens(this.rightPinnedColDefs())\n );\n\n readonly totalWidth = computed(() =>\n this.width(this.visibleColDefs())\n + (this.opts.showControlColumn() ? this.opts.controlColumnWidth() : 0)\n );\n readonly pinnedPaneWidth = computed(() =>\n this.width(this.pinnedColDefs())\n + (this.opts.showControlColumn() ? this.opts.controlColumnWidth() : 0)\n );\n readonly rightPinnedPaneWidth = computed(() => this.width(this.rightPinnedColDefs()));\n readonly scrollableTotalWidth = computed(() => this.width(this.scrollableColDefs()));\n\n private width(columns: ColDef[]): number {\n return columns.reduce((sum, col) => sum + this.opts.getColumnWidth(col), 0);\n }\n\n private widthTokens(columns: ColDef[]): string {\n return columns.map(col => this.opts.getColumnWidthToken(col)).join(' ');\n }\n\n private buildHeaderGroupRuns(columns: ColDef[], pane: string): AgridHeaderGroupRun[] {\n const runs: AgridHeaderGroupRun[] = [];\n for (const col of columns) {\n const label = this.groupLabel(col.group);\n const id = label === null ? null : col.group ?? null;\n const previous = runs[runs.length - 1];\n if (id !== null && previous?.id === id) {\n previous.fields.push(col.field);\n previous.span++;\n continue;\n }\n runs.push({\n key: `${pane}:${col.field}`,\n id,\n label: label ?? '',\n fields: [col.field],\n span: 1,\n });\n }\n return runs;\n }\n\n private groupLabel(groupId: string | undefined): string | null {\n if (!groupId) return null;\n return this.opts.headerGroups().find(group => group.id === groupId)?.label ?? null;\n }\n}\n","/** Built-in locale identifiers supplied by the grid. */\nexport type AgridLocaleKey = 'en' | 'de';\n\n/** Complete set of user-facing strings and label factories used by the grid. */\nexport interface AgridLocaleText {\n actions: string;\n addRow: string;\n aggregate: string;\n aggregateAvg: string;\n aggregateCount: string;\n aggregateMax: string;\n aggregateMin: string;\n aggregateSum: string;\n autosizeColumn: string;\n blank: string;\n clearAllFilters: string;\n clearFilter: string;\n clearSort: string;\n close: string;\n columnMenu: string;\n columns: string;\n detail: string;\n toggleDetail: string;\n hiddenColumn: string;\n filterCondition: string;\n filterConditionMenu: string;\n filterValue: string;\n filterNoCondition: string;\n filterOpEquals: string;\n filterOpNotEquals: string;\n filterOpGreater: string;\n filterOpGreaterEqual: string;\n filterOpLess: string;\n filterOpLessEqual: string;\n filterOpBetween: string;\n filterOpBefore: string;\n filterOpAfter: string;\n filterOpOn: string;\n filterOpLike: string;\n filterOpStartsWith: string;\n filterOpEndsWith: string;\n filterOpIncludes: string;\n filterOpNotIncludes: string;\n copyCellValue: string;\n copyRow: string;\n confirmDeleteRow: string;\n confirmNo: string;\n confirmYes: string;\n deleteRow: string;\n filterPlaceholder: string;\n findPlaceholder: string;\n firstPage: string;\n grid: string;\n groupBy: (header: string) => string;\n hideColumn: string;\n insertRowAbove: string;\n insertRowBelow: string;\n lastPage: string;\n loading: string;\n markRow: string;\n next: string;\n noRows: string;\n pagination: string;\n pinColumn: string;\n pinColumnRight: string;\n unpinColumnRight: string;\n pinRowTop: string;\n pinRowBottom: string;\n unpinRow: string;\n previous: string;\n resizeColumn: string;\n rows: (count: number) => string;\n quickFilterPlaceholder: string;\n searchValuesPlaceholder: string;\n selectAll: string;\n sortOnlyByThis: string;\n sortAscending: string;\n sortDescending: string;\n ungroup: string;\n unpinColumn: string;\n save: string;\n}\n\n/** Partial locale text supplied to {@link AgridProvider.addLocalization}. */\nexport type AgridLocaleTextOverrides = Partial<AgridLocaleText>;\n\n/** Built-in English and German grid translations. */\nexport const AGRID_LOCALE_TEXT: Record<AgridLocaleKey, AgridLocaleText> = {\n en: {\n actions: 'Actions',\n addRow: 'Add row',\n aggregate: 'Aggregate',\n aggregateAvg: 'Average',\n aggregateCount: 'Count',\n aggregateMax: 'Maximum',\n aggregateMin: 'Minimum',\n aggregateSum: 'Sum',\n autosizeColumn: 'Autosize column',\n blank: '(blank)',\n clearAllFilters: 'Clear all filters',\n clearFilter: 'Clear filter',\n clearSort: 'Clear sort',\n close: 'Close',\n columnMenu: 'Column menu',\n columns: 'Columns',\n detail: 'Detail',\n toggleDetail: 'Toggle detail panel',\n hiddenColumn: '(hidden)',\n filterCondition: 'Condition',\n filterConditionMenu: 'Filter condition',\n filterValue: 'Value',\n filterNoCondition: 'No condition',\n filterOpEquals: 'Equals',\n filterOpNotEquals: 'Not equal',\n filterOpGreater: 'Greater than',\n filterOpGreaterEqual: 'Greater or equal',\n filterOpLess: 'Less than',\n filterOpLessEqual: 'Less or equal',\n filterOpBetween: 'Between',\n filterOpBefore: 'Before',\n filterOpAfter: 'After',\n filterOpOn: 'On',\n filterOpLike: 'Like (% and _ wildcards)',\n filterOpStartsWith: 'Starts with',\n filterOpEndsWith: 'Ends with',\n filterOpIncludes: 'Includes',\n filterOpNotIncludes: 'Does not include',\n copyCellValue: 'Copy cell',\n copyRow: 'Copy row',\n confirmDeleteRow: 'Sure to delete?',\n confirmNo: 'No',\n confirmYes: 'Yes',\n deleteRow: 'Delete row',\n filterPlaceholder: 'Filter...',\n findPlaceholder: 'Find',\n firstPage: 'First page',\n grid: 'Data grid',\n groupBy: header => `Group by ${header}`,\n hideColumn: 'Hide column',\n insertRowAbove: 'Insert row above',\n insertRowBelow: 'Insert row below',\n lastPage: 'Last page',\n loading: 'Loading...',\n markRow: 'Mark row for copying',\n next: 'Next',\n noRows: 'No rows to display',\n pagination: 'Pagination',\n pinColumn: 'Pin left',\n pinColumnRight: 'Pin right',\n unpinColumnRight: 'Unpin right',\n pinRowTop: 'Pin row to top',\n pinRowBottom: 'Pin row to bottom',\n unpinRow: 'Unpin row',\n previous: 'Previous',\n resizeColumn: 'Resize column',\n rows: count => `${count} ${count === 1 ? 'row' : 'rows'}`,\n quickFilterPlaceholder: 'Search all columns...',\n searchValuesPlaceholder: 'Search values...',\n selectAll: '(Select All)',\n sortOnlyByThis: 'Sort only by this column',\n sortAscending: 'Sort ascending',\n sortDescending: 'Sort descending',\n ungroup: 'Ungroup',\n unpinColumn: 'Unpin column',\n save: 'Save',\n },\n de: {\n actions: 'Aktionen',\n addRow: 'Zeile hinzufügen',\n aggregate: 'Aggregat',\n aggregateAvg: 'Durchschnitt',\n aggregateCount: 'Anzahl',\n aggregateMax: 'Maximum',\n aggregateMin: 'Minimum',\n aggregateSum: 'Summe',\n autosizeColumn: 'Spaltenbreite anpassen',\n blank: '(leer)',\n clearAllFilters: 'Alle Filter löschen',\n clearFilter: 'Filter löschen',\n clearSort: 'Sortierung löschen',\n close: 'Schließen',\n columnMenu: 'Spaltenmenü',\n columns: 'Spalten',\n detail: 'Details',\n toggleDetail: 'Detailbereich umschalten',\n hiddenColumn: '(ausgeblendet)',\n filterCondition: 'Bedingung',\n filterConditionMenu: 'Filterbedingung',\n filterValue: 'Wert',\n filterNoCondition: 'Keine Bedingung',\n filterOpEquals: 'Gleich',\n filterOpNotEquals: 'Ungleich',\n filterOpGreater: 'Größer als',\n filterOpGreaterEqual: 'Größer oder gleich',\n filterOpLess: 'Kleiner als',\n filterOpLessEqual: 'Kleiner oder gleich',\n filterOpBetween: 'Zwischen',\n filterOpBefore: 'Vor',\n filterOpAfter: 'Nach',\n filterOpOn: 'Am',\n filterOpLike: 'Wie (% und _ Platzhalter)',\n filterOpStartsWith: 'Beginnt mit',\n filterOpEndsWith: 'Endet mit',\n filterOpIncludes: 'Enthält',\n filterOpNotIncludes: 'Enthält nicht',\n copyCellValue: 'Zelle kopieren',\n copyRow: 'Zeile kopieren',\n confirmDeleteRow: 'Wirklich löschen?',\n confirmNo: 'Nein',\n confirmYes: 'Ja',\n deleteRow: 'Zeile löschen',\n filterPlaceholder: 'Filtern...',\n findPlaceholder: 'Suchen',\n firstPage: 'Erste Seite',\n grid: 'Datentabelle',\n groupBy: header => `Nach ${header} gruppieren`,\n hideColumn: 'Spalte ausblenden',\n insertRowAbove: 'Zeile darüber einfügen',\n insertRowBelow: 'Zeile darunter einfügen',\n lastPage: 'Letzte Seite',\n loading: 'Wird geladen...',\n markRow: 'Zeile zum Kopieren markieren',\n next: 'Weiter',\n noRows: 'Keine Zeilen vorhanden',\n pagination: 'Seitennavigation',\n pinColumn: 'Links fixieren',\n pinColumnRight: 'Rechts fixieren',\n unpinColumnRight: 'Rechts lösen',\n pinRowTop: 'Zeile oben fixieren',\n pinRowBottom: 'Zeile unten fixieren',\n unpinRow: 'Zeilenfixierung lösen',\n previous: 'Zurück',\n resizeColumn: 'Spaltenbreite ändern',\n rows: count => `${count} ${count === 1 ? 'Zeile' : 'Zeilen'}`,\n quickFilterPlaceholder: 'Alle Spalten durchsuchen...',\n searchValuesPlaceholder: 'Werte suchen...',\n selectAll: '(Alle auswählen)',\n sortOnlyByThis: 'Nur nach dieser Spalte sortieren',\n sortAscending: 'Aufsteigend sortieren',\n sortDescending: 'Absteigend sortieren',\n ungroup: 'Gruppierung aufheben',\n unpinColumn: 'Fixierung lösen',\n save: 'Speichern',\n },\n};\n\n/** Resolves 'auto' to the browser's navigator.language, falling back to 'en-US'. */\nexport function resolveLocale(locale: string): string {\n if (locale !== 'auto') return locale;\n return (typeof navigator !== 'undefined' ? navigator.language : null) ?? 'en-US';\n}\n\n/**\n * Resolves built-in locale text and merges the best matching custom overrides.\n *\n * Matching prefers an exact locale key, then a primary-language match.\n */\nexport function resolveAgridLocaleText(\n locale: string | undefined,\n localizations: ReadonlyMap<string, AgridLocaleTextOverrides>,\n): AgridLocaleText {\n const resolved = resolveLocale(locale ?? 'auto');\n const normalized = resolved.toLowerCase();\n const primaryTag = normalized.split('-')[0];\n\n const base = normalized.startsWith('de') ? AGRID_LOCALE_TEXT.de : AGRID_LOCALE_TEXT.en;\n\n // Prefer exact match (case-insensitive), fall back to primary-language match (e.g. 'fr' matches 'fr-FR')\n let overrides: AgridLocaleTextOverrides | undefined;\n for (const [key, value] of localizations) {\n const k = key.toLowerCase();\n if (k === normalized) { overrides = value; break; }\n if (!overrides && k.split('-')[0] === primaryTag) { overrides = value; }\n }\n\n return { ...base, ...overrides };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\nimport { FilterOperator } from '../agrid-control';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\n\n/** Clamp a floating menu so it remains inside the browser viewport. @internal */\nexport function fitColumnMenuToViewport(\n x: number,\n y: number,\n width: number,\n height: number,\n viewportWidth: number,\n viewportHeight: number,\n margin = 8,\n): { x: number; y: number } {\n return {\n x: Math.max(margin, Math.min(x, viewportWidth - width - margin)),\n y: Math.max(margin, Math.min(y, viewportHeight - height - margin)),\n };\n}\n\n/** Display model for one value-filter option in the column menu. */\nexport interface AgridColumnMenuValueItem {\n /** Human-readable value label shown in the menu. */\n label: string;\n /** Raw value string used by the filter state. */\n rawStr: string;\n /** Whether this value is present in the current cross-filtered row set. */\n active: boolean;\n /** Whether this value is currently selected in the value filter. */\n selected: boolean;\n}\n\n/** Floating column menu for sort, column actions, grouping, and value filters. */\n@Component({\n selector: 'agrid-column-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-column-menu.component.html',\n styleUrl: './agrid-column-menu.component.css',\n})\nexport class AgridColumnMenuComponent {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly browser = new AgridBrowserAdapter();\n private resizeObserver: ResizeObserver | null = null;\n\n /** Localized labels used in the menu. */\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n\n /** Fixed viewport x-position for the menu. */\n x = input.required<number>();\n\n /** Fixed viewport y-position for the menu. */\n y = input.required<number>();\n\n /** Viewport-fitted coordinates used by the rendered menu. */\n readonly position = signal({ x: 0, y: 0 });\n\n /** Header label for the active column. */\n header = input.required<string>();\n\n /** Current sort direction for the active column. */\n sortDir = input<'asc' | 'desc' | null>(null);\n\n /** Whether sort controls are available for this grid. */\n sortable = input<boolean>(true);\n\n /** Whether stateful column actions should be shown. */\n showColumnActions = input<boolean>(false);\n\n /** Current pin state of the active column. */\n pinned = input<'left' | 'right' | false>(false);\n\n /** Whether the active column supports grouping. */\n groupable = input<boolean>(false);\n\n /** Whether the grid is currently grouped by the active column. */\n grouped = input<boolean>(false);\n\n /** Whether the active column supports value-filter controls. */\n filterable = input<boolean>(false);\n\n /** Whether to show the Excel-style distinct-value picker. */\n showValueFilter = input<boolean>(true);\n\n /** Condition-filter input type for the active column, or `null` to hide the condition UI. */\n filterType = input<'text' | 'number' | 'date' | null>(null);\n\n /** Current condition operator, or `null` when none is selected. */\n operator = input<FilterOperator | null>(null);\n\n /** Current primary condition operand. */\n operand = input<string>('');\n\n /** Current secondary condition operand (used by `between`). */\n operand2 = input<string>('');\n\n /** Emits the selected condition operator, or `null` to clear it. */\n operatorChange = output<FilterOperator | null>();\n\n /** Emits the primary condition operand text. */\n operandChange = output<string>();\n\n /** Emits the secondary condition operand text (used by `between`). */\n operand2Change = output<string>();\n\n /** Current search text for the value-filter option list. */\n search = input<string>('');\n\n /** Whether the value filter currently allows every value. */\n allSelected = input<boolean>(true);\n\n /** Visible value-filter option rows. */\n valueItems = input<AgridColumnMenuValueItem[]>([]);\n\n /** 1-based priority of this column in the current multi-sort stack (0 = not sorted). */\n sortPriority = input<number>(0);\n\n /** Whether more than one column is currently sorted. */\n hasMultiSort = input<boolean>(false);\n\n /**\n * Emits a sort direction — toggles this column in the multi-sort stack\n * (adds if not sorted, clears if same direction clicked again).\n */\n sort = output<'asc' | 'desc'>();\n\n /** Emits to replace all sorts with only this column at the given direction. */\n resetSort = output<'asc' | 'desc'>();\n\n /** Requests autosizing the active column. */\n autosize = output<void>();\n\n /** Requests toggling left-pin for the active column. */\n togglePin = output<void>();\n\n /** Requests toggling right-pin for the active column. */\n togglePinRight = output<void>();\n\n /** Requests hiding the active column. */\n hide = output<void>();\n\n /** Requests toggling grouping for the active column. */\n toggleGroup = output<void>();\n\n /** Requests clearing filter and sort state for the active column. */\n clearFilter = output<void>();\n\n /** Requests clearing filter and sort state for every column. */\n clearAll = output<void>();\n\n /** Emits value-filter search text changes. */\n searchChange = output<string>();\n\n /** Requests selecting or deselecting all value-filter options. */\n toggleAll = output<void>();\n\n /** Requests toggling one value-filter option by raw string value. */\n toggleValue = output<string>();\n\n /** Active aggregate function for this column set via the control, or `null` if none. */\n aggregate = input<'sum' | 'avg' | 'min' | 'max' | 'count' | null>(null);\n\n /** Emits the aggregate to set, or `null` to clear it. */\n setAggregate = output<'sum' | 'avg' | 'min' | 'max' | 'count' | null>();\n\n readonly aggregateOptions = computed(() => {\n const t = this.localeText();\n return [\n { value: 'sum' as const, symbol: 'Σ', label: t.aggregateSum },\n { value: 'avg' as const, symbol: 'Ø', label: t.aggregateAvg },\n { value: 'min' as const, symbol: '↓', label: t.aggregateMin },\n { value: 'max' as const, symbol: '↑', label: t.aggregateMax },\n { value: 'count' as const, symbol: '#', label: t.aggregateCount },\n ];\n });\n\n /** Condition operators offered for the active column, labeled per column type. */\n readonly operatorOptions = computed<{ value: FilterOperator; label: string }[]>(() => {\n const t = this.localeText();\n if (this.filterType() === 'date') {\n return [\n { value: 'eq', label: t.filterOpOn },\n { value: 'lt', label: t.filterOpBefore },\n { value: 'gt', label: t.filterOpAfter },\n { value: 'between', label: t.filterOpBetween },\n ];\n }\n if (this.filterType() === 'text') {\n return [\n { value: 'eq', label: t.filterOpEquals },\n { value: 'neq', label: t.filterOpNotEquals },\n { value: 'like', label: t.filterOpLike },\n { value: 'startsWith', label: t.filterOpStartsWith },\n { value: 'endsWith', label: t.filterOpEndsWith },\n { value: 'includes', label: t.filterOpIncludes },\n { value: 'notIncludes', label: t.filterOpNotIncludes },\n ];\n }\n return [\n { value: 'eq', label: t.filterOpEquals },\n { value: 'neq', label: t.filterOpNotEquals },\n { value: 'gt', label: t.filterOpGreater },\n { value: 'gte', label: t.filterOpGreaterEqual },\n { value: 'lt', label: t.filterOpLess },\n { value: 'lte', label: t.filterOpLessEqual },\n { value: 'between', label: t.filterOpBetween },\n ];\n });\n\n /** Native input type for operand fields (date columns use a date picker). */\n readonly operandInputType = computed(() =>\n this.filterType() === 'date' ? 'date' : this.filterType() === 'number' ? 'number' : 'text',\n );\n\n constructor() {\n effect(() => {\n this.position.set({ x: this.x(), y: this.y() });\n this.scheduleViewportFit();\n });\n\n afterNextRender(() => {\n const menu = this.menuElement();\n this.fitToViewport();\n if (menu && typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.fitToViewport());\n this.resizeObserver.observe(menu);\n }\n });\n\n this.destroyRef.onDestroy(() => this.resizeObserver?.disconnect());\n }\n\n private scheduleViewportFit(): void {\n setTimeout(() => this.fitToViewport());\n }\n\n private fitToViewport(): void {\n const menu = this.menuElement();\n if (!menu || !this.browser.available) return;\n const rect = menu.getBoundingClientRect();\n this.position.set(fitColumnMenuToViewport(\n this.x(),\n this.y(),\n rect.width,\n rect.height,\n this.browser.viewportWidth(),\n this.browser.viewportHeight(),\n ));\n }\n\n private menuElement(): HTMLElement | null {\n return this.elementRef.nativeElement.querySelector<HTMLElement>('.ag-filter-menu');\n }\n}\n","<div\n class=\"ag-filter-menu\"\n role=\"dialog\"\n [attr.aria-label]=\"localeText().columnMenu + ': ' + header()\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\"\n (click)=\"$event.stopPropagation()\"\n>\n @if (sortable()) {\n <div class=\"ag-filter-menu-section\">\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"sortDir() === 'asc'\"\n (click)=\"sort.emit('asc')\"\n >\n ↑ {{ localeText().sortAscending }}\n @if (sortPriority() > 0) {\n <span class=\"ag-sort-priority-badge\">{{ sortPriority() }}</span>\n }\n </button>\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"sortDir() === 'desc'\"\n (click)=\"sort.emit('desc')\"\n >\n ↓ {{ localeText().sortDescending }}\n @if (sortPriority() > 0) {\n <span class=\"ag-sort-priority-badge\">{{ sortPriority() }}</span>\n }\n </button>\n @if (hasMultiSort() && sortPriority() > 0) {\n <button class=\"ag-filter-menu-item ag-filter-menu-item--muted\" (click)=\"resetSort.emit(sortDir()!)\">{{ localeText().sortOnlyByThis }}</button>\n }\n @if (sortDir()) {\n <button class=\"ag-filter-menu-item\" (click)=\"sort.emit(sortDir()!)\">{{ localeText().clearSort }}</button>\n }\n </div>\n }\n\n @if (showColumnActions()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <button class=\"ag-filter-menu-item\" (click)=\"autosize.emit()\">↔ {{ localeText().autosizeColumn }}</button>\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"pinned() === 'left'\"\n (click)=\"togglePin.emit()\"\n >⊣ {{ pinned() === 'left' ? localeText().unpinColumn : localeText().pinColumn }}</button>\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"pinned() === 'right'\"\n (click)=\"togglePinRight.emit()\"\n >⊢ {{ pinned() === 'right' ? localeText().unpinColumnRight : localeText().pinColumnRight }}</button>\n <button class=\"ag-filter-menu-item\" (click)=\"hide.emit()\">{{ localeText().hideColumn }}</button>\n </div>\n }\n\n @if (showColumnActions()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <span class=\"ag-filter-menu-aggregate-label\">{{ localeText().aggregate }}</span>\n <div class=\"ag-filter-menu-aggregate-btns\">\n @for (opt of aggregateOptions(); track opt.value) {\n <button\n class=\"ag-aggregate-btn\"\n [class.ag-aggregate-btn--active]=\"aggregate() === opt.value\"\n [title]=\"opt.label\"\n (click)=\"setAggregate.emit(aggregate() === opt.value ? null : opt.value)\"\n >{{ opt.symbol }}</button>\n }\n </div>\n </div>\n }\n\n @if (groupable()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"grouped()\"\n (click)=\"toggleGroup.emit()\"\n >{{ grouped() ? '⊟ ' + localeText().ungroup : '⊞ ' + localeText().groupBy(header()) }}</button>\n </div>\n }\n\n @if (filterable()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <button class=\"ag-filter-menu-item ag-filter-menu-item--muted\" (click)=\"clearFilter.emit()\">\n ✕ {{ localeText().clearFilter }}\n </button>\n <button class=\"ag-filter-menu-item ag-filter-menu-item--muted\" (click)=\"clearAll.emit()\">\n ✕ {{ localeText().clearAllFilters }}\n </button>\n </div>\n\n @if (filterType()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border ag-filter-menu-condition\">\n <span class=\"ag-filter-menu-aggregate-label\">{{ localeText().filterCondition }}</span>\n <div class=\"ag-filter-menu-operators\">\n <button\n type=\"button\"\n class=\"ag-filter-menu-operator-btn ag-filter-menu-operator-btn--clear\"\n [class.ag-filter-menu-operator-btn--active]=\"!operator()\"\n (click)=\"operatorChange.emit(null)\"\n >{{ localeText().filterNoCondition }}</button>\n @for (op of operatorOptions(); track op.value) {\n <button\n type=\"button\"\n class=\"ag-filter-menu-operator-btn\"\n [class.ag-filter-menu-operator-btn--active]=\"op.value === operator()\"\n (click)=\"operatorChange.emit(op.value)\"\n >{{ op.label }}</button>\n }\n </div>\n @if (operator()) {\n <label class=\"ag-filter-menu-operand-label\" for=\"agrid-filter-operand\">\n {{ localeText().filterValue }}\n </label>\n <input\n id=\"agrid-filter-operand\"\n class=\"ag-filter-menu-operand\"\n [type]=\"operandInputType()\"\n [value]=\"operand()\"\n (input)=\"operandChange.emit($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n @if (operator() === 'between') {\n <input\n class=\"ag-filter-menu-operand\"\n [type]=\"operandInputType()\"\n [value]=\"operand2()\"\n (input)=\"operand2Change.emit($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n }\n </div>\n }\n\n @if (showValueFilter()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <input\n class=\"ag-filter-menu-search\"\n [value]=\"search()\"\n (input)=\"searchChange.emit($any($event.target).value)\"\n [placeholder]=\"localeText().searchValuesPlaceholder\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n\n <div class=\"ag-filter-menu-values\">\n <label class=\"ag-filter-menu-value\">\n <input\n type=\"checkbox\"\n [checked]=\"allSelected()\"\n (change)=\"toggleAll.emit()\"\n />\n <span class=\"ag-filter-menu-value-label\">{{ localeText().selectAll }}</span>\n </label>\n @for (item of valueItems(); track item.rawStr) {\n <label\n class=\"ag-filter-menu-value\"\n [class.ag-filter-menu-value--inactive]=\"!item.active\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"item.selected\"\n [disabled]=\"!item.active\"\n (change)=\"toggleValue.emit(item.rawStr)\"\n />\n <span class=\"ag-filter-menu-value-label\">{{ item.label || localeText().blank }}</span>\n </label>\n }\n </div>\n }\n }\n</div>\n","import { DestroyRef, Signal, computed, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridColumnMenuValueItem } from './agrid-column-menu.component';\nimport { AgridControl, FilterOperator } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { ColDef, FilterChangeEvent, SortChangeEvent, ValueOption } from '../agrid.types';\nimport { passesConditionFilter } from '../agrid.utils';\n\n/** Position and target field of the open column menu. @internal */\nexport type AgridColumnMenuState = {\n field: string;\n x: number;\n y: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridColumnMenuController}. @internal */\nexport interface AgridColumnMenuControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n colDefs: Signal<ColDef[]>;\n serverSideFiltering: Signal<boolean>;\n filterDebounceMs: Signal<number>;\n sortOption: Signal<'single' | 'multi' | 'none'>;\n effectiveSortOrder: () => string[];\n autosizeColumn: (col: ColDef) => void;\n onFilterChange: (event: FilterChangeEvent) => void;\n onSortChange: (event: SortChangeEvent) => void;\n}\n\n/** Owns column-menu state, filters, sorting, and menu-triggered column mutations. @internal */\nexport class AgridColumnMenuController {\n readonly menu = signal<AgridColumnMenuState | null>(null);\n readonly search = signal('');\n\n readonly items = computed<{ label: string; rawStr: string }[]>(() => {\n const menu = this.menu();\n if (!menu) return [];\n const col = this.getColDef(menu.field);\n if (!col?.filterable) return [];\n const values = col?.values;\n if (values?.length) {\n return values\n .map(value => typeof value === 'string'\n ? { label: value, rawStr: value }\n : {\n label: (value as ValueOption).label,\n rawStr: String((value as ValueOption).value),\n })\n .sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }));\n }\n\n const rows = this.opts.dataSource().rows();\n const rawValues = [...new Set(rows.map(row => String(row[menu.field] ?? '')))];\n return rawValues\n .map(rawStr => ({\n label: col?.formatter ? col.formatter(rawStr) : rawStr,\n rawStr,\n }))\n .sort((a, b) =>\n a.label.localeCompare(b.label, undefined, { numeric: true, sensitivity: 'base' }),\n );\n });\n\n readonly visibleItems = computed(() => {\n const search = this.search().toLowerCase();\n return this.items().filter(item => !search || item.label.toLowerCase().includes(search));\n });\n\n readonly activeValues = computed(() => {\n const menu = this.menu();\n if (!menu) return new Set<string>();\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n let indices = rows.map((_, index) => index);\n if (control) {\n for (const [field, filter] of Object.entries(control.filters())) {\n if (field === menu.field) continue;\n if (filter.text) {\n const search = filter.text.toLowerCase();\n indices = indices.filter(index =>\n String(rows[index][field] ?? '').toLowerCase().includes(search),\n );\n }\n if (filter.selectedValues !== null) {\n const allowed = new Set(filter.selectedValues);\n indices = indices.filter(index => allowed.has(String(rows[index][field] ?? '')));\n }\n if (filter.operator && filter.operand != null && filter.operand !== '') {\n const filterCol = this.getColDef(field);\n indices = indices.filter(index =>\n passesConditionFilter(filterCol, rows[index][field], filter),\n );\n }\n }\n }\n return new Set(indices.map(index => String(rows[index][menu.field] ?? '')));\n });\n\n readonly valueItems = computed<AgridColumnMenuValueItem[]>(() => {\n const menu = this.menu();\n if (!menu) return [];\n return this.visibleItems().map(item => ({\n ...item,\n active: this.activeValues().has(item.rawStr),\n selected: this.isValueSelected(menu.field, item.rawStr),\n }));\n });\n\n private readonly filterDebounces = new Map<string, ReturnType<typeof setTimeout>>();\n\n constructor(\n private readonly opts: AgridColumnMenuControllerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => {\n for (const timer of this.filterDebounces.values()) clearTimeout(timer);\n this.filterDebounces.clear();\n });\n }\n\n /** Returns the active text filter for a field. */\n getTextFilter(field: string): string {\n return this.opts.control()?.getFilter(field).text ?? '';\n }\n\n /** Returns the condition-filter input type for a filterable field. */\n getFilterType(field: string): 'text' | 'number' | 'date' | null {\n const col = this.getColDef(field);\n if (!col?.filterable || col.type === 'boolean') return null;\n return col.type === 'number' || col.type === 'date' ? col.type : 'text';\n }\n\n /** Returns the condition operator for a field, or `null`. */\n getFilterOperator(field: string): FilterOperator | null {\n return this.opts.control()?.getFilter(field).operator ?? null;\n }\n\n /** Returns the primary condition operand for a field. */\n getFilterOperand(field: string): string {\n return this.opts.control()?.getFilter(field).operand ?? '';\n }\n\n /** Returns the secondary condition operand (used by `between`). */\n getFilterOperand2(field: string): string {\n return this.opts.control()?.getFilter(field).operand2 ?? '';\n }\n\n /** Sets the condition operator; clearing it (`null`) also drops the operands. */\n setFilterOperator(field: string, operator: FilterOperator | null): void {\n const control = this.opts.control();\n if (!control) return;\n if (!operator) {\n control.setRangeFilter(field, null, null, null);\n } else {\n const current = control.getFilter(field);\n control.setRangeFilter(field, operator, current.operand ?? '', current.operand2 ?? '');\n }\n this.emitRangeServer(field, false);\n }\n\n /** Sets the primary condition operand. */\n setFilterOperand(field: string, value: string): void {\n const control = this.opts.control();\n if (!control) return;\n const current = control.getFilter(field);\n control.setRangeFilter(field, current.operator ?? 'eq', value, current.operand2 ?? '');\n this.emitRangeServer(field, true);\n }\n\n /** Sets the secondary condition operand (used by `between`). */\n setFilterOperand2(field: string, value: string): void {\n const control = this.opts.control();\n if (!control) return;\n const current = control.getFilter(field);\n control.setRangeFilter(field, current.operator ?? 'between', current.operand ?? '', value);\n this.emitRangeServer(field, true);\n }\n\n /**\n * In server-side filtering mode, emit a {@link FilterChangeEvent} carrying the current\n * condition so the host can refetch. Operand edits are debounced; operator changes are immediate.\n * No-op in client mode (the projection layer filters locally).\n */\n private emitRangeServer(field: string, debounce: boolean): void {\n if (!this.opts.serverSideFiltering()) return;\n const emit = () => {\n const f = this.opts.control()?.getFilter(field);\n this.opts.onFilterChange({\n field,\n value: '',\n operator: f?.operator ?? null,\n operand: f?.operand ?? null,\n operand2: f?.operand2 ?? null,\n });\n };\n this.cancelFilterDebounce(field);\n const delay = this.opts.filterDebounceMs();\n if (!debounce || delay === 0) {\n emit();\n return;\n }\n this.filterDebounces.set(field, setTimeout(() => {\n this.filterDebounces.delete(field);\n emit();\n }, delay));\n }\n\n /** Returns the active sort direction, respecting disabled sorting. */\n getSort(field: string): 'asc' | 'desc' | null {\n return this.opts.sortOption() === 'none'\n ? null\n : this.opts.control()?.getFilter(field).sort ?? null;\n }\n\n /** Returns a field's one-based position in the sort stack. */\n getSortPriority(field: string): number {\n return this.opts.control()?.getSortPriority(field) ?? 0;\n }\n\n /** Returns whether multiple sort fields are currently active. */\n hasMultiSort(): boolean {\n return this.opts.sortOption() === 'multi' && this.opts.effectiveSortOrder().length > 1;\n }\n\n /** Returns whether the value filter currently includes every value. */\n isAllSelected(field: string): boolean {\n return this.opts.control()?.getFilter(field).selectedValues === null;\n }\n\n /** Returns whether a raw value survives filters on other columns. */\n isValueActive(rawStr: string): boolean {\n return this.activeValues().has(rawStr);\n }\n\n /** Returns whether a raw value is selected by the field's value filter. */\n isValueSelected(field: string, value: string): boolean {\n const selected = this.opts.control()?.getFilter(field).selectedValues;\n return selected == null || selected.includes(value);\n }\n\n /** Returns whether a field has active filter or sort state. */\n hasActiveFilter(field: string): boolean {\n return this.opts.control()?.hasActiveFilter(field) ?? false;\n }\n\n /** Updates a text filter and emits its debounced server-side event. */\n onTextFilterChange(event: Event, field: string): void {\n const value = (event.target as HTMLInputElement).value;\n this.opts.control()?.setTextFilter(field, value);\n if (!this.opts.serverSideFiltering()) return;\n\n this.cancelFilterDebounce(field);\n const delay = this.opts.filterDebounceMs();\n if (delay === 0) {\n this.opts.onFilterChange({ field, value });\n return;\n }\n this.filterDebounces.set(field, setTimeout(() => {\n this.filterDebounces.delete(field);\n this.opts.onFilterChange({ field, value });\n }, delay));\n }\n\n /** Opens the column menu at a viewport position. */\n open(event: MouseEvent, field: string): void {\n event.stopPropagation();\n this.search.set('');\n this.menu.set({\n field,\n x: Math.min(event.clientX, this.browser.viewportWidth() - 220),\n y: event.clientY,\n });\n }\n\n /** Closes the column menu. */\n close(): void {\n this.menu.set(null);\n }\n\n /** Updates the distinct-value search text. */\n setSearch(value: string): void {\n this.search.set(value);\n }\n\n /** Applies or clears a sort according to the configured sorting mode. */\n sort(field: string, direction: 'asc' | 'desc'): void {\n const control = this.opts.control();\n if (!control || this.opts.sortOption() === 'none') return;\n if (control.getFilter(field).sort === direction) {\n const previous = control.getFilter(field);\n control.clearFilter(field);\n if (previous.text) control.setTextFilter(field, previous.text);\n if (previous.selectedValues !== null) {\n control.setSelectedValues(field, previous.selectedValues);\n }\n if (previous.operator) {\n control.setRangeFilter(\n field,\n previous.operator,\n previous.operand ?? null,\n previous.operand2 ?? null,\n );\n }\n if (this.opts.serverSideFiltering()) {\n this.opts.onSortChange({ field, direction: null });\n }\n } else if (this.opts.sortOption() === 'single') {\n const previousFields = control.sortOrder().filter(sortedField => sortedField !== field);\n control.setSort(field, direction);\n if (this.opts.serverSideFiltering()) {\n for (const previousField of previousFields) {\n this.opts.onSortChange({ field: previousField, direction: null });\n }\n this.opts.onSortChange({ field, direction });\n }\n } else {\n control.addSort(field, direction);\n if (this.opts.serverSideFiltering()) {\n this.opts.onSortChange({ field, direction });\n }\n }\n this.close();\n }\n\n /** Clears filter and sort state for one field. */\n clearFilter(field: string): void {\n const control = this.opts.control();\n if (!control) return;\n this.cancelFilterDebounce(field);\n const previous = control.getFilter(field);\n control.clearFilter(field);\n if (this.opts.serverSideFiltering()) {\n if (previous.text) this.opts.onFilterChange({ field, value: '' });\n if (previous.operator) {\n this.opts.onFilterChange({ field, value: '', operator: null, operand: null, operand2: null });\n }\n if (previous.sort) this.opts.onSortChange({ field, direction: null });\n }\n this.close();\n }\n\n /** Replaces the multi-sort stack with one field and direction. */\n resetSort(field: string, direction: 'asc' | 'desc'): void {\n const control = this.opts.control();\n if (!control || this.opts.sortOption() !== 'multi') return;\n const previousFields = control.sortOrder().filter(sortedField => sortedField !== field);\n control.setSort(field, direction);\n if (this.opts.serverSideFiltering()) {\n for (const previousField of previousFields) {\n this.opts.onSortChange({ field: previousField, direction: null });\n }\n this.opts.onSortChange({ field, direction });\n }\n this.close();\n }\n\n /** Toggles grouping by a field. */\n toggleGroupBy(field: string): void {\n const control = this.opts.control();\n if (!control) return;\n control.setGroupBy(control.groupByField() === field ? null : field);\n this.close();\n }\n\n /** Clears filter and sort state for every field. */\n clearAll(): void {\n const control = this.opts.control();\n if (!control) return;\n for (const field of this.filterDebounces.keys()) this.cancelFilterDebounce(field);\n const previous = control.filters();\n control.clearAllFilters();\n if (this.opts.serverSideFiltering()) {\n for (const [field, filter] of Object.entries(previous)) {\n if (filter.text) this.opts.onFilterChange({ field, value: '' });\n if (filter.operator) {\n this.opts.onFilterChange({ field, value: '', operator: null, operand: null, operand2: null });\n }\n if (filter.sort) this.opts.onSortChange({ field, direction: null });\n }\n }\n this.close();\n }\n\n /** Selects or deselects every distinct value for a field. */\n toggleAll(field: string): void {\n const control = this.opts.control();\n if (!control) return;\n control.setSelectedValues(\n field,\n control.getFilter(field).selectedValues === null ? [] : null,\n );\n }\n\n /** Toggles one raw value in a field's value filter. */\n toggleValue(field: string, rawStr: string): void {\n const control = this.opts.control();\n if (!control) return;\n const allValues = this.items().map(item => item.rawStr);\n const current = control.getFilter(field).selectedValues ?? allValues;\n const next = current.includes(rawStr)\n ? current.filter(value => value !== rawStr)\n : [...current, rawStr];\n control.setSelectedValues(field, next.length === allValues.length ? null : next);\n }\n\n /** Toggles left pinning for a field. */\n togglePin(field: string): void {\n this.opts.control()?.togglePinned(field);\n this.close();\n }\n\n /** Toggles right pinning for a field. */\n togglePinRight(field: string): void {\n this.opts.control()?.togglePinnedRight(field);\n this.close();\n }\n\n /** Autosizes a field and closes the menu. */\n autosize(field: string): void {\n const col = this.getColDef(field);\n if (!col) return;\n this.opts.autosizeColumn(col);\n this.close();\n }\n\n /** Sets a built-in aggregate for a field. */\n setAggregate(\n field: string,\n aggregate: 'sum' | 'avg' | 'min' | 'max' | 'count' | null,\n ): void {\n this.opts.control()?.setAggregate(field, aggregate);\n this.close();\n }\n\n /** Hides a field and closes the menu. */\n hideColumn(field: string): void {\n this.opts.control()?.setColumnVisibility(field, false);\n this.close();\n }\n\n /** Toggles field visibility from the sidebar column list. */\n toggleColumnVisibility(field: string): void {\n this.opts.control()?.toggleColumnVisibility(field);\n }\n\n /** Sets visibility for several fields from a sidebar header-group toggle. */\n setColumnsVisibility(fields: string[], visible: boolean): void {\n const control = this.opts.control();\n if (!control) return;\n for (const field of fields) {\n control.setColumnVisibility(field, visible);\n }\n }\n\n private getColDef(field: string): ColDef | undefined {\n return this.opts.colDefs().find(col => col.field === field);\n }\n\n private cancelFilterDebounce(field: string): void {\n const timer = this.filterDebounces.get(field);\n if (timer === undefined) return;\n clearTimeout(timer);\n this.filterDebounces.delete(field);\n }\n}\n","import { DestroyRef, Signal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef } from '../agrid.types';\n\n/** View state for the floating column header shown during a reorder drag. @internal */\nexport interface AgridColumnDragPreview {\n field: string;\n fields: string[];\n label: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ntype AgridColumnDropTarget = {\n field: string;\n left: number;\n right: number;\n top: number;\n bottom: number;\n};\n\n/** Dependencies required by {@link AgridColumnReorderController}. @internal */\nexport interface AgridColumnReorderControllerOptions {\n control: Signal<AgridControl | null>;\n visibleColDefs: Signal<ColDef[]>;\n getColDef: (field: string) => ColDef | undefined;\n}\n\n/** Owns column header drag/drop state and column reordering. @internal */\nexport class AgridColumnReorderController {\n private readonly dragFields = signal<string[]>([]);\n private readonly dragOverField = signal<string | null>(null);\n private readonly dragInsertBefore = signal(true);\n readonly preview = signal<AgridColumnDragPreview | null>(null);\n private dragStartFields: string[] = [];\n private dragLabel = '';\n private dragStartX = 0;\n private dragStartY = 0;\n private pointerOffsetX = 0;\n private pointerOffsetY = 0;\n private draggedWidth = 0;\n private draggedHeight = 0;\n private dropTargets: AgridColumnDropTarget[] = [];\n\n constructor(\n private readonly opts: AgridColumnReorderControllerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this.cancel());\n }\n\n /** Arms a column reorder gesture for an unlocked header. */\n start(event: PointerEvent, field: string): void {\n const col = this.opts.getColDef(field);\n this.startFields(event, [field], col?.header ?? field);\n }\n\n /** Arms a grouped-header reorder gesture for a contiguous field segment. */\n startGroup(event: PointerEvent, fields: readonly string[], label: string): void {\n this.startFields(event, fields, label);\n }\n\n private startFields(event: PointerEvent, fields: readonly string[], label: string): void {\n if (!this.opts.control() || event.button !== 0) return;\n if (fields.length === 0 || fields.some(field => this.opts.getColDef(field)?.locked)) return;\n const header = event.currentTarget as HTMLElement | null;\n const rect = header?.getBoundingClientRect();\n this.dragStartFields = [...fields];\n this.dragLabel = label;\n this.dragStartX = event.clientX;\n this.dragStartY = event.clientY;\n this.draggedWidth = rect?.width ?? 0;\n this.draggedHeight = rect?.height ?? 32;\n this.pointerOffsetX = rect ? event.clientX - rect.left : 0;\n this.pointerOffsetY = rect ? event.clientY - rect.top : 0;\n this.dropTargets = this.captureDropTargets(header);\n this.browser.addDocumentListener('pointermove', this.dragMove);\n this.browser.addDocumentListener('pointerup', this.dragUp);\n this.browser.addDocumentListener('pointercancel', this.dragCancel);\n }\n\n /** Returns whether the field is currently being dragged. */\n isDragging(field: string): boolean {\n return this.dragFields().includes(field);\n }\n\n /** Returns the active drop-indicator side for a field. */\n getDropSide(field: string): 'before' | 'after' | null {\n if (this.dragOverField() !== field || this.dragFields().includes(field)) return null;\n return this.dragInsertBefore() ? 'before' : 'after';\n }\n\n /** Horizontal translation used to animate headers away from the pending insertion gap. */\n getHeaderOffset(field: string): number {\n const movingFields = this.dragFields();\n const overField = this.dragOverField();\n if (movingFields.length === 0 || !overField || movingFields.includes(field)\n || this.draggedWidth <= 0) return 0;\n\n const fields = this.opts.visibleColDefs().map(col => col.field);\n const fromIndex = fields.findIndex(value => movingFields.includes(value));\n const remaining = fields.filter(value => !movingFields.includes(value));\n const overIndex = remaining.indexOf(overField);\n const fieldIndex = remaining.indexOf(field);\n if (fromIndex < 0 || overIndex < 0 || fieldIndex < 0) return 0;\n\n const insertionIndex = overIndex + (this.dragInsertBefore() ? 0 : 1);\n if (insertionIndex < fromIndex && fieldIndex >= insertionIndex && fieldIndex < fromIndex) {\n return this.draggedWidth;\n }\n if (insertionIndex > fromIndex && fieldIndex >= fromIndex && fieldIndex < insertionIndex) {\n return -this.draggedWidth;\n }\n return 0;\n }\n\n private readonly dragMove = (event: PointerEvent): void => {\n if (this.dragStartFields.length === 0) return;\n if (this.dragFields().length === 0) {\n if (Math.abs(event.clientX - this.dragStartX) < 5) return;\n this.dragFields.set([...this.dragStartFields]);\n this.preview.set({\n field: this.dragStartFields[0],\n fields: [...this.dragStartFields],\n label: this.dragLabel,\n x: event.clientX - this.pointerOffsetX,\n y: event.clientY - this.pointerOffsetY,\n width: this.draggedWidth,\n height: this.draggedHeight,\n });\n } else {\n this.preview.update(preview => preview ? {\n ...preview,\n x: event.clientX - this.pointerOffsetX,\n y: event.clientY - this.pointerOffsetY,\n } : null);\n }\n const hovered = this.getHoveredHeaderCell(event.clientX, event.clientY);\n if (hovered && !this.dragFields().includes(hovered.field)) {\n this.dragOverField.set(hovered.field);\n this.dragInsertBefore.set(hovered.insertBefore);\n } else {\n this.dragOverField.set(null);\n }\n };\n\n private readonly dragUp = (): void => {\n this.removeListeners();\n const from = this.dragFields();\n const to = this.dragOverField();\n if (from.length > 0 && to) {\n this.opts.control()?.moveColumns(\n this.opts.visibleColDefs().map(col => col.field),\n from,\n to,\n this.dragInsertBefore(),\n );\n }\n this.dragFields.set([]);\n this.dragOverField.set(null);\n this.dragInsertBefore.set(true);\n this.preview.set(null);\n this.dragStartFields = [];\n this.dragLabel = '';\n this.dropTargets = [];\n };\n\n private readonly dragCancel = (): void => this.cancel();\n\n private cancel(): void {\n this.removeListeners();\n this.dragFields.set([]);\n this.dragOverField.set(null);\n this.dragInsertBefore.set(true);\n this.preview.set(null);\n this.dragStartFields = [];\n this.dragLabel = '';\n this.dropTargets = [];\n }\n\n private removeListeners(): void {\n this.browser.removeDocumentListener('pointermove', this.dragMove);\n this.browser.removeDocumentListener('pointerup', this.dragUp);\n this.browser.removeDocumentListener('pointercancel', this.dragCancel);\n }\n\n private getHoveredHeaderCell(x: number, _y: number): { field: string; insertBefore: boolean } | null {\n const target = this.dropTargets.find(rect => x >= rect.left && x <= rect.right);\n return target\n ? { field: target.field, insertBefore: x < target.left + (target.right - target.left) / 2 }\n : null;\n }\n\n private captureDropTargets(header: HTMLElement | null): AgridColumnDropTarget[] {\n const root = header?.closest('.ag-wrapper') ?? header?.ownerDocument;\n if (!root) return [];\n return Array.from(root.querySelectorAll<HTMLElement>('.ag-header-cell[data-col-field]'))\n .map(element => {\n const field = element.dataset['colField'];\n const rect = element.getBoundingClientRect();\n return field ? {\n field,\n left: rect.left,\n right: rect.right,\n top: rect.top,\n bottom: rect.bottom,\n } : null;\n })\n .filter((target): target is AgridColumnDropTarget => target !== null);\n }\n\n}\n","import { DestroyRef, Signal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Dependencies required by {@link AgridColumnSizingController}. @internal */\nexport interface AgridColumnSizingOptions {\n control: Signal<AgridControl | null>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n scrollableColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n isColumnPinned: (field: string) => boolean;\n wrapperElement: () => HTMLElement;\n scrollerElement: () => HTMLElement;\n}\n\n/**\n * Owns column widths, resize interactions, autosizing, and horizontal visibility.\n * @internal\n */\nexport class AgridColumnSizingController {\n private readonly localWidths = signal<Record<string, number>>({});\n private resizeState: { field: string; startX: number; startWidth: number } | null = null;\n\n constructor(\n private readonly opts: AgridColumnSizingOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this.finishResize());\n }\n\n /** Returns a column's effective fixed width, or `0` for flexible columns. */\n getWidth(col: ColDef): number {\n const override = this.widthOverride(col.field);\n if (override !== undefined) return override;\n return col.width == null || col.width === -1 ? 0 : col.width;\n }\n\n /** Returns the CSS grid width token for a column. */\n getWidthToken(col: ColDef): string {\n const override = this.widthOverride(col.field);\n if (override !== undefined) return `${override}px`;\n return col.width == null || col.width === -1 ? '1fr' : `${col.width}px`;\n }\n\n /** Stores a clamped runtime width in the control or local fallback state. */\n setWidth(field: string, width: number): void {\n const control = this.opts.control();\n if (control) {\n control.setColumnWidth(field, width);\n } else {\n this.localWidths.update(widths => ({\n ...widths,\n [field]: Math.max(40, width),\n }));\n }\n }\n\n /** Starts pointer-driven resizing for an unlocked column. */\n startResize(event: MouseEvent, col: ColDef): void {\n if (col.locked) return;\n event.preventDefault();\n event.stopPropagation();\n const renderedWidth = (event.currentTarget as HTMLElement)\n .closest<HTMLElement>('.ag-header-cell')\n ?.getBoundingClientRect().width;\n this.resizeState = {\n field: col.field,\n startX: event.clientX,\n startWidth: this.getWidth(col) || renderedWidth || 100,\n };\n this.browser.setBodyInteraction('col-resize', 'none');\n this.browser.addDocumentListener('mousemove', this.resizeMove);\n this.browser.addDocumentListener('mouseup', this.resizeUp);\n }\n\n /** Adjusts an unlocked column width with keyboard arrow keys. */\n resizeFromKeyboard(event: KeyboardEvent, col: ColDef): void {\n if (col.locked || (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')) return;\n event.preventDefault();\n const delta = event.key === 'ArrowLeft' ? -10 : 10;\n this.setWidth(col.field, this.getWidth(col) + delta);\n }\n\n /** Sizes one unlocked column to fit its header and visible values. */\n autosizeColumn(col: ColDef): void {\n if (col.locked) return;\n const context = this.getAutosizeContext();\n if (!context) return;\n this.setWidth(col.field, this.measureAutosizeWidth(col, context));\n }\n\n /** Sizes every unlocked visible column to its current content. */\n autosizeAllColumns(): void {\n const context = this.getAutosizeContext();\n if (!context) return;\n for (const col of this.opts.visibleColDefs()) {\n if (!col.locked) this.setWidth(col.field, this.measureAutosizeWidth(col, context));\n }\n }\n\n /** Horizontally scrolls an unpinned column into view. */\n scrollColumnToKeepVisible(colIndex: number): void {\n const col = this.opts.visibleColDefs()[colIndex];\n if (!col || this.opts.isColumnPinned(col.field)) return;\n\n const scroller = this.opts.scrollerElement();\n const { start, end } = this.getScrollableColumnBounds(col.field);\n const maxScrollLeft = Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n let nextScrollLeft = scroller.scrollLeft;\n\n if (start < nextScrollLeft) {\n nextScrollLeft = start;\n } else if (end > nextScrollLeft + scroller.clientWidth) {\n nextScrollLeft = end - scroller.clientWidth;\n }\n\n nextScrollLeft = Math.max(0, Math.min(maxScrollLeft, nextScrollLeft));\n if (nextScrollLeft !== scroller.scrollLeft) scroller.scrollLeft = nextScrollLeft;\n }\n\n private readonly resizeMove = (event: MouseEvent): void => {\n if (!this.resizeState) return;\n this.setWidth(\n this.resizeState.field,\n this.resizeState.startWidth + (event.clientX - this.resizeState.startX),\n );\n };\n\n private readonly resizeUp = (): void => this.finishResize();\n\n private finishResize(): void {\n this.resizeState = null;\n this.browser.setBodyInteraction('', '');\n this.browser.removeDocumentListener('mousemove', this.resizeMove);\n this.browser.removeDocumentListener('mouseup', this.resizeUp);\n }\n\n private widthOverride(field: string): number | undefined {\n return this.opts.control()?.columnWidths()[field] ?? this.localWidths()[field];\n }\n\n private getScrollableColumnBounds(field: string): { start: number; end: number } {\n let start = 0;\n for (const col of this.opts.scrollableColDefs()) {\n const width = this.getWidth(col);\n if (col.field === field) return { start, end: start + width };\n start += width;\n }\n return { start: 0, end: 0 };\n }\n\n private measureAutosizeWidth(\n col: ColDef,\n context: CanvasRenderingContext2D,\n ): number {\n const values = [col.header];\n for (const item of this.opts.filteredItems()) {\n if (!isDataRowItem(item)) continue;\n values.push(getDisplayForField(col, item.row[col.field], this.opts.locale()));\n }\n const measured = values.reduce(\n (max, value) => Math.max(max, context.measureText(value).width),\n 0,\n );\n return Math.max(40, Math.min(500, Math.ceil(measured + 42)));\n }\n\n private getAutosizeContext(): CanvasRenderingContext2D | null {\n const context = this.browser.createCanvasContext();\n if (!context) return null;\n const style = this.browser.computedStyle(this.opts.wrapperElement());\n if (style) context.font = `${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n return context;\n }\n}\n","import { Signal, computed } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef } from '../agrid.types';\n\n/** Reactive column state consumed by {@link AgridColumnStateService}. @internal */\nexport interface AgridColumnStateOptions {\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n pinnedColDefs: Signal<ColDef[]>;\n rightPinnedColDefs: Signal<ColDef[]>;\n showControlColumn: Signal<boolean>;\n}\n\n/** Provides template-facing column lookup, pinning, visibility, and ARIA state. @internal */\nexport class AgridColumnStateService {\n constructor(private readonly opts: AgridColumnStateOptions) {}\n\n private readonly columnsByField = computed(() =>\n new Map(this.opts.colDefs().map(col => [col.field, col])),\n );\n\n private readonly visibleIndexByField = computed(() =>\n new Map(this.opts.visibleColDefs().map((col, index) => [col.field, index])),\n );\n\n /** Finds a column definition by field name. */\n getColDef(field: string): ColDef | undefined {\n return this.columnsByField().get(field);\n }\n\n /** Returns a field's zero-based index among visible columns. */\n getVisibleColIndex(field: string): number {\n return this.visibleIndexByField().get(field) ?? -1;\n }\n\n /** Converts a visible data-column index to a one-based ARIA index. */\n getAriaColIndex(colIndex: number): number {\n return colIndex + 1 + (this.opts.showControlColumn() ? 1 : 0);\n }\n\n /** Returns whether a field is hidden by the grid control. */\n isColumnHidden(field: string): boolean {\n return this.opts.control()?.isColumnHidden(field) ?? false;\n }\n\n /** Returns whether the grid is grouped by the field. */\n isGroupedByField(field: string): boolean {\n return this.opts.control()?.groupByField() === field;\n }\n\n /** Returns whether a field is pinned to the left. */\n isColumnPinned(field: string): boolean {\n return this.opts.pinnedColDefs().some(col => col.field === field);\n }\n\n /** Returns whether a field is pinned to the right. */\n isColumnPinnedRight(field: string): boolean {\n return this.opts.rightPinnedColDefs().some(col => col.field === field);\n }\n\n /** Returns the field's current pin side, or `false` when unpinned. */\n getColumnPinState(field: string): 'left' | 'right' | false {\n if (this.isColumnPinned(field)) return 'left';\n if (this.isColumnPinnedRight(field)) return 'right';\n return false;\n }\n\n /** Returns whether the field is the first right-pinned column. */\n isFirstRightPinnedColumn(field: string): boolean {\n const cols = this.opts.rightPinnedColDefs();\n return cols.length > 0 && cols[0].field === field;\n }\n\n /** Returns whether the field is the last left-pinned column. */\n isLastPinnedColumn(field: string): boolean {\n const cols = this.opts.pinnedColDefs();\n return cols.length > 0 && cols[cols.length - 1].field === field;\n }\n}\n","import { DestroyRef, Signal, WritableSignal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { ColDef, GridItem, RowReorderEvent } from '../agrid.types';\nimport { buildSelectionRange, getDisplayForField } from '../agrid.utils';\n\n/** Dependencies and callbacks required by {@link AgridDragHandler}. @internal */\nexport interface AgridDragHandlerOptions {\n dataSource: Signal<AgridDataSource>;\n filteredItems: () => GridItem[];\n locale: () => string | undefined;\n selectedIndices: WritableSignal<Set<number>>;\n onReorder: (event: RowReorderEvent) => void;\n onSelectionChange: () => void;\n}\n\n/**\n * Handles both row-reorder drag and drag-select. The two share `_getHoveredRow`\n * and the same pointer-event lifecycle pattern, so they live together.\n *\n * Signals exposed here are read by the component's `displayItems` computed\n * to render the ghost row during a reorder drag.\n *\n * @internal\n */\nexport class AgridDragHandler {\n readonly reorderOriginalIndex = signal<number | null>(null);\n readonly reorderOverIndex = signal<number | null>(null);\n readonly reorderInsertBefore = signal<boolean>(true);\n\n private _overlayEl: HTMLElement | null = null;\n private _offsetX = 0;\n private _offsetY = 0;\n private _dragSelAnchor: number | null = null;\n\n constructor(\n private readonly opts: AgridDragHandlerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this._cleanupReorder());\n destroyRef.onDestroy(() => this._cancelDragSelect());\n }\n\n /** Starts a row reorder gesture and creates its floating preview. */\n startReorder(event: PointerEvent, originalIndex: number): void {\n event.preventDefault();\n event.stopPropagation();\n const rowEl = (event.currentTarget as HTMLElement).closest<HTMLElement>('.ag-row');\n if (!rowEl) return;\n const rect = rowEl.getBoundingClientRect();\n this.reorderOriginalIndex.set(originalIndex);\n this._offsetX = event.clientX - rect.left;\n this._offsetY = event.clientY - rect.top;\n\n const overlay = rowEl.cloneNode(true) as HTMLElement;\n overlay.removeAttribute('data-original-index');\n Object.assign(overlay.style, {\n position: 'fixed', top: `${rect.top}px`, left: `${rect.left}px`,\n width: `${rect.width}px`, height: `${rect.height}px`,\n pointerEvents: 'none', zIndex: '9999', background: '#fff',\n border: '1px solid #1a73e8', borderRadius: '4px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.15)', overflow: 'hidden',\n opacity: '0.95', cursor: 'grabbing',\n });\n if (!this.browser.appendToBody(overlay)) {\n this._clearReorder();\n return;\n }\n this._overlayEl = overlay;\n this.browser.addDocumentListener('pointermove', this._reorderMove);\n this.browser.addDocumentListener('pointerup', this._reorderUp);\n this.browser.addDocumentListener('pointercancel', this._reorderCancel);\n }\n\n /** Returns the formatted value shown in a reorder ghost cell. */\n getGhostDisplay(col: ColDef): string {\n const idx = this.reorderOriginalIndex();\n if (idx === null) return '';\n return getDisplayForField(col, this.opts.dataSource().rows()[idx]?.[col.field], this.opts.locale());\n }\n\n private readonly _reorderMove = (e: PointerEvent): void => {\n if (this._overlayEl) {\n this._overlayEl.style.top = `${e.clientY - this._offsetY}px`;\n this._overlayEl.style.left = `${e.clientX - this._offsetX}px`;\n }\n const hovered = this._getHoveredRow(e.clientX, e.clientY);\n if (hovered) {\n if (this.reorderOverIndex() !== hovered.originalIndex) this.reorderOverIndex.set(hovered.originalIndex);\n if (this.reorderInsertBefore() !== hovered.insertBefore) this.reorderInsertBefore.set(hovered.insertBefore);\n } else {\n this.reorderOverIndex.set(null);\n }\n };\n\n private readonly _reorderUp = (_e: PointerEvent): void => {\n this._removeReorderListeners();\n const overlay = this._overlayEl;\n this._overlayEl = null;\n if (overlay) {\n overlay.style.transition = 'opacity 80ms ease';\n overlay.style.opacity = '0';\n this.browser.schedule(() => overlay.remove(), 90);\n }\n const oldIndex = this.reorderOriginalIndex();\n const overIdx = this.reorderOverIndex();\n if (oldIndex !== null && overIdx !== null) {\n const newIndex = this.reorderInsertBefore() ? overIdx : overIdx + 1;\n const shouldEmit = oldIndex !== newIndex;\n this._clearReorder();\n if (shouldEmit) {\n this.opts.onReorder({ row: { ...this.opts.dataSource().rows()[oldIndex] }, oldIndex, newIndex });\n }\n } else {\n this._clearReorder();\n }\n };\n\n private readonly _reorderCancel = (): void => this._cleanupReorder();\n\n private _cleanupReorder(): void {\n this._removeReorderListeners();\n this._overlayEl?.remove();\n this._overlayEl = null;\n this._clearReorder();\n }\n\n private _removeReorderListeners(): void {\n this.browser.removeDocumentListener('pointermove', this._reorderMove);\n this.browser.removeDocumentListener('pointerup', this._reorderUp);\n this.browser.removeDocumentListener('pointercancel', this._reorderCancel);\n }\n\n private _clearReorder(): void {\n this.reorderOriginalIndex.set(null);\n this.reorderOverIndex.set(null);\n this.reorderInsertBefore.set(true);\n }\n\n /** Starts pointer-driven multi-row selection from an anchor row. */\n startDragSelect(originalIndex: number): void {\n this._dragSelAnchor = originalIndex;\n this.browser.addDocumentListener('pointermove', this._dragSelMove);\n this.browser.addDocumentListener('pointerup', this._dragSelUp);\n this.browser.addDocumentListener('pointercancel', this._dragSelCancel);\n }\n\n private readonly _dragSelMove = (e: PointerEvent): void => {\n const anchor = this._dragSelAnchor;\n if (anchor === null) return;\n const hovered = this._getHoveredRow(e.clientX, e.clientY);\n if (!hovered) return;\n this.opts.selectedIndices.set(\n buildSelectionRange(anchor, hovered.originalIndex, this.opts.filteredItems())\n );\n };\n\n private readonly _dragSelUp = (): void => {\n this._removeDragSelectListeners();\n this._dragSelAnchor = null;\n this.opts.onSelectionChange();\n };\n\n private readonly _dragSelCancel = (): void => this._cancelDragSelect();\n\n private _cancelDragSelect(): void {\n this._removeDragSelectListeners();\n this._dragSelAnchor = null;\n }\n\n private _removeDragSelectListeners(): void {\n this.browser.removeDocumentListener('pointermove', this._dragSelMove);\n this.browser.removeDocumentListener('pointerup', this._dragSelUp);\n this.browser.removeDocumentListener('pointercancel', this._dragSelCancel);\n }\n\n private _getHoveredRow(x: number, y: number): { originalIndex: number; insertBefore: boolean } | null {\n for (const el of this.browser.elementsFromPoint(x, y)) {\n const rowEl = (el as HTMLElement).closest<HTMLElement>('.ag-row[data-original-index]');\n if (!rowEl) continue;\n const rect = rowEl.getBoundingClientRect();\n return {\n originalIndex: Number(rowEl.dataset['originalIndex']),\n insertBefore: y < rect.top + rect.height / 2,\n };\n }\n return null;\n }\n}\n","import { Signal, WritableSignal, signal } from '@angular/core';\nimport { CellRange } from '../selection/agrid-clipboard.handler';\nimport { AgridControl, HistoryEntry, HistoryItem } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridEditEvent } from '../agrid.types';\n\n/** Dependencies and callbacks required by {@link AgridEditController}. @internal */\nexport interface AgridEditControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n visibleColDefs: Signal<ColDef[]>;\n readonlyGrid: Signal<boolean>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n findDisplayIndex: (originalIndex: number) => number;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n focusGrid: () => void;\n onCellEdit: (event: GridEditEvent) => void;\n /** Called when a `ColDef.validate` hook rejects a committed value. */\n onValidationFailed: (event: { rowIndex: number; field: string; value: unknown; message: string }) => void;\n}\n\n/** Active cell validation error: the rejecting cell position, field, and message. @internal */\nexport interface CellValidationError {\n rowIndex: number;\n colIndex: number;\n field: string;\n message: string;\n}\n\n/**\n * Owns cell edit state, commit/cancel transitions, and undo/redo application.\n * @internal\n */\nexport class AgridEditController {\n readonly editingCell = signal<CellPosition | null>(null);\n readonly currentDraft = signal<unknown>(null);\n readonly editSeedChar = signal<string>('');\n /** Whether a newly focused text editor should select all text. */\n readonly selectTextOnEdit = signal<boolean>(true);\n /** The active cell validation error, or `null` when the last commit was accepted. */\n readonly validationError = signal<CellValidationError | null>(null);\n\n constructor(private readonly opts: AgridEditControllerOptions) {}\n\n /** Returns whether a cell can be edited in the current grid state. */\n isCellEditable(col: ColDef | undefined, originalIndex?: number): boolean {\n if (!col || this.opts.readonlyGrid() || col.editable === false) return false;\n if (originalIndex === undefined || !col.cellReadonly) return true;\n const row = this.opts.dataSource().getRow(originalIndex);\n if (!row) return false;\n return !col.cellReadonly({\n row,\n value: row[col.field],\n column: col,\n originalIndex,\n });\n }\n\n /** Replaces the value currently staged by the active editor. */\n setDraft(value: unknown): void {\n this.currentDraft.set(value);\n }\n\n /** Starts editing a cell, optionally seeded by a typed character. */\n start(originalIndex: number, colIndex: number, seedChar: string, selectText = true): void {\n const col = this.opts.visibleColDefs()[colIndex];\n if (!this.isCellEditable(col, originalIndex)) return;\n this.validationError.set(null);\n const currentValue = this.opts.dataSource().getRow(originalIndex)[col.field];\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: originalIndex, colIndex });\n let initialDraft: unknown;\n if (seedChar !== '') {\n initialDraft = seedChar;\n } else if (col.type === 'date' && (currentValue == null || currentValue === '')) {\n initialDraft = new Date().toISOString().slice(0, 10);\n } else {\n initialDraft = currentValue;\n }\n this.currentDraft.set(initialDraft);\n this.editSeedChar.set(seedChar);\n this.selectTextOnEdit.set(selectText);\n this.editingCell.set({ rowIndex: originalIndex, colIndex });\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n if (displayIndex >= 0) this.opts.scrollToCell(displayIndex, colIndex);\n }\n\n /**\n * Commits the staged value and records the edit in history.\n * Returns `false` (keeping the cell in edit mode) when a `ColDef.validate` hook rejects the\n * value; `true` when the edit is committed or there was no change.\n */\n commit(): boolean {\n const position = this.editingCell();\n if (!position) return true;\n const col = this.opts.visibleColDefs()[position.colIndex];\n if (!col) {\n this.cancel();\n return true;\n }\n\n const row = this.opts.dataSource().getRow(position.rowIndex);\n if (!this.isCellEditable(col, position.rowIndex)) {\n this.cancel();\n return true;\n }\n const oldValue = row[col.field];\n const newValue = this.currentDraft();\n if (oldValue !== newValue) {\n const message = col.validate?.(newValue as never, row as never) ?? null;\n if (message) {\n this.validationError.set({ ...position, field: col.field, message });\n this.opts.onValidationFailed({ rowIndex: position.rowIndex, field: col.field, value: newValue, message });\n return false;\n }\n this.opts.dataSource().patchRow(position.rowIndex, { [col.field]: newValue });\n this.opts.control()?.pushEdit({\n rowIndex: position.rowIndex,\n field: col.field,\n oldValue,\n newValue,\n });\n this.opts.onCellEdit({ position, field: col.field, oldValue, newValue });\n }\n this.validationError.set(null);\n this.clearEditState();\n this.opts.focusGrid();\n return true;\n }\n\n /**\n * Commit a value directly to a cell without entering edit mode (e.g. a boolean checkbox\n * toggle). Records the change in history and emits the edit just like {@link commit}.\n */\n setCellValue(rowIndex: number, colIndex: number, newValue: unknown): boolean {\n const col = this.opts.visibleColDefs()[colIndex];\n if (!this.isCellEditable(col, rowIndex)) return false;\n const row = this.opts.dataSource().getRow(rowIndex);\n const oldValue = row[col.field];\n if (oldValue === newValue) return true;\n const message = col.validate?.(newValue as never, row as never) ?? null;\n if (message) {\n this.validationError.set({ rowIndex, colIndex, field: col.field, message });\n this.opts.onValidationFailed({ rowIndex, field: col.field, value: newValue, message });\n return false;\n }\n this.opts.dataSource().patchRow(rowIndex, { [col.field]: newValue });\n this.opts.control()?.pushEdit({ rowIndex, field: col.field, oldValue, newValue });\n this.opts.onCellEdit({\n position: { rowIndex, colIndex },\n field: col.field,\n oldValue,\n newValue,\n });\n this.validationError.set(null);\n return true;\n }\n\n /** Discards the active edit without changing row data. */\n cancel(): void {\n this.validationError.set(null);\n this.clearEditState();\n }\n\n /** Applies the previous edit-history value to the data source. */\n undo(): void {\n const item = this.opts.control()?.undo();\n if (item) this.applyHistoryItem(item, 'oldValue');\n }\n\n /** Reapplies the next edit-history value to the data source. */\n redo(): void {\n const item = this.opts.control()?.redo();\n if (item) this.applyHistoryItem(item, 'newValue');\n }\n\n /** Reconciles active edit coordinates after a row is removed. */\n onRowRemoved(originalIndex: number): void {\n const editing = this.editingCell();\n if (editing?.rowIndex === originalIndex) {\n this.clearEditState();\n } else if (editing && editing.rowIndex > originalIndex) {\n this.editingCell.set({ ...editing, rowIndex: editing.rowIndex - 1 });\n }\n }\n\n private applyHistoryItem(item: HistoryItem, valueKey: 'oldValue' | 'newValue'): void {\n const entries = Array.isArray(item) ? item : [item];\n const ordered = valueKey === 'oldValue' ? [...entries].reverse() : entries;\n for (const entry of ordered) this.applyHistoryEntry(entry, entry[valueKey]);\n }\n\n private applyHistoryEntry(entry: HistoryEntry, value: unknown): void {\n const oldValue = this.opts.dataSource().getRow(entry.rowIndex)[entry.field];\n this.opts.dataSource().patchRow(entry.rowIndex, { [entry.field]: value });\n const colIndex = this.opts.visibleColDefs().findIndex(col => col.field === entry.field);\n this.opts.onCellEdit({\n position: { rowIndex: entry.rowIndex, colIndex },\n field: entry.field,\n oldValue,\n newValue: value,\n });\n }\n\n private clearEditState(): void {\n this.editingCell.set(null);\n this.editSeedChar.set('');\n this.selectTextOnEdit.set(true);\n }\n}\n","import { Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef } from '../agrid.types';\nimport { getDisplayForField } from '../agrid.utils';\n\n/** Location of a formatted-value match in source coordinates. @internal */\nexport type AgridFindMatch = {\n rowIndex: number;\n colIndex: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridFindController}. @internal */\nexport interface AgridFindControllerOptions {\n dataSource: Signal<AgridDataSource>;\n filteredSortedIndices: Signal<number[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n revealMatch: (originalIndex: number, colIndex: number) => void;\n focusGrid: () => void;\n}\n\n/** Owns in-grid find state, formatted-value matching, and match navigation. @internal */\nexport class AgridFindController {\n readonly open = signal(false);\n readonly query = signal('');\n readonly activeIndex = signal(-1);\n\n readonly matches = computed<AgridFindMatch[]>(() => {\n const query = this.query().trim().toLowerCase();\n if (!query) return [];\n const cols = this.opts.visibleColDefs();\n const rows = this.opts.dataSource().rows();\n const matches: AgridFindMatch[] = [];\n this.opts.filteredSortedIndices().forEach(rowIndex => {\n const row = rows[rowIndex];\n if (!row) return;\n for (let colIndex = 0; colIndex < cols.length; colIndex++) {\n const col = cols[colIndex];\n const value = getDisplayForField(col, row[col.field], this.opts.locale()).toLowerCase();\n if (value.includes(query)) {\n matches.push({ rowIndex, colIndex });\n }\n }\n });\n return matches;\n });\n\n constructor(private readonly opts: AgridFindControllerOptions) {}\n\n /** Opens the find panel. */\n show(): void {\n this.opts.selectedCell.set(null);\n this.opts.selectedRange.set(null);\n this.activeIndex.set(-1);\n this.open.set(true);\n }\n\n /** Closes the find panel and returns focus to the grid. */\n close(): void {\n this.open.set(false);\n this.opts.focusGrid();\n }\n\n /** Replaces the search query without moving focus away from the find input. */\n setQuery(value: string): void {\n this.query.set(value);\n this.activeIndex.set(-1);\n }\n\n /** Selects the next or previous match, wrapping at either end. */\n goToMatch(direction: 1 | -1): void {\n const matches = this.matches();\n if (matches.length === 0) {\n this.activeIndex.set(-1);\n return;\n }\n const current = this.activeIndex();\n const next = current < 0\n ? (direction === 1 ? 0 : matches.length - 1)\n : (current + direction + matches.length) % matches.length;\n this.activeIndex.set(next);\n const match = matches[next];\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: match.rowIndex, colIndex: match.colIndex });\n this.opts.revealMatch(match.rowIndex, match.colIndex);\n }\n\n /** Returns whether a cell matches the current query. */\n isMatchCell(originalIndex: number, colIndex: number): boolean {\n return this.matches().some(\n match => match.rowIndex === originalIndex && match.colIndex === colIndex,\n );\n }\n\n /** Returns whether a cell is the currently active match. */\n isActiveMatchCell(originalIndex: number, colIndex: number): boolean {\n const match = this.matches()[this.activeIndex()];\n return !!match && match.rowIndex === originalIndex && match.colIndex === colIndex;\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\n\n/** Floating find panel used by `AgridComponent` for in-grid search navigation. */\n@Component({\n selector: 'agrid-find-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-find-panel.component.html',\n styleUrl: './agrid-find-panel.component.css',\n})\nexport class AgridFindPanelComponent implements AfterViewInit {\n /** Localized labels used in the find panel. */\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n\n /** Current find query shown in the input. */\n query = input<string>('');\n\n /** Number of cells matching the current query. */\n matchCount = input<number>(0);\n\n /** Zero-based active match index, or `-1` when no match is active. */\n activeIndex = input<number>(-1);\n\n /** Emits whenever the user changes the find query. */\n queryChange = output<string>();\n\n /** Requests navigation to the next match. */\n next = output<void>();\n\n /** Requests navigation to the previous match. */\n previous = output<void>();\n\n /** Requests closing the find panel. */\n close = output<void>();\n\n private readonly findInput = viewChild.required<ElementRef<HTMLInputElement>>('findInput');\n\n /** Focuses and selects the find input after Angular has rendered the panel. */\n ngAfterViewInit(): void {\n setTimeout(() => {\n const input = this.findInput().nativeElement;\n input.focus();\n input.select();\n });\n }\n\n /** Returns the compact `active / total` label displayed next to the input. */\n countLabel(): string {\n const count = this.matchCount();\n return count === 0 ? '0 / 0' : `${this.activeIndex() + 1} / ${count}`;\n }\n\n /** Handles Enter, Shift+Enter, and Escape while preventing grid-level key handling. */\n onKeyDown(event: KeyboardEvent): void {\n event.stopPropagation();\n if (event.key === 'Enter') {\n event.preventDefault();\n event.shiftKey ? this.previous.emit() : this.next.emit();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this.close.emit();\n }\n }\n}\n","<div class=\"ag-find-panel\" role=\"search\" (click)=\"$event.stopPropagation()\">\n <input\n #findInput\n class=\"ag-find-input\"\n [value]=\"query()\"\n (input)=\"queryChange.emit($any($event.target).value)\"\n (keydown)=\"onKeyDown($event)\"\n [placeholder]=\"localeText().findPlaceholder\"\n [attr.aria-label]=\"localeText().findPlaceholder\"\n />\n <span class=\"ag-find-count\" aria-live=\"polite\">{{ countLabel() }}</span>\n <button class=\"ag-find-btn\" [title]=\"localeText().previous\" [attr.aria-label]=\"localeText().previous\"\n (click)=\"previous.emit()\">↑</button>\n <button class=\"ag-find-btn\" [title]=\"localeText().next\" [attr.aria-label]=\"localeText().next\"\n (click)=\"next.emit()\">↓</button>\n <button class=\"ag-find-btn\" [title]=\"localeText().close\" [attr.aria-label]=\"localeText().close\"\n (click)=\"close.emit()\">✕</button>\n</div>\n","import { Signal, signal } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { GridItem, GroupAction } from '../agrid.types';\nimport { isGroupHeaderItem } from '../agrid.utils';\n\n/** Expanded group labels associated with the active grouping field. @internal */\nexport type AgridExpandedGroups = {\n field: string | null;\n labels: Set<string>;\n};\n\n/** Dependencies required by {@link AgridGroupController}. @internal */\nexport interface AgridGroupControllerOptions {\n control: Signal<AgridControl | null>;\n groupDescription: Signal<((label: string) => string) | null>;\n}\n\n/** Owns group expansion state and the group-action context menu. @internal */\nexport class AgridGroupController {\n readonly expandedGroups = signal<AgridExpandedGroups>({\n field: null,\n labels: new Set(),\n });\n readonly actionsMenu = signal<{ x: number; y: number; label: string } | null>(null);\n\n constructor(private readonly opts: AgridGroupControllerOptions) {}\n\n /** Toggles one group label within the active grouping field. */\n toggle(label: string): void {\n const groupField = this.opts.control()?.groupByField() ?? null;\n this.expandedGroups.update(state => {\n const labels = state.field === groupField ? new Set(state.labels) : new Set<string>();\n if (labels.has(label)) labels.delete(label);\n else labels.add(label);\n return { field: groupField, labels };\n });\n }\n\n /** Expands every group header present in the supplied projection. */\n expandAll(items: GridItem[]): void {\n const groupField = this.opts.control()?.groupByField() ?? null;\n if (!groupField) return;\n const labels = new Set<string>();\n for (const item of items) {\n if (isGroupHeaderItem(item)) labels.add(item.groupLabel);\n }\n this.expandedGroups.set({ field: groupField, labels });\n }\n\n /** Collapses all groups for the active grouping field. */\n collapseAll(): void {\n const groupField = this.opts.control()?.groupByField() ?? null;\n this.expandedGroups.set({ field: groupField, labels: new Set() });\n }\n\n /** Returns the configured description for a group label. */\n getDescription(label: string): string {\n return this.opts.groupDescription()?.(label) ?? '';\n }\n\n /** Opens the action menu for a group label. */\n openActionsMenu(event: MouseEvent, label: string): void {\n event.stopPropagation();\n this.actionsMenu.set({ x: event.clientX, y: event.clientY, label });\n }\n\n /** Closes the group action menu. */\n closeActionsMenu(): void {\n this.actionsMenu.set(null);\n }\n\n /** Runs a group action and closes its menu. */\n runAction(action: GroupAction, label: string): void {\n action.action(label);\n this.closeActionsMenu();\n }\n}\n","import { signal } from '@angular/core';\n\n/**\n * Owns the expand/collapse state of a hierarchical (tree) grid.\n *\n * Expansion is keyed by **node id** (from {@link AgridTreeConfig.getId}), independent of any\n * column or grouping field, so it works at arbitrary depth. Ids that no longer exist in the\n * data simply never match and are harmless, so the state does not need to be reset when the\n * underlying rows change.\n *\n * Mirrors {@link AgridGroupController} in spirit but is intentionally option-free — the grid\n * component supplies node ids to {@link expandAll} from the current data source.\n * @internal\n */\nexport class AgridTreeController {\n /** Ids of the nodes that are currently expanded (their children are visible). */\n readonly expandedIds = signal<Set<string | number>>(new Set());\n\n /** Returns `true` when the node with `id` is currently expanded. */\n isExpanded(id: string | number): boolean {\n return this.expandedIds().has(id);\n }\n\n /** Toggle the expanded state of a single node. */\n toggle(id: string | number): void {\n this.expandedIds.update(ids => {\n const next = new Set(ids);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }\n\n /** Explicitly expand or collapse a single node. */\n setExpanded(id: string | number, expanded: boolean): void {\n this.expandedIds.update(ids => {\n if (expanded === ids.has(id)) return ids;\n const next = new Set(ids);\n if (expanded) next.add(id);\n else next.delete(id);\n return next;\n });\n }\n\n /** Expand every node in `ids` (typically all expandable nodes in the data source). */\n expandAll(ids: Iterable<string | number>): void {\n this.expandedIds.set(new Set(ids));\n }\n\n /** Collapse every node. */\n collapseAll(): void {\n this.expandedIds.set(new Set());\n }\n}\n","import { Signal, WritableSignal } from '@angular/core';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { AgridControl } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { AgridEnterEditAction, CellPosition, ColDef, GridItem, NewRecord } from '../agrid.types';\nimport { isDataRowItem, isGroupHeaderItem } from '../agrid.utils';\n\n/** Minimal vertical viewport API used by grid navigation. @internal */\nexport interface AgridVerticalViewport {\n /** Returns the current vertical scroll offset in pixels. */\n measureScrollOffset(): number;\n /** Returns the visible viewport height in pixels. */\n getViewportSize(): number;\n /** Scrolls the viewport to an absolute vertical offset. */\n scrollToOffset(offset: number): void;\n}\n\n/** Dependencies and callbacks required by {@link AgridNavigationController}. @internal */\nexport interface AgridNavigationControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n filteredSortedIndices: Signal<number[]>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n rowHeight: Signal<number>;\n allowAddRows: Signal<boolean>;\n autoAddRows: Signal<boolean>;\n enterEditAction: Signal<AgridEnterEditAction>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n editingCell: Signal<CellPosition | null>;\n isEditing: (originalIndex: number, colIndex: number) => boolean;\n isCellEditable: (col: ColDef | undefined, originalIndex: number) => boolean;\n toggleTreeCell: (originalIndex: number, colIndex: number) => boolean;\n startEdit: (originalIndex: number, colIndex: number, seedChar: string, selectText?: boolean) => void;\n commitEdit: () => boolean;\n cancelEdit: () => void;\n undoEdit: () => void;\n redoEdit: () => void;\n extendRangeTo: (originalIndex: number, colIndex: number) => void;\n openFind: () => void;\n focusGrid: () => void;\n viewport: () => AgridVerticalViewport;\n scrollColumnToKeepVisible: (colIndex: number) => void;\n onPrepareAddRecord: (event: Pick<NewRecord, 'index' | 'data'>) => void;\n}\n\n/**\n * Owns grid keyboard navigation, cell activation, add-row creation, and visibility scrolling.\n * @internal\n */\nexport class AgridNavigationController {\n constructor(private readonly opts: AgridNavigationControllerOptions) {}\n\n /** Activates a cell, optionally extending the current range selection. */\n activateCell(originalIndex: number, colIndex: number, event?: MouseEvent): void {\n if (this.opts.isEditing(originalIndex, colIndex)) return;\n this.opts.cancelEdit();\n if (event?.shiftKey && this.opts.selectedCell()) {\n this.opts.extendRangeTo(originalIndex, colIndex);\n this.opts.focusGrid();\n return;\n }\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: originalIndex, colIndex });\n const col = this.opts.visibleColDefs()[colIndex];\n if (col.values?.length) this.opts.startEdit(originalIndex, colIndex, '');\n else this.opts.focusGrid();\n }\n\n /** Creates and selects a row from the add-row placeholder. */\n activateAddRow(): void {\n this.opts.cancelEdit();\n this.addRowAndSelect();\n }\n\n /** Clears cell and range navigation when focus moves to a grid control. */\n deactivateCell(): void {\n this.opts.cancelEdit();\n this.opts.selectedCell.set(null);\n this.opts.selectedRange.set(null);\n }\n\n /** Inserts an initialized blank row and emits the preparation callback. */\n insertRowAt(atIndex: number): void {\n const emptyRow = this.buildEmptyRow();\n const insertedIndex = this.opts.dataSource().addRow(emptyRow, atIndex);\n this.opts.onPrepareAddRecord({ index: insertedIndex, data: emptyRow });\n }\n\n /** Handles grid-level navigation, editing, history, find, and add-row shortcuts. */\n handleKeyDown(event: KeyboardEvent): void {\n if ((event.target as Element)?.closest(\n '.ag-sidebar, .ag-filter-input, .ag-filter-menu, .ag-menu-bar',\n )) return;\n\n if ((event.ctrlKey || event.metaKey) && !event.altKey && event.key.toLowerCase() === 'f') {\n event.preventDefault();\n this.opts.openFind();\n return;\n }\n\n if ((event.ctrlKey || event.metaKey) && !event.altKey) {\n if (event.key === 'z') {\n event.preventDefault();\n event.shiftKey ? this.opts.redoEdit() : this.opts.undoEdit();\n return;\n }\n if (event.key === 'y') {\n event.preventDefault();\n this.opts.redoEdit();\n return;\n }\n }\n\n const sel = this.opts.selectedCell();\n if (\n event.key === 'Enter'\n && (event.ctrlKey || event.metaKey)\n && !event.altKey\n && !event.shiftKey\n && sel\n && this.opts.toggleTreeCell(sel.rowIndex, sel.colIndex)\n ) {\n event.preventDefault();\n return;\n }\n\n if (this.opts.editingCell()) {\n switch (event.key) {\n case 'Tab':\n event.preventDefault();\n if (this.opts.commitEdit()) this.moveSelection(0, event.shiftKey ? -1 : 1);\n break;\n case 'Enter':\n event.preventDefault();\n if (this.opts.commitEdit()) this.applyEnterEditAction(event.shiftKey);\n break;\n case 'Escape':\n event.preventDefault();\n this.opts.cancelEdit();\n this.opts.focusGrid();\n break;\n }\n return;\n }\n\n const isOnAddRow = this.opts.allowAddRows()\n && !this.opts.autoAddRows()\n && sel?.rowIndex === this.opts.dataSource().length;\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault();\n this.moveSelection(-1, 0, event.shiftKey);\n break;\n case 'ArrowDown':\n event.preventDefault();\n this.moveSelection(1, 0, event.shiftKey);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.moveSelection(0, -1, event.shiftKey);\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.moveSelection(0, 1, event.shiftKey);\n break;\n case 'Tab':\n event.preventDefault();\n this.moveSelection(0, event.shiftKey ? -1 : 1);\n break;\n case 'Enter':\n event.preventDefault();\n if (sel) {\n if (isOnAddRow) this.addRowAndSelect();\n else this.opts.startEdit(sel.rowIndex, sel.colIndex, '');\n }\n break;\n case 'F2':\n event.preventDefault();\n if (sel) {\n if (isOnAddRow) this.addRowAndSelect();\n else this.opts.startEdit(sel.rowIndex, sel.colIndex, '');\n }\n break;\n default:\n if (sel && event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n if (isOnAddRow) this.addRowAndSelect();\n else this.opts.startEdit(sel.rowIndex, sel.colIndex, event.key);\n }\n }\n }\n\n private applyEnterEditAction(reverse: boolean): void {\n switch (this.opts.enterEditAction()) {\n case 'nextColumn':\n this.moveToNextEditableColumn(reverse ? -1 : 1);\n break;\n case 'nextRow':\n this.moveSelection(reverse ? -1 : 1, 0);\n break;\n case 'nothing':\n this.opts.focusGrid();\n break;\n }\n }\n\n private moveToNextEditableColumn(direction: 1 | -1): void {\n const items = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const selected = this.opts.selectedCell();\n if (!selected || items.length === 0 || cols.length === 0) {\n this.opts.focusGrid();\n return;\n }\n\n const currentDisplayIndex = this.selectedDisplayIndex();\n if (currentDisplayIndex < 0) {\n this.opts.focusGrid();\n return;\n }\n\n let displayIndex = currentDisplayIndex;\n let colIndex = selected.colIndex + direction;\n\n while (displayIndex >= 0 && displayIndex < items.length) {\n while (colIndex >= 0 && colIndex < cols.length) {\n const item = items[displayIndex];\n const col = cols[colIndex];\n if (isDataRowItem(item) && this.opts.isCellEditable(col, item.originalIndex)) {\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: item.originalIndex, colIndex });\n this.scrollToKeepVisible(displayIndex, colIndex);\n if (this.isTextColumn(col)) this.opts.startEdit(item.originalIndex, colIndex, '', false);\n else this.opts.focusGrid();\n return;\n }\n colIndex += direction;\n }\n displayIndex += direction;\n colIndex = direction > 0 ? 0 : cols.length - 1;\n while (\n displayIndex >= 0\n && displayIndex < items.length\n && isGroupHeaderItem(items[displayIndex])\n ) {\n displayIndex += direction;\n }\n }\n\n this.opts.focusGrid();\n }\n\n private isTextColumn(col: ColDef): boolean {\n return !col.values?.length && (col.type === undefined || col.type === 'text');\n }\n\n /** Finds a data row's current index in the projected display items. */\n findDisplayIndex(originalIndex: number): number {\n return this.opts.filteredItems().findIndex(\n item => isDataRowItem(item) && item.originalIndex === originalIndex,\n );\n }\n\n /** Navigates client pagination as needed and reveals a data-source row. */\n revealRow(originalIndex: number): void {\n const filteredIndex = this.opts.filteredSortedIndices().indexOf(originalIndex);\n if (filteredIndex < 0) return;\n\n const ctrl = this.opts.control();\n const pageSize = ctrl?.pageSize() ?? 0;\n if (ctrl && pageSize > 0 && ctrl.totalRows() === 0 && !ctrl.groupByField()) {\n ctrl.setPage(Math.floor(filteredIndex / pageSize) + 1);\n }\n\n setTimeout(() => {\n const displayIndex = this.findDisplayIndex(originalIndex);\n if (displayIndex >= 0) this.scrollToKeepVisible(displayIndex, 0);\n });\n }\n\n /** Scrolls a display row and optional column into the visible viewport. */\n scrollToKeepVisible(displayIndex: number, colIndex: number | null = null): void {\n const viewport = this.opts.viewport();\n const itemSize = this.opts.rowHeight();\n const scrollOffset = viewport.measureScrollOffset();\n const viewportSize = viewport.getViewportSize();\n if (displayIndex * itemSize < scrollOffset) {\n viewport.scrollToOffset(displayIndex * itemSize);\n } else if ((displayIndex + 1) * itemSize > scrollOffset + viewportSize) {\n viewport.scrollToOffset((displayIndex + 1) * itemSize - viewportSize);\n }\n\n if (colIndex !== null) this.opts.scrollColumnToKeepVisible(colIndex);\n }\n\n private moveSelection(dRow: number, dCol: number, extendRange = false): void {\n const items = this.opts.filteredItems();\n if (items.length === 0) {\n if (\n this.opts.allowAddRows()\n && this.opts.autoAddRows()\n && this.opts.dataSource().length === 0\n ) {\n this.addRowAndSelect();\n }\n return;\n }\n const cols = this.opts.visibleColDefs().length;\n let di = this.selectedDisplayIndex();\n let ci = this.opts.selectedCell()?.colIndex ?? 0;\n if (di === -1) {\n di = 0;\n ci = 0;\n }\n let newDi = di + dRow;\n let newCi = ci + dCol;\n const onAddRow = items[newDi] === null;\n if (!onAddRow) {\n if (newCi < 0) {\n newDi--;\n newCi = cols - 1;\n }\n if (newCi >= cols) {\n newDi++;\n newCi = 0;\n }\n }\n\n const skipDir = dRow < 0 ? -1 : 1;\n let skipDi = newDi;\n while (skipDi >= 0 && skipDi < items.length && isGroupHeaderItem(items[skipDi])) skipDi += skipDir;\n if (skipDi >= 0 && skipDi < items.length) newDi = skipDi;\n\n if (this.opts.autoAddRows() && newDi >= items.length) {\n const emptyRow = this.buildEmptyRow();\n const insertedIndex = this.opts.dataSource().addRow(emptyRow);\n const colIndex = Math.min(newCi, cols - 1);\n const newDisplayIdx = this.findDisplayIndex(insertedIndex);\n this.opts.selectedCell.set({ rowIndex: insertedIndex, colIndex });\n if (newDisplayIdx >= 0) this.scrollToKeepVisible(newDisplayIdx, colIndex);\n this.opts.focusGrid();\n this.opts.onPrepareAddRecord({ index: insertedIndex, data: emptyRow });\n return;\n }\n\n newDi = Math.max(0, Math.min(items.length - 1, newDi));\n newCi = Math.max(0, Math.min(cols - 1, newCi));\n const newItem = items[newDi];\n if (newItem === null) {\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: this.opts.dataSource().length, colIndex: 0 });\n } else if (isDataRowItem(newItem)) {\n if (extendRange) {\n this.opts.extendRangeTo(newItem.originalIndex, newCi);\n } else {\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: newItem.originalIndex, colIndex: newCi });\n }\n }\n this.scrollToKeepVisible(newDi, newCi);\n this.opts.focusGrid();\n }\n\n private selectedDisplayIndex(): number {\n const sel = this.opts.selectedCell();\n if (!sel) return -1;\n const items = this.opts.filteredItems();\n if (sel.rowIndex >= this.opts.dataSource().length) return items.length - 1;\n return items.findIndex(item => isDataRowItem(item) && item.originalIndex === sel.rowIndex);\n }\n\n private addRowAndSelect(): void {\n const emptyRow = this.buildEmptyRow();\n const insertedIndex = this.opts.dataSource().addRow(emptyRow);\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: insertedIndex, colIndex: 0 });\n this.opts.focusGrid();\n const displayIdx = this.findDisplayIndex(insertedIndex);\n if (displayIdx >= 0) this.scrollToKeepVisible(displayIdx, 0);\n this.opts.onPrepareAddRecord({ index: insertedIndex, data: emptyRow });\n }\n\n private buildEmptyRow(): Record<string, unknown> {\n const row: Record<string, unknown> = {};\n for (const col of this.opts.colDefs()) row[col.field] = col.type === 'number' ? 0 : '';\n return row;\n }\n}\n","import { Signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Reactive display state required by {@link AgridPresentationService}. @internal */\nexport interface AgridPresentationOptions {\n control: Signal<AgridControl | null>;\n visibleColDefs: Signal<ColDef[]>;\n filteredItems: Signal<GridItem[]>;\n locale: Signal<string>;\n /** Optional host callback returning CSS classes for a whole data row. */\n getRowClass?: Signal<((params: { row: Record<string, unknown>; index: number }) => string) | undefined>;\n}\n\n/**\n * Provides display formatting and CSV export without coupling them to the grid component.\n * @internal\n */\nexport class AgridPresentationService {\n constructor(\n private readonly opts: AgridPresentationOptions,\n private readonly browser = new AgridBrowserAdapter(),\n ) {}\n\n /** Returns the formatted tooltip text for a cell value. */\n getCellTitle(col: ColDef, value: unknown): string {\n return getDisplayForField(col, value, this.opts.locale());\n }\n\n /** Resolves dynamic CSS classes configured for a cell. */\n getCellClass(col: ColDef, value: unknown, row: Record<string, unknown>): string {\n return col.cellClass?.({ value, row }) ?? '';\n }\n\n /** Resolves dynamic CSS classes configured for a whole data row. */\n getRowClass(row: Record<string, unknown>, index: number): string {\n return this.opts.getRowClass?.()?.({ row, index }) ?? '';\n }\n\n /** Returns the compact label for a built-in aggregate. */\n getAggregateLabel(col: ColDef): string {\n const aggregate = this.opts.control()?.aggregates()[col.field] ?? col.aggregate;\n if (!aggregate || typeof aggregate === 'function') return '';\n return { sum: 'Σ', avg: 'Ø', min: '↓', max: '↑', count: '#' }[aggregate] ?? '';\n }\n\n /** Returns whether a column has a static or runtime aggregate. */\n hasAggregate(col: ColDef): boolean {\n return this.opts.control()?.aggregates()[col.field] !== undefined || !!col.aggregate;\n }\n\n /** Formats a computed footer value for display. */\n getFooterDisplay(col: ColDef, value: unknown): string {\n if (value == null || value === '') return '';\n if (col.formatter) return col.formatter(value);\n if (typeof value === 'number') return value.toLocaleString(this.opts.locale());\n return String(value);\n }\n\n /** Downloads the currently projected rows and visible columns as CSV. */\n exportCsv(filename: string): void {\n const cols = this.opts.visibleColDefs();\n const rows = this.opts.filteredItems()\n .filter(isDataRowItem)\n .map(item => item.row);\n const escape = (value: string): string =>\n /[,\"\\n\\r]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n const header = cols.map(col => escape(col.header)).join(',');\n const locale = this.opts.locale();\n const body = rows\n .map(row => cols\n .map(col => escape(getDisplayForField(col, row[col.field], locale)))\n .join(','))\n .join('\\n');\n this.browser.downloadText(\n filename,\n `${header}\\n${body}`,\n 'text/csv;charset=utf-8;',\n );\n }\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport {\n AgridMenuBarContext,\n AgridMenuBarItem,\n AgridMenuBarMenuItem,\n AgridMenuBarState,\n} from '../agrid.types';\n\n/** Internal renderer for provider-configured grid commands and dropdown items. */\n@Component({\n selector: 'agrid-menu-bar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-menu-bar.component.html',\n styleUrl: './agrid-menu-bar.component.css',\n})\nexport class AgridMenuBarComponent<T extends object = any> {\n items = input<readonly AgridMenuBarItem<T>[]>([]);\n context = input.required<AgridMenuBarContext<T>>();\n label = input<string>('Actions');\n openItemId = input<string | null>(null);\n\n action = output<string>();\n openItemIdChange = output<string | null>();\n\n resolveState(state: AgridMenuBarState<T> | undefined, fallback: boolean): boolean {\n if (typeof state === 'function') return state(this.context());\n return state ?? fallback;\n }\n\n isActive(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveState(item.active, false);\n }\n\n isDisabled(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveState(item.disabled, false);\n }\n\n visibleChildren(item: AgridMenuBarItem<T>): AgridMenuBarMenuItem<T>[] {\n return (item.items ?? []).filter(child => this.resolveState(child.visible, true));\n }\n\n runAction(event: Event, item: AgridMenuBarMenuItem<T>): void {\n event.stopPropagation();\n if (!this.resolveState(item.visible, true) || this.isDisabled(item)) return;\n this.action.emit(item.id);\n this.openItemIdChange.emit(null);\n }\n\n toggleMenu(event: Event, item: AgridMenuBarItem<T>): void {\n event.preventDefault();\n event.stopPropagation();\n if (this.isDisabled(item) || this.visibleChildren(item).length === 0) return;\n this.openItemIdChange.emit(this.openItemId() === item.id ? null : item.id);\n }\n\n onTriggerKeydown(event: KeyboardEvent, item: AgridMenuBarItem<T>): void {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n event.preventDefault();\n event.stopPropagation();\n if (this.isDisabled(item) || this.visibleChildren(item).length === 0) return;\n this.openItemIdChange.emit(item.id);\n const group = (event.currentTarget as HTMLElement).closest('.ag-menu-bar-group');\n setTimeout(() => {\n const enabled = group?.querySelectorAll<HTMLButtonElement>(\n '.ag-menu-bar-dropdown [role=\"menuitem\"]:not(:disabled)',\n );\n const target = event.key === 'ArrowUp' ? enabled?.[enabled.length - 1] : enabled?.[0];\n target?.focus();\n });\n }\n\n onMenuKeydown(event: KeyboardEvent): void {\n const menu = event.currentTarget as HTMLElement;\n const items = Array.from(\n menu.querySelectorAll<HTMLButtonElement>('[role=\"menuitem\"]:not(:disabled)'),\n );\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.openItemIdChange.emit(null);\n menu.closest('.ag-menu-bar-group')\n ?.querySelector<HTMLButtonElement>('.ag-menu-bar-trigger')\n ?.focus();\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key) || items.length === 0) return;\n event.preventDefault();\n event.stopPropagation();\n const current = items.indexOf(event.target as HTMLButtonElement);\n const next = event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? items.length - 1\n : event.key === 'ArrowDown'\n ? (current + 1 + items.length) % items.length\n : (current - 1 + items.length) % items.length;\n items[next].focus();\n }\n}\n","<div class=\"ag-menu-bar\" role=\"toolbar\" [attr.aria-label]=\"label()\">\n @for (item of items(); track item.id) {\n @let children = visibleChildren(item);\n <div class=\"ag-menu-bar-group\" [attr.data-menu-id]=\"item.id\">\n <button type=\"button\" class=\"ag-menu-bar-button\"\n [class.ag-menu-bar-button--active]=\"isActive(item)\"\n [class.ag-menu-bar-button--split]=\"children.length > 0\"\n [disabled]=\"isDisabled(item)\"\n [attr.aria-pressed]=\"item.active !== undefined ? isActive(item) : null\"\n (click)=\"runAction($event, item)\">\n @if (item.icon) {\n <span class=\"ag-menu-bar-icon\" aria-hidden=\"true\">{{ item.icon }}</span>\n }\n <span class=\"ag-menu-bar-label\">{{ item.label }}</span>\n </button>\n @if (children.length > 0) {\n <button type=\"button\" class=\"ag-menu-bar-trigger\"\n [class.ag-menu-bar-trigger--open]=\"openItemId() === item.id\"\n [attr.aria-label]=\"item.label + ': ' + label()\"\n [attr.aria-expanded]=\"openItemId() === item.id\" aria-haspopup=\"menu\"\n [disabled]=\"isDisabled(item)\"\n (click)=\"toggleMenu($event, item)\"\n (keydown)=\"onTriggerKeydown($event, item)\">▾</button>\n @if (openItemId() === item.id) {\n <div class=\"ag-menu-bar-dropdown\" role=\"menu\" [attr.aria-label]=\"item.label\"\n (click)=\"$event.stopPropagation()\" (keydown)=\"onMenuKeydown($event)\">\n @for (child of children; track child.id) {\n <button type=\"button\" class=\"ag-menu-bar-dropdown-item\" role=\"menuitem\"\n [class.ag-menu-bar-dropdown-item--active]=\"isActive(child)\"\n [disabled]=\"isDisabled(child)\"\n [attr.aria-current]=\"isActive(child) ? 'true' : null\"\n (click)=\"runAction($event, child)\">\n <span class=\"ag-menu-bar-dropdown-check\" aria-hidden=\"true\">{{ isActive(child) ? '✓' : '' }}</span>\n @if (child.icon) {\n <span class=\"ag-menu-bar-icon\" aria-hidden=\"true\">{{ child.icon }}</span>\n }\n <span class=\"ag-menu-bar-label\">{{ child.label }}</span>\n </button>\n }\n </div>\n }\n }\n </div>\n }\n</div>\n","import { Signal, computed, signal } from '@angular/core';\n\n/**\n * A single reversible cell edit stored in the undo/redo history.\n * Both `oldValue` and `newValue` are the raw values as stored in the data source.\n */\nexport interface HistoryEntry {\n rowIndex: number;\n field: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\n/** A single undo/redo history item. Multi-cell operations are stored as one batch. */\nexport type HistoryItem = HistoryEntry | HistoryEntry[];\n\n/**\n * Per-column filter state stored inside {@link AgridControl}.\n *\n * All three fields are independent — text, value selection, and sort are ANDed together\n * when computing the visible rows.\n */\n/**\n * Comparison operator for a column condition filter.\n * For `date` columns `gt`/`lt`/`eq` read as after / before / on.\n */\nexport type FilterOperator =\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'between'\n | 'like'\n | 'startsWith'\n | 'endsWith'\n | 'includes'\n | 'notIncludes';\n\nexport interface ColumnFilter {\n /** Free-text substring filter (case-insensitive). Empty string = no text filter. */\n text: string;\n /**\n * Allowed values for the value-picker filter.\n * - `null` → all values pass (no value filter active)\n * - `string[]` → only rows whose field value is in this list are shown\n */\n selectedValues: string[] | null;\n /** Sort direction, or `null` when this column is not sorted. */\n sort: 'asc' | 'desc' | null;\n /**\n * Condition operator for text, number, or date columns, or `null`/omitted when none.\n * Combined with text and value filters using AND semantics.\n */\n operator?: FilterOperator | null;\n /** Primary comparison operand (number as string, or `yyyy-mm-dd`). */\n operand?: string | null;\n /** Upper-bound operand used only when {@link operator} is `'between'`. */\n operand2?: string | null;\n}\n\n/** Serializable snapshot of the grid's UI state. Used with `toJSON` / `fromJSON`. */\nexport interface AgridControlState {\n /** Per-field column width overrides in pixels. */\n columnWidths: Record<string, number>;\n /** Per-field filter and sort state. Fields with default state may be omitted. */\n filters: Record<string, ColumnFilter>;\n /** Global quick-filter text matched across all visible columns. Empty string when inactive. */\n quickFilter?: string;\n /** When `true`, rows can be reordered by dragging the control-column handle. */\n allowRowReorder?: boolean;\n /** Field to group rows by, or `null` / omitted for no grouping. */\n groupByField?: string | null;\n /** Fields that are currently hidden from the grid view. */\n hiddenColumns?: string[];\n /** Ordered list of field names defining the column display order. */\n columnOrder?: string[];\n /** Fields that are pinned to the left edge. */\n pinnedColumns?: string[];\n /** Fields that are pinned to the right edge. */\n pinnedRightColumns?: string[];\n /** Ordered list of field names currently sorted, from highest to lowest priority. */\n sortOrder?: string[];\n /** Number of rows per page. `0` means no pagination (show all rows). */\n pageSize?: number;\n /** Current page (1-based). */\n currentPage?: number;\n /**\n * Total row count supplied by the server. When greater than zero the grid enters\n * server-side pagination mode: it no longer slices rows locally and instead emits\n * a `(pageChange)` event so the host can fetch the correct slice.\n */\n totalRows?: number;\n /** Per-field aggregate function set via the column menu. Only built-in string values are serializable. */\n aggregates?: Record<string, 'sum' | 'avg' | 'min' | 'max' | 'count'>;\n}\n\n/**\n * Signal-based container for mutable grid UI state such as column widths and active filters.\n *\n * Assign an instance to `AgridProvider.control` so the grid can store runtime state\n * in a place the host component can persist across sessions.\n *\n * @example\n * ```ts\n * // Restore saved state:\n * readonly ctrl = AgridControl.fromJSON(\n * JSON.parse(localStorage.getItem('grid') ?? '{}')\n * );\n *\n * // Save on demand:\n * localStorage.setItem('grid', JSON.stringify(this.ctrl.toJSON()));\n * ```\n */\nexport class AgridControl {\n private readonly _columnWidths = signal<Record<string, number>>({});\n private readonly _filters = signal<Record<string, ColumnFilter>>({});\n private readonly _quickFilter = signal<string>('');\n private readonly _allowRowReorder = signal<boolean>(false);\n private readonly _groupByField = signal<string | null>(null);\n private readonly _hiddenColumns = signal<Set<string>>(new Set());\n private readonly _columnOrder = signal<string[]>([]);\n private readonly _pinnedColumns = signal<Set<string>>(new Set());\n private readonly _pinnedRightColumns = signal<Set<string>>(new Set());\n private readonly _pageSize = signal<number>(0);\n private readonly _currentPage = signal<number>(1);\n private readonly _totalRows = signal<number>(0);\n private readonly _aggregates = signal<Record<string, 'sum' | 'avg' | 'min' | 'max' | 'count'>>({});\n private readonly _sortOrder = signal<string[]>([]);\n\n /** @param state Optional initial state, e.g. deserialized from storage. */\n constructor(state?: Partial<AgridControlState>) {\n if (state?.columnWidths) this._columnWidths.set({ ...state.columnWidths });\n if (state?.filters) this._filters.set({ ...state.filters });\n if (state?.quickFilter) this._quickFilter.set(state.quickFilter);\n if (state?.allowRowReorder) this._allowRowReorder.set(state.allowRowReorder);\n if (state?.groupByField !== undefined) this._groupByField.set(state.groupByField ?? null);\n if (state?.hiddenColumns?.length) this._hiddenColumns.set(new Set(state.hiddenColumns));\n if (state?.columnOrder?.length) this._columnOrder.set([...state.columnOrder]);\n if (state?.pinnedColumns?.length) this._pinnedColumns.set(new Set(state.pinnedColumns));\n if (state?.pinnedRightColumns?.length) this._pinnedRightColumns.set(new Set(state.pinnedRightColumns));\n if (state?.pageSize) this._pageSize.set(state.pageSize);\n if (state?.currentPage) this._currentPage.set(state.currentPage);\n if (state?.totalRows) this._totalRows.set(state.totalRows);\n if (state?.aggregates) this._aggregates.set({ ...state.aggregates });\n if (state?.sortOrder?.length) this._sortOrder.set([...state.sortOrder]);\n }\n\n /**\n * When `true`, the control column shows a drag handle and rows can be\n * reordered by dragging. Requires `showControlColumn` to be enabled on the grid.\n */\n readonly allowRowReorder: Signal<boolean> = this._allowRowReorder.asReadonly();\n\n /** Enable or disable row reordering at runtime. */\n setAllowRowReorder(value: boolean): void {\n this._allowRowReorder.set(value);\n }\n\n /**\n * The field currently used to group rows, or `null` when grouping is off.\n * When set, rows are bucketed by the display value of this field and a header\n * row is inserted before each group. Secondary sorts still apply within groups.\n */\n readonly groupByField: Signal<string | null> = this._groupByField.asReadonly();\n\n /**\n * Enable grouping by `field`, or pass `null` to turn grouping off.\n */\n setGroupBy(field: string | null): void {\n this._groupByField.set(field);\n }\n\n /**\n * Global quick-filter text. When non-empty (and not in server-side filtering mode),\n * the grid keeps only rows where at least one visible column's display value contains\n * this text (case-insensitive).\n */\n readonly quickFilter: Signal<string> = this._quickFilter.asReadonly();\n\n /** Set the global quick-filter text. Pass an empty string to clear it. */\n setQuickFilter(text: string): void {\n this._quickFilter.set(text);\n }\n\n /**\n * Reactive set of field names that are currently hidden.\n * An empty set means all columns are visible.\n */\n readonly hiddenColumns: Signal<Set<string>> = this._hiddenColumns.asReadonly();\n\n /** Return `true` when the given field is currently hidden. */\n isColumnHidden(field: string): boolean {\n return this._hiddenColumns().has(field);\n }\n\n /**\n * Show or hide a column by field name.\n * Hiding a column does not clear its filter or sort — they resume when it is shown again.\n */\n setColumnVisibility(field: string, visible: boolean): void {\n this._hiddenColumns.update(set => {\n const next = new Set(set);\n if (visible) next.delete(field);\n else next.add(field);\n return next;\n });\n }\n\n /** Toggle the visibility of a column. */\n toggleColumnVisibility(field: string): void {\n this.setColumnVisibility(field, this.isColumnHidden(field));\n }\n\n // ── Column order ──────────────────────────────────────────────────────────\n\n /**\n * Ordered list of field names that defines the left-to-right column display order.\n * An empty array means \"use the original `colDefs` order\".\n */\n readonly columnOrder: Signal<string[]> = this._columnOrder.asReadonly();\n\n /** Replace the entire column order with a new list of field names. */\n setColumnOrder(fields: string[]): void {\n this._columnOrder.set([...fields]);\n }\n\n /**\n * Move `fromField` to a new position relative to `toField`.\n * `currentVisibleOrder` should be the current `visibleColDefs` field array so the\n * operation works correctly whether or not an order has been set before.\n */\n moveColumn(currentVisibleOrder: string[], fromField: string, toField: string, insertBefore: boolean): void {\n this.moveColumns(currentVisibleOrder, [fromField], toField, insertBefore);\n }\n\n /**\n * Move an ordered block of fields to a new position relative to `toField`.\n * Fields absent from `currentVisibleOrder` are ignored.\n */\n moveColumns(\n currentVisibleOrder: string[],\n fromFields: readonly string[],\n toField: string,\n insertBefore: boolean,\n ): void {\n const order = [...currentVisibleOrder];\n const moving = order.filter(field => fromFields.includes(field));\n if (moving.length === 0 || moving.includes(toField)) return;\n const remaining = order.filter(field => !moving.includes(field));\n const toIdx = remaining.indexOf(toField);\n if (toIdx === -1) return;\n remaining.splice(insertBefore ? toIdx : toIdx + 1, 0, ...moving);\n this._columnOrder.set(remaining);\n }\n\n // ── Pinned columns ────────────────────────────────────────────────────────\n\n /** Reactive set of field names currently pinned to the left edge. */\n readonly pinnedColumns: Signal<Set<string>> = this._pinnedColumns.asReadonly();\n\n /** Return `true` when the given field is pinned. */\n isPinned(field: string): boolean {\n return this._pinnedColumns().has(field);\n }\n\n /** Pin or unpin a column to the left edge. Pinning left auto-unpins right. */\n setPinned(field: string, pinned: boolean): void {\n this._pinnedColumns.update(set => {\n const next = new Set(set);\n if (pinned) next.add(field); else next.delete(field);\n return next;\n });\n if (pinned) this._pinnedRightColumns.update(s => { const n = new Set(s); n.delete(field); return n; });\n }\n\n /** Toggle left-pin state of a column. */\n togglePinned(field: string): void {\n this.setPinned(field, !this.isPinned(field));\n }\n\n // ── Right pinning ─────────────────────────────────────────────────────────\n\n /** Reactive set of field names currently pinned to the right edge. */\n readonly pinnedRightColumns: Signal<Set<string>> = this._pinnedRightColumns.asReadonly();\n\n /** Return `true` when the given field is pinned to the right edge. */\n isPinnedRight(field: string): boolean {\n return this._pinnedRightColumns().has(field);\n }\n\n /** Pin or unpin a column to the right edge. Pinning right auto-unpins left. */\n setPinnedRight(field: string, pinned: boolean): void {\n this._pinnedRightColumns.update(set => {\n const next = new Set(set);\n if (pinned) next.add(field); else next.delete(field);\n return next;\n });\n if (pinned) this._pinnedColumns.update(s => { const n = new Set(s); n.delete(field); return n; });\n }\n\n /** Toggle right-pin state of a column. */\n togglePinnedRight(field: string): void {\n this.setPinnedRight(field, !this.isPinnedRight(field));\n }\n\n // ── Pagination ────────────────────────────────────────────────────────────\n\n /** Number of rows per page. `0` means all rows are shown (no pagination). */\n readonly pageSize: Signal<number> = this._pageSize.asReadonly();\n\n /** Current page number (1-based). */\n readonly currentPage: Signal<number> = this._currentPage.asReadonly();\n\n /** Set rows per page. Pass `0` to disable pagination. Resets to page 1. */\n setPageSize(size: number): void {\n this._pageSize.set(Math.max(0, size));\n this._currentPage.set(1);\n }\n\n /** Navigate to a specific page (1-based). Clamped to valid range by the grid. */\n setPage(page: number): void {\n this._currentPage.set(Math.max(1, page));\n }\n\n /**\n * Set the total number of rows available on the server.\n * When greater than zero the grid switches to **server-side pagination mode**:\n * - Rows in the data source are shown as-is (no local slicing).\n * - `totalPages` is derived from this value instead of the local row count.\n * - A `(pageChange)` event is emitted whenever the user navigates to a new page.\n *\n * Pass `0` to return to client-side pagination.\n */\n setTotalRows(count: number): void {\n this._totalRows.set(Math.max(0, count));\n }\n\n /**\n * Total server-side row count. `0` means client-side mode (grid slices locally).\n */\n readonly totalRows: Signal<number> = this._totalRows.asReadonly();\n\n // ── Aggregates ────────────────────────────────────────────────────────────\n\n /** Per-field aggregate overrides set via the column menu. */\n readonly aggregates: Signal<Record<string, 'sum' | 'avg' | 'min' | 'max' | 'count'>> = this._aggregates.asReadonly();\n\n /**\n * Set or clear the aggregate function for a column.\n * Pass `null` to remove the aggregate (hides the footer cell for that column).\n */\n setAggregate(field: string, fn: 'sum' | 'avg' | 'min' | 'max' | 'count' | null): void {\n this._aggregates.update(a => {\n const next = { ...a };\n if (fn === null) delete next[field];\n else next[field] = fn;\n return next;\n });\n }\n\n // ── Undo / redo history ────────────────────────────────────────────────────\n\n private readonly _history = signal<HistoryItem[]>([]);\n private readonly _historyPointer = signal<number>(-1);\n private static readonly MAX_HISTORY = 100;\n\n /** `true` when there is at least one edit that can be undone. */\n readonly canUndo = computed(() => this._historyPointer() >= 0);\n\n /** `true` when there is at least one edit that can be re-applied. */\n readonly canRedo = computed(() => this._historyPointer() < this._history().length - 1);\n\n /**\n * Record a committed cell edit in the history.\n * Calling this discards any redo entries that came after the current pointer.\n * Called automatically by the grid after every cell commit.\n */\n pushEdit(entry: HistoryEntry): void {\n this.pushHistoryItem(entry);\n }\n\n /** Record a multi-cell edit as one undo/redo step. */\n pushEditBatch(entries: HistoryEntry[]): void {\n if (entries.length === 0) return;\n this.pushHistoryItem(entries.length === 1 ? entries[0] : [...entries]);\n }\n\n private pushHistoryItem(item: HistoryItem): void {\n const pointer = this._historyPointer();\n const base = this._history().slice(0, pointer + 1);\n base.push(item);\n const trimmed = base.length > AgridControl.MAX_HISTORY\n ? base.slice(base.length - AgridControl.MAX_HISTORY)\n : base;\n this._history.set(trimmed);\n this._historyPointer.set(trimmed.length - 1);\n }\n\n /**\n * Move one step back in history and return the entry to reverse, or `null` if\n * already at the beginning. The caller is responsible for applying `oldValue`\n * back to the data source.\n */\n undo(): HistoryItem | null {\n const p = this._historyPointer();\n if (p < 0) return null;\n this._historyPointer.set(p - 1);\n return this._history()[p];\n }\n\n /**\n * Move one step forward in history and return the entry to re-apply, or `null`\n * if already at the end. The caller is responsible for applying `newValue` back\n * to the data source.\n */\n redo(): HistoryItem | null {\n const p = this._historyPointer();\n const h = this._history();\n if (p >= h.length - 1) return null;\n this._historyPointer.set(p + 1);\n return h[p + 1];\n }\n\n /** Clear the entire undo/redo history. */\n clearHistory(): void {\n this._history.set([]);\n this._historyPointer.set(-1);\n }\n\n /**\n * Reactive map of `field → pixel width`.\n * Only fields whose width was explicitly overridden are present; the grid falls\n * back to `ColDef.width` for fields not in this map.\n */\n readonly columnWidths: Signal<Record<string, number>> = this._columnWidths.asReadonly();\n\n /**\n * Reactive map of `field → ColumnFilter`.\n * Only fields with at least one active filter/sort condition are present.\n */\n readonly filters: Signal<Record<string, ColumnFilter>> = this._filters.asReadonly();\n\n // ── Column widths ──────────────────────────────────────────────────────────\n\n /**\n * Return the effective width for a column, falling back to `defaultWidth`\n * if no override exists.\n */\n getColumnWidth(field: string, defaultWidth: number): number {\n return this._columnWidths()[field] ?? defaultWidth;\n }\n\n /**\n * Set the width for a column. Enforces a minimum of 40 px.\n * Called by the grid when the user drags a resize handle.\n */\n setColumnWidth(field: string, width: number): void {\n this._columnWidths.update(w => ({ ...w, [field]: Math.max(40, width) }));\n }\n\n // ── Filters & sort ─────────────────────────────────────────────────────────\n\n /**\n * Return the current filter state for a field.\n * Returns a default (inactive) filter when no state is stored for the field.\n */\n getFilter(field: string): ColumnFilter {\n return this._filters()[field] ?? { text: '', selectedValues: null, sort: null };\n }\n\n /**\n * Set the free-text filter for a column.\n * An empty string removes the text filter for that column.\n */\n setTextFilter(field: string, text: string): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...this.getFilter(field), text },\n }));\n }\n\n /**\n * Set the value-picker selection for a column.\n * Pass `null` to show all values (clear the value filter).\n */\n setSelectedValues(field: string, values: string[] | null): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...this.getFilter(field), selectedValues: values },\n }));\n }\n\n /**\n * Set a column condition filter. Text columns support string operators while number/date\n * columns support comparison operators.\n * Pass `operator: null` (or an empty `operand`) to clear it. `operand2` is only used\n * by the `'between'` operator.\n */\n setRangeFilter(\n field: string,\n operator: FilterOperator | null,\n operand: string | null,\n operand2: string | null = null,\n ): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...this.getFilter(field), operator, operand, operand2 },\n }));\n }\n\n /** Ordered list of sorted field names, from highest to lowest priority. */\n readonly sortOrder: Signal<string[]> = this._sortOrder.asReadonly();\n\n /** Return the 1-based sort priority of a field, or `0` if it is not sorted. */\n getSortPriority(field: string): number {\n const idx = this._sortOrder().indexOf(field);\n return idx === -1 ? 0 : idx + 1;\n }\n\n /**\n * Set the sort direction for a column, clearing all other sorts.\n * Pass `null` to remove the sort entirely.\n * For multi-column sort use {@link addSort}.\n */\n setSort(field: string, sort: 'asc' | 'desc' | null): void {\n this._filters.update(f => {\n const next: Record<string, ColumnFilter> = {};\n for (const [k, v] of Object.entries(f)) {\n next[k] = k === field ? { ...v, sort } : { ...v, sort: null };\n }\n if (!next[field]) next[field] = { text: '', selectedValues: null, sort };\n return next;\n });\n this._sortOrder.set(sort ? [field] : []);\n }\n\n /**\n * Add a column to the multi-sort stack or update its direction.\n * If the column is already sorted, only its direction is updated (priority unchanged).\n * If not yet sorted, it is appended as the lowest-priority sort key.\n */\n addSort(field: string, sort: 'asc' | 'desc'): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...(f[field] ?? { text: '', selectedValues: null }), sort },\n }));\n this._sortOrder.update(order =>\n order.includes(field) ? order : [...order, field]\n );\n }\n\n /**\n * Remove all active filters and sort for a single column.\n */\n clearFilter(field: string): void {\n this._filters.update(f => {\n const next = { ...f };\n delete next[field];\n return next;\n });\n this._sortOrder.update(o => o.filter(f => f !== field));\n }\n\n /** Remove all active filters and sorts for every column, including the quick filter. */\n clearAllFilters(): void {\n this._filters.set({});\n this._sortOrder.set([]);\n this._quickFilter.set('');\n }\n\n /**\n * Return `true` when the given field has any active filter or sort.\n * Useful for showing a visual indicator on the column header.\n */\n hasActiveFilter(field: string): boolean {\n const f = this.getFilter(field);\n const hasRange = !!f.operator && f.operand != null && f.operand !== '';\n return !!(f.text || f.selectedValues !== null || f.sort || hasRange);\n }\n\n /** Return `true` when the quick filter or ANY column has an active filter or sort. */\n hasAnyActiveFilter(): boolean {\n return !!this._quickFilter() || Object.values(this._filters()).some(\n f => f.text || f.selectedValues !== null || f.sort\n || (!!f.operator && f.operand != null && f.operand !== '')\n );\n }\n\n // ── Serialization ──────────────────────────────────────────────────────────\n\n /** Serialize current state to a plain object suitable for JSON storage. */\n toJSON(): AgridControlState {\n return {\n columnWidths: { ...this._columnWidths() },\n filters: { ...this._filters() },\n quickFilter: this._quickFilter() || undefined,\n allowRowReorder: this._allowRowReorder(),\n groupByField: this._groupByField() ?? undefined,\n hiddenColumns: [...this._hiddenColumns()],\n columnOrder: [...this._columnOrder()],\n pinnedColumns: [...this._pinnedColumns()],\n pinnedRightColumns: [...this._pinnedRightColumns()],\n pageSize: this._pageSize(),\n currentPage: this._currentPage(),\n totalRows: this._totalRows(),\n aggregates: { ...this._aggregates() },\n sortOrder: [...this._sortOrder()],\n };\n }\n\n /** Restore an `AgridControl` from a previously serialized state. */\n static fromJSON(state: Partial<AgridControlState>): AgridControl {\n return new AgridControl(state);\n }\n}\n","import { Signal, WritableSignal, isWritableSignal, linkedSignal, signal } from '@angular/core';\n\n/**\n * Signal-based data container shared between the grid and the host component.\n *\n * Both the grid and the host component hold a reference to the same `AgridDataSource`\n * instance. Mutations made by either side (e.g. the grid calling `patchRow` when a cell\n * is committed, or the host calling `setData` to load fresh data) are immediately reflected\n * in the grid because {@link rows} is a readonly Angular signal.\n *\n * @example\n * ```ts\n * readonly ds = new AgridDataSource(generateRows(1000));\n *\n * // Later — update one row from outside the grid:\n * this.ds.patchRow(5, { salary: 99000 });\n * ```\n */\nexport class AgridDataSource<T extends object = any> {\n private readonly _linkedRows = signal<Signal<T[]> | null>(null);\n private readonly _rows = linkedSignal<T[]>(() => this._linkedRows()?.() ?? []);\n private _writableLinkedRows: WritableSignal<T[]> | null = null;\n private readonly _rowAdded = signal<{ index: number; sequence: number } | null>(null);\n private _changeSequence = 0;\n\n /**\n * @param initialData Rows to seed the data source with.\n * The array is shallow-copied so external mutations do not affect the source.\n */\n constructor(initialData: T[] = []) {\n this._rows.set([...initialData]);\n }\n\n /**\n * Readonly signal of the current row array.\n * Read it inside Angular templates or `computed()` to react to changes automatically.\n */\n readonly rows: Signal<T[]> = this._rows.asReadonly();\n\n /** Latest row insertion, used by attached grids to reveal the inserted row. */\n readonly rowAdded: Signal<{ index: number; sequence: number } | null> =\n this._rowAdded.asReadonly();\n\n /**\n * Link an external row signal to this data source.\n *\n * Whenever `source` changes, its array becomes the current datasource value without an\n * intermediate effect or array copy. If `source` is writable, datasource mutations are written\n * back to it automatically. Mutations remain local when linking a readonly signal.\n */\n linkSignal(source: Signal<T[]>): void {\n this._writableLinkedRows = isWritableSignal(source)\n ? source as WritableSignal<T[]>\n : null;\n this._linkedRows.set(source);\n }\n\n /**\n * Replace the entire row array.\n * Triggers a full grid re-render via the signal.\n */\n setData(rows: T[]): void {\n this.setRows([...rows]);\n }\n\n /**\n * Overwrite the row at `index` with a new row object.\n * Use {@link patchRow} when you only want to change specific fields.\n */\n updateRow(index: number, row: T): void {\n this.updateRows(rows => {\n const next = [...rows];\n next[index] = row;\n return next;\n });\n }\n\n /**\n * Merge `patch` into the existing row at `index`, leaving other fields untouched.\n * The grid calls this internally when a cell edit is committed.\n */\n patchRow(index: number, patch: Partial<T>): void {\n this.updateRows(rows => {\n const next = [...rows];\n next[index] = { ...next[index], ...patch } as T;\n return next;\n });\n }\n\n /**\n * Insert a row into the data source and return the index at which it was inserted.\n *\n * @param row The row object to insert.\n * @param atIndex Optional insertion index. Defaults to the end of the array.\n * @returns The index the row was inserted at.\n */\n addRow(row: T, atIndex?: number): number {\n let insertedAt!: number;\n this.updateRows(rows => {\n if (atIndex === undefined) {\n insertedAt = rows.length;\n return [...rows, row];\n }\n insertedAt = atIndex;\n const next = [...rows];\n next.splice(atIndex, 0, row);\n return next;\n });\n this._rowAdded.set({ index: insertedAt, sequence: ++this._changeSequence });\n return insertedAt;\n }\n\n /**\n * Remove the row at `index`.\n * The grid adjusts `selectedCell` and `editingCell` internally when a deletion occurs\n * via the control column context menu.\n */\n removeRow(index: number): void {\n this.updateRows(rows => rows.filter((_, i) => i !== index));\n }\n\n /**\n * Move the row at `from` to position `to` (insert-before semantics).\n * Designed to be called directly from a `(rowReorder)` handler:\n * ```ts\n * onReorder(e: RowReorderEvent) { this.ds.moveRow(e.oldIndex, e.newIndex); }\n * ```\n */\n moveRow(from: number, to: number): void {\n if (from === to) return;\n this.updateRows(rows => {\n const arr = [...rows];\n const [item] = arr.splice(from, 1);\n arr.splice(to > from ? to - 1 : to, 0, item);\n return arr;\n });\n }\n\n /** Return the current row at `index` (non-reactive snapshot). */\n getRow(index: number): T {\n return this._rows()[index];\n }\n\n /** Current number of rows (non-reactive snapshot). */\n get length(): number {\n return this._rows().length;\n }\n\n private updateRows(update: (rows: T[]) => T[]): void {\n this.setRows(update(this._rows()));\n }\n\n private setRows(rows: T[]): void {\n this._writableLinkedRows?.set(rows);\n this._rows.set(rows);\n }\n}\n","import { signal, WritableSignal } from '@angular/core';\nimport { AgridControl } from './agrid-control';\nimport { AgridDataSource } from './agrid-datasource';\nimport { AgridLocaleTextOverrides } from './agrid-localization';\nimport {\n AGridOptions,\n AgridEnterEditAction,\n AgridMenuBarItem,\n AgridTreeConfig,\n CellContextMenuItem,\n ColDef,\n GroupAction,\n HeaderGroup,\n} from './agrid.types';\n\n/** Configuration used to create an {@link AgridProvider}. */\nexport interface AgridProviderConfig<T extends object = any> extends Partial<AGridOptions> {\n /** Row data source. A new empty data source is created when omitted. */\n datasource?: AgridDataSource<T>;\n /** Stateful grid control. A default control is created when omitted. */\n control?: AgridControl;\n /** Initial column definitions in display order. */\n columns?: ColDef<T>[];\n /** Labels used by columns with a matching `group` identifier. */\n headerGroups?: HeaderGroup[];\n /**\n * Render rows as a hierarchical tree. When set, rows are nested by the configured\n * parent/child accessors and an expand/collapse twisty is shown on `treeField`.\n * Mutually exclusive with grouping and pagination.\n */\n treeConfig?: AgridTreeConfig<T>;\n /** Row height in pixels. Must be fixed for CDK virtual scroll. @default 32 */\n rowHeight?: number;\n /** Minimum height of the grid host element (e.g. `'200px'`). */\n minHeight?: string;\n /** Maximum height of the grid host element (e.g. `'500px'`). */\n maxHeight?: string;\n /** Show a `+ Add row` placeholder at the bottom. */\n allowAddRows?: boolean;\n /** Automatically insert a blank row when navigating past the last real row. */\n autoAddRows?: boolean;\n /** Show a 24 px control column with a drag handle and right-click context menu. */\n showControlColumn?: boolean;\n /** Show row-marking checkboxes in a 48 px control column for clipboard inclusion. @default false */\n enableRowMarking?: boolean;\n /** Show the sidebar panel. */\n showSidebar?: boolean;\n /** Automatically open the detail panel when a row is selected. */\n autoOpenDetail?: boolean;\n /**\n * Emit filter and sort changes for server processing instead of applying them locally.\n * The Excel-style value picker is hidden in this mode. @default false\n */\n serverSideFiltering?: boolean;\n /** Delay before emitting server-side text filter changes. Set to `0` to disable. @default 300 */\n filterDebounceMs?: number;\n /**\n * Show the global quick-filter box above the grid. In client mode it filters rows whose\n * visible columns contain the text; in `serverSideFiltering` mode it emits `(quickFilterChange)`\n * instead of filtering locally. @default false\n */\n enableQuickFilter?: boolean;\n /**\n * Optional command bar rendered above the column headers. Buttons and dropdown items emit\n * their id through the grid's single `(menuBarAction)` output.\n */\n menuBarItems?: AgridMenuBarItem<T>[];\n /**\n * Sorting behavior: one active column, multiple columns, or disabled entirely.\n * @default 'multi'\n */\n sortOption?: 'single' | 'multi' | 'none';\n /**\n * Row selection mode.\n * - `'none'` — no selection (default)\n * - `'single'` — click to select/deselect\n * - `'multi'` — Ctrl+click toggles, Shift+click extends range, click+drag sweeps\n */\n rowSelection?: 'single' | 'multi' | 'none';\n /**\n * Behavior after pressing Enter while an inline cell editor is active.\n * - `'nothing'` — commit and keep the current cell selected\n * - `'nextColumn'` — commit and move to the next column in the same row\n * - `'nextRow'` — commit and move to the same column one row down\n * @default 'nextRow'\n */\n enterEditAction?: AgridEnterEditAction;\n /** Returns a short description string shown next to the group label. */\n groupDescription?: ((label: string) => string) | null;\n /** Actions shown in the group header's `⋮` menu. */\n groupActions?: GroupAction[];\n /**\n * Extra items appended to the cell right-click context menu.\n * Pass `null` entries to insert separator lines.\n */\n cellMenuItems?: (CellContextMenuItem<T> | null)[];\n /** Shade every other row slightly for easier reading. @default false */\n zebraStripes?: boolean;\n /** Show a color marker on cells changed through grid editing. @default false */\n showChangedCellIndicator?: boolean;\n /** Ask for confirmation before grid row-delete actions. @default false */\n confirmRowDelete?: boolean;\n /** Make the entire grid read-only. @default false */\n readonly?: boolean;\n\n /** Restrict editing to the sidebar editor instead of inline cells. */\n useSidebarEditor?: boolean;\n\n /** Show a loading overlay over the grid body. @default false */\n loading?: boolean;\n /** Message shown when the grid has no rows to display. */\n emptyText?: string;\n\n /**\n * Return one or more CSS class names applied to a whole data row, based on its data and index.\n * Complements the per-cell {@link ColDef.cellClass}.\n *\n * @example\n * ```ts\n * getRowClass: ({ row }) => row.status === 'overdue' ? 'row-danger' : ''\n * ```\n */\n getRowClass?: (params: { row: T; index: number }) => string;\n\n /**\n * Designate rows to pin to the top or bottom of the grid body. Pinned rows stay visible during\n * vertical scroll and are excluded from grouping and pagination, but remain fully interactive\n * (editable/selectable) because they keep their real data-source index.\n *\n * Return `'top'`, `'bottom'`, or `undefined` (a normal scrolling row).\n *\n * @example\n * ```ts\n * pinRow: row => row.isSummary ? 'bottom' : undefined\n * ```\n */\n pinRow?: (row: T, index: number) => 'top' | 'bottom' | undefined;\n\n /**\n * Enable master/detail rows: each flat data row, or each leaf row in tree mode, can expand to\n * reveal a detail panel rendered beneath it. Requires {@link detailRenderer}. Grouped mode is\n * not supported. @default false\n */\n masterDetail?: boolean;\n /**\n * Returns the HTML shown inside an expanded detail panel. Angular's built-in HTML sanitization\n * is applied automatically (same as {@link ColDef.cellRenderer}).\n *\n * @example\n * ```ts\n * detailRenderer: ({ row }) => `<div class=\"detail\">${row.notes}</div>`\n * ```\n */\n detailRenderer?: (params: { row: T }) => string;\n /** Fixed height in pixels of an expanded detail panel row. @default 200 */\n detailRowHeight?: number;\n}\n\n/**\n * Bundles a grid's data source, control state, columns, and display options.\n *\n * Create one provider per independent grid instance. A provider may be selected\n * from an array when a component renders multiple grids.\n */\nexport class AgridProvider<T extends object = any> {\n /** Mutable row data consumed by the grid. */\n datasource: AgridDataSource<T>;\n /** Runtime UI state and imperative grid controls. */\n control: AgridControl;\n /** Reactive column definitions in display order. */\n readonly columns: WritableSignal<ColDef<T>[]>;\n /** Header-group labels referenced by column definitions. */\n headerGroups: HeaderGroup[];\n /** Tree configuration, or `null` when the grid is not in tree mode. */\n treeConfig: AgridTreeConfig<T> | null;\n /** Shared grid options such as locale. */\n options: AGridOptions;\n\n private readonly _localizations = new Map<string, AgridLocaleTextOverrides>();\n\n /** Read-only view of registered per-locale text overrides. Used by the grid to resolve locale text. */\n get localizations(): ReadonlyMap<string, AgridLocaleTextOverrides> {\n return this._localizations;\n }\n\n /**\n * Register locale-specific label overrides. Call multiple times for multiple locales.\n * When `locale` is `'auto'`, the grid matches the browser language against registered locales\n * (exact match first, then primary-language match, e.g. `'fr'` matches a browser locale of `'fr-FR'`).\n *\n * @example\n * provider.addLocalization('fr-FR', { addRow: 'Ajouter une ligne', noRows: 'Aucune donnée' });\n */\n addLocalization(locale: string, overrides: AgridLocaleTextOverrides): this {\n this._localizations.set(locale, overrides);\n return this;\n }\n\n /** Fixed virtual-scroll row height in pixels. */\n rowHeight: number;\n /** Minimum CSS height of the grid host. */\n minHeight?: string;\n /** Maximum CSS height of the grid host. */\n maxHeight?: string;\n /** Whether the add-row placeholder is shown. */\n allowAddRows: boolean;\n /** Whether the control column is rendered. */\n showControlColumn: boolean;\n /** Whether rows can be marked for inclusion in clipboard copies. */\n enableRowMarking: boolean;\n /** Whether the sidebar is available. */\n showSidebar: boolean;\n /** Whether selecting a row automatically opens its detail panel. */\n autoOpenDetail: boolean;\n /** Whether filter and sort operations are delegated to the host. */\n serverSideFiltering: boolean;\n /** Delay before server-side filter events are emitted. */\n filterDebounceMs: number;\n /** Whether the global quick-filter box is shown above the grid. */\n enableQuickFilter: boolean;\n /** Commands rendered in the optional menu bar above the column headers. */\n menuBarItems: AgridMenuBarItem<T>[];\n /** Enabled sorting mode. */\n sortOption: 'single' | 'multi' | 'none';\n /** Toggle auto-add-rows without recreating the provider. @default signal(false) */\n readonly autoAddRows: WritableSignal<boolean>;\n /** Enabled row-selection mode. */\n rowSelection: 'single' | 'multi' | 'none';\n /** Behavior after pressing Enter while an inline cell editor is active. */\n enterEditAction: AgridEnterEditAction;\n /** Optional description shown beside each group heading. */\n groupDescription: ((label: string) => string) | null;\n /** Actions available from group headers. */\n groupActions: GroupAction[];\n /** Additional cell context-menu entries. */\n cellMenuItems: (CellContextMenuItem<T> | null)[];\n /** Whether alternating data rows receive stripe styling. */\n zebraStripes: boolean;\n /** Whether committed cell changes receive a visual marker. */\n showChangedCellIndicator: boolean;\n /** Whether grid row-delete actions require in-row confirmation. */\n confirmRowDelete: boolean;\n /** Optional empty-state text override. */\n emptyText?: string;\n /** Whether edits are restricted to the sidebar editor. */\n useSidebarEditor: boolean;\n\n /** Optional callback returning CSS classes for a whole data row. */\n getRowClass?: (params: { row: T; index: number }) => string;\n /** Optional callback designating rows pinned to the top or bottom of the body. */\n pinRow?: (row: T, index: number) => 'top' | 'bottom' | undefined;\n /** Whether master/detail expandable detail rows are enabled. */\n masterDetail: boolean;\n /** Returns the sanitized HTML rendered inside an expanded detail panel. */\n detailRenderer?: (params: { row: T }) => string;\n /** Fixed height in pixels of an expanded detail panel row. */\n detailRowHeight: number;\n\n /** Toggle the loading overlay without recreating the provider. @default signal(false) */\n readonly loading: WritableSignal<boolean>;\n /** Toggle readonly mode without recreating the provider. @default signal(false) */\n readonly readonlyGrid: WritableSignal<boolean>;\n\n /** Creates a provider from the supplied data, state, columns, and display options. */\n constructor(config: AgridProviderConfig<T> = {}) {\n this.options = { locale: config.locale ?? 'auto' };\n this.datasource = config.datasource ?? new AgridDataSource<T>([]);\n this.control = config.control ?? new AgridControl({ allowRowReorder: true });\n this.columns = signal(config.columns ?? []);\n this.headerGroups = config.headerGroups ?? [];\n this.treeConfig = config.treeConfig ?? null;\n\n this.rowHeight = config.rowHeight ?? 32;\n this.minHeight = config.minHeight;\n this.maxHeight = config.maxHeight;\n this.allowAddRows = config.allowAddRows ?? false;\n this.autoAddRows = signal(config.autoAddRows ?? false);\n this.showControlColumn = config.showControlColumn ?? false;\n this.enableRowMarking = config.enableRowMarking ?? false;\n this.showSidebar = config.showSidebar ?? false;\n this.autoOpenDetail = config.autoOpenDetail ?? false;\n this.serverSideFiltering = config.serverSideFiltering ?? false;\n this.filterDebounceMs = Math.max(0, config.filterDebounceMs ?? 300);\n this.enableQuickFilter = config.enableQuickFilter ?? false;\n this.menuBarItems = config.menuBarItems ?? [];\n this.sortOption = config.sortOption ?? 'multi';\n this.rowSelection = config.rowSelection ?? 'none';\n this.enterEditAction = config.enterEditAction ?? 'nextRow';\n this.groupDescription = config.groupDescription ?? null;\n this.groupActions = config.groupActions ?? [];\n this.cellMenuItems = config.cellMenuItems ?? [];\n this.zebraStripes = config.zebraStripes ?? false;\n this.showChangedCellIndicator = config.showChangedCellIndicator ?? false;\n this.confirmRowDelete = config.confirmRowDelete ?? false;\n this.emptyText = config.emptyText;\n this.loading = signal(config.loading ?? false);\n this.readonlyGrid = signal(config.readonly ?? false);\n this.useSidebarEditor = config.useSidebarEditor ?? false;\n this.getRowClass = config.getRowClass;\n this.pinRow = config.pinRow;\n this.masterDetail = config.masterDetail ?? false;\n this.detailRenderer = config.detailRenderer;\n this.detailRowHeight = config.detailRowHeight ?? 200;\n }\n\n /** Returns the current reactive row array. */\n getGridData(): T[] {\n return this.datasource.rows();\n }\n}\n","import { Signal, computed } from '@angular/core';\nimport { AgridControl, ColumnFilter } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { AgridTreeConfig, ColDef, GridItem } from '../agrid.types';\nimport {\n applyQuickFilter,\n applySortToIndices,\n applyTextAndValueFilters,\n buildGroupedItems,\n buildPathTreeItems,\n buildTreeItems,\n computeAggregates,\n isPathTreeConfig,\n} from '../agrid.utils';\n\n/** Expanded labels associated with the current grouping field. @internal */\nexport interface AgridGroupExpansionState {\n field: string | null;\n labels: Set<string>;\n}\n\n/** Reactive inputs required by {@link AgridProjectionModel}. @internal */\nexport interface AgridProjectionOptions {\n dataSource: Signal<AgridDataSource>;\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n serverSideFiltering: Signal<boolean>;\n sortOption: Signal<'single' | 'multi' | 'none'>;\n allowAddRows: Signal<boolean>;\n autoAddRows: Signal<boolean>;\n expandedGroups: Signal<AgridGroupExpansionState>;\n /** Tree configuration, or `null` when the grid is not in tree mode. */\n treeConfig: Signal<AgridTreeConfig | null>;\n /** Expanded node ids when tree mode is active. */\n expandedTreeIds: Signal<Set<string | number>>;\n /** Host callback designating rows pinned to the top/bottom, or `undefined` when not pinning. */\n pinRow?: Signal<((row: Record<string, unknown>, index: number) => 'top' | 'bottom' | undefined) | undefined>;\n /** Whether master/detail expandable rows are enabled. */\n masterDetail?: Signal<boolean>;\n /** Original indices of rows whose detail panel is currently expanded. */\n expandedDetailIds?: Signal<Set<number>>;\n}\n\n/**\n * Computes the visible row projection and aggregate state from grid data and controls.\n * @internal\n */\nexport class AgridProjectionModel {\n constructor(private readonly opts: AgridProjectionOptions) {}\n\n /** Filtered and sorted source indices before pagination or grouping. */\n readonly filteredSortedIndices = computed<number[]>(() => {\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n const colMap = this.columnMap();\n let indices = rows.map((_, index) => index);\n\n if (!control || this.opts.serverSideFiltering()) return indices;\n\n const filters = control.filters();\n indices = applyTextAndValueFilters(\n rows,\n indices,\n filters,\n colMap,\n this.opts.locale(),\n );\n const quick = control.quickFilter();\n if (quick) {\n indices = applyQuickFilter(rows, indices, quick, this.opts.visibleColDefs(), this.opts.locale());\n }\n if (control.groupByField()) return indices;\n\n const sortEntries = this.sortEntries(filters);\n return sortEntries.length\n ? applySortToIndices(rows, indices, sortEntries, colMap, this.opts.locale())\n : indices;\n });\n\n /** Total filtered row count, unaffected by client-side pagination. */\n readonly filteredRowCount = computed(() => this.filteredSortedIndices().length);\n\n /** Whether row pinning is active: a `pinRow` callback is supplied and not in tree mode. */\n private readonly pinningActive = computed(() => !!this.opts.pinRow?.() && !this.opts.treeConfig());\n\n /**\n * Partitions the filtered+sorted indices into top-pinned, bottom-pinned, and a body set.\n * Pinned rows keep their real source index, so editing/selection over them is unchanged.\n */\n private readonly partitionPinned = computed<{ top: number[]; bottom: number[]; bodySet: Set<number> }>(() => {\n if (!this.pinningActive()) return { top: [], bottom: [], bodySet: new Set<number>() };\n const rows = this.opts.dataSource().rows();\n const pinRow = this.opts.pinRow!()!;\n const top: number[] = [];\n const bottom: number[] = [];\n const bodySet = new Set<number>();\n for (const index of this.filteredSortedIndices()) {\n const where = pinRow(rows[index], index);\n if (where === 'top') top.push(index);\n else if (where === 'bottom') bottom.push(index);\n else bodySet.add(index);\n }\n return { top, bottom, bodySet };\n });\n\n /** Top-pinned rows as data-row items, in filtered+sorted order. */\n readonly pinnedTopItems = computed<{ row: Record<string, unknown>; originalIndex: number }[]>(() => {\n const rows = this.opts.dataSource().rows();\n return this.partitionPinned().top.map(originalIndex => ({ row: rows[originalIndex], originalIndex }));\n });\n\n /** Bottom-pinned rows as data-row items, in filtered+sorted order. */\n readonly pinnedBottomItems = computed<{ row: Record<string, unknown>; originalIndex: number }[]>(() => {\n const rows = this.opts.dataSource().rows();\n return this.partitionPinned().bottom.map(originalIndex => ({ row: rows[originalIndex], originalIndex }));\n });\n\n /** All source indices in active sort order, ignoring filters. Used for tree ancestor ordering. */\n private readonly allSortedIndices = computed<number[]>(() => {\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n const indices = rows.map((_, index) => index);\n if (!control || this.opts.serverSideFiltering()) return indices;\n const sortEntries = this.sortEntries(control.filters());\n return sortEntries.length\n ? applySortToIndices(rows, indices, sortEntries, this.columnMap(), this.opts.locale())\n : indices;\n });\n\n /** Total page count using server total when server-side pagination is active. */\n readonly totalPages = computed(() => {\n const control = this.opts.control();\n const pageSize = control?.pageSize() ?? 0;\n if (pageSize <= 0) return 1;\n const count = (control?.totalRows() ?? 0) > 0\n ? control!.totalRows()\n : this.filteredSortedIndices().length;\n return Math.max(1, Math.ceil(count / pageSize));\n });\n\n /** Whether client or server pagination controls should be rendered. */\n readonly showPagination = computed(() => {\n const control = this.opts.control();\n if (this.opts.treeConfig()) return false;\n return (control?.pageSize() ?? 0) > 0 && !control?.groupByField();\n });\n\n /** Whether at least one visible column has an aggregate footer. */\n readonly showFooter = computed(() => {\n const aggregates = this.opts.control()?.aggregates() ?? {};\n return this.opts.visibleColDefs().some(col => col.aggregate || aggregates[col.field]);\n });\n\n /** Aggregate values computed over all filtered rows, before pagination. */\n readonly footerValues = computed<Record<string, unknown>>(() =>\n computeAggregates(\n this.opts.dataSource().rows(),\n this.filteredSortedIndices(),\n this.opts.visibleColDefs(),\n this.opts.control()?.aggregates() ?? {},\n ),\n );\n\n /** Filtered, sorted, paginated, and optionally grouped virtual-scroll items. */\n readonly filteredItems = computed<GridItem[]>(() => {\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n let indices = this.filteredSortedIndices();\n\n // Tree mode takes precedence over grouping/pagination: the already filtered-and-sorted\n // indices are flattened into a hierarchy honoring the expanded-id set.\n const treeConfig = this.opts.treeConfig();\n if (treeConfig) {\n const expandedIds = this.opts.expandedTreeIds();\n\n // When a text/value filter is active, keep the ancestors of every match visible (and\n // force their path open) so deep matches don't vanish under filtered-out parents.\n const filters = control?.filters() ?? {};\n const filterActive = !this.opts.serverSideFiltering()\n && Object.values(filters).some(f => f.text || f.selectedValues !== null);\n\n if (isPathTreeConfig(treeConfig)) {\n const items = this.appendTreeDetailItems(\n buildPathTreeItems(\n rows,\n indices,\n treeConfig,\n expandedIds,\n filterActive && treeConfig.keepAncestorsOnFilter !== false,\n ),\n rows,\n treeConfig,\n );\n this.appendAddRow(items);\n return items;\n }\n\n if (filterActive && treeConfig.keepAncestorsOnFilter !== false) {\n const { getId, getParentId } = treeConfig;\n const idToIndex = new Map<string | number, number>();\n rows.forEach((row, index) => idToIndex.set(getId(row), index));\n\n const visible = new Set<number>(indices);\n const forced = new Set<string | number>();\n for (const matched of indices) {\n let parentId = getParentId(rows[matched]);\n while (parentId != null && idToIndex.has(parentId)) {\n const parentIndex = idToIndex.get(parentId)!;\n forced.add(parentId);\n if (visible.has(parentIndex)) break; // chain already added by an earlier match\n visible.add(parentIndex);\n parentId = getParentId(rows[parentIndex]);\n }\n }\n\n const ordered = this.allSortedIndices().filter(index => visible.has(index));\n const items = this.appendTreeDetailItems(\n buildTreeItems(rows, ordered, treeConfig, expandedIds, forced),\n rows,\n treeConfig,\n );\n this.appendAddRow(items);\n return items;\n }\n\n const items = this.appendTreeDetailItems(\n buildTreeItems(rows, indices, treeConfig, expandedIds),\n rows,\n treeConfig,\n );\n this.appendAddRow(items);\n return items;\n }\n\n // Pull pinned rows out of the body; they render in fixed top/bottom containers instead.\n if (this.pinningActive()) {\n const bodySet = this.partitionPinned().bodySet;\n indices = indices.filter(index => bodySet.has(index));\n }\n\n if (control) {\n const groupField = control.groupByField();\n const pageSize = control.pageSize();\n const serverPagination = control.totalRows() > 0;\n if (pageSize > 0 && !serverPagination && !groupField) {\n const page = Math.max(1, Math.min(control.currentPage(), this.totalPages()));\n indices = indices.slice((page - 1) * pageSize, page * pageSize);\n }\n\n if (groupField) {\n const expansion = this.opts.expandedGroups();\n const expandedLabels = expansion.field === groupField\n ? expansion.labels\n : new Set<string>();\n const filters = control.filters();\n const sortEntries = this.opts.serverSideFiltering()\n ? []\n : this.sortEntries(filters);\n const items = buildGroupedItems(\n rows,\n indices,\n groupField,\n this.columnMap(),\n sortEntries,\n expandedLabels,\n this.opts.locale(),\n this.opts.visibleColDefs(),\n control.aggregates(),\n );\n this.appendAddRow(items);\n return items;\n }\n }\n\n // Flat mode: optionally interleave a master/detail panel item after each expanded row.\n const expandedDetail = this.opts.masterDetail?.() ? this.opts.expandedDetailIds?.() : null;\n const items: GridItem[] = [];\n for (const originalIndex of indices) {\n const row = rows[originalIndex];\n items.push({ row, originalIndex });\n if (expandedDetail?.has(originalIndex)) items.push({ detailFor: originalIndex, row });\n }\n this.appendAddRow(items);\n return items;\n });\n\n /** Returns sorted fields after applying the configured sorting mode. */\n effectiveSortOrder(): string[] {\n const option = this.opts.sortOption();\n if (option === 'none') return [];\n const order = this.opts.control()?.sortOrder() ?? [];\n return option === 'single' ? order.slice(-1) : order;\n }\n\n private columnMap(): Map<string, ColDef> {\n return new Map(this.opts.colDefs().map(col => [col.field, col]));\n }\n\n private sortEntries(filters: Record<string, ColumnFilter>): [string, ColumnFilter][] {\n return this.effectiveSortOrder()\n .map(field => [field, filters[field]] as [string, ColumnFilter])\n .filter(([, filter]) => !!filter?.sort);\n }\n\n private appendTreeDetailItems(\n items: GridItem[],\n rows: Record<string, unknown>[],\n treeConfig: AgridTreeConfig,\n ): GridItem[] {\n const expandedDetail = this.opts.masterDetail?.() ? this.opts.expandedDetailIds?.() : null;\n if (!expandedDetail?.size) return items;\n\n const parentIds = !isPathTreeConfig(treeConfig)\n ? new Set(\n rows\n .map(row => treeConfig.getParentId(row))\n .filter((id): id is string | number => id !== null && id !== undefined),\n )\n : new Set<string | number>();\n const result: GridItem[] = [];\n for (const item of items) {\n result.push(item);\n if (\n item\n && typeof item === 'object'\n && 'originalIndex' in item\n && (\n isPathTreeConfig(treeConfig)\n || !parentIds.has(treeConfig.getId(item.row))\n )\n && expandedDetail.has(item.originalIndex)\n ) {\n result.push({ detailFor: item.originalIndex, row: item.row });\n }\n }\n return result;\n }\n\n private appendAddRow(items: GridItem[]): void {\n if (this.opts.allowAddRows() && !this.opts.autoAddRows()) items.push(null);\n }\n}\n","import { DestroyRef, Signal, WritableSignal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { AgridControl, HistoryEntry } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridEditEvent, GridItem } from '../agrid.types';\nimport { isDataRowItem } from '../agrid.utils';\n\n/** Rectangular bounds in projected row and visible column coordinates. @internal */\nexport type VisibleCellBounds = {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridRangeController}. @internal */\nexport interface AgridRangeControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n isCellEditable: (col: ColDef, originalIndex: number) => boolean;\n cancelEdit: () => void;\n findDisplayIndex: (originalIndex: number) => number;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n onCellEdit: (event: GridEditEvent) => void;\n}\n\n/** Owns cell-range calculations and fill-handle drag/application behavior. @internal */\nexport class AgridRangeController {\n readonly fillPreviewBounds = signal<VisibleCellBounds | null>(null);\n private fillDragSource: VisibleCellBounds | null = null;\n\n constructor(\n private readonly opts: AgridRangeControllerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this.cancelFill());\n }\n\n /** Extends the current range focus to a source row and visible column. */\n extendTo(rowIndex: number, colIndex: number): void {\n const selected = this.opts.selectedCell();\n const anchor = this.opts.selectedRange()?.anchor ?? selected ?? { rowIndex, colIndex };\n const focus = { rowIndex, colIndex };\n this.opts.selectedCell.set(focus);\n this.opts.selectedRange.set({ anchor, focus });\n }\n\n /** Returns selected range bounds in projected display coordinates. */\n getVisibleRangeBounds(): VisibleCellBounds | null {\n const range = this.opts.selectedRange();\n if (!range) return null;\n const anchorDisplayIndex = this.opts.findDisplayIndex(range.anchor.rowIndex);\n const focusDisplayIndex = this.opts.findDisplayIndex(range.focus.rowIndex);\n if (anchorDisplayIndex < 0 || focusDisplayIndex < 0) return null;\n return {\n rowStart: Math.min(anchorDisplayIndex, focusDisplayIndex),\n rowEnd: Math.max(anchorDisplayIndex, focusDisplayIndex),\n colStart: Math.min(range.anchor.colIndex, range.focus.colIndex),\n colEnd: Math.max(range.anchor.colIndex, range.focus.colIndex),\n };\n }\n\n /** Returns range bounds, falling back to the active cell. */\n getActiveSelectionBounds(): VisibleCellBounds | null {\n const range = this.getVisibleRangeBounds();\n if (range) return range;\n const selected = this.opts.selectedCell();\n if (!selected) return null;\n const displayIndex = this.opts.findDisplayIndex(selected.rowIndex);\n if (displayIndex < 0) return null;\n return {\n rowStart: displayIndex,\n rowEnd: displayIndex,\n colStart: selected.colIndex,\n colEnd: selected.colIndex,\n };\n }\n\n /** Returns whether a cell is inside the selected range. */\n isRangeSelected(originalIndex: number, colIndex: number): boolean {\n const range = this.getVisibleRangeBounds();\n if (!range) return false;\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n return displayIndex >= range.rowStart && displayIndex <= range.rowEnd\n && colIndex >= range.colStart && colIndex <= range.colEnd;\n }\n\n /** Returns whether a cell owns the selection's fill handle. */\n isFillHandleCell(originalIndex: number, colIndex: number): boolean {\n const bounds = this.getActiveSelectionBounds();\n if (!bounds) return false;\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n return displayIndex === bounds.rowEnd && colIndex === bounds.colEnd;\n }\n\n /** Returns whether a cell is inside the pending fill extension. */\n isFillPreviewCell(originalIndex: number, colIndex: number): boolean {\n const source = this.fillDragSource;\n const target = this.fillPreviewBounds();\n if (!source || !target) return false;\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n const insideTarget = displayIndex >= target.rowStart && displayIndex <= target.rowEnd\n && colIndex >= target.colStart && colIndex <= target.colEnd;\n const insideSource = displayIndex >= source.rowStart && displayIndex <= source.rowEnd\n && colIndex >= source.colStart && colIndex <= source.colEnd;\n return insideTarget && !insideSource;\n }\n\n /** Starts a fill-handle drag from the active selection corner. */\n startFill(event: PointerEvent, originalIndex: number, colIndex: number): void {\n if (event.button !== 0 || !this.isFillHandleCell(originalIndex, colIndex)) return;\n if (!this.isFillHandleHit(event)) return;\n const bounds = this.getActiveSelectionBounds();\n if (!bounds) return;\n event.preventDefault();\n event.stopPropagation();\n this.opts.cancelEdit();\n this.fillDragSource = bounds;\n this.fillPreviewBounds.set(null);\n this.browser.addDocumentListener('pointermove', this.fillDragMove);\n this.browser.addDocumentListener('pointerup', this.fillDragUp);\n this.browser.addDocumentListener('pointercancel', this.fillDragCancel);\n }\n\n /** Repeats source values across the target range as one history operation. */\n applyFill(source: VisibleCellBounds, target: VisibleCellBounds): void {\n const items = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const sourceRows = this.getDataDisplayIndices(source.rowStart, source.rowEnd);\n const targetRows = this.getDataDisplayIndices(target.rowStart, target.rowEnd);\n if (sourceRows.length === 0 || targetRows.length === 0) return;\n\n const sourceValues = sourceRows.map(displayIndex => {\n const item = items[displayIndex];\n return isDataRowItem(item)\n ? cols.slice(source.colStart, source.colEnd + 1).map(col => item.row[col.field])\n : [];\n });\n\n let lastPosition: CellPosition | null = null;\n const historyEntries: HistoryEntry[] = [];\n for (let rowOffset = 0; rowOffset < targetRows.length; rowOffset++) {\n const displayIndex = targetRows[rowOffset];\n const item = items[displayIndex];\n if (!isDataRowItem(item)) continue;\n for (let colIndex = target.colStart; colIndex <= target.colEnd; colIndex++) {\n const insideSource = displayIndex >= source.rowStart && displayIndex <= source.rowEnd\n && colIndex >= source.colStart && colIndex <= source.colEnd;\n if (insideSource) continue;\n const col = cols[colIndex];\n if (!col || !this.opts.isCellEditable(col, item.originalIndex)) continue;\n const sourceRowIndex = rowOffset % sourceValues.length;\n const sourceRowValues = sourceValues[sourceRowIndex];\n if (sourceRowValues.length === 0) continue;\n const sourceColIndex = (colIndex - source.colStart) % sourceRowValues.length;\n const oldValue = this.opts.dataSource().getRow(item.originalIndex)[col.field];\n const newValue = sourceRowValues[sourceColIndex];\n if (oldValue === newValue) continue;\n\n this.opts.dataSource().patchRow(item.originalIndex, { [col.field]: newValue });\n historyEntries.push({\n rowIndex: item.originalIndex,\n field: col.field,\n oldValue,\n newValue,\n });\n this.opts.onCellEdit({\n position: { rowIndex: item.originalIndex, colIndex },\n field: col.field,\n oldValue,\n newValue,\n });\n lastPosition = { rowIndex: item.originalIndex, colIndex };\n }\n }\n\n this.opts.control()?.pushEditBatch(historyEntries);\n const targetItem = items[target.rowEnd];\n if (isDataRowItem(targetItem)) {\n this.opts.selectedCell.set({ rowIndex: targetItem.originalIndex, colIndex: target.colEnd });\n this.opts.selectedRange.set({\n anchor: this.positionFromVisibleCell(source.rowStart, source.colStart),\n focus: { rowIndex: targetItem.originalIndex, colIndex: target.colEnd },\n });\n } else if (lastPosition) {\n this.opts.selectedCell.set(lastPosition);\n }\n }\n\n private readonly fillDragMove = (event: PointerEvent): void => {\n const source = this.fillDragSource;\n if (!source) return;\n const target = this.getHoveredCellPosition(event.clientX, event.clientY);\n if (!target) {\n this.fillPreviewBounds.set(null);\n return;\n }\n const targetDisplayIndex = this.opts.findDisplayIndex(target.rowIndex);\n if (targetDisplayIndex < 0) {\n this.fillPreviewBounds.set(null);\n return;\n }\n const rowEnd = Math.max(source.rowEnd, targetDisplayIndex);\n const colEnd = Math.max(source.colEnd, target.colIndex);\n if (rowEnd === source.rowEnd && colEnd === source.colEnd) {\n this.fillPreviewBounds.set(null);\n return;\n }\n this.fillPreviewBounds.set({\n rowStart: source.rowStart,\n rowEnd,\n colStart: source.colStart,\n colEnd,\n });\n this.opts.scrollToCell(rowEnd, colEnd);\n };\n\n private readonly fillDragUp = (): void => {\n this.stopFillListeners();\n const source = this.fillDragSource;\n const target = this.fillPreviewBounds();\n this.fillDragSource = null;\n this.fillPreviewBounds.set(null);\n if (source && target) this.applyFill(source, target);\n };\n\n private readonly fillDragCancel = (): void => this.cancelFill();\n\n private cancelFill(): void {\n this.stopFillListeners();\n this.fillDragSource = null;\n this.fillPreviewBounds.set(null);\n }\n\n private stopFillListeners(): void {\n this.browser.removeDocumentListener('pointermove', this.fillDragMove);\n this.browser.removeDocumentListener('pointerup', this.fillDragUp);\n this.browser.removeDocumentListener('pointercancel', this.fillDragCancel);\n }\n\n private isFillHandleHit(event: PointerEvent): boolean {\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n return event.clientX >= rect.right - 8 && event.clientY >= rect.bottom - 8;\n }\n\n private getHoveredCellPosition(x: number, y: number): CellPosition | null {\n for (const element of this.browser.elementsFromPoint(x, y)) {\n const cell = (element as HTMLElement)\n .closest<HTMLElement>('agrid-cell[data-cell-row][data-cell-col]');\n if (!cell) continue;\n const rowIndex = Number(cell.dataset['cellRow']);\n const colIndex = Number(cell.dataset['cellCol']);\n if (Number.isFinite(rowIndex) && Number.isFinite(colIndex)) {\n return { rowIndex, colIndex };\n }\n }\n return null;\n }\n\n private getDataDisplayIndices(start: number, end: number): number[] {\n const items = this.opts.filteredItems();\n const indices: number[] = [];\n for (let displayIndex = start; displayIndex <= end; displayIndex++) {\n if (isDataRowItem(items[displayIndex])) indices.push(displayIndex);\n }\n return indices;\n }\n\n private positionFromVisibleCell(displayIndex: number, colIndex: number): CellPosition {\n const item = this.opts.filteredItems()[displayIndex];\n if (isDataRowItem(item)) return { rowIndex: item.originalIndex, colIndex };\n return this.opts.selectedCell() ?? { rowIndex: 0, colIndex };\n }\n}\n","import { Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridDataSource } from '../agrid-datasource';\nimport {\n CellPosition,\n ColDef,\n GridItem,\n RecordEditEvent,\n RowClickEvent,\n RowSelectEvent,\n} from '../agrid.types';\nimport { buildSelectionRange, getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/**\n * Whether a pointer event originated inside an editable form control. Used to avoid calling\n * `preventDefault()` on a row pointerdown, which would otherwise cancel native text selection\n * (and caret placement) inside an active cell editor.\n */\nfunction isEditableEventTarget(target: EventTarget | null): boolean {\n return target instanceof HTMLInputElement\n || target instanceof HTMLTextAreaElement\n || target instanceof HTMLSelectElement\n || (target instanceof HTMLElement && target.isContentEditable);\n}\n\n/** Dependencies and callbacks required by {@link AgridRowController}. @internal */\nexport interface AgridRowControllerOptions {\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n markedRowIndices: Signal<ReadonlySet<number>>;\n rowSelection: Signal<'none' | 'single' | 'multi'>;\n selectedCell: WritableSignal<CellPosition | null>;\n editingCell: Signal<CellPosition | null>;\n insertRowAt: (index: number) => void;\n startDragSelect: (originalIndex: number) => void;\n onRowSelect: (event: RowSelectEvent | null) => void;\n onRowClick: (event: RowClickEvent) => void;\n onRowRemoved: (event: Pick<RecordEditEvent, 'index' | 'data'>) => void;\n onEditRowRemoved: (originalIndex: number) => void;\n closeFilterMenu: () => void;\n closeGroupActionsMenu: () => void;\n}\n\n/** Screen position and row targeted by the row context menu. @internal */\nexport type AgridRowContextMenu = { x: number; y: number; rowIndex: number };\n\n/** Screen position and cell data targeted by the cell context menu. @internal */\nexport type AgridCellContextMenu = {\n x: number;\n y: number;\n rowIndex: number;\n colIndex: number;\n field: string;\n value: unknown;\n row: Record<string, unknown>;\n};\n\n/**\n * Owns row selection, row/cell context menus, and row-level operations.\n * @internal\n */\nexport class AgridRowController {\n readonly contextMenu = signal<AgridRowContextMenu | null>(null);\n readonly cellContextMenu = signal<AgridCellContextMenu | null>(null);\n readonly selectedIndices = signal<Set<number>>(new Set());\n readonly selectedRowIndices: Signal<ReadonlySet<number>> =\n this.selectedIndices.asReadonly() as Signal<ReadonlySet<number>>;\n readonly selectedRowIndex = computed<number | null>(() => {\n const selected = this.selectedIndices();\n return selected.size > 0 ? [...selected][0] : null;\n });\n\n private selectionPivot: number | null = null;\n\n constructor(\n private readonly opts: AgridRowControllerOptions,\n private readonly browser = new AgridBrowserAdapter(),\n ) {}\n\n /** Returns whether the data-source row is currently selected. */\n isRowSelected(originalIndex: number): boolean {\n return this.selectedIndices().has(originalIndex);\n }\n\n /** Returns whether a virtual item is a selected data row. */\n isPinnedPaneRowSelected(item: GridItem): boolean {\n return isDataRowItem(item) && this.isRowSelected(item.originalIndex);\n }\n\n /** Clears all selected rows and emits the selection change. */\n clearSelection(): void {\n if (this.selectedIndices().size === 0) return;\n this.selectedIndices.set(new Set());\n this.opts.onRowSelect(null);\n }\n\n /** Applies pointer selection semantics for the configured selection mode. */\n selectFromPointer(event: PointerEvent, originalIndex: number, allowDragSelect: boolean): void {\n const mode = this.opts.rowSelection();\n if (mode === 'none' || event.button !== 0) return;\n\n if (mode === 'single') {\n const already = this.selectedIndices().has(originalIndex);\n this.selectedIndices.set(already ? new Set() : new Set([originalIndex]));\n this.emitSelection();\n return;\n }\n\n const ctrl = event.ctrlKey || event.metaKey;\n const shift = event.shiftKey;\n\n if (ctrl) {\n const next = new Set(this.selectedIndices());\n if (next.has(originalIndex)) next.delete(originalIndex);\n else next.add(originalIndex);\n this.selectedIndices.set(next);\n this.selectionPivot = originalIndex;\n this.emitSelection();\n } else if (shift && this.selectionPivot !== null) {\n this.selectedIndices.set(\n buildSelectionRange(this.selectionPivot, originalIndex, this.opts.filteredItems()),\n );\n this.emitSelection();\n } else {\n if (!isEditableEventTarget(event.target)) event.preventDefault();\n this.selectedIndices.set(new Set([originalIndex]));\n this.selectionPivot = originalIndex;\n\n if (allowDragSelect) this.opts.startDragSelect(originalIndex);\n else this.emitSelection();\n }\n }\n\n /** Emits a row click unless a cell edit is active. */\n clickRow(item: { row: Record<string, unknown>; originalIndex: number }): void {\n if (this.opts.editingCell()) return;\n this.opts.onRowClick({ row: item.row, originalIndex: item.originalIndex });\n }\n\n /** Opens the row context menu at the pointer position. */\n openRowContextMenu(event: MouseEvent, originalIndex: number): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenu.set({ x: event.clientX, y: event.clientY, rowIndex: originalIndex });\n }\n\n /** Closes the row context menu. */\n closeContextMenu(): void {\n this.contextMenu.set(null);\n }\n\n /** Opens the cell context menu and closes conflicting menus. */\n openCellContextMenu(\n event: MouseEvent,\n rowIndex: number,\n colIndex: number,\n col: ColDef,\n row: Record<string, unknown>,\n ): void {\n event.preventDefault();\n event.stopPropagation();\n this.closeContextMenu();\n this.opts.closeFilterMenu();\n this.opts.closeGroupActionsMenu();\n this.cellContextMenu.set({\n x: event.clientX,\n y: event.clientY,\n rowIndex,\n colIndex,\n field: col.field,\n value: row[col.field],\n row,\n });\n }\n\n /** Closes the cell context menu. */\n closeCellContextMenu(): void {\n this.cellContextMenu.set(null);\n }\n\n /** Copies a cell plus the same field from marked rows to the clipboard. */\n copyCellToClipboard(originalIndex: number, col: ColDef): void {\n const rows = this.opts.dataSource().rows();\n const text = this.copyIndices(originalIndex)\n .map(index => getDisplayForField(col, rows[index]?.[col.field], this.opts.locale()))\n .join('\\n');\n void this.browser.writeClipboard(text);\n this.closeCellContextMenu();\n }\n\n /** Copies a row plus all marked rows as tab-separated text. */\n copyRowToClipboard(originalIndex: number): void {\n const rows = this.opts.dataSource().rows();\n const cols = this.opts.visibleColDefs();\n const text = this.copyIndices(originalIndex)\n .map(index => cols\n .map(col => getDisplayForField(col, rows[index]?.[col.field], this.opts.locale()))\n .join('\\t'))\n .join('\\n');\n void this.browser.writeClipboard(text);\n this.closeCellContextMenu();\n }\n\n private copyIndices(primaryIndex: number): number[] {\n const length = this.opts.dataSource().length;\n const indices = [primaryIndex];\n for (const index of [...this.opts.markedRowIndices()].sort((a, b) => a - b)) {\n if (index !== primaryIndex && index >= 0 && index < length) indices.push(index);\n }\n return indices;\n }\n\n /** Inserts a row through the grid's central insertion callback. */\n insertRowAt(index: number): void {\n this.opts.insertRowAt(index);\n this.closeCellContextMenu();\n }\n\n /** Removes a row and reconciles selection and editing indices. */\n deleteRow(originalIndex: number): void {\n const removedRow = this.opts.dataSource().getRow(originalIndex);\n this.opts.dataSource().removeRow(originalIndex);\n\n const selectedCell = this.opts.selectedCell();\n if (selectedCell?.rowIndex === originalIndex) {\n this.opts.selectedCell.set(null);\n } else if (selectedCell && selectedCell.rowIndex > originalIndex) {\n this.opts.selectedCell.update(cell => cell ? { ...cell, rowIndex: cell.rowIndex - 1 } : null);\n }\n\n this.opts.onEditRowRemoved(originalIndex);\n\n if (this.selectedIndices().has(originalIndex)) {\n this.selectedIndices.update(indices => {\n const next = new Set(indices);\n next.delete(originalIndex);\n return next;\n });\n this.emitSelection();\n }\n this.contextMenu.set(null);\n this.opts.onRowRemoved({ index: originalIndex, data: removedRow });\n }\n\n /** Emits the current selected rows, or `null` when selection is empty. */\n emitSelection(): void {\n const indices = this.selectedIndices();\n if (indices.size === 0) {\n this.opts.onRowSelect(null);\n return;\n }\n const rows = this.opts.dataSource().rows();\n this.opts.onRowSelect({\n rows: [...indices].map(index => ({ row: rows[index], originalIndex: index })),\n });\n }\n}\n","import { Signal, computed, signal } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { AgridSidebarEdit } from './agrid-sidebar.component';\nimport { ColDef, GridEditEvent, ValueOption } from '../agrid.types';\nimport { coerceDateInputValue } from '../agrid.utils';\n\n/** Dependencies and callbacks required by {@link AgridSidebarController}. @internal */\nexport interface AgridSidebarControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n selectedRowIndex: Signal<number | null>;\n autoOpenDetail: Signal<boolean>;\n useSidebarEditor: Signal<boolean>;\n isCellEditable: (col: ColDef, originalIndex: number) => boolean;\n onFieldChange: (event: GridEditEvent) => void;\n onCellEdit: (event: GridEditEvent) => void;\n /** Called when a `ColDef.validate` hook rejects a sidebar value. */\n onValidationFailed: (event: { rowIndex: number; field: string; value: unknown; message: string }) => void;\n}\n\n/** Owns sidebar visibility, selected-row projection, and detail-panel edits. @internal */\nexport class AgridSidebarController {\n readonly open = signal(false);\n readonly tab = signal<'columns' | 'detail'>('columns');\n readonly row = computed<Record<string, unknown> | null>(() => {\n const index = this.opts.selectedRowIndex();\n return index === null ? null : this.opts.dataSource().rows()[index] ?? null;\n });\n readonly hiddenColumns = computed<ReadonlySet<string>>(\n () => this.opts.control()?.hiddenColumns() ?? new Set<string>(),\n );\n /** Per-field validation messages for rejected sidebar edits (`field → message`). */\n readonly validationErrors = signal<Record<string, string>>({});\n\n constructor(private readonly opts: AgridSidebarControllerOptions) {}\n\n /** Remove the stored validation message for one field, if any. */\n private clearFieldError(field: string): void {\n if (!(field in this.validationErrors())) return;\n this.validationErrors.update(errors => {\n const next = { ...errors };\n delete next[field];\n return next;\n });\n }\n\n /** Opens the detail tab when automatic detail display is enabled. */\n syncAutoOpen(): void {\n if (this.opts.autoOpenDetail() && this.opts.selectedRowIndex() !== null) {\n this.open.set(true);\n this.tab.set('detail');\n }\n }\n\n /** Toggles sidebar visibility without changing the active tab. */\n toggle(): void {\n this.open.update(value => !value);\n }\n\n /** Opens the sidebar. */\n openSidebar(): void {\n this.open.set(true);\n }\n\n /** Closes the sidebar. */\n closeSidebar(): void {\n this.open.set(false);\n }\n\n /** Selects a tab, or closes the sidebar when selecting its active tab. */\n selectTab(tab: 'columns' | 'detail'): void {\n if (this.open() && this.tab() === tab) {\n this.open.set(false);\n } else {\n this.tab.set(tab);\n this.open.set(true);\n }\n }\n\n /** Commits an edit emitted by the sidebar component. */\n edit(event: AgridSidebarEdit): void {\n this.commitEdit(event.field, event.col, event.value);\n }\n\n /** Returns the currently selected data-source row index. */\n selectedRowIndex(): number | null {\n return this.opts.selectedRowIndex();\n }\n\n /** Coerces and commits a sidebar field value to the selected row. */\n commitEdit(field: string, col: ColDef, stringValue: string): void {\n const index = this.opts.selectedRowIndex();\n if (index === null) return;\n if (!this.opts.isCellEditable(col, index)) return;\n let newValue: unknown = stringValue;\n if (col.type === 'number') {\n newValue = stringValue === '' ? null : Number(stringValue);\n } else if (col.type === 'date') {\n newValue = coerceDateInputValue(\n stringValue,\n this.opts.dataSource().getRow(index)[field],\n );\n } else if (col.values?.length) {\n const option = col.values.find(value =>\n typeof value === 'string'\n ? value === stringValue\n : String((value as ValueOption).value) === stringValue,\n );\n newValue = option === undefined\n ? stringValue\n : typeof option === 'string' ? option : (option as ValueOption).value;\n }\n\n const row = this.opts.dataSource().getRow(index);\n const oldValue = row[field];\n if (oldValue === newValue) return;\n const message = col.validate?.(newValue as never, row as never) ?? null;\n if (message) {\n this.validationErrors.update(errors => ({ ...errors, [field]: message }));\n this.opts.onValidationFailed({ rowIndex: index, field, value: newValue, message });\n return;\n }\n this.clearFieldError(field);\n this.opts.dataSource().patchRow(index, { [field]: newValue });\n const colIndex = this.opts.visibleColDefs().findIndex(column => column.field === field);\n this.opts.control()?.pushEdit({ rowIndex: index, field, oldValue, newValue });\n const event = {\n position: { rowIndex: index, colIndex },\n field,\n oldValue,\n newValue,\n };\n this.opts.onFieldChange(event);\n if (!this.opts.useSidebarEditor()) {\n this.opts.onCellEdit(event);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\nimport { getDateInputValue, getDisplayForField, looksLikeDate, matchesInputMask } from '../agrid.utils';\nimport { ColDef, HeaderGroup } from '../agrid.types';\n\n/** Field edit emitted by the sidebar detail form. @internal */\nexport interface AgridSidebarEdit {\n /** Data field being edited. */\n field: string;\n /** Column definition controlling value coercion and editability. */\n col: ColDef;\n /** Raw string value produced by the form control. */\n value: string;\n}\n\n/** Display and edit model for one sidebar detail field. @internal */\nexport interface AgridSidebarDetailField {\n /** Human-readable field label. */\n label: string;\n /** Formatted read-only display value. */\n value: string;\n /** Original value stored in the row. */\n rawValue: unknown;\n /** String value supplied to the field editor. */\n inputValue: string;\n /** Whether the corresponding grid column is hidden. */\n hidden: boolean;\n /** Whether the field can be edited in the current grid state. */\n editable: boolean;\n /** Column definition associated with the field. */\n col: ColDef;\n}\n\n/** Visibility change requested from a grouped sidebar column entry. @internal */\nexport interface AgridSidebarGroupToggle {\n /** Fields belonging to the selected header group. */\n fields: string[];\n /** Requested visibility for every field in the group. */\n visible: boolean;\n}\n\n/** Grouped or standalone entry rendered in the sidebar column tree. @internal */\nexport type AgridSidebarColumnEntry =\n | { kind: 'column'; col: ColDef }\n | { kind: 'group'; id: string; label: string; columns: ColDef[] };\n\n/** Sidebar view for column visibility and selected-row details. @internal */\n@Component({\n selector: 'agrid-sidebar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-sidebar.component.html',\n styleUrl: './agrid-sidebar.component.css',\n})\nexport class AgridSidebarComponent {\n open = input<boolean>(false);\n activeTab = input<'columns' | 'detail'>('columns');\n columns = input<ColDef[]>([]);\n headerGroups = input<HeaderGroup[]>([]);\n row = input<Record<string, unknown> | null>(null);\n rowIndex = input<number | null>(null);\n hiddenColumns = input<ReadonlySet<string>>(new Set());\n locale = input<string | undefined>(undefined);\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n readonlyGrid = input<boolean>(false);\n useSidebarEditor = input<boolean>(false);\n isCellEditable = input<(col: ColDef, originalIndex: number) => boolean>(\n col => col.editable !== false,\n );\n /** Per-field validation messages (`field → message`) for rejected detail edits. */\n errors = input<Record<string, string>>({});\n\n close = output<void>();\n tabChange = output<'columns' | 'detail'>();\n toggleColumn = output<string>();\n toggleColumnGroup = output<AgridSidebarGroupToggle>();\n detailEdit = output<AgridSidebarEdit>();\n save = output<AgridSidebarDetailField[]>();\n\n readonly columnEntries = computed<AgridSidebarColumnEntry[]>(() => {\n const groupLabels = new Map(this.headerGroups().map(group => [group.id, group.label]));\n const entries: AgridSidebarColumnEntry[] = [];\n const groupedEntries = new Map<string, Extract<AgridSidebarColumnEntry, { kind: 'group' }>>();\n\n for (const col of this.columns()) {\n const groupId = col.group;\n const groupLabel = groupId ? groupLabels.get(groupId) : undefined;\n if (!groupId || !groupLabel) {\n entries.push({ kind: 'column', col });\n continue;\n }\n\n let entry = groupedEntries.get(groupId);\n if (!entry) {\n entry = { kind: 'group', id: groupId, label: groupLabel, columns: [] };\n groupedEntries.set(groupId, entry);\n entries.push(entry);\n }\n entry.columns.push(col);\n }\n\n return entries;\n });\n\n /** Whether every column in a group is currently visible. */\n isGroupVisible(columns: ColDef[]): boolean {\n const hidden = this.hiddenColumns();\n return columns.every(col => !hidden.has(col.field));\n }\n\n /** Whether a group contains both visible and hidden columns. */\n isGroupPartiallyVisible(columns: ColDef[]): boolean {\n const hidden = this.hiddenColumns();\n const visibleCount = columns.filter(col => !hidden.has(col.field)).length;\n return visibleCount > 0 && visibleCount < columns.length;\n }\n\n /** Emits a visibility request for all columns belonging to a group. */\n onGroupToggle(columns: ColDef[], event: Event): void {\n this.toggleColumnGroup.emit({\n fields: columns.map(col => col.field),\n visible: (event.target as HTMLInputElement).checked,\n });\n }\n\n /** Apply the row-aware input mask while preserving the sidebar's change-to-commit behavior. */\n onDetailMaskInput(field: AgridSidebarDetailField, event: Event): void {\n const input = event.target as HTMLInputElement;\n const row = this.row();\n if (row && field.col.inputMask && field.col.type !== 'number' && field.col.type !== 'date') {\n const mask = field.col.inputMask({\n row,\n value: field.rawValue,\n column: field.col,\n });\n if (mask && !matchesInputMask(input.value, mask)) {\n input.value = input.dataset['agridMaskValue'] ?? field.inputValue;\n return;\n }\n input.dataset['agridMaskValue'] = input.value;\n }\n }\n\n /** Forward the final sidebar value after native change/blur. */\n onDetailChange(field: AgridSidebarDetailField, event: Event): void {\n this.onDetailMaskInput(field, event);\n this.detailEdit.emit({\n field: field.col.field,\n col: field.col,\n value: (event.target as HTMLInputElement).value,\n });\n }\n\n readonly detailFields = computed<AgridSidebarDetailField[] | null>(() => {\n const row = this.row();\n if (!row) return null;\n const locale = this.locale();\n const readonlyGrid = this.readonlyGrid();\n const hiddenColumns = this.hiddenColumns();\n const rowIndex = this.rowIndex();\n return this.columns().map(col => {\n const rawValue = row[col.field];\n let inputValue = String(rawValue ?? '');\n if (col.type === 'date' || looksLikeDate(rawValue)) {\n inputValue = getDateInputValue(rawValue);\n }\n return {\n label: col.header,\n value: getDisplayForField(col, rawValue, locale),\n rawValue,\n inputValue,\n hidden: hiddenColumns.has(col.field),\n editable: !readonlyGrid && rowIndex !== null && this.isCellEditable()(col, rowIndex),\n col,\n };\n });\n });\n}\n","@if (open()) {\n <div class=\"ag-sidebar\" role=\"region\"\n [attr.aria-label]=\"activeTab() === 'columns' ? localeText().columns : localeText().detail\">\n <div class=\"ag-sidebar-header\">\n <span>{{ activeTab() === 'columns' ? localeText().columns : localeText().detail }}</span>\n <button class=\"ag-sidebar-close\" (click)=\"close.emit()\" [title]=\"localeText().close\"\n [attr.aria-label]=\"localeText().close\">✕</button>\n </div>\n\n @if (activeTab() === 'columns') {\n @for (entry of columnEntries(); track entry.kind === 'group' ? 'group-' + entry.id : 'column-' + entry.col.field) {\n @if (entry.kind === 'group') {\n <div class=\"ag-sidebar-group\">\n <label class=\"ag-sidebar-item ag-sidebar-group-label\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupVisible(entry.columns)\"\n [indeterminate]=\"isGroupPartiallyVisible(entry.columns)\"\n (change)=\"onGroupToggle(entry.columns, $event)\"\n />\n {{ entry.label }}\n </label>\n <div class=\"ag-sidebar-group-children\">\n @for (col of entry.columns; track col.field) {\n <label class=\"ag-sidebar-item ag-sidebar-group-child\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"!hiddenColumns().has(col.field)\"\n (change)=\"toggleColumn.emit(col.field)\"\n />\n {{ col.header }}\n </label>\n }\n </div>\n </div>\n } @else {\n <label class=\"ag-sidebar-item\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"!hiddenColumns().has(entry.col.field)\"\n (change)=\"toggleColumn.emit(entry.col.field)\"\n />\n {{ entry.col.header }}\n </label>\n }\n }\n } @else {\n @if (detailFields(); as fields) {\n @for (field of fields; track field.col.field) {\n <div class=\"ag-detail-field\">\n <span class=\"ag-detail-label\">\n {{ field.label }}\n @if (field.hidden) {\n <span class=\"ag-detail-hidden\">{{ localeText().hiddenColumn }}</span>\n }\n </span>\n @if (field.editable && field.col.values?.length) {\n <select\n class=\"ag-detail-input\"\n [class.ag-detail-input--invalid]=\"!!errors()[field.col.field]\"\n (change)=\"detailEdit.emit({\n field: field.col.field,\n col: field.col,\n value: $any($event.target).value\n })\"\n >\n @for (opt of field.col.values; track $index) {\n @if ($any(opt).value !== undefined) {\n <option [value]=\"$any(opt).value\" [selected]=\"$any(opt).value === field.rawValue\">\n {{ $any(opt).label }}\n </option>\n } @else {\n <option [value]=\"opt\" [selected]=\"opt === field.rawValue\">{{ opt }}</option>\n }\n }\n </select>\n } @else if (field.editable) {\n <input\n class=\"ag-detail-input\"\n [class.ag-detail-input--invalid]=\"!!errors()[field.col.field]\"\n [type]=\"field.col.type === 'number' ? 'number' : field.col.type === 'date' ? 'date' : 'text'\"\n [value]=\"field.inputValue\"\n (input)=\"onDetailMaskInput(field, $event)\"\n (change)=\"onDetailChange(field, $event)\"\n />\n } @else {\n <span class=\"ag-detail-value\">{{ field.value }}</span>\n }\n @if (errors()[field.col.field]; as msg) {\n <span class=\"ag-detail-error\" role=\"alert\">{{ msg }}</span>\n }\n </div>\n }\n @if (useSidebarEditor()) {\n <div class=\"ag-detail-field\">\n <button class=\"ag-button\" (click)=\"save.emit(fields)\">{{ localeText().save }}</button>\n </div>\n }\n } @else {\n <div class=\"ag-detail-empty\">{{ localeText().noRows }}</div>\n }\n }\n </div>\n}\n\n<div class=\"ag-sidebar-strip\">\n <button\n class=\"ag-sidebar-strip-btn\"\n [class.active]=\"open() && activeTab() === 'columns'\"\n [attr.aria-pressed]=\"open() && activeTab() === 'columns'\"\n (click)=\"tabChange.emit('columns')\"\n >{{ localeText().columns }}</button>\n <button\n class=\"ag-sidebar-strip-btn\"\n [class.active]=\"open() && activeTab() === 'detail'\"\n [attr.aria-pressed]=\"open() && activeTab() === 'detail'\"\n (click)=\"tabChange.emit('detail')\"\n >{{ localeText().detail }}</button>\n</div>\n","import { ListRange } from '@angular/cdk/collections';\nimport {\n CdkVirtualScrollViewport,\n VIRTUAL_SCROLL_STRATEGY,\n VirtualScrollStrategy,\n} from '@angular/cdk/scrolling';\nimport { Directive, OnChanges, forwardRef, input } from '@angular/core';\nimport { Observable, Subject, distinctUntilChanged } from 'rxjs';\n\n/** Pixels rendered above and below the viewport so scrolling does not reveal blank rows. */\nconst BUFFER_PX = 200;\n\n/**\n * A {@link VirtualScrollStrategy} that supports a different height per item instead of the single\n * fixed `itemSize` used by CDK's {@link FixedSizeVirtualScrollStrategy}.\n *\n * Item heights are supplied as a flat array (one entry per virtual item) and converted into a\n * prefix-sum offset table, so any row — a normal data row or a tall master/detail panel — can have\n * its own height while scroll position math stays O(log n) via binary search.\n *\n * When every item shares the same height (the common case with no detail rows open) the behavior\n * is equivalent to the fixed-size strategy, so the default code path is regression-safe.\n * @internal\n */\nexport class AgridVariableRowSizeStrategy implements VirtualScrollStrategy {\n private viewport: CdkVirtualScrollViewport | null = null;\n private sizes: number[] = [];\n /** Cumulative offsets; `offsets[i]` is the top of item `i`, `offsets[n]` is the total size. */\n private offsets: number[] = [0];\n\n private readonly indexChange = new Subject<number>();\n readonly scrolledIndexChange: Observable<number> = this.indexChange.pipe(distinctUntilChanged());\n\n attach(viewport: CdkVirtualScrollViewport): void {\n this.viewport = viewport;\n this.updateTotalContentSize();\n this.updateRenderedRange();\n }\n\n detach(): void {\n this.indexChange.complete();\n this.viewport = null;\n }\n\n /** Replace the per-item heights and re-measure. Called by the directive when inputs change. */\n updateItemSizes(sizes: number[]): void {\n this.sizes = sizes;\n const offsets = new Array<number>(sizes.length + 1);\n offsets[0] = 0;\n for (let i = 0; i < sizes.length; i++) offsets[i + 1] = offsets[i] + sizes[i];\n this.offsets = offsets;\n if (this.viewport) {\n this.updateTotalContentSize();\n this.updateRenderedRange();\n }\n }\n\n onContentScrolled(): void {\n this.updateRenderedRange();\n }\n\n onDataLengthChanged(): void {\n this.updateTotalContentSize();\n this.updateRenderedRange();\n }\n\n onContentRendered(): void {\n /* no-op: heights are supplied, not measured from the DOM */\n }\n\n onRenderedOffsetChanged(): void {\n /* no-op */\n }\n\n scrollToIndex(index: number, behavior: ScrollBehavior): void {\n if (!this.viewport) return;\n const clamped = Math.max(0, Math.min(index, this.sizes.length));\n this.viewport.scrollToOffset(this.offsets[clamped] ?? 0, behavior);\n }\n\n private get totalSize(): number {\n return this.offsets[this.offsets.length - 1] ?? 0;\n }\n\n private updateTotalContentSize(): void {\n this.viewport?.setTotalContentSize(this.totalSize);\n }\n\n /** Largest item index whose top offset is `<= offset` (binary search over the prefix sums). */\n private indexAt(offset: number): number {\n const o = this.offsets;\n let lo = 0;\n let hi = o.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (o[mid] <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n }\n\n private updateRenderedRange(): void {\n const viewport = this.viewport;\n if (!viewport) return;\n\n const dataLength = viewport.getDataLength();\n const n = Math.min(this.sizes.length, dataLength);\n if (n === 0) {\n viewport.setRenderedRange({ start: 0, end: 0 });\n viewport.setRenderedContentOffset(0);\n this.indexChange.next(0);\n return;\n }\n\n const scrollOffset = viewport.measureScrollOffset();\n const viewportSize = viewport.getViewportSize();\n const start = Math.max(0, this.indexAt(scrollOffset - BUFFER_PX));\n const end = Math.min(n, this.indexAt(scrollOffset + viewportSize + BUFFER_PX) + 1);\n\n const range: ListRange = { start, end };\n viewport.setRenderedRange(range);\n viewport.setRenderedContentOffset(this.offsets[start] ?? 0);\n this.indexChange.next(this.indexAt(scrollOffset));\n }\n}\n\n/**\n * Wires {@link AgridVariableRowSizeStrategy} into a `cdk-virtual-scroll-viewport`.\n *\n * Apply alongside an `agridVariableRowSize` binding carrying the per-item height array. Replaces\n * the viewport's `[itemSize]` binding. The same height array is fed to every (left/body/right)\n * viewport so the panes stay row-aligned.\n * @internal\n */\n@Directive({\n selector: 'cdk-virtual-scroll-viewport[agridVariableRowSize]',\n providers: [\n {\n provide: VIRTUAL_SCROLL_STRATEGY,\n useFactory: (d: AgridVariableRowSizeDirective) => d.strategy,\n deps: [forwardRef(() => AgridVariableRowSizeDirective)],\n },\n ],\n})\nexport class AgridVariableRowSizeDirective implements OnChanges {\n /** Per-item heights in pixels, one entry per virtual-scroll item. */\n readonly itemSizes = input<number[]>([], { alias: 'agridVariableRowSize' });\n\n readonly strategy = new AgridVariableRowSizeStrategy();\n\n ngOnChanges(): void {\n this.strategy.updateItemSizes(this.itemSizes());\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Signal,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { AgridCellComponent } from './rendering/agrid-cell.component';\nimport { AgridBrowserAdapter } from './infrastructure/agrid-browser.adapter';\nimport { AgridClipboardHandler, CellRange } from './selection/agrid-clipboard.handler';\nimport { AgridColumnLayoutModel } from './columns/agrid-column-layout.model';\nimport { AgridColumnMenuComponent } from './columns/agrid-column-menu.component';\nimport { AgridColumnMenuController } from './columns/agrid-column-menu.controller';\nimport { AgridColumnReorderController } from './columns/agrid-column-reorder.controller';\nimport { AgridColumnSizingController } from './columns/agrid-column-sizing.controller';\nimport { AgridColumnStateService } from './columns/agrid-column-state.service';\nimport { AgridControl, FilterOperator } from './agrid-control';\nimport { AgridDataSource } from './agrid-datasource';\nimport { AgridDragHandler } from './rows/agrid-drag.handler';\nimport { AgridEditController } from './editing/agrid-edit.controller';\nimport { AgridFindController } from './selection/agrid-find.controller';\nimport { AgridFindPanelComponent } from './selection/agrid-find-panel.component';\nimport { AgridGroupController } from './rows/agrid-group.controller';\nimport { AgridTreeController } from './rows/agrid-tree.controller';\nimport { AgridLocaleText, resolveAgridLocaleText, resolveLocale } from './agrid-localization';\nimport { AgridNavigationController } from './selection/agrid-navigation.controller';\nimport { AgridPresentationService } from './rendering/agrid-presentation.service';\nimport { AgridMenuBarComponent } from './rendering/agrid-menu-bar.component';\nimport { AgridProvider } from './agrid-provider';\nimport { AgridProjectionModel } from './rows/agrid-projection.model';\nimport { AgridRangeController } from './selection/agrid-range.controller';\nimport { AgridCellContextMenu, AgridRowController } from './rows/agrid-row.controller';\nimport { AgridSidebarController } from './editing/agrid-sidebar.controller';\nimport {\n AgridSidebarComponent,\n AgridSidebarDetailField,\n AgridSidebarEdit,\n} from './editing/agrid-sidebar.component';\nimport {\n isDataRowItem as isDataRowItemFn,\n isDetailRowItem as isDetailRowItemFn,\n isGroupHeaderItem as isGroupHeaderItemFn,\n isPathTreeNodeItem as isPathTreeNodeItemFn,\n isPathTreeConfig,\n isTreeRowItem as isTreeRowItemFn,\n pathTreeNodeId,\n} from './agrid.utils';\nimport { AgridVariableRowSizeDirective } from './infrastructure/agrid-variable-row-size.strategy';\nimport {\n AgridField, AgridMenuBarContext, AgridMenuBarItem, AgridMenuBarMenuItem, AgridMenuBarState,\n CellContextMenuItem, CellInfoEvent, CellPosition, ColDef, DetailRowItem, FilterChangeEvent, GridEditEvent,\n GridItem, GroupAction, NewRecord, PageChangeEvent, PathTreeNodeItem, RecordEditEvent, RowClickEvent,\n RowReorderEvent, RowSelectEvent, RowUpdateEvent, SortChangeEvent, TreeNodeClickEvent, ValidationFailedEvent,\n} from './agrid.types';\n\n// Re-export for backward compatibility with existing imports of GridItem from this file.\nexport type { GridItem };\n\n/**\n * Excel-like data grid for Angular 21.\n *\n * ## Minimal setup\n * ```html\n * <agrid [provider]=\"gridProvider\" />\n * ```\n *\n * ### Keyboard shortcuts\n * | Key | Action |\n * |-----|--------|\n * | Arrow keys | Move selection |\n * | Tab / Shift+Tab | Move right / left (wraps rows) |\n * | Enter | Enter edit mode |\n * | Ctrl/Cmd+Enter | Toggle an expandable tree node |\n * | F2 | Enter edit mode |\n * | Printable key | Enter edit mode with seeded character |\n * | Escape | Close any open menu or cancel edit |\n * | Tab / Enter (while editing) | Commit and move according to navigation settings |\n */\n@Component({\n selector: 'agrid',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ScrollingModule,\n NgTemplateOutlet,\n AgridVariableRowSizeDirective,\n AgridCellComponent,\n AgridMenuBarComponent,\n AgridColumnMenuComponent,\n AgridFindPanelComponent,\n AgridSidebarComponent,\n ],\n templateUrl: './agrid.component.html',\n styleUrl: './agrid.component.css',\n host: {\n '[class.ag-zebra]': 'zebraStripes()',\n '[style.min-height]': 'minHeight()',\n '[style.max-height]': 'maxHeight()',\n },\n})\nexport class AgridComponent<T extends object = any> {\n\n // ── Inputs ───────────────────────────────────────────────────────────────────\n\n /** Grid provider containing columns, data source, control, and options. */\n provider = input<AgridProvider<T>>(new AgridProvider<T>());\n\n // All display / behaviour options are read from the provider.\n readonly rowHeight = computed(() => this.provider().rowHeight);\n readonly minHeight = computed(() => this.provider().minHeight);\n readonly maxHeight = computed(() => this.provider().maxHeight);\n readonly allowAddRows = computed(() => this.provider().allowAddRows);\n readonly autoAddRows = computed(() => this.provider().autoAddRows());\n readonly enableRowMarking = computed(() => this.provider().enableRowMarking);\n readonly showControlColumn = computed(() =>\n this.provider().showControlColumn || this.enableRowMarking() || this.masterDetail()\n );\n readonly controlColumnWidth = computed(() => this.enableRowMarking() ? 48 : 24);\n readonly showSidebar = computed(() => this.provider().showSidebar);\n readonly autoOpenDetail = computed(() => this.provider().autoOpenDetail);\n readonly serverSideFiltering = computed(() => this.provider().serverSideFiltering);\n readonly filterDebounceMs = computed(() => this.provider().filterDebounceMs);\n readonly enableQuickFilter = computed(() => this.provider().enableQuickFilter);\n readonly menuBarItems = computed(() => this.provider().menuBarItems);\n readonly quickFilterValue = computed(() => this.control()?.quickFilter() ?? '');\n readonly sortOption = computed(() => this.provider().sortOption);\n readonly rowSelection = computed(() => this.provider().rowSelection);\n readonly enterEditAction = computed(() => this.provider().enterEditAction);\n readonly groupDescription = computed(() => this.provider().groupDescription);\n readonly groupActions = computed(() => this.provider().groupActions);\n readonly cellMenuItems = computed(() => this.provider().cellMenuItems);\n readonly headerGroups = computed(() => this.provider().headerGroups);\n readonly treeConfig = computed(() => this.provider().treeConfig);\n readonly zebraStripes = computed(() => this.provider().zebraStripes);\n readonly showChangedCellIndicator = computed(\n () => this.provider().showChangedCellIndicator,\n );\n readonly confirmRowDelete = computed(() => this.provider().confirmRowDelete);\n readonly readonlyGrid = computed(() => this.provider().readonlyGrid());\n readonly loading = computed(() => this.provider().loading());\n readonly emptyText = computed(() => this.provider().emptyText);\n readonly useSidebarEditor = computed(() => this.provider().useSidebarEditor);\n\n /** Host callback for per-row CSS classes, or `undefined`. */\n readonly rowClassFn = computed(() => this.provider().getRowClass as\n | ((params: { row: Record<string, unknown>; index: number }) => string)\n | undefined);\n /** Host callback designating pinned rows, or `undefined`. */\n readonly pinRowFn = computed(() => this.provider().pinRow as\n | ((row: Record<string, unknown>, index: number) => 'top' | 'bottom' | undefined)\n | undefined);\n\n /**\n * Effective pin resolver fed to the projection: a runtime UI override wins (including an explicit\n * `null` unpin), otherwise the provider `pinRow` predicate decides. Returns `undefined` when\n * neither pinning source is active, so the projection's pinning path stays off.\n */\n readonly effectivePinRow = computed(() => {\n const predicate = this.pinRowFn();\n const overrides = this._pinnedRows();\n if (!predicate && overrides.size === 0) return undefined;\n return (row: Record<string, unknown>, index: number): 'top' | 'bottom' | undefined => {\n const override = overrides.get(index);\n if (override !== undefined) return override ?? undefined;\n return predicate?.(row, index);\n };\n });\n /** Whether master/detail is enabled and applicable (flat rows or tree leaves; not grouped). */\n readonly masterDetail = computed(\n () => this.provider().masterDetail && !!this.provider().detailRenderer\n && !this.control()?.groupByField(),\n );\n /** Fixed detail-panel height in pixels. */\n readonly detailRowHeight = computed(() => this.provider().detailRowHeight);\n\n /** Column definitions from the active provider. */\n readonly colDefs = computed<ColDef[]>(\n () => this.provider().columns() as unknown as ColDef[],\n );\n\n /** Signal-based data container from the active provider. */\n readonly dataSource = computed<AgridDataSource>(() => this.provider().datasource);\n\n private readonly treeParentIds = computed(() => {\n const config = this.treeConfig();\n if (!config || isPathTreeConfig(config)) return new Set<string | number>();\n const ids = new Set<string | number>();\n for (const row of this.dataSource().rows()) {\n const parentId = config.getParentId(row as T);\n if (parentId !== null && parentId !== undefined) ids.add(parentId);\n }\n return ids;\n });\n\n /** Grid UI state container from the active provider. */\n readonly control = computed<AgridControl | null>(() => this.provider().control);\n\n /** Resolved locale code used for date formatting and built-in localization lookup. 'auto' is replaced with navigator.language. */\n readonly locale = computed<string>(() => resolveLocale(this.provider().options.locale));\n\n /** Resolved built-in locale text merged with provider customizations. */\n readonly localeText = computed<AgridLocaleText>(() =>\n resolveAgridLocaleText(this.provider().options.locale, this.provider().localizations)\n );\n\n /** Effective empty-state label. */\n readonly emptyTextLabel = computed<string>(() => this.emptyText() ?? this.localeText().noRows);\n\n // ── Outputs ──────────────────────────────────────────────────────────────────\n\n /** Emitted after the user commits a cell edit. */\n cellEdit = output<GridEditEvent<T>>();\n\n /**\n * Emitted after an edit changes a row.\n * Includes the row index, current data, provider, and data source.\n */\n recordEdit = output<RecordEditEvent<T>>();\n\n /** Emitted after a row is removed, with its former index and captured row data. */\n rowRemoved = output<RecordEditEvent<T>>();\n\n /** Emitted when the grid inserts a blank row. Use `dataSource.patchRow()` to populate it. */\n prepareAddRecord = output<NewRecord<T>>();\n\n /** Emitted when the user finishes dragging a row. Call `dataSource.moveRow()` to apply. */\n rowReorder = output<RowReorderEvent<T>>();\n\n /** Emitted when the row selection changes. `null` = selection cleared. */\n rowSelect = output<RowSelectEvent<T> | null>();\n\n rowDoubleClicked = output<RowClickEvent<T>>();\n\n /** Emitted when the user single-clicks a data row. */\n rowClick = output<RowClickEvent<T>>();\n\n /** Emitted when the user single-clicks a generated path-tree branch node. */\n treeNodeClick = output<TreeNodeClickEvent>();\n\n /** Emitted when the user double-clicks a generated path-tree branch node. */\n treeNodeDoubleClicked = output<TreeNodeClickEvent>();\n\n /**\n * Emitted once after a changed row is left during inline editing, or when the sidebar editor\n * save button is used.\n */\n rowChanged = output<RowUpdateEvent<T>>();\n /**\n * Emitted when the user navigates to a new page in **server-side pagination mode**\n * (i.e. when `AgridControl.totalRows` is greater than zero).\n * The host should fetch the indicated row slice and update the data source.\n */\n pageChange = output<PageChangeEvent>();\n\n /** Emitted when a header filter changes in server-side filtering mode. */\n filterChange = output<FilterChangeEvent>();\n\n /** Emitted when a column sort changes in server-side filtering mode. */\n sortChange = output<SortChangeEvent>();\n\n /**\n * Emitted (debounced) when the global quick-filter text changes in server-side filtering mode.\n * The host should refetch rows matching the text. Not emitted in client mode, where the grid\n * filters locally.\n */\n quickFilterChange = output<string>();\n\n /** Emitted when a `ColDef.validate` hook rejects a committed value (inline or sidebar). */\n validationFailed = output<ValidationFailedEvent>();\n\n /** Emitted when a column's optional cell information button is clicked. */\n cellInfo = output<CellInfoEvent<T>>();\n\n /** Emitted for every enabled menu-bar button or dropdown item, carrying its configured id. */\n menuBarAction = output<string>();\n\n // ── Public state ─────────────────────────────────────────────────────────────\n\n /** Currently focused cell, or `null`. */\n readonly selectedCell = signal<CellPosition | null>(null);\n\n /** Original index of the row awaiting delete confirmation, or `null`. */\n readonly pendingDeleteRow = signal<number | null>(null);\n\n /** Original indices of rows whose master/detail panel is currently expanded. */\n private readonly _expandedDetailIds = signal<Set<number>>(new Set());\n\n /**\n * Runtime per-row pin overrides set through the UI (keyed by original index). A `null` value\n * explicitly unpins a row that the `pinRow` predicate would otherwise pin. Merged with the\n * provider predicate by {@link effectivePinRow}.\n */\n private readonly _pinnedRows = signal<Map<number, 'top' | 'bottom' | null>>(new Map());\n\n private readonly markedIndices = signal<Set<number>>(new Set());\n\n /** Original datasource indices marked for inclusion in copy operations. */\n readonly markedRowIndices: Signal<ReadonlySet<number>> =\n this.markedIndices.asReadonly() as Signal<ReadonlySet<number>>;\n\n /** Horizontal position of the delete prompt inside the scrollable row. */\n readonly deleteConfirmationLeft = signal(0);\n\n /** Visible width available to the delete prompt. */\n readonly deleteConfirmationWidth = signal(0);\n\n /** Rectangular cell range selected by Shift+arrow or Shift+click. */\n readonly selectedRange = signal<CellRange | null>(null);\n\n /** @internal Stable callback passed to child components for row-aware editability checks. */\n readonly isCellEditableForRow = (col: ColDef, originalIndex: number): boolean =>\n this.isCellEditable(col, originalIndex);\n\n /** Fill-handle drag preview bounds, in visible row/column coordinates. */\n get fillPreviewBounds() { return this.rangeController.fillPreviewBounds; }\n\n /** Position of the cell in edit mode, or `null`. */\n get editingCell() { return this.editController.editingCell; }\n\n /** Draft value while editing — committed on Tab/Enter, discarded on Escape. */\n get currentDraft() { return this.editController.currentDraft; }\n\n /** Seed character typed to enter edit mode (e.g. pressing 'A'). */\n get editSeedChar() { return this.editController.editSeedChar; }\n\n /** Whether the active text editor should select all text when it opens. */\n get selectTextOnEdit() { return this.editController.selectTextOnEdit; }\n\n /** Toggle the sidebar open/closed. */\n toggleSidebar(): void { this.sidebarController.toggle(); }\n\n /** @internal */\n onSidebarStripClick(tab: 'columns' | 'detail'): void {\n this.sidebarController.selectTab(tab);\n }\n\n /** @internal */\n onSidebarDetailEdit(event: AgridSidebarEdit): void {\n this.sidebarController.edit(event);\n }\n\n /** @internal Commit an edit made via the detail panel. */\n commitDetailEdit(field: string, col: ColDef, stringValue: string): void {\n this.sidebarController.commitEdit(field, col, stringValue);\n }\n\n onSidebarDetailSave(_event: AgridSidebarDetailField[]): void {\n const originalIndex = this.sidebarController.selectedRowIndex();\n if (originalIndex === null) return;\n this.emitRowChanged(originalIndex);\n this.emitRecordEdit(originalIndex);\n this.sidebarController.closeSidebar();\n }\n\n /**\n * Download the currently visible, filtered rows as a CSV file.\n * Uses display values (ValueOption labels, formatters) and respects column visibility.\n * Group header rows are excluded — only data rows are exported.\n *\n * @param filename Output filename, defaults to `'export.csv'`.\n */\n exportCsv(filename = 'export.csv'): void {\n this.presentation.exportCsv(filename);\n }\n\n /** @internal */ goToFirstPage(): void { this.control()?.setPage(1); }\n /** @internal */ goToLastPage(): void { this.control()?.setPage(this.totalPages()); }\n /** @internal */ goToNextPage(): void { const c = this.control(); if (c) c.setPage(Math.min(c.currentPage() + 1, this.totalPages())); }\n /** @internal */ goToPrevPage(): void { const c = this.control(); if (c) c.setPage(Math.max(c.currentPage() - 1, 1)); }\n\n /** Resize every visible column to fit its header and current row values. */\n autosizeAllColumns(): void {\n this.columnSizing.autosizeAllColumns();\n }\n\n /**\n * Clears changed-cell markers after persistence succeeds.\n * Omit `originalIndex` to clear every marker; omit `fields` to clear the whole row.\n */\n clearChangedCells(originalIndex?: number, fields?: readonly string[]): void {\n if (originalIndex === undefined) {\n this.changedCells.set(new Set());\n return;\n }\n\n const fieldSet = fields ? new Set(fields) : null;\n this.changedCells.update(current => {\n const next = new Set(current);\n for (const key of current) {\n const marker = this.parseChangedCellKey(key);\n if (marker.rowIndex === originalIndex && (!fieldSet || fieldSet.has(marker.field))) {\n next.delete(key);\n }\n }\n return next;\n });\n }\n\n /** @internal Whether a cell has an unsaved-change marker. */\n isCellChanged(originalIndex: number, field: string): boolean {\n return this.changedCells().has(this.changedCellKey(originalIndex, field));\n }\n\n /** @internal Full display value for a cell — used as the `title` tooltip attribute. */\n getCellTitle(col: ColDef, value: unknown): string {\n return this.presentation.getCellTitle(col, value);\n }\n\n /** @internal Dynamic CSS class string for a cell from `ColDef.cellClass`. */\n getCellClass(col: ColDef, value: unknown, row: Record<string, unknown>): string {\n return this.presentation.getCellClass(col, value, row);\n }\n\n /** @internal Short symbol shown before the footer aggregate value. */\n getAggregateLabel(col: ColDef): string {\n return this.presentation.getAggregateLabel(col);\n }\n\n /** @internal Whether a column has a static or control-configured aggregate. */\n hasAggregate(col: ColDef): boolean {\n return this.presentation.hasAggregate(col);\n }\n\n /** @internal Formatted footer value — uses the column formatter when set, otherwise locale number. */\n getFooterDisplay(col: ColDef, value: unknown): string {\n return this.presentation.getFooterDisplay(col, value);\n }\n\n // ── Internal signals ─────────────────────────────────────────────────────────\n\n private readonly groupController = new AgridGroupController({\n control: this.control,\n groupDescription: this.groupDescription,\n });\n\n readonly treeController = new AgridTreeController();\n\n // ── Derived state ─────────────────────────────────────────────────────────────\n\n readonly allowRowReorder = computed(() =>\n (this.control()?.allowRowReorder() ?? false) && !this.control()?.groupByField()\n );\n\n /** `true` when there is a committed edit that can be undone (Ctrl+Z). */\n readonly canUndo = computed(() => this.control()?.canUndo() ?? false);\n\n /** `true` when there is a previously undone edit that can be re-applied (Ctrl+Y / Ctrl+Shift+Z). */\n readonly canRedo = computed(() => this.control()?.canRedo() ?? false);\n\n private readonly columnLayout = new AgridColumnLayoutModel({\n control: this.control,\n colDefs: this.colDefs,\n headerGroups: this.headerGroups,\n showControlColumn: this.showControlColumn,\n controlColumnWidth: this.controlColumnWidth,\n getColumnWidth: col => this.getColumnWidth(col),\n getColumnWidthToken: col => this.getColumnWidthToken(col),\n });\n\n /** Columns currently visible after hidden state, ordering, and pinning are applied. */\n readonly visibleColDefs = this.columnLayout.visibleColDefs;\n /** Columns currently pinned to the left in display order. */\n readonly pinnedColDefs = this.columnLayout.pinnedColDefs;\n /** Columns currently pinned to the right in display order. */\n readonly rightPinnedColDefs = this.columnLayout.rightPinnedColDefs;\n /** Columns rendered in the horizontally scrollable pane. */\n readonly scrollableColDefs = this.columnLayout.scrollableColDefs;\n readonly rightGridTemplateColumns = this.columnLayout.rightGridTemplateColumns;\n readonly rightPinnedPaneWidth = this.columnLayout.rightPinnedPaneWidth;\n readonly hasRightPinnedPane = this.columnLayout.hasRightPinnedPane;\n readonly hasPinnedPane = this.columnLayout.hasPinnedPane;\n readonly hasFilterableColumns = this.columnLayout.hasFilterableColumns;\n readonly hasHeaderGroups = this.columnLayout.hasHeaderGroups;\n readonly pinnedHeaderGroupRuns = this.columnLayout.pinnedHeaderGroupRuns;\n readonly scrollableHeaderGroupRuns = this.columnLayout.scrollableHeaderGroupRuns;\n readonly rightHeaderGroupRuns = this.columnLayout.rightHeaderGroupRuns;\n\n private readonly columnState = new AgridColumnStateService({\n control: this.control,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n pinnedColDefs: this.pinnedColDefs,\n rightPinnedColDefs: this.rightPinnedColDefs,\n showControlColumn: this.showControlColumn,\n });\n\n private readonly projection: AgridProjectionModel = new AgridProjectionModel({\n dataSource: this.dataSource,\n control: this.control,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n serverSideFiltering: this.serverSideFiltering,\n sortOption: this.sortOption,\n allowAddRows: this.allowAddRows,\n autoAddRows: this.autoAddRows,\n expandedGroups: this.groupController.expandedGroups,\n treeConfig: this.treeConfig,\n expandedTreeIds: this.treeController.expandedIds,\n pinRow: this.effectivePinRow,\n masterDetail: this.masterDetail,\n expandedDetailIds: this._expandedDetailIds,\n });\n\n private readonly editController = new AgridEditController({\n control: this.control,\n dataSource: this.dataSource,\n visibleColDefs: this.visibleColDefs,\n readonlyGrid: this.readonlyGrid,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n findDisplayIndex: originalIndex => this.findDisplayIndex(originalIndex),\n scrollToCell: (displayIndex, colIndex) => this.scrollToKeepVisible(displayIndex, colIndex),\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n onCellEdit: event => this.emitEditEvents(event),\n onValidationFailed: event => this.validationFailed.emit({ ...event, source: 'inline' }),\n });\n\n /** Total filtered row count regardless of current page. */\n readonly filteredRowCount = this.projection.filteredRowCount;\n\n /** Total number of pages given the current filter and page size. */\n readonly totalPages = this.projection.totalPages;\n\n readonly showPagination = this.projection.showPagination;\n\n /** Number of semantic header rows currently rendered. */\n readonly headerRowCount = computed(() => this.hasHeaderGroups() ? 2 : 1);\n\n /** Number of rendered semantic rows, including header and pinned rows. */\n readonly ariaRowCount = computed(() =>\n this.displayItems().length + this.headerRowCount() + (this.showFooter() ? 1 : 0)\n + this.pinnedTopItems().length + this.pinnedBottomItems().length\n );\n\n /** Number of visible semantic columns, including the optional control column. */\n readonly ariaColCount = computed(() =>\n this.visibleColDefs().length + (this.showControlColumn() ? 1 : 0)\n );\n\n /** True when no rows or group headers are visible (ignores add-row sentinel and ghost). */\n readonly isEmpty = computed(() =>\n !this.loading() && this.filteredItems().every(item => item === null || item === 'ghost')\n );\n\n /**\n * @internal Effective aggregate for the column menu — string values only.\n * Custom function aggregates from ColDef can't be represented in the menu so they return null.\n */\n getEffectiveAggregate(col: ColDef): 'sum' | 'avg' | 'min' | 'max' | 'count' | null {\n const ctrlAgg = this.control()?.aggregates()[col.field];\n if (ctrlAgg !== undefined) return ctrlAgg;\n const colAgg = col.aggregate;\n return typeof colAgg === 'string' ? colAgg : null;\n }\n\n /** True when at least one visible column has an aggregate function (from ColDef or control). */\n readonly showFooter = this.projection.showFooter;\n\n /** Computed aggregate value per column field, over currently filtered rows. */\n readonly footerValues = this.projection.footerValues;\n\n readonly gridTemplateColumns = this.columnLayout.gridTemplateColumns;\n readonly pinnedGridTemplateColumns = this.columnLayout.pinnedGridTemplateColumns;\n readonly scrollableGridTemplateColumns = this.columnLayout.scrollableGridTemplateColumns;\n readonly totalWidth = this.columnLayout.totalWidth;\n readonly pinnedPaneWidth = this.columnLayout.pinnedPaneWidth;\n readonly scrollableTotalWidth = this.columnLayout.scrollableTotalWidth;\n\n /**\n * Filtered, sorted, and optionally grouped row list for `*cdkVirtualFor`.\n * Appends `null` when the explicit add-row placeholder is active.\n */\n readonly filteredItems: Signal<GridItem[]> = this.projection.filteredItems;\n\n /** Virtual scroll source — injects ghost row during a reorder drag. */\n /** Maps originalIndex → true if the data row should receive the odd-row stripe. Counts only data rows, so group headers don't shift the pattern. */\n readonly dataRowIsOdd = computed<Map<number, boolean>>(() => {\n const map = new Map<number, boolean>();\n let rank = 0;\n for (const item of this.filteredItems()) {\n if (isDataRowItemFn(item)) map.set(item.originalIndex, (rank++ % 2) !== 0);\n }\n return map;\n });\n\n readonly displayItems = computed<GridItem[]>(() => {\n const items = this.filteredItems();\n const dragIdx = this.dragHandler.reorderOriginalIndex();\n if (dragIdx === null) return items;\n\n const sourcePos = items.findIndex(item => isDataRowItemFn(item) && item.originalIndex === dragIdx);\n const withoutSource: GridItem[] = sourcePos === -1\n ? [...items]\n : [...items.slice(0, sourcePos), ...items.slice(sourcePos + 1)];\n\n const overIdx = this.dragHandler.reorderOverIndex();\n if (overIdx === null) return withoutSource;\n\n const targetPos = withoutSource.findIndex(item => isDataRowItemFn(item) && item.originalIndex === overIdx);\n if (targetPos === -1) return withoutSource;\n\n const insertAt = this.dragHandler.reorderInsertBefore() ? targetPos : targetPos + 1;\n const result = [...withoutSource];\n result.splice(insertAt, 0, 'ghost');\n return result;\n });\n\n /** Rows pinned to the top of the body (rendered in a fixed container, outside virtual scroll). */\n readonly pinnedTopItems = this.projection.pinnedTopItems;\n /** Rows pinned to the bottom of the body (rendered in a fixed container, outside virtual scroll). */\n readonly pinnedBottomItems = this.projection.pinnedBottomItems;\n /** Whether any top-pinned rows are present. */\n readonly hasPinnedTopRows = computed(() => this.pinnedTopItems().length > 0);\n /** Whether any bottom-pinned rows are present. */\n readonly hasPinnedBottomRows = computed(() => this.pinnedBottomItems().length > 0);\n\n /**\n * Per-item heights fed to the variable-size virtual-scroll strategy: a detail panel uses the\n * configured detail height, every other row uses the standard row height. With no detail rows\n * open the array is uniform, so scrolling matches the fixed-size strategy.\n */\n readonly itemSizes = computed<number[]>(() => {\n const h = this.rowHeight();\n const dh = this.detailRowHeight();\n return this.displayItems().map(item => (isDetailRowItemFn(item) ? dh : h));\n });\n\n // ── Menu signals ─────────────────────────────────────────────────────────────\n\n readonly groupActionsMenu = this.groupController.actionsMenu;\n\n // ── Infrastructure ────────────────────────────────────────────────────────────\n\n private readonly viewport = viewChild.required<CdkVirtualScrollViewport>('scrollViewport');\n private readonly pinnedViewport = viewChild<CdkVirtualScrollViewport>('pinnedViewport');\n private readonly rightPinnedViewport = viewChild<CdkVirtualScrollViewport>('rightPinnedViewport');\n private readonly wrapperEl = viewChild.required<ElementRef<HTMLDivElement>>('wrapper');\n private readonly horizontalScrollerEl =\n viewChild.required<ElementRef<HTMLDivElement>>('horizontalScroller');\n private readonly destroyRef = inject(DestroyRef);\n private readonly _hostEl = inject(ElementRef<HTMLElement>);\n private readonly browser = new AgridBrowserAdapter();\n\n private readonly rangeController = new AgridRangeController({\n control: this.control,\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n isCellEditable: (col, originalIndex) => this.isCellEditable(col, originalIndex),\n cancelEdit: () => this.cancelCurrent(),\n findDisplayIndex: originalIndex => this.findDisplayIndex(originalIndex),\n scrollToCell: (displayIndex, colIndex) => this.scrollToKeepVisible(displayIndex, colIndex),\n onCellEdit: event => this.emitEditEvents(event),\n }, this.destroyRef);\n\n private readonly columnSizing = new AgridColumnSizingController({\n control: this.control,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n scrollableColDefs: this.scrollableColDefs,\n locale: this.locale,\n isColumnPinned: field => this.isColumnPinned(field),\n wrapperElement: () => this.wrapperEl().nativeElement,\n scrollerElement: () => this.horizontalScrollerEl().nativeElement,\n }, this.destroyRef);\n\n private readonly columnMenuController = new AgridColumnMenuController({\n control: this.control,\n dataSource: this.dataSource,\n colDefs: this.colDefs,\n serverSideFiltering: this.serverSideFiltering,\n filterDebounceMs: this.filterDebounceMs,\n sortOption: this.sortOption,\n effectiveSortOrder: () => this.projection.effectiveSortOrder(),\n autosizeColumn: col => this.columnSizing.autosizeColumn(col),\n onFilterChange: event => this.filterChange.emit(event),\n onSortChange: event => this.sortChange.emit(event),\n }, this.destroyRef);\n\n readonly filterMenu = this.columnMenuController.menu;\n readonly filterMenuSearch = this.columnMenuController.search;\n readonly filterMenuItems = this.columnMenuController.items;\n readonly filterMenuVisibleItems = this.columnMenuController.visibleItems;\n readonly filterMenuActiveValues = this.columnMenuController.activeValues;\n readonly columnMenuValueItems = this.columnMenuController.valueItems;\n\n private readonly presentation = new AgridPresentationService({\n control: this.control,\n visibleColDefs: this.visibleColDefs,\n filteredItems: this.filteredItems,\n locale: this.locale,\n getRowClass: this.rowClassFn,\n });\n\n private readonly findController = new AgridFindController({\n dataSource: this.dataSource,\n filteredSortedIndices: this.projection.filteredSortedIndices,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n revealMatch: (originalIndex, colIndex) => this.revealFindMatch(originalIndex, colIndex),\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n });\n\n readonly findOpen = this.findController.open;\n readonly findQuery = this.findController.query;\n readonly findActiveIndex = this.findController.activeIndex;\n readonly findMatches = this.findController.matches;\n\n private readonly navigationController = new AgridNavigationController({\n control: this.control,\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n filteredSortedIndices: this.projection.filteredSortedIndices,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n rowHeight: this.rowHeight,\n allowAddRows: this.allowAddRows,\n autoAddRows: this.autoAddRows,\n enterEditAction: this.enterEditAction,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n editingCell: this.editController.editingCell,\n isEditing: (originalIndex, colIndex) => this.isEditing(originalIndex, colIndex),\n isCellEditable: (col, originalIndex) => this.editController.isCellEditable(col, originalIndex),\n toggleTreeCell: (originalIndex, colIndex) =>\n this.toggleTreeCell(originalIndex, colIndex),\n startEdit: (originalIndex, colIndex, seedChar, selectText) =>\n this.editController.start(originalIndex, colIndex, seedChar, selectText),\n commitEdit: () => this.editController.commit(),\n cancelEdit: () => this.editController.cancel(),\n undoEdit: () => this.editController.undo(),\n redoEdit: () => this.editController.redo(),\n extendRangeTo: (originalIndex, colIndex) =>\n this.rangeController.extendTo(originalIndex, colIndex),\n openFind: () => this.findController.show(),\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n viewport: () => this.viewport(),\n scrollColumnToKeepVisible: colIndex =>\n this.columnSizing.scrollColumnToKeepVisible(colIndex),\n onPrepareAddRecord: event => this.prepareAddRecord.emit({\n ...event,\n provider: this.provider(),\n datasource: this.dataSource(),\n }),\n });\n\n private readonly rowController = new AgridRowController({\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n markedRowIndices: this.markedRowIndices,\n rowSelection: this.rowSelection,\n selectedCell: this.selectedCell,\n editingCell: this.editController.editingCell,\n insertRowAt: index => {\n this.reconcileMarkedRowsAfterInsertion(index);\n this.navigationController.insertRowAt(index);\n },\n startDragSelect: originalIndex => this.dragHandler.startDragSelect(originalIndex),\n onRowSelect: event => this.rowSelect.emit(event),\n onRowClick: event => this.rowClick.emit(event),\n onRowRemoved: event => {\n this.reconcileDirtyInlineRowsAfterRemoval(event.index);\n this.reconcileMarkedRowsAfterRemoval(event.index);\n this.rowRemoved.emit(this.createRecordEvent(event.index, event.data));\n },\n onEditRowRemoved: originalIndex => this.editController.onRowRemoved(originalIndex),\n closeFilterMenu: () => this.columnMenuController.close(),\n closeGroupActionsMenu: () => this.closeGroupActionsMenu(),\n });\n\n readonly selectedRowIndices = this.rowController.selectedRowIndices;\n readonly selectedRowIndex = this.rowController.selectedRowIndex;\n readonly contextMenu = this.rowController.contextMenu;\n readonly cellContextMenuState = this.rowController.cellContextMenu;\n\n /** Id of the menu-bar button whose dropdown is open, or `null`. */\n readonly openMenuBarItemId = signal<string | null>(null);\n\n /** Runtime state passed to menu-bar visibility, active, and disabled resolvers. */\n readonly menuBarContext = computed<AgridMenuBarContext<T>>(() => {\n const datasource = this.dataSource();\n const rows = datasource.rows() as T[];\n const selectedRows = [...this.selectedRowIndices()]\n .sort((a, b) => a - b)\n .map(originalIndex => ({ row: rows[originalIndex], originalIndex }))\n .filter((entry): entry is { row: T; originalIndex: number } => !!entry.row);\n return {\n rows,\n selectedRows,\n selectedCell: this.selectedCell(),\n provider: this.provider(),\n datasource,\n };\n });\n\n /** Menu-bar buttons currently allowed by their visibility resolvers. */\n readonly visibleMenuBarItems = computed(() =>\n this.menuBarItems().filter(item => this.isMenuBarItemVisible(item)),\n );\n\n private readonly sidebarController = new AgridSidebarController({\n control: this.control,\n dataSource: this.dataSource,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n selectedRowIndex: this.selectedRowIndex,\n autoOpenDetail: this.autoOpenDetail,\n useSidebarEditor: this.useSidebarEditor,\n isCellEditable: (col, originalIndex) => this.isCellEditable(col, originalIndex),\n onFieldChange: event => this.markCellChanged(event),\n onCellEdit: event => this.emitSidebarEditEvents(event),\n onValidationFailed: event => this.validationFailed.emit({ ...event, source: 'sidebar' }),\n });\n\n readonly sidebarOpen = this.sidebarController.open;\n /** @internal Per-field sidebar validation messages. */\n readonly sidebarValidationErrors = this.sidebarController.validationErrors;\n readonly sidebarTab = this.sidebarController.tab;\n readonly sidebarRow = this.sidebarController.row;\n readonly sidebarHiddenColumns = this.sidebarController.hiddenColumns;\n\n private readonly clipboardHandler = new AgridClipboardHandler({\n control: this.control,\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n markedRowIndices: this.markedRowIndices,\n isCellEditable: (col, originalIndex) => this.isCellEditable(col, originalIndex),\n onCellEdit: event => this.emitEditEvents(event),\n scrollToCell: (displayIndex, colIndex) => this.scrollToKeepVisible(displayIndex, colIndex),\n });\n\n readonly dragHandler = new AgridDragHandler({\n dataSource: this.dataSource,\n filteredItems: () => this.filteredItems(),\n locale: () => this.locale(),\n selectedIndices: this.rowController.selectedIndices,\n onReorder: e => {\n this.reconcileMarkedRowsAfterMove(e.oldIndex, e.newIndex);\n this.rowReorder.emit(e);\n },\n onSelectionChange: () => this.rowController.emitSelection(),\n }, this.destroyRef);\n\n private readonly columnReorder = new AgridColumnReorderController({\n control: this.control,\n visibleColDefs: this.visibleColDefs,\n getColDef: field => this.getColDef(field),\n }, this.destroyRef);\n\n readonly columnDragPreview = this.columnReorder.preview;\n\n /** @internal Start a column header drag. */\n onColHeaderPointerDown(event: PointerEvent, field: string): void {\n this.columnReorder.start(event, field);\n }\n\n /** @internal Start dragging all columns in one contiguous grouped-header segment. */\n onHeaderGroupPointerDown(event: PointerEvent, fields: string[], label: string): void {\n this.columnReorder.startGroup(event, fields, label);\n }\n\n /** @internal Whether any field in a grouped-header segment is being dragged. */\n isHeaderGroupDragging(fields: string[]): boolean {\n return fields.some(field => this.columnReorder.isDragging(field));\n }\n\n /** @internal Whether a grouped-header segment contains a locked column. */\n isHeaderGroupLocked(fields: string[]): boolean {\n return fields.some(field => this.getColDef(field)?.locked);\n }\n\n /** @internal Whether the given column header is being dragged. */\n isColDragging(field: string): boolean {\n return this.columnReorder.isDragging(field);\n }\n\n /** @internal Template helper for drop-indicator class. */\n getColDropSide(field: string): 'before' | 'after' | null {\n return this.columnReorder.getDropSide(field);\n }\n\n /** @internal Horizontal animation offset for a header during column reordering. */\n getColReorderOffset(field: string): number {\n return this.columnReorder.getHeaderOffset(field);\n }\n\n hasContextMenuEntries() {\n const hme = (!this.readonlyGrid() && !this.treeConfig())\n return hme;\n }\n\n // ── Setup ─────────────────────────────────────────────────────────────────────\n\n private readonly _seededControls = new WeakSet<AgridControl>();\n private readonly dirtyInlineRows = new Set<number>();\n private dirtyRowsDataSource: AgridDataSource | null = null;\n private readonly changedCells = signal<ReadonlySet<string>>(new Set());\n private changedCellsDataSource: AgridDataSource | null = null;\n\n private emitEditEvents(event: GridEditEvent): void {\n this.cellEdit.emit(event as GridEditEvent<T>);\n this.emitRecordEdit(event.position.rowIndex);\n this.markInlineRowDirty(event.position.rowIndex);\n this.markCellChanged(event);\n }\n\n private emitSidebarEditEvents(event: GridEditEvent): void {\n this.cellEdit.emit(event as GridEditEvent<T>);\n this.emitRecordEdit(event.position.rowIndex);\n }\n\n private emitRecordEdit(index: number): void {\n const datasource = this.dataSource();\n const event = this.createRecordEvent(index, datasource.getRow(index));\n queueMicrotask(() => this.recordEdit.emit(event));\n }\n\n private markInlineRowDirty(index: number): void {\n const datasource = this.dataSource();\n if (this.dirtyRowsDataSource !== datasource) {\n this.dirtyInlineRows.clear();\n this.dirtyRowsDataSource = datasource;\n }\n this.dirtyInlineRows.add(index);\n }\n\n private markCellChanged(event: GridEditEvent): void {\n if (!this.showChangedCellIndicator()) return;\n const datasource = this.dataSource();\n if (this.changedCellsDataSource !== datasource) {\n this.changedCells.set(new Set());\n this.changedCellsDataSource = datasource;\n }\n this.changedCells.update(current => {\n const next = new Set(current);\n next.add(this.changedCellKey(event.position.rowIndex, event.field));\n return next;\n });\n }\n\n private changedCellKey(rowIndex: number, field: string): string {\n return JSON.stringify([rowIndex, field]);\n }\n\n private parseChangedCellKey(key: string): { rowIndex: number; field: string } {\n const [rowIndex, field] = JSON.parse(key) as [number, string];\n return { rowIndex, field };\n }\n\n private flushDirtyInlineRows(activeRowIndex: number | null = null): void {\n const datasource = this.dataSource();\n if (this.dirtyRowsDataSource !== datasource) {\n this.dirtyInlineRows.clear();\n this.dirtyRowsDataSource = datasource;\n return;\n }\n\n for (const index of [...this.dirtyInlineRows].sort((a, b) => a - b)) {\n if (index === activeRowIndex) continue;\n this.dirtyInlineRows.delete(index);\n if (index >= 0 && index < datasource.length) this.emitRowChanged(index);\n }\n }\n\n private reconcileDirtyInlineRowsAfterRemoval(removedIndex: number): void {\n const shifted = new Set<number>();\n for (const index of this.dirtyInlineRows) {\n if (index < removedIndex) shifted.add(index);\n else if (index > removedIndex) shifted.add(index - 1);\n }\n this.dirtyInlineRows.clear();\n for (const index of shifted) this.dirtyInlineRows.add(index);\n this.reconcileChangedCellsAfterRemoval(removedIndex);\n }\n\n private reconcileChangedCellsAfterRemoval(removedIndex: number): void {\n const shifted = new Set<string>();\n for (const key of this.changedCells()) {\n const marker = this.parseChangedCellKey(key);\n if (marker.rowIndex < removedIndex) shifted.add(key);\n else if (marker.rowIndex > removedIndex) {\n shifted.add(this.changedCellKey(marker.rowIndex - 1, marker.field));\n }\n }\n this.changedCells.set(shifted);\n }\n\n private emitRowChanged(originalIndex: number): void {\n this.rowChanged.emit({\n row: this.dataSource().getRow(originalIndex),\n originalIndex,\n } as RowUpdateEvent<T>);\n }\n\n private createRecordEvent(index: number, data: Record<string, unknown>): RecordEditEvent {\n const datasource = this.dataSource();\n return {\n index,\n data,\n provider: this.provider(),\n datasource,\n };\n }\n\n constructor() {\n effect(() => this.sidebarController.syncAutoOpen());\n\n effect(() => {\n const datasource = this.dataSource();\n if (this.changedCellsDataSource === datasource) return;\n this.changedCellsDataSource = datasource;\n this.changedCells.set(new Set());\n });\n\n effect(() => {\n const activeRowIndex = this.selectedCell()?.rowIndex ?? null;\n this.flushDirtyInlineRows(activeRowIndex);\n });\n\n afterNextRender(() => {\n const wrapper = this.wrapperEl().nativeElement;\n const onKeyDown = (event: KeyboardEvent) => this.onKeyDown(event);\n wrapper.addEventListener('keydown', onKeyDown, { capture: true });\n this.destroyRef.onDestroy(() =>\n wrapper.removeEventListener('keydown', onKeyDown, { capture: true })\n );\n });\n\n const onDocumentKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n if (this.closeOpenMenus()) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n this.browser.addDocumentListener('keydown', onDocumentKeyDown);\n\n // Emit pageChange whenever page or pageSize changes in server-side pagination mode.\n effect(() => {\n const ctrl = this.control();\n if (!ctrl || ctrl.totalRows() <= 0 || ctrl.pageSize() <= 0) return;\n const page = ctrl.currentPage();\n const pageSize = ctrl.pageSize();\n const totalRows = ctrl.totalRows();\n const startRow = (page - 1) * pageSize;\n const endRow = Math.min(page * pageSize, totalRows) - 1;\n this.pageChange.emit({ page, pageSize, startRow, endRow });\n });\n\n effect(() => {\n const added = this.dataSource().rowAdded();\n if (!added) return;\n this.navigationController.revealRow(added.index);\n });\n\n // Deselect when clicking outside the grid.\n const onOutsidePointerDown = (e: PointerEvent) => {\n const isInsideGrid = this._hostEl.nativeElement.contains(e.target as Node);\n if (!isInsideGrid) {\n this.closeOpenMenus();\n queueMicrotask(() => this.flushDirtyInlineRows());\n }\n if (this.rowSelection() === 'none') return;\n if (this.selectedRowIndices().size === 0) return;\n if (isInsideGrid) return;\n this.rowController.clearSelection();\n };\n this.browser.addDocumentListener('pointerdown', onOutsidePointerDown);\n this.destroyRef.onDestroy(() => {\n this.browser.removeDocumentListener('keydown', onDocumentKeyDown);\n this.browser.removeDocumentListener('pointerdown', onOutsidePointerDown);\n if (this.quickFilterTimer !== null) clearTimeout(this.quickFilterTimer);\n });\n\n // Re-sync pinned pane scroll after displayItems changes — CDK independently adjusts\n // each viewport when item count changes (group/ungroup, collapse), which can leave\n // the panes offset by one row.\n effect(() => {\n this.displayItems();\n setTimeout(() => {\n const viewport = this.viewport();\n viewport.checkViewportSize();\n this.pinnedViewport()?.checkViewportSize();\n this.rightPinnedViewport()?.checkViewportSize();\n\n const offset = viewport.measureScrollOffset();\n this.pinnedViewport()?.scrollToOffset(offset);\n this.rightPinnedViewport()?.scrollToOffset(offset);\n }, 0);\n });\n\n // Seed ColDef.hidden and ColDef.pinned into the control once per control instance.\n effect(() => {\n const ctrl = this.control();\n const cols = this.colDefs();\n if (!ctrl || this._seededControls.has(ctrl)) return;\n this._seededControls.add(ctrl);\n for (const col of cols) {\n if (col.hidden) ctrl.setColumnVisibility(col.field, false);\n if (col.pinned === 'left') ctrl.setPinned(col.field, true);\n if (col.pinned === 'right') ctrl.setPinnedRight(col.field, true);\n }\n });\n }\n\n // ── Template helpers — type guards ────────────────────────────────────────────\n\n /** @internal */\n isDataRowItem(item: GridItem): item is { row: Record<string, unknown>; originalIndex: number } {\n return isDataRowItemFn(item);\n }\n\n /** @internal */\n isGroupHeaderItem(item: GridItem): item is { groupLabel: string; count: number; collapsed: boolean } {\n return isGroupHeaderItemFn(item);\n }\n\n /** @internal */\n isPathTreeNodeItem(item: GridItem): boolean {\n return isPathTreeNodeItemFn(item);\n }\n\n /** @internal */\n getItemOriginalIndex(item: GridItem): number | null {\n return isDataRowItemFn(item) ? item.originalIndex : null;\n }\n\n /** @internal True when the item is a master/detail panel row. */\n isDetailRowItem(item: GridItem): item is DetailRowItem {\n return isDetailRowItemFn(item);\n }\n\n /** @internal Rendered pixel height of a virtual-scroll item (detail panels are taller). */\n rowPx(item: GridItem): number {\n return isDetailRowItemFn(item) ? this.detailRowHeight() : this.rowHeight();\n }\n\n /** @internal Resolved HTML for an expanded detail panel (auto-sanitized by `[innerHTML]`). */\n detailHtml(item: GridItem): string {\n if (!isDetailRowItemFn(item)) return '';\n return this.provider().detailRenderer?.({ row: item.row as T }) ?? '';\n }\n\n /** @internal Resolved per-row CSS classes from the host `getRowClass` callback. */\n getRowClass(row: Record<string, unknown>, index: number): string {\n return this.presentation.getRowClass(row, index);\n }\n\n /** Whether the master/detail panel for `originalIndex` is currently expanded. */\n isDetailExpanded(originalIndex: number): boolean {\n return this._expandedDetailIds().has(originalIndex);\n }\n\n /** @internal Whether a data row may show a master/detail panel. */\n canToggleDetail(item: GridItem): boolean {\n if (!this.masterDetail() || !isDataRowItemFn(item)) return false;\n const config = this.treeConfig();\n return !config\n || isPathTreeConfig(config)\n || !this.treeParentIds().has(config.getId(item.row as T));\n }\n\n /** Toggle the master/detail panel for a row by its original (data-source) index. */\n toggleDetail(originalIndex: number): void {\n const row = this.dataSource().getRow(originalIndex);\n const config = this.treeConfig();\n if (\n !row\n || (\n config\n && !isPathTreeConfig(config)\n && this.treeParentIds().has(config.getId(row as T))\n )\n ) return;\n this._expandedDetailIds.update(ids => {\n const next = new Set(ids);\n if (next.has(originalIndex)) next.delete(originalIndex);\n else next.add(originalIndex);\n return next;\n });\n }\n\n /** @internal Template handler for the detail expander chevron. */\n onDetailToggle(originalIndex: number): void {\n this.toggleDetail(originalIndex);\n }\n\n /** Effective pin position of a row (`'top'`, `'bottom'`, or `undefined`). */\n rowPinState(originalIndex: number): 'top' | 'bottom' | undefined {\n const resolver = this.effectivePinRow();\n if (!resolver) return undefined;\n return resolver(this.dataSource().rows()[originalIndex], originalIndex);\n }\n\n /**\n * Pin a row to the top or bottom of the body, or unpin it with `null`.\n * Keyed by the row's original (data-source) index; the pinned row stays fully interactive.\n */\n pinRowTo(originalIndex: number, position: 'top' | 'bottom' | null): void {\n this._pinnedRows.update(map => {\n const next = new Map(map);\n // When no predicate could re-pin the row, an unpin can simply drop the override.\n if (position === null && !this.pinRowFn()) next.delete(originalIndex);\n else next.set(originalIndex, position);\n return next;\n });\n }\n\n /** @internal Template handler for the pin/unpin context-menu items; closes the open menus. */\n onPinRow(originalIndex: number, position: 'top' | 'bottom' | null): void {\n this.pinRowTo(originalIndex, position);\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n }\n\n // ── Template helpers — tree ───────────────────────────────────────────────────\n\n /** @internal True when `col` is the configured tree column. */\n isTreeCell(col: ColDef): boolean {\n return this.treeConfig()?.treeField === col.field;\n }\n\n /** @internal Tree depth of a row item (0 when not a tree row). */\n treeRowLevel(item: GridItem): number {\n return isTreeRowItemFn(item) || isPathTreeNodeItemFn(item) ? item.level : 0;\n }\n\n /** @internal Whether a tree row has children and can be expanded. */\n treeRowExpandable(item: GridItem): boolean {\n return (isTreeRowItemFn(item) || isPathTreeNodeItemFn(item)) && item.expandable;\n }\n\n /** @internal Whether a tree row is currently expanded. */\n treeRowExpanded(item: GridItem): boolean {\n return (isTreeRowItemFn(item) || isPathTreeNodeItemFn(item)) && item.expanded;\n }\n\n /** @internal Display-only final path segment for a datasource-backed path-tree leaf. */\n treeCellDisplayOverride(item: GridItem, col: ColDef): string | null {\n return isTreeRowItemFn(item) && this.isTreeCell(col) ? item.treeLabel ?? null : null;\n }\n\n /** @internal Whether the configured info action is visible for this cell. */\n showCellInfoIcon(col: ColDef, row: Record<string, unknown>): boolean {\n return typeof col.infoIcon === 'function'\n ? col.infoIcon({ value: row[col.field], row })\n : col.infoIcon === true;\n }\n\n /** @internal Emits the typed cell information action. */\n onCellInfo(originalIndex: number, col: ColDef, row: Record<string, unknown>): void {\n this.cellInfo.emit({\n row: row as T,\n field: col.field as AgridField<T>,\n value: row[col.field],\n originalIndex,\n column: col,\n } as unknown as CellInfoEvent<T>);\n }\n\n /** @internal Label of a generated path-tree branch. */\n pathTreeLabel(item: GridItem): string {\n return isPathTreeNodeItemFn(item) ? item.pathLabel : '';\n }\n\n /** @internal Toggle the expand/collapse state of a tree row from its twisty. */\n onTreeToggle(item: GridItem): void {\n const config = this.treeConfig();\n if (!config) return;\n if (isPathTreeNodeItemFn(item)) {\n this.treeController.toggle(item.pathNodeId);\n } else if (isTreeRowItemFn(item) && !isPathTreeConfig(config)) {\n this.treeController.toggle(config.getId(item.row as T));\n }\n }\n\n /** @internal Emits the generated path-tree branch click event. */\n onTreeNodeClick(item: GridItem): void {\n if (!isPathTreeNodeItemFn(item)) return;\n this.treeNodeClick.emit(this.toTreeNodeClickEvent(item));\n }\n\n /** @internal Emits the generated path-tree branch double-click event. */\n onTreeNodeDoubleClick(item: GridItem): void {\n if (!isPathTreeNodeItemFn(item)) return;\n this.treeNodeDoubleClicked.emit(this.toTreeNodeClickEvent(item));\n }\n\n private toTreeNodeClickEvent(item: PathTreeNodeItem): TreeNodeClickEvent {\n return {\n uuid: item.uuid,\n pathNodeId: item.pathNodeId,\n pathLabel: item.pathLabel,\n level: item.level,\n expanded: item.expanded,\n node: { ...item },\n };\n }\n\n private toggleTreeCell(originalIndex: number, colIndex: number): boolean {\n const config = this.treeConfig();\n const col = this.visibleColDefs()[colIndex];\n if (!config || !col || config.treeField !== col.field) return false;\n\n const item = this.displayItems().find(\n candidate => isDataRowItemFn(candidate) && candidate.originalIndex === originalIndex,\n );\n if (!item || !isTreeRowItemFn(item) || !item.expandable || isPathTreeConfig(config)) return false;\n\n this.treeController.toggle(config.getId(item.row as T));\n return true;\n }\n\n /** Expand every expandable node in the tree. No-op when not in tree mode. */\n expandAllNodes(): void {\n const config = this.treeConfig();\n if (!config) return;\n if (isPathTreeConfig(config)) {\n const ids = new Set<string>();\n for (const row of this.dataSource().rows() as T[]) {\n const path = config.getPath(row).map(String).filter(Boolean);\n for (let length = 1; length < path.length; length++) {\n ids.add(pathTreeNodeId(path.slice(0, length)));\n }\n }\n this.treeController.expandAll(ids);\n return;\n }\n const expandable = new Set<string | number>();\n for (const row of this.dataSource().rows()) {\n const parentId = config.getParentId(row as T);\n if (parentId != null) expandable.add(parentId);\n }\n this.treeController.expandAll(expandable);\n }\n\n /** Collapse every node in the tree. No-op when not in tree mode. */\n collapseAllNodes(): void {\n this.treeController.collapseAll();\n }\n\n /** @internal CDK trackBy — arrow to preserve `this`. */\n readonly trackByItem = (_di: number, item: GridItem): string | number => {\n if (item === 'ghost') return '__ghost__';\n if (item === null) return -1;\n if (isGroupHeaderItemFn(item)) return `__group__${item.groupLabel}`;\n if (isDetailRowItemFn(item)) return `__detail__${item.detailFor}`;\n if (isPathTreeNodeItemFn(item)) return item.pathNodeId;\n return item.originalIndex;\n };\n\n // ── Template helpers — cell/selection state ───────────────────────────────────\n\n /** @internal */\n isSelected(originalIndex: number, ci: number): boolean {\n const sel = this.selectedCell();\n return sel?.rowIndex === originalIndex && sel?.colIndex === ci;\n }\n\n /** @internal */\n isEditing(originalIndex: number, ci: number): boolean {\n const ed = this.editingCell();\n return ed?.rowIndex === originalIndex && ed?.colIndex === ci;\n }\n\n /** @internal */\n getSeedChar(originalIndex: number, ci: number): string {\n return this.isEditing(originalIndex, ci) ? this.editSeedChar() : '';\n }\n\n /** @internal */\n isAddRowSelected(): boolean {\n const sel = this.selectedCell();\n return this.allowAddRows() && sel?.rowIndex === this.dataSource().length;\n }\n\n /** @internal */\n isRowSelected(originalIndex: number): boolean {\n return this.rowController.isRowSelected(originalIndex);\n }\n\n /** @internal Selection class for the separate pinned/control viewport. */\n isPinnedPaneRowSelected(item: GridItem): boolean {\n return this.rowController.isPinnedPaneRowSelected(item);\n }\n\n // ── Template helpers — filter menu ────────────────────────────────────────────\n\n /** @internal */\n /** @internal 1-based sort priority for a column, 0 if not sorted. */\n getSortPriority(field: string): number { return this.columnMenuController.getSortPriority(field); }\n\n /** @internal Whether more than one column is currently sorted. */\n hasMultiSort(): boolean {\n return this.columnMenuController.hasMultiSort();\n }\n\n getTextFilter(field: string): string { return this.columnMenuController.getTextFilter(field); }\n\n /** @internal Condition input type for a column, or `null` when unsupported. */\n getMenuFilterType(field: string): 'text' | 'number' | 'date' | null {\n return this.columnMenuController.getFilterType(field);\n }\n\n /** @internal Short label for an active header condition. */\n getConditionButtonLabel(field: string): string {\n switch (this.getMenuOperator(field)) {\n case 'eq': return '=';\n case 'neq': return '≠';\n case 'gt': return '>';\n case 'gte': return '≥';\n case 'lt': return '<';\n case 'lte': return '≤';\n case 'between': return '↔';\n case 'like': return '~';\n case 'startsWith': return 'A…';\n case 'endsWith': return '…Z';\n case 'includes': return '⊃';\n case 'notIncludes': return '⊅';\n default: return '⋯';\n }\n }\n\n /** @internal */\n getMenuOperator(field: string): FilterOperator | null {\n return this.columnMenuController.getFilterOperator(field);\n }\n\n /** @internal */\n getMenuOperand(field: string): string { return this.columnMenuController.getFilterOperand(field); }\n\n /** @internal */\n getMenuOperand2(field: string): string {\n return this.columnMenuController.getFilterOperand2(field);\n }\n\n /** @internal */\n onMenuOperatorChange(field: string, operator: FilterOperator | null): void {\n this.columnMenuController.setFilterOperator(field, operator);\n }\n\n /** @internal */\n onMenuOperandChange(field: string, value: string): void {\n this.columnMenuController.setFilterOperand(field, value);\n }\n\n /** @internal */\n onMenuOperand2Change(field: string, value: string): void {\n this.columnMenuController.setFilterOperand2(field, value);\n }\n\n /** @internal */\n getSort(field: string): 'asc' | 'desc' | null {\n return this.columnMenuController.getSort(field);\n }\n\n /** @internal */\n isMenuAllSelected(field: string): boolean {\n return this.columnMenuController.isAllSelected(field);\n }\n\n /** @internal */\n isMenuValueActive(rawStr: string): boolean {\n return this.columnMenuController.isValueActive(rawStr);\n }\n\n /** @internal */\n isMenuValueSelected(field: string, value: string): boolean {\n return this.columnMenuController.isValueSelected(field, value);\n }\n\n /** @internal */\n hasActiveFilter(field: string): boolean {\n return this.columnMenuController.hasActiveFilter(field);\n }\n\n /** @internal */\n getColDef(field: string): ColDef | undefined { return this.columnState.getColDef(field); }\n\n /** @internal */\n getVisibleColIndex(field: string): number {\n return this.columnState.getVisibleColIndex(field);\n }\n\n /** @internal Convert a zero-based visible data-column index to a one-based ARIA index. */\n getAriaColIndex(colIndex: number): number {\n return this.columnState.getAriaColIndex(colIndex);\n }\n\n /** @internal */\n isColumnHidden(field: string): boolean { return this.columnState.isColumnHidden(field); }\n\n /** @internal */\n isGroupedByField(field: string): boolean { return this.columnState.isGroupedByField(field); }\n\n /** @internal */\n isColumnPinned(field: string): boolean {\n return this.columnState.isColumnPinned(field);\n }\n\n isColumnPinnedRight(field: string): boolean {\n return this.columnState.isColumnPinnedRight(field);\n }\n\n /** Returns `'left'`, `'right'`, or `false` — used by the column menu. */\n getColumnPinState(field: string): 'left' | 'right' | false {\n return this.columnState.getColumnPinState(field);\n }\n\n isFirstRightPinnedColumn(field: string): boolean {\n return this.columnState.isFirstRightPinnedColumn(field);\n }\n\n /** @internal Returns `true` for the rightmost pinned column (used to draw the separator shadow). */\n isLastPinnedColumn(field: string): boolean {\n return this.columnState.isLastPinnedColumn(field);\n }\n\n // ── Row selection ─────────────────────────────────────────────────────────────\n\n /** @internal */\n onRowPointerDown(event: PointerEvent, originalIndex: number): void {\n this.rowController.selectFromPointer(event, originalIndex, true);\n }\n\n /** @internal Emits rowClick when the user single-clicks a data row outside of a cell editor. */\n onRowClick(event: MouseEvent, item: { row: Record<string, unknown>; originalIndex: number }): void {\n this.rowController.clickRow(item);\n }\n\n // ── Cell interaction ──────────────────────────────────────────────────────────\n\n /** @internal */\n onActivate(originalIndex: number, ci: number, event?: MouseEvent): void {\n this.navigationController.activateCell(originalIndex, ci, event);\n }\n\n /** @internal */\n onActivateAddRow(): void {\n this.navigationController.activateAddRow();\n }\n\n /** @internal */\n onStartEdit(originalIndex: number, ci: number): void {\n const row = this.dataSource().rows()[originalIndex];\n this.rowDoubleClicked.emit({ row, originalIndex });\n if (this.isEditing(originalIndex, ci)) return;\n this.enterEdit(originalIndex, ci, '');\n }\n\n /** @internal */\n onDraftChange(value: unknown): void { this.editController.setDraft(value); }\n\n private quickFilterTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * @internal Quick-filter input handler. Stores the text on the control (drives the bound value\n * and client-side filtering) and, in server mode, emits a debounced `quickFilterChange` instead.\n */\n onQuickFilterInput(event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n this.control()?.setQuickFilter(text);\n if (!this.serverSideFiltering()) return;\n if (this.quickFilterTimer !== null) clearTimeout(this.quickFilterTimer);\n const delay = this.filterDebounceMs();\n if (delay === 0) {\n this.quickFilterChange.emit(text);\n return;\n }\n this.quickFilterTimer = setTimeout(() => {\n this.quickFilterTimer = null;\n this.quickFilterChange.emit(text);\n }, delay);\n }\n\n /** @internal Whether a column is editable in the current grid state (drives boolean checkboxes). */\n isColEditable(col: ColDef, originalIndex?: number): boolean {\n return this.editController.isCellEditable(col, originalIndex);\n }\n\n /** @internal Inline validation message for a cell, or `null` when the cell has no active error. */\n cellValidationError(originalIndex: number, ci: number): string | null {\n const error = this.editController.validationError();\n return error && error.rowIndex === originalIndex && error.colIndex === ci ? error.message : null;\n }\n\n /** @internal Commit a boolean-column checkbox toggle directly to the data source. */\n onBooleanToggle(originalIndex: number, ci: number, value: boolean): void {\n this.editController.setCellValue(originalIndex, ci, value);\n }\n\n /** @internal Starts a fill-handle drag from the bottom-right corner of the selection. */\n onCellPointerDown(event: PointerEvent, originalIndex: number, colIndex: number): void {\n this.rangeController.startFill(event, originalIndex, colIndex);\n }\n\n /** @internal Main keyboard handler delegated from the wrapper div. */\n onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.closeOpenMenus()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n if (event.key === 'Escape' && this.pendingDeleteRow() !== null) {\n event.preventDefault();\n event.stopPropagation();\n this.cancelRowDelete();\n return;\n }\n this.navigationController.handleKeyDown(event);\n }\n\n /** @internal Clears cell navigation while a header filter control owns focus. */\n onGridFocusIn(event: FocusEvent): void {\n if ((event.target as Element | null)?.closest('.ag-filter-input, .ag-filter-menu')) {\n this.navigationController.deactivateCell();\n }\n }\n\n /** Open the find panel and focus its input. */\n openFind(): void {\n this.findController.show();\n }\n\n /** @internal */\n closeFind(): void {\n this.findController.close();\n }\n\n /** @internal */\n onFindInput(value: string): void {\n this.findController.setQuery(value);\n }\n\n /** @internal */\n goToFindMatch(direction: 1 | -1): void {\n this.findController.goToMatch(direction);\n }\n\n private revealFindMatch(originalIndex: number, colIndex: number): void {\n const config = this.treeConfig();\n if (config) {\n const rows = this.dataSource().rows() as T[];\n const expanded = new Set(this.treeController.expandedIds());\n if (isPathTreeConfig(config)) {\n const path = config.getPath(rows[originalIndex]).map(String).filter(Boolean);\n for (let length = 1; length < path.length; length++) {\n expanded.add(pathTreeNodeId(path.slice(0, length)));\n }\n } else {\n const idToRow = new Map(rows.map(row => [config.getId(row), row]));\n const visited = new Set<string | number>();\n let parentId = config.getParentId(rows[originalIndex]);\n while (parentId !== null && parentId !== undefined && !visited.has(parentId)) {\n visited.add(parentId);\n expanded.add(parentId);\n const parent = idToRow.get(parentId);\n if (!parent) break;\n parentId = config.getParentId(parent);\n }\n }\n this.treeController.expandAll(expanded);\n } else {\n const control = this.control();\n const pageSize = control?.pageSize() ?? 0;\n const filteredIndex = this.projection.filteredSortedIndices().indexOf(originalIndex);\n if (control && pageSize > 0 && control.totalRows() === 0 && filteredIndex >= 0) {\n control.setPage(Math.floor(filteredIndex / pageSize) + 1);\n }\n }\n\n setTimeout(() => {\n const displayIndex = this.navigationController.findDisplayIndex(originalIndex);\n if (displayIndex >= 0) {\n this.navigationController.scrollToKeepVisible(displayIndex, colIndex);\n }\n });\n }\n\n // ── Row reorder ───────────────────────────────────────────────────────────────\n\n /** @internal Ghost cell display during a reorder drag. */\n getGhostCellDisplay(col: ColDef): string { return this.dragHandler.getGhostDisplay(col); }\n\n /** @internal Delegates to AgridDragHandler. */\n onHandlePointerDown(event: PointerEvent, originalIndex: number): void {\n if (!this.allowRowReorder()) return;\n this.dragHandler.startReorder(event, originalIndex);\n }\n\n /** @internal Handles the control column without letting the row receive a second pointer event. */\n onControlPointerDown(event: PointerEvent, originalIndex: number): void {\n event.stopPropagation();\n if (this.allowRowReorder() && event.pointerType === 'mouse' && event.button === 0) {\n this.onHandlePointerDown(event, originalIndex);\n return;\n }\n this.rowController.selectFromPointer(event, originalIndex, false);\n }\n\n /** @internal Toggle whether a row is included in subsequent copy operations. */\n toggleRowMarked(originalIndex: number): void {\n this.markedIndices.update(indices => {\n const next = new Set(indices);\n if (next.has(originalIndex)) next.delete(originalIndex);\n else next.add(originalIndex);\n return next;\n });\n }\n\n /** @internal Returns whether a row is marked for copying. */\n isRowMarked(originalIndex: number): boolean {\n return this.markedIndices().has(originalIndex);\n }\n\n /** Clear every row marked for clipboard inclusion. */\n clearMarkedRows(): void {\n this.markedIndices.set(new Set());\n }\n\n /** @internal Copy the active range or cell as TSV. */\n onCopy(event: ClipboardEvent): void {\n this.clipboardHandler.copy(event);\n }\n\n /** @internal Paste TSV/CSV-like plain text into the current cell. */\n onPaste(event: ClipboardEvent): void {\n if (this.editingCell()) return;\n this.clipboardHandler.paste(event);\n }\n\n // ── Column resize ─────────────────────────────────────────────────────────────\n\n /** @internal Starts pointer-based column resizing. */\n onResizeStart(event: MouseEvent, col: ColDef): void {\n this.columnSizing.startResize(event, col);\n }\n\n /** @internal Resize a column from its keyboard-accessible separator handle. */\n onResizeKeyDown(event: KeyboardEvent, col: ColDef): void {\n this.columnSizing.resizeFromKeyboard(event, col);\n }\n\n /** @internal Autosize a column to fit its header and currently visible row values. */\n onAutosizeColumn(event: MouseEvent, col: ColDef): void {\n if (col.locked) return;\n event.preventDefault();\n event.stopPropagation();\n this.columnSizing.autosizeColumn(col);\n const selected = this.selectedCell();\n if (selected) this.columnSizing.scrollColumnToKeepVisible(selected.colIndex);\n }\n\n // ── Row context menu ──────────────────────────────────────────────────────────\n\n /** @internal */\n onControlContextMenu(event: MouseEvent, originalIndex: number): void {\n this.rowController.openRowContextMenu(event, originalIndex);\n }\n\n /** @internal */\n closeContextMenu(): void { this.rowController.closeContextMenu(); }\n\n /** @internal */\n onCellContextMenu(event: MouseEvent, rowIndex: number, colIndex: number, col: ColDef, row: Record<string, unknown>): void {\n this.rowController.openCellContextMenu(event, rowIndex, colIndex, col, row);\n }\n\n /** @internal */\n closeCellContextMenu(): void { this.rowController.closeCellContextMenu(); }\n\n /** @internal Closes any row, cell, menu-bar, group-action, or column menu owned by this grid. */\n closeOpenMenus(): boolean {\n const hadOpenMenu = this.contextMenu() !== null\n || this.cellContextMenuState() !== null\n || this.openMenuBarItemId() !== null\n || this.groupActionsMenu() !== null\n || this.filterMenu() !== null;\n if (!hadOpenMenu) return false;\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n this.closeMenuBarMenu();\n this.groupController.closeActionsMenu();\n this.columnMenuController.close();\n return true;\n }\n\n /** @internal Resolves a menu-bar state callback against the current grid state. */\n resolveMenuBarState(state: AgridMenuBarState<T> | undefined, fallback: boolean): boolean {\n if (typeof state === 'function') return state(this.menuBarContext());\n return state ?? fallback;\n }\n\n /** @internal Whether a menu-bar button or dropdown item should be rendered. */\n isMenuBarItemVisible(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveMenuBarState(item.visible, true);\n }\n\n /** @internal Whether a menu-bar button or dropdown item is active. */\n isMenuBarItemActive(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveMenuBarState(item.active, false);\n }\n\n /** @internal Whether a menu-bar button or dropdown item is disabled. */\n isMenuBarItemDisabled(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveMenuBarState(item.disabled, false);\n }\n\n /** @internal Visible dropdown entries for a menu-bar button. */\n visibleMenuBarChildren(item: AgridMenuBarItem<T>): AgridMenuBarMenuItem<T>[] {\n return (item.items ?? []).filter(child => this.isMenuBarItemVisible(child));\n }\n\n /** @internal Emits one menu-bar action and closes its dropdown. */\n runMenuBarAction(event: Event, item: AgridMenuBarMenuItem<T>): void {\n event.stopPropagation();\n if (!this.isMenuBarItemVisible(item) || this.isMenuBarItemDisabled(item)) return;\n this.menuBarAction.emit(item.id);\n this.closeMenuBarMenu();\n }\n\n /** @internal Opens or closes a split button's additional command menu. */\n toggleMenuBarMenu(event: Event, item: AgridMenuBarItem<T>): void {\n event.preventDefault();\n event.stopPropagation();\n if (this.visibleMenuBarChildren(item).length === 0) return;\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n this.groupController.closeActionsMenu();\n this.columnMenuController.close();\n this.openMenuBarItemId.update(id => id === item.id ? null : item.id);\n }\n\n /** @internal Opens a dropdown from the keyboard and focuses its first/last enabled item. */\n onMenuBarTriggerKeydown(event: KeyboardEvent, item: AgridMenuBarItem<T>): void {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n event.preventDefault();\n event.stopPropagation();\n if (this.visibleMenuBarChildren(item).length === 0) return;\n this.openMenuBarItemId.set(item.id);\n const group = (event.currentTarget as HTMLElement).closest('.ag-menu-bar-group');\n setTimeout(() => {\n const enabled = group?.querySelectorAll<HTMLButtonElement>(\n '.ag-menu-bar-dropdown [role=\"menuitem\"]:not(:disabled)',\n );\n const target = event.key === 'ArrowUp' ? enabled?.[enabled.length - 1] : enabled?.[0];\n target?.focus();\n });\n }\n\n /** @internal Provides standard keyboard navigation within an open menu-bar dropdown. */\n onMenuBarMenuKeydown(event: KeyboardEvent): void {\n const menu = event.currentTarget as HTMLElement;\n const items = Array.from(menu.querySelectorAll<HTMLButtonElement>(\n '[role=\"menuitem\"]:not(:disabled)',\n ));\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.closeMenuBarMenu();\n menu.closest('.ag-menu-bar-group')\n ?.querySelector<HTMLButtonElement>('.ag-menu-bar-trigger')\n ?.focus();\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key) || items.length === 0) return;\n event.preventDefault();\n event.stopPropagation();\n const current = items.indexOf(event.target as HTMLButtonElement);\n const next = event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? items.length - 1\n : event.key === 'ArrowDown'\n ? (current + 1 + items.length) % items.length\n : (current - 1 + items.length) % items.length;\n items[next].focus();\n }\n\n /** @internal Closes the currently open menu-bar dropdown. */\n closeMenuBarMenu(): void {\n this.openMenuBarItemId.set(null);\n }\n\n /** @internal Synchronizes dropdown state and closes competing grid menus when one opens. */\n onMenuBarOpenItemChange(id: string | null): void {\n if (id !== null) {\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n this.groupController.closeActionsMenu();\n this.columnMenuController.close();\n }\n this.openMenuBarItemId.set(id);\n }\n\n /** @internal Runs a typed provider context-menu action against erased controller state. */\n runCellMenuItem(item: CellContextMenuItem<T>, menu: AgridCellContextMenu): void {\n item.action({\n value: menu.value as T[AgridField<T>],\n row: menu.row as unknown as T,\n field: menu.field as AgridField<T>,\n originalIndex: menu.rowIndex,\n });\n this.closeCellContextMenu();\n }\n\n /** @internal Copy one field from the target and marked rows. */\n copyCellToClipboard(originalIndex: number, col: ColDef): void {\n this.rowController.copyCellToClipboard(originalIndex, col);\n }\n\n /** @internal Copy the target and marked rows using all visible fields. */\n copyRowToClipboard(originalIndex: number): void {\n this.rowController.copyRowToClipboard(originalIndex);\n }\n\n /** @internal Insert a blank row at a specific position and emit prepareAddRecord. */\n insertRowAt(atIndex: number): void {\n this.rowController.insertRowAt(atIndex);\n }\n\n /** Start confirmation or immediately delete the row at `originalIndex`. */\n deleteRow(originalIndex: number): void {\n if (this.confirmRowDelete()) {\n this.updateDeleteConfirmationPosition();\n this.pendingDeleteRow.set(originalIndex);\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n this.browser.schedule(() => {\n (this._hostEl.nativeElement as HTMLElement)\n .querySelector<HTMLButtonElement>('[data-delete-confirm-no]')\n ?.focus();\n });\n return;\n }\n this.deleteRowImmediately(originalIndex);\n }\n\n /** @internal Returns whether this row is awaiting delete confirmation. */\n isRowPendingDelete(originalIndex: number): boolean {\n return this.pendingDeleteRow() === originalIndex;\n }\n\n /** @internal Delete the row currently awaiting confirmation. */\n confirmPendingRowDelete(): void {\n const originalIndex = this.pendingDeleteRow();\n if (originalIndex === null) return;\n this.pendingDeleteRow.set(null);\n this.deleteRowImmediately(originalIndex);\n }\n\n /** @internal Cancel the active row-delete confirmation. */\n cancelRowDelete(): void {\n this.pendingDeleteRow.set(null);\n this.wrapperEl().nativeElement.focus();\n }\n\n private deleteRowImmediately(originalIndex: number): void {\n this.rowController.deleteRow(originalIndex);\n this.rowController.closeCellContextMenu();\n }\n\n private updateDeleteConfirmationPosition(): void {\n const scroller = this.horizontalScrollerEl().nativeElement;\n this.deleteConfirmationLeft.set(scroller.scrollLeft);\n this.deleteConfirmationWidth.set(scroller.clientWidth);\n }\n\n // ── Group expand / collapse ───────────────────────────────────────────────────\n\n /** @internal */\n onGroupHeaderClick(label: string): void {\n this.groupController.toggle(label);\n }\n\n /** Expand all groups. No-op when grouping is not active. */\n expandGroups(): void {\n this.groupController.expandAll(this.filteredItems());\n }\n\n /** Collapse all groups. No-op when grouping is not active. */\n collapseGroups(): void {\n this.groupController.collapseAll();\n }\n\n /** @internal */\n getGroupDescription(label: string): string {\n return this.groupController.getDescription(label);\n }\n\n /** @internal */\n openGroupActionsMenu(event: MouseEvent, label: string): void {\n this.groupController.openActionsMenu(event, label);\n }\n\n /** @internal */\n closeGroupActionsMenu(): void { this.groupController.closeActionsMenu(); }\n\n /** @internal */\n onGroupAction(action: GroupAction, label: string): void {\n this.groupController.runAction(action, label);\n }\n\n // ── Filter row & menu ─────────────────────────────────────────────────────────\n\n /** @internal */\n onTextFilterChange(event: Event, field: string): void {\n this.columnMenuController.onTextFilterChange(event, field);\n }\n\n /** @internal */\n openFilterMenu(event: MouseEvent, field: string): void {\n this.columnMenuController.open(event, field);\n }\n\n /** @internal */\n closeFilterMenu(): void { this.columnMenuController.close(); }\n\n /** @internal */\n onFilterMenuSearch(value: string): void {\n this.columnMenuController.setSearch(value);\n }\n\n /** @internal */\n onMenuSort(field: string, dir: 'asc' | 'desc'): void {\n this.columnMenuController.sort(field, dir);\n }\n\n /** @internal */\n onMenuClearFilter(field: string): void {\n this.columnMenuController.clearFilter(field);\n }\n\n /** @internal */\n /** @internal Replace the entire sort stack with a single sort on this column. */\n onMenuResetSort(field: string, dir: 'asc' | 'desc'): void {\n this.columnMenuController.resetSort(field, dir);\n }\n\n onMenuToggleGroupBy(field: string): void {\n this.columnMenuController.toggleGroupBy(field);\n }\n\n /** @internal */\n onMenuClearAll(): void {\n this.columnMenuController.clearAll();\n }\n\n /** @internal */\n onMenuToggleAll(field: string): void {\n this.columnMenuController.toggleAll(field);\n }\n\n /** @internal */\n onMenuToggleValue(field: string, rawStr: string): void {\n this.columnMenuController.toggleValue(field, rawStr);\n }\n\n /** @internal */\n onSidebarToggleColumn(field: string): void {\n this.columnMenuController.toggleColumnVisibility(field);\n }\n\n /** @internal Sets every column in a sidebar header group to the requested visibility. */\n onSidebarToggleColumnGroup(fields: string[], visible: boolean): void {\n this.columnMenuController.setColumnsVisibility(fields, visible);\n }\n\n /** @internal Mirrors vertical scrolling from the main viewport into both pinned panes. */\n onBodyScroll(): void {\n const offset = this.viewport().measureScrollOffset();\n this.pinnedViewport()?.scrollToOffset(offset);\n this.rightPinnedViewport()?.scrollToOffset(offset);\n }\n\n /** @internal Keeps the row-delete prompt visible while columns scroll horizontally. */\n onHorizontalScroll(): void {\n this.updateDeleteConfirmationPosition();\n }\n\n /** @internal */\n onRightPinnedBodyScroll(): void {\n const right = this.rightPinnedViewport();\n if (!right) return;\n const offset = right.measureScrollOffset();\n if (Math.abs(offset - this.viewport().measureScrollOffset()) < 1) return;\n this.viewport().scrollToOffset(offset);\n this.pinnedViewport()?.scrollToOffset(offset);\n }\n\n /** @internal */\n onMenuTogglePin(field: string): void {\n this.columnMenuController.togglePin(field);\n }\n\n /** @internal */\n onMenuTogglePinRight(field: string): void {\n this.columnMenuController.togglePinRight(field);\n }\n\n /** @internal */\n onMenuAutosizeColumn(field: string): void {\n this.columnMenuController.autosize(field);\n }\n\n /** @internal */\n onMenuSetAggregate(field: string, agg: 'sum' | 'avg' | 'min' | 'max' | 'count' | null): void {\n this.columnMenuController.setAggregate(field, agg);\n }\n\n /** @internal */\n onMenuHideColumn(field: string): void {\n this.columnMenuController.hideColumn(field);\n }\n\n // ── Private helpers ───────────────────────────────────────────────────────────\n\n private findDisplayIndex(originalIndex: number): number {\n return this.navigationController.findDisplayIndex(originalIndex);\n }\n\n private reconcileMarkedRowsAfterInsertion(insertedIndex: number): void {\n if (this.markedIndices().size === 0) return;\n this.markedIndices.update(indices => new Set(\n [...indices].map(index => index >= insertedIndex ? index + 1 : index)\n ));\n }\n\n private reconcileMarkedRowsAfterRemoval(removedIndex: number): void {\n if (this.markedIndices().size === 0) return;\n this.markedIndices.update(indices => new Set(\n [...indices]\n .filter(index => index !== removedIndex)\n .map(index => index > removedIndex ? index - 1 : index)\n ));\n }\n\n private reconcileMarkedRowsAfterMove(oldIndex: number, newIndex: number): void {\n if (this.markedIndices().size === 0 || oldIndex === newIndex) return;\n const destination = newIndex > oldIndex ? newIndex - 1 : newIndex;\n this.markedIndices.update(indices => new Set([...indices].map(index => {\n if (index === oldIndex) return destination;\n if (oldIndex < destination && index > oldIndex && index <= destination) return index - 1;\n if (destination < oldIndex && index >= destination && index < oldIndex) return index + 1;\n return index;\n })));\n }\n\n private isCellEditable(col: ColDef, originalIndex?: number): boolean {\n return this.editController.isCellEditable(col, originalIndex);\n }\n\n private enterEdit(originalIndex: number, ci: number, seedChar: string, selectText = true): void {\n this.editController.start(originalIndex, ci, seedChar, selectText);\n }\n\n private cancelCurrent(): void {\n this.editController.cancel();\n }\n\n /** @internal */\n isRangeSelected(originalIndex: number, colIndex: number): boolean {\n return this.rangeController.isRangeSelected(originalIndex, colIndex);\n }\n\n /** @internal */\n isFindMatchCell(originalIndex: number, colIndex: number): boolean {\n return this.findController.isMatchCell(originalIndex, colIndex);\n }\n\n /** @internal */\n isActiveFindMatchCell(originalIndex: number, colIndex: number): boolean {\n return this.findController.isActiveMatchCell(originalIndex, colIndex);\n }\n\n /** @internal */\n isFillHandleCell(originalIndex: number, colIndex: number): boolean {\n return this.rangeController.isFillHandleCell(originalIndex, colIndex);\n }\n\n /** @internal */\n isFillPreviewCell(originalIndex: number, colIndex: number): boolean {\n return this.rangeController.isFillPreviewCell(originalIndex, colIndex);\n }\n\n private scrollToKeepVisible(displayIndex: number, colIndex: number | null = null): void {\n this.navigationController.scrollToKeepVisible(displayIndex, colIndex);\n }\n\n /** @internal Current rendered width for a column. */\n getColumnWidth(col: ColDef): number {\n return this.columnSizing.getWidth(col);\n }\n\n private getColumnWidthToken(col: ColDef): string {\n return this.columnSizing.getWidthToken(col);\n }\n\n}\n","<div #wrapper class=\"ag-wrapper\" tabindex=\"0\" role=\"grid\" [attr.aria-label]=\"localeText().grid\"\n [attr.aria-rowcount]=\"ariaRowCount()\" [attr.aria-colcount]=\"ariaColCount()\"\n [attr.aria-multiselectable]=\"rowSelection() === 'multi' ? 'true' : null\"\n [attr.aria-readonly]=\"readonlyGrid() ? 'true' : null\" [attr.aria-busy]=\"loading() ? 'true' : null\"\n (copy)=\"onCopy($event)\" (paste)=\"onPaste($event)\" (focusin)=\"onGridFocusIn($event)\"\n (click)=\"closeContextMenu(); closeCellContextMenu(); closeFilterMenu(); closeGroupActionsMenu(); closeMenuBarMenu()\">\n @if (visibleMenuBarItems().length > 0 || enableQuickFilter()) {\n <div class=\"ag-toolbar\">\n @if (visibleMenuBarItems().length > 0) {\n <agrid-menu-bar [items]=\"visibleMenuBarItems()\" [context]=\"menuBarContext()\"\n [label]=\"localeText().actions\" [openItemId]=\"openMenuBarItemId()\"\n (openItemIdChange)=\"onMenuBarOpenItemChange($event)\" (action)=\"menuBarAction.emit($event)\" />\n }\n @if (enableQuickFilter()) {\n <input class=\"ag-quick-filter\" type=\"search\" [value]=\"quickFilterValue()\" (input)=\"onQuickFilterInput($event)\"\n [placeholder]=\"localeText().quickFilterPlaceholder\" [attr.aria-label]=\"localeText().quickFilterPlaceholder\" />\n }\n </div>\n }\n <div class=\"ag-main-area\">\n <div class=\"ag-grid-split\" [class.ag-has-right-pane]=\"hasRightPinnedPane()\">\n @if (hasPinnedPane()) {\n <div class=\"ag-pinned-pane\" [style.width.px]=\"pinnedPaneWidth()\">\n @if (hasHeaderGroups()) {\n <div class=\"ag-header-groups ag-header-groups--pinned\" role=\"row\" aria-rowindex=\"1\"\n [style.grid-template-columns]=\"pinnedGridTemplateColumns()\" [style.width.px]=\"pinnedPaneWidth()\">\n @if (showControlColumn()) {\n <div class=\"ag-header-group-cell ag-header-group-cell--empty\"></div>\n }\n @for (run of pinnedHeaderGroupRuns(); track run.key) {\n <div class=\"ag-header-group-cell\" role=\"columnheader\" [attr.data-header-group]=\"run.id\"\n [class.ag-header-group-cell--empty]=\"!run.id\"\n [class.ag-header-group-cell--locked]=\"isHeaderGroupLocked(run.fields)\"\n [class.ag-header-group-cell--dragging]=\"isHeaderGroupDragging(run.fields)\"\n [style.grid-column]=\"'span ' + run.span\"\n (pointerdown)=\"run.id && onHeaderGroupPointerDown($event, run.fields, run.label)\">\n {{ run.label }}\n </div>\n }\n </div>\n }\n <div class=\"ag-header ag-header--pinned\" role=\"row\" [attr.aria-rowindex]=\"headerRowCount()\"\n [class.ag-header--with-filters]=\"hasFilterableColumns()\"\n [style.grid-template-columns]=\"pinnedGridTemplateColumns()\" [style.width.px]=\"pinnedPaneWidth()\">\n @if (showControlColumn()) {\n <div class=\"ag-header-cell ag-control-header\" role=\"columnheader\" aria-colindex=\"1\">\n <div class=\"ag-header-cell-top\"></div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\"></div>\n }\n </div>\n }\n @for (col of pinnedColDefs(); track col.field) {\n <div class=\"ag-header-cell ag-header-cell--pinned\" role=\"columnheader\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [attr.aria-sort]=\"getSort(col.field) === 'asc' ? 'ascending' : getSort(col.field) === 'desc' ? 'descending' : 'none'\"\n [class.ag-header-cell--filtered]=\"hasActiveFilter(col.field)\"\n [class.ag-header-cell--dragging]=\"isColDragging(col.field)\"\n [class.ag-header-cell--drop-before]=\"getColDropSide(col.field) === 'before'\"\n [class.ag-header-cell--drop-after]=\"getColDropSide(col.field) === 'after'\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-header-cell--pinned-last]=\"isLastPinnedColumn(col.field)\" [attr.data-col-field]=\"col.field\"\n (pointerdown)=\"onColHeaderPointerDown($event, col.field)\">\n <div class=\"ag-header-cell-top\">\n <span class=\"ag-header-cell-label\">{{ col.header }}</span>\n @if (getSort(col.field); as dir) {\n <span class=\"ag-sort-badge\">{{ dir === 'asc' ? '↑' : '↓' }}@if (hasMultiSort()) {<sup\n class=\"ag-sort-priority\">{{ getSortPriority(col.field) }}</sup>}</span>\n }\n <button class=\"ag-header-menu-btn\" [class.ag-header-menu-btn--active]=\"hasActiveFilter(col.field)\"\n [title]=\"localeText().columnMenu\" [attr.aria-label]=\"localeText().columnMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\" aria-haspopup=\"menu\"\n (click)=\"openFilterMenu($event, col.field)\" (pointerdown)=\"$event.stopPropagation()\">▾</button>\n </div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\">\n @if (col.filterable) {\n <input class=\"ag-filter-input\" [value]=\"getTextFilter(col.field)\"\n (input)=\"onTextFilterChange($event, col.field)\" (click)=\"$event.stopPropagation()\"\n [placeholder]=\"localeText().filterPlaceholder\"\n [attr.aria-label]=\"localeText().filterPlaceholder + ' ' + col.header\" />\n @if (getMenuFilterType(col.field)) {\n <button type=\"button\" class=\"ag-filter-condition-btn\"\n [class.ag-filter-condition-btn--active]=\"!!getMenuOperator(col.field)\"\n [title]=\"localeText().filterConditionMenu\"\n [attr.aria-label]=\"localeText().filterConditionMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\"\n (click)=\"openFilterMenu($event, col.field)\"\n (pointerdown)=\"$event.stopPropagation()\">{{ getConditionButtonLabel(col.field) }}</button>\n }\n }\n </div>\n }\n <div class=\"ag-resize-handle\" role=\"separator\" [attr.tabindex]=\"col.locked ? -1 : 0\"\n aria-orientation=\"vertical\" [attr.aria-disabled]=\"col.locked ? 'true' : null\"\n [attr.aria-label]=\"localeText().resizeColumn + ': ' + col.header\"\n [attr.aria-valuenow]=\"getColumnWidth(col)\" (keydown)=\"onResizeKeyDown($event, col)\"\n (mousedown)=\"onResizeStart($event, col)\" (pointerdown)=\"$event.stopPropagation()\"\n (dblclick)=\"onAutosizeColumn($event, col)\"></div>\n </div>\n }\n </div>\n\n <ng-template #leftRow let-item let-ariaIndex=\"ariaIndex\">\n <div role=\"row\" [attr.aria-rowindex]=\"ariaIndex\"\n [attr.data-control]=\"true\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item) && !isDetailRowItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-add-row--selected]=\"item === null && isAddRowSelected()\" [class.ag-ghost-row]=\"item === 'ghost'\"\n [class.ag-group-header-row]=\"isGroupHeaderItem(item)\" [class.ag-detail-row]=\"isDetailRowItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isPinnedPaneRowSelected(item)\"\n [class.ag-row--marked]=\"isDataRowItem(item) && isRowMarked(item.originalIndex)\"\n [class.ag-row--pending-delete]=\"isDataRowItem(item) && isRowPendingDelete(item.originalIndex)\"\n [class]=\"isDataRowItem(item) ? getRowClass(item.row, item.originalIndex) : ''\"\n [attr.data-original-index]=\"getItemOriginalIndex(item)\" [style.height.px]=\"rowPx(item)\"\n [style.grid-template-columns]=\"isDataRowItem(item) || item === 'ghost' ? pinnedGridTemplateColumns() : null\"\n (pointerdown)=\"isDataRowItem(item) && onRowPointerDown($event, item.originalIndex)\"\n (click)=\"isDataRowItem(item) && onRowClick($event, item)\">\n @if (isDataRowItem(item)) {\n @if (showControlColumn()) {\n <div class=\"ag-control-cell\" role=\"rowheader\" aria-colindex=\"1\"\n [class.ag-control-cell--reorder]=\"allowRowReorder()\"\n (contextmenu)=\"onControlContextMenu($event, item.originalIndex)\" (click)=\"$event.stopPropagation()\"\n (pointerdown)=\"onControlPointerDown($event, item.originalIndex)\">\n @if (canToggleDetail(item)) {\n <button class=\"ag-detail-toggle\" type=\"button\"\n [class.ag-detail-toggle--expanded]=\"isDetailExpanded(item.originalIndex)\"\n [attr.aria-expanded]=\"isDetailExpanded(item.originalIndex)\"\n [attr.aria-label]=\"localeText().toggleDetail\" (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"onDetailToggle(item.originalIndex); $event.stopPropagation()\">▶</button>\n }\n @if (enableRowMarking()) {\n <input class=\"ag-row-marker\" type=\"checkbox\" [checked]=\"isRowMarked(item.originalIndex)\"\n [attr.aria-label]=\"localeText().markRow\" (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\" (change)=\"toggleRowMarked(item.originalIndex)\" />\n }\n </div>\n }\n @for (col of pinnedColDefs(); track col.field) {\n @let ci = getVisibleColIndex(col.field);\n <agrid-cell [col]=\"col\" [rowIndex]=\"item.originalIndex\" [colIndex]=\"ci\" [value]=\"item.row[col.field]\"\n [displayValueOverride]=\"treeCellDisplayOverride(item, col)\"\n [row]=\"item.row\" [locale]=\"locale()\" [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\"\n [attr.data-col-field]=\"col.field\" [attr.aria-colindex]=\"getAriaColIndex(ci)\"\n [attr.aria-selected]=\"isSelected(item.originalIndex, ci) || isRangeSelected(item.originalIndex, ci)\"\n [selected]=\"isSelected(item.originalIndex, ci)\" [editing]=\"isEditing(item.originalIndex, ci)\"\n [editable]=\"isColEditable(col, item.originalIndex)\" [error]=\"cellValidationError(item.originalIndex, ci)\"\n [showInfoIcon]=\"showCellInfoIcon(col, item.row)\"\n [seedChar]=\"getSeedChar(item.originalIndex, ci)\" [selectTextOnEdit]=\"selectTextOnEdit()\"\n [treeCell]=\"isTreeCell(col)\"\n [treeLevel]=\"treeRowLevel(item)\" [treeExpandable]=\"treeRowExpandable(item)\"\n [treeExpanded]=\"treeRowExpanded(item)\"\n [class.ag-cell--range-selected]=\"isRangeSelected(item.originalIndex, ci)\"\n [class.ag-cell--fill-preview]=\"isFillPreviewCell(item.originalIndex, ci)\"\n [class.ag-cell--fill-handle]=\"isFillHandleCell(item.originalIndex, ci)\"\n [class.ag-cell--find-match]=\"isFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--find-active]=\"isActiveFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--changed]=\"isCellChanged(item.originalIndex, col.field)\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class]=\"getCellClass(col, item.row[col.field], item.row)\" [class.ag-cell--pinned]=\"true\"\n [class.ag-cell--pinned-last]=\"isLastPinnedColumn(col.field)\"\n (pointerdown)=\"onCellPointerDown($event, item.originalIndex, ci)\"\n (activate)=\"onActivate(item.originalIndex, ci, $event)\" (startEdit)=\"onStartEdit(item.originalIndex, ci)\"\n (draftChange)=\"onDraftChange($event)\" (booleanToggle)=\"onBooleanToggle(item.originalIndex, ci, $event)\"\n (infoClick)=\"onCellInfo(item.originalIndex, col, item.row)\"\n (treeToggle)=\"onTreeToggle(item)\"\n (contextmenu)=\"onCellContextMenu($event, item.originalIndex, ci, col, item.row)\" />\n }\n } @else if (item === null) {\n <div class=\"ag-pinned-row-spacer\"></div>\n } @else if (item === 'ghost') {\n @if (showControlColumn()) {\n <div class=\"ag-control-cell ag-control-cell--reorder ag-ghost-handle\"></div>\n }\n @for (col of pinnedColDefs(); track col.field) {\n <div class=\"ag-ghost-cell ag-cell--pinned\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-cell--pinned-last]=\"isLastPinnedColumn(col.field)\">{{\n getGhostCellDisplay(col) }}</div>\n }\n } @else {\n <div class=\"ag-pinned-row-spacer\"></div>\n }\n </div>\n </ng-template>\n\n @if (hasPinnedTopRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--top ag-pinned-body\" [style.width.px]=\"pinnedPaneWidth()\">\n @for (item of pinnedTopItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"leftRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + $index }\" />\n }\n </div>\n }\n\n <cdk-virtual-scroll-viewport #pinnedViewport class=\"ag-body ag-pinned-body\" [agridVariableRowSize]=\"itemSizes()\"\n [style.width.px]=\"pinnedPaneWidth()\">\n <ng-container *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\">\n <ng-container [ngTemplateOutlet]=\"leftRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: di + headerRowCount() + 1 + pinnedTopItems().length }\" />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n @if (hasPinnedBottomRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--bottom ag-pinned-body\" [style.width.px]=\"pinnedPaneWidth()\">\n @for (item of pinnedBottomItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"leftRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + pinnedTopItems().length + displayItems().length + $index }\" />\n }\n </div>\n }\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\" [attr.aria-rowindex]=\"displayItems().length + headerRowCount() + 1\"\n [style.grid-template-columns]=\"pinnedGridTemplateColumns()\">\n @if (showControlColumn()) {\n <div class=\"ag-footer-cell ag-footer-cell--control\" role=\"gridcell\" aria-colindex=\"1\"></div>\n }\n @for (col of pinnedColDefs(); track col.field) {\n <div class=\"ag-footer-cell\" role=\"gridcell\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [class.ag-footer-cell--pinned-last]=\"isLastPinnedColumn(col.field)\">\n @if (hasAggregate(col)) {\n <span class=\"ag-footer-label\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, footerValues()[col.field]) }}\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"ag-scroll-pane\">\n <div #horizontalScroller class=\"ag-horizontal-scroll\" (scroll)=\"onHorizontalScroll()\">\n @if (hasHeaderGroups()) {\n <div class=\"ag-header-groups\" role=\"row\" aria-rowindex=\"1\"\n [style.grid-template-columns]=\"scrollableGridTemplateColumns()\"\n [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (run of scrollableHeaderGroupRuns(); track run.key) {\n <div class=\"ag-header-group-cell\" role=\"columnheader\" [attr.data-header-group]=\"run.id\"\n [class.ag-header-group-cell--empty]=\"!run.id\"\n [class.ag-header-group-cell--locked]=\"isHeaderGroupLocked(run.fields)\"\n [class.ag-header-group-cell--dragging]=\"isHeaderGroupDragging(run.fields)\"\n [style.grid-column]=\"'span ' + run.span\"\n (pointerdown)=\"run.id && onHeaderGroupPointerDown($event, run.fields, run.label)\">\n {{ run.label }}\n </div>\n }\n </div>\n }\n <div class=\"ag-header\" role=\"row\" [attr.aria-rowindex]=\"headerRowCount()\"\n [class.ag-header--with-filters]=\"hasFilterableColumns()\"\n [style.grid-template-columns]=\"scrollableGridTemplateColumns()\"\n [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (col of scrollableColDefs(); track col.field) {\n <div class=\"ag-header-cell\" role=\"columnheader\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [attr.aria-sort]=\"getSort(col.field) === 'asc' ? 'ascending' : getSort(col.field) === 'desc' ? 'descending' : 'none'\"\n [class.ag-header-cell--filtered]=\"hasActiveFilter(col.field)\"\n [class.ag-header-cell--dragging]=\"isColDragging(col.field)\"\n [class.ag-header-cell--drop-before]=\"getColDropSide(col.field) === 'before'\"\n [class.ag-header-cell--drop-after]=\"getColDropSide(col.field) === 'after'\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [attr.data-col-field]=\"col.field\" (pointerdown)=\"onColHeaderPointerDown($event, col.field)\">\n <div class=\"ag-header-cell-top\">\n <span class=\"ag-header-cell-label\">{{ col.header }}</span>\n @if (getSort(col.field); as dir) {\n <span class=\"ag-sort-badge\">{{ dir === 'asc' ? '↑' : '↓' }}@if (hasMultiSort()) {<sup\n class=\"ag-sort-priority\">{{ getSortPriority(col.field) }}</sup>}</span>\n }\n @if (isGroupedByField(col.field)) {\n <span class=\"ag-sort-badge\">⊟</span>\n }\n <button class=\"ag-header-menu-btn\" [class.ag-header-menu-btn--active]=\"hasActiveFilter(col.field)\"\n [title]=\"localeText().columnMenu\" [attr.aria-label]=\"localeText().columnMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\" aria-haspopup=\"menu\"\n (click)=\"openFilterMenu($event, col.field)\" (pointerdown)=\"$event.stopPropagation()\">▾</button>\n </div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\">\n @if (col.filterable) {\n <input class=\"ag-filter-input\" [value]=\"getTextFilter(col.field)\"\n (input)=\"onTextFilterChange($event, col.field)\" (click)=\"$event.stopPropagation()\"\n [placeholder]=\"localeText().filterPlaceholder\"\n [attr.aria-label]=\"localeText().filterPlaceholder + ' ' + col.header\" />\n @if (getMenuFilterType(col.field)) {\n <button type=\"button\" class=\"ag-filter-condition-btn\"\n [class.ag-filter-condition-btn--active]=\"!!getMenuOperator(col.field)\"\n [title]=\"localeText().filterConditionMenu\"\n [attr.aria-label]=\"localeText().filterConditionMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\"\n (click)=\"openFilterMenu($event, col.field)\"\n (pointerdown)=\"$event.stopPropagation()\">{{ getConditionButtonLabel(col.field) }}</button>\n }\n }\n </div>\n }\n <div class=\"ag-resize-handle\" role=\"separator\" [attr.tabindex]=\"col.locked ? -1 : 0\"\n aria-orientation=\"vertical\" [attr.aria-disabled]=\"col.locked ? 'true' : null\"\n [attr.aria-label]=\"localeText().resizeColumn + ': ' + col.header\"\n [attr.aria-valuenow]=\"getColumnWidth(col)\" (keydown)=\"onResizeKeyDown($event, col)\"\n (mousedown)=\"onResizeStart($event, col)\" (pointerdown)=\"$event.stopPropagation()\"\n (dblclick)=\"onAutosizeColumn($event, col)\"></div>\n </div>\n }\n </div>\n\n <ng-template #bodyRow let-item let-ariaIndex=\"ariaIndex\">\n <div role=\"row\" [attr.aria-rowindex]=\"ariaIndex\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item) && !isDetailRowItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-add-row--selected]=\"item === null && isAddRowSelected()\" [class.ag-ghost-row]=\"item === 'ghost'\"\n [class.ag-group-header-row]=\"isGroupHeaderItem(item)\" [class.ag-detail-row]=\"isDetailRowItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex)\"\n [class.ag-row--marked]=\"isDataRowItem(item) && isRowMarked(item.originalIndex)\"\n [class.ag-row--pending-delete]=\"isDataRowItem(item) && isRowPendingDelete(item.originalIndex)\"\n [class]=\"isDataRowItem(item) ? getRowClass(item.row, item.originalIndex) : ''\"\n [attr.data-original-index]=\"getItemOriginalIndex(item)\" [style.height.px]=\"rowPx(item)\"\n [style.grid-template-columns]=\"isDataRowItem(item) || item === 'ghost' ? scrollableGridTemplateColumns() : null\"\n (pointerdown)=\"isDataRowItem(item) && onRowPointerDown($event, item.originalIndex)\"\n (click)=\"isDataRowItem(item) && onRowClick($event, item)\">\n @if (isDataRowItem(item)) {\n @for (col of scrollableColDefs(); track col.field) {\n @let ci = getVisibleColIndex(col.field);\n <agrid-cell [col]=\"col\" [rowIndex]=\"item.originalIndex\" [colIndex]=\"ci\" [value]=\"item.row[col.field]\"\n [displayValueOverride]=\"treeCellDisplayOverride(item, col)\"\n [row]=\"item.row\" [locale]=\"locale()\" [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\"\n [attr.data-col-field]=\"col.field\" [attr.aria-colindex]=\"getAriaColIndex(ci)\"\n [attr.aria-selected]=\"isSelected(item.originalIndex, ci) || isRangeSelected(item.originalIndex, ci)\"\n [selected]=\"isSelected(item.originalIndex, ci)\" [editing]=\"isEditing(item.originalIndex, ci)\"\n [editable]=\"isColEditable(col, item.originalIndex)\" [error]=\"cellValidationError(item.originalIndex, ci)\"\n [showInfoIcon]=\"showCellInfoIcon(col, item.row)\"\n [seedChar]=\"getSeedChar(item.originalIndex, ci)\" [selectTextOnEdit]=\"selectTextOnEdit()\"\n [treeCell]=\"isTreeCell(col)\"\n [treeLevel]=\"treeRowLevel(item)\" [treeExpandable]=\"treeRowExpandable(item)\"\n [treeExpanded]=\"treeRowExpanded(item)\"\n [class.ag-cell--range-selected]=\"isRangeSelected(item.originalIndex, ci)\"\n [class.ag-cell--fill-preview]=\"isFillPreviewCell(item.originalIndex, ci)\"\n [class.ag-cell--fill-handle]=\"isFillHandleCell(item.originalIndex, ci)\"\n [class]=\"getCellClass(col, item.row[col.field], item.row)\"\n [class.ag-cell--changed]=\"isCellChanged(item.originalIndex, col.field)\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-cell--find-match]=\"isFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--find-active]=\"isActiveFindMatchCell(item.originalIndex, ci)\"\n (pointerdown)=\"onCellPointerDown($event, item.originalIndex, ci)\"\n (activate)=\"onActivate(item.originalIndex, ci, $event)\"\n (startEdit)=\"onStartEdit(item.originalIndex, ci)\" (draftChange)=\"onDraftChange($event)\"\n (booleanToggle)=\"onBooleanToggle(item.originalIndex, ci, $event)\" (treeToggle)=\"onTreeToggle(item)\"\n (infoClick)=\"onCellInfo(item.originalIndex, col, item.row)\"\n (contextmenu)=\"onCellContextMenu($event, item.originalIndex, ci, col, item.row)\" />\n }\n } @else if (item === null) {\n <div class=\"ag-add-row-label\" (click)=\"onActivateAddRow()\">\n <span class=\"ag-add-row-icon\">+</span> {{ localeText().addRow }}\n </div>\n } @else if (item === 'ghost') {\n @for (col of scrollableColDefs(); track col.field) {\n <div class=\"ag-ghost-cell\" [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\">{{\n getGhostCellDisplay(col) }}</div>\n }\n } @else if (isDetailRowItem(item)) {\n <div class=\"ag-detail-panel\" [style.height.px]=\"detailRowHeight()\"\n [style.min-width.px]=\"scrollableTotalWidth()\" [innerHTML]=\"detailHtml(item)\"></div>\n } @else if (isPathTreeNodeItem(item)) {\n <div class=\"ag-path-tree-content\" [style.min-width.px]=\"scrollableTotalWidth()\"\n [style.padding-left.px]=\"treeRowLevel(item) * 16 + 8\"\n (click)=\"onTreeNodeClick(item); $event.stopPropagation()\"\n (dblclick)=\"onTreeNodeDoubleClick(item); $event.stopPropagation()\">\n <button type=\"button\" class=\"ag-tree-twisty\"\n [class.ag-tree-twisty--expanded]=\"treeRowExpanded(item)\"\n [attr.aria-expanded]=\"treeRowExpanded(item)\"\n (click)=\"onTreeToggle(item); $event.stopPropagation()\">▶</button>\n <span>{{ pathTreeLabel(item) }}</span>\n </div>\n } @else {\n <div class=\"ag-group-header-content\" [style.min-width.px]=\"scrollableTotalWidth()\">\n <div class=\"ag-group-header-main\"\n (click)=\"onGroupHeaderClick(item.groupLabel); $event.stopPropagation()\">\n <span class=\"ag-group-icon\" [class.ag-group-icon--expanded]=\"!item.collapsed\">▶</span>\n <span class=\"ag-group-label\">{{ item.groupLabel }}</span>\n @if (groupActions().length > 0) {\n <button class=\"ag-group-actions-btn\" [title]=\"localeText().actions\"\n (click)=\"openGroupActionsMenu($event, item.groupLabel)\">⋮</button>\n }\n <span class=\"ag-group-count\">{{ item.count }}</span>\n @if (getGroupDescription(item.groupLabel); as desc) {\n <span class=\"ag-group-description\">{{ desc }}</span>\n }\n @if (item.aggregates; as aggs) {\n <span class=\"ag-group-aggregates\">\n @for (col of visibleColDefs(); track col.field) {\n @if (hasAggregate(col) && aggs[col.field] !== undefined) {\n <span class=\"ag-group-aggregate\">\n <span class=\"ag-group-aggregate-col\">{{ col.header }}</span>\n <span class=\"ag-group-aggregate-op\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, aggs[col.field]) }}\n </span>\n }\n }\n </span>\n }\n </div>\n </div>\n }\n @if (isDataRowItem(item) && isRowPendingDelete(item.originalIndex)) {\n <div class=\"ag-delete-confirmation\" role=\"alertdialog\" [attr.aria-label]=\"localeText().confirmDeleteRow\"\n [style.left.px]=\"deleteConfirmationLeft()\" [style.width.px]=\"deleteConfirmationWidth() || null\"\n (pointerdown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\">\n <span class=\"ag-delete-confirmation-text\">{{ localeText().confirmDeleteRow }}</span>\n <button class=\"ag-delete-confirmation-btn ag-delete-confirmation-btn--yes\" type=\"button\"\n (click)=\"confirmPendingRowDelete()\">{{ localeText().confirmYes }}</button>\n <button class=\"ag-delete-confirmation-btn\" type=\"button\" data-delete-confirm-no\n (click)=\"cancelRowDelete()\">{{ localeText().confirmNo }}</button>\n </div>\n }\n </div>\n </ng-template>\n\n @if (hasPinnedTopRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--top\" [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (item of pinnedTopItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"bodyRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + $index }\" />\n }\n </div>\n }\n\n <cdk-virtual-scroll-viewport #scrollViewport class=\"ag-body\" [agridVariableRowSize]=\"itemSizes()\"\n [style.min-width.px]=\"scrollableTotalWidth()\" (scroll)=\"onBodyScroll()\">\n <ng-container *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\">\n <ng-container [ngTemplateOutlet]=\"bodyRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: di + headerRowCount() + 1 + pinnedTopItems().length }\" />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n @if (hasPinnedBottomRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--bottom\" [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (item of pinnedBottomItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"bodyRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + pinnedTopItems().length + displayItems().length + $index }\" />\n }\n </div>\n }\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\" [attr.aria-rowindex]=\"displayItems().length + headerRowCount() + 1\"\n [style.grid-template-columns]=\"scrollableGridTemplateColumns()\"\n [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (col of scrollableColDefs(); track col.field) {\n <div class=\"ag-footer-cell\" role=\"gridcell\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\">\n @if (hasAggregate(col)) {\n <span class=\"ag-footer-label\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, footerValues()[col.field]) }}\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n @if (hasRightPinnedPane()) {\n <div class=\"ag-pinned-pane ag-pinned-pane--right\" [style.width.px]=\"rightPinnedPaneWidth()\">\n @if (hasHeaderGroups()) {\n <div class=\"ag-header-groups\" role=\"row\" aria-rowindex=\"1\"\n [style.grid-template-columns]=\"rightGridTemplateColumns()\" [style.width.px]=\"rightPinnedPaneWidth()\">\n @for (run of rightHeaderGroupRuns(); track run.key) {\n <div class=\"ag-header-group-cell\" role=\"columnheader\" [attr.data-header-group]=\"run.id\"\n [class.ag-header-group-cell--empty]=\"!run.id\"\n [class.ag-header-group-cell--locked]=\"isHeaderGroupLocked(run.fields)\"\n [class.ag-header-group-cell--dragging]=\"isHeaderGroupDragging(run.fields)\"\n [style.grid-column]=\"'span ' + run.span\"\n (pointerdown)=\"run.id && onHeaderGroupPointerDown($event, run.fields, run.label)\">\n {{ run.label }}\n </div>\n }\n </div>\n }\n <div class=\"ag-header\" role=\"row\" [attr.aria-rowindex]=\"headerRowCount()\"\n [class.ag-header--with-filters]=\"hasFilterableColumns()\"\n [style.grid-template-columns]=\"rightGridTemplateColumns()\" [style.width.px]=\"rightPinnedPaneWidth()\">\n @for (col of rightPinnedColDefs(); track col.field) {\n <div class=\"ag-header-cell ag-header-cell--pinned\" role=\"columnheader\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [attr.aria-sort]=\"getSort(col.field) === 'asc' ? 'ascending' : getSort(col.field) === 'desc' ? 'descending' : 'none'\"\n [class.ag-header-cell--filtered]=\"hasActiveFilter(col.field)\"\n [class.ag-header-cell--dragging]=\"isColDragging(col.field)\"\n [class.ag-header-cell--drop-before]=\"getColDropSide(col.field) === 'before'\"\n [class.ag-header-cell--drop-after]=\"getColDropSide(col.field) === 'after'\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-header-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\" [attr.data-col-field]=\"col.field\"\n (pointerdown)=\"onColHeaderPointerDown($event, col.field)\">\n <div class=\"ag-header-cell-top\">\n <span class=\"ag-header-cell-label\">{{ col.header }}</span>\n @if (getSort(col.field); as dir) {\n <span class=\"ag-sort-badge\">{{ dir === 'asc' ? '↑' : '↓' }}@if (hasMultiSort()) {<sup\n class=\"ag-sort-priority\">{{ getSortPriority(col.field) }}</sup>}</span>\n }\n @if (isGroupedByField(col.field)) {\n <span class=\"ag-sort-badge\">'⊟ '</span>\n }\n <button class=\"ag-header-menu-btn\" [class.ag-header-menu-btn--active]=\"hasActiveFilter(col.field)\"\n [title]=\"localeText().columnMenu\" [attr.aria-label]=\"localeText().columnMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\" aria-haspopup=\"menu\"\n (click)=\"openFilterMenu($event, col.field)\" (pointerdown)=\"$event.stopPropagation()\">▾</button>\n </div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\">\n @if (col.filterable) {\n <input class=\"ag-filter-input\" [value]=\"getTextFilter(col.field)\"\n (input)=\"onTextFilterChange($event, col.field)\" (click)=\"$event.stopPropagation()\"\n [placeholder]=\"localeText().filterPlaceholder\"\n [attr.aria-label]=\"localeText().filterPlaceholder + ' ' + col.header\" />\n @if (getMenuFilterType(col.field)) {\n <button type=\"button\" class=\"ag-filter-condition-btn\"\n [class.ag-filter-condition-btn--active]=\"!!getMenuOperator(col.field)\"\n [title]=\"localeText().filterConditionMenu\"\n [attr.aria-label]=\"localeText().filterConditionMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\"\n (click)=\"openFilterMenu($event, col.field)\"\n (pointerdown)=\"$event.stopPropagation()\">{{ getConditionButtonLabel(col.field) }}</button>\n }\n }\n </div>\n }\n <div class=\"ag-resize-handle\" role=\"separator\" [attr.tabindex]=\"col.locked ? -1 : 0\"\n aria-orientation=\"vertical\" [attr.aria-disabled]=\"col.locked ? 'true' : null\"\n [attr.aria-label]=\"localeText().resizeColumn + ': ' + col.header\"\n [attr.aria-valuenow]=\"getColumnWidth(col)\" (keydown)=\"onResizeKeyDown($event, col)\"\n (mousedown)=\"onResizeStart($event, col)\" (pointerdown)=\"$event.stopPropagation()\"\n (dblclick)=\"onAutosizeColumn($event, col)\"></div>\n </div>\n }\n </div>\n\n <ng-template #rightRow let-item let-ariaIndex=\"ariaIndex\">\n <div role=\"row\" [attr.aria-rowindex]=\"ariaIndex\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item) && !isDetailRowItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-ghost-row]=\"item === 'ghost'\" [class.ag-group-header-row]=\"isGroupHeaderItem(item)\"\n [class.ag-detail-row]=\"isDetailRowItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex)\"\n [class.ag-row--marked]=\"isDataRowItem(item) && isRowMarked(item.originalIndex)\"\n [class.ag-row--pending-delete]=\"isDataRowItem(item) && isRowPendingDelete(item.originalIndex)\"\n [class]=\"isDataRowItem(item) ? getRowClass(item.row, item.originalIndex) : ''\"\n [style.height.px]=\"rowPx(item)\"\n [style.grid-template-columns]=\"isDataRowItem(item) || item === 'ghost' ? rightGridTemplateColumns() : null\">\n @if (isDataRowItem(item)) {\n @for (col of rightPinnedColDefs(); track col.field) {\n @let ci = getVisibleColIndex(col.field);\n <agrid-cell [col]=\"col\" [rowIndex]=\"item.originalIndex\" [colIndex]=\"ci\" [value]=\"item.row[col.field]\"\n [displayValueOverride]=\"treeCellDisplayOverride(item, col)\"\n [row]=\"item.row\" [locale]=\"locale()\" [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\"\n [attr.data-col-field]=\"col.field\" [attr.aria-colindex]=\"getAriaColIndex(ci)\"\n [attr.aria-selected]=\"isSelected(item.originalIndex, ci) || isRangeSelected(item.originalIndex, ci)\"\n [selected]=\"isSelected(item.originalIndex, ci)\" [editing]=\"isEditing(item.originalIndex, ci)\"\n [editable]=\"isColEditable(col, item.originalIndex)\" [error]=\"cellValidationError(item.originalIndex, ci)\"\n [showInfoIcon]=\"showCellInfoIcon(col, item.row)\"\n [seedChar]=\"getSeedChar(item.originalIndex, ci)\" [selectTextOnEdit]=\"selectTextOnEdit()\"\n [treeCell]=\"isTreeCell(col)\"\n [treeLevel]=\"treeRowLevel(item)\" [treeExpandable]=\"treeRowExpandable(item)\"\n [treeExpanded]=\"treeRowExpanded(item)\" [class]=\"getCellClass(col, item.row[col.field], item.row)\"\n [class.ag-cell--range-selected]=\"isRangeSelected(item.originalIndex, ci)\"\n [class.ag-cell--fill-preview]=\"isFillPreviewCell(item.originalIndex, ci)\"\n [class.ag-cell--fill-handle]=\"isFillHandleCell(item.originalIndex, ci)\"\n [class.ag-cell--changed]=\"isCellChanged(item.originalIndex, col.field)\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-cell--find-match]=\"isFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--find-active]=\"isActiveFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--pinned]=\"true\" [class.ag-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\"\n (pointerdown)=\"onCellPointerDown($event, item.originalIndex, ci)\"\n (activate)=\"onActivate(item.originalIndex, ci, $event)\" (startEdit)=\"onStartEdit(item.originalIndex, ci)\"\n (draftChange)=\"onDraftChange($event)\" (booleanToggle)=\"onBooleanToggle(item.originalIndex, ci, $event)\"\n (infoClick)=\"onCellInfo(item.originalIndex, col, item.row)\"\n (treeToggle)=\"onTreeToggle(item)\"\n (contextmenu)=\"onCellContextMenu($event, item.originalIndex, ci, col, item.row)\" />\n }\n } @else if (item === null) {\n <div class=\"ag-pinned-row-spacer\"></div>\n } @else if (item === 'ghost') {\n @for (col of rightPinnedColDefs(); track col.field) {\n <div class=\"ag-ghost-cell ag-cell--pinned\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\">{{ getGhostCellDisplay(col) }}</div>\n }\n } @else {\n <div class=\"ag-pinned-row-spacer\"></div>\n }\n </div>\n </ng-template>\n\n @if (hasPinnedTopRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--top ag-pinned-body ag-right-pinned-body\"\n [style.width.px]=\"rightPinnedPaneWidth()\">\n @for (item of pinnedTopItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"rightRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + $index }\" />\n }\n </div>\n }\n\n <cdk-virtual-scroll-viewport #rightPinnedViewport class=\"ag-body ag-pinned-body ag-right-pinned-body\"\n [agridVariableRowSize]=\"itemSizes()\" [style.width.px]=\"rightPinnedPaneWidth()\"\n (scroll)=\"onRightPinnedBodyScroll()\">\n <ng-container *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\">\n <ng-container [ngTemplateOutlet]=\"rightRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: di + headerRowCount() + 1 + pinnedTopItems().length }\" />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n @if (hasPinnedBottomRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--bottom ag-pinned-body ag-right-pinned-body\"\n [style.width.px]=\"rightPinnedPaneWidth()\">\n @for (item of pinnedBottomItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"rightRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + pinnedTopItems().length + displayItems().length + $index }\" />\n }\n </div>\n }\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\" [attr.aria-rowindex]=\"displayItems().length + headerRowCount() + 1\"\n [style.grid-template-columns]=\"rightGridTemplateColumns()\">\n @for (col of rightPinnedColDefs(); track col.field) {\n <div class=\"ag-footer-cell\" role=\"gridcell\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [class.ag-footer-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\">\n @if (hasAggregate(col)) {\n <span class=\"ag-footer-label\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, footerValues()[col.field]) }}\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n @if (loading()) {\n <div class=\"ag-state-overlay\" role=\"status\" aria-live=\"polite\">{{ localeText().loading }}</div>\n } @else if (isEmpty()) {\n <div class=\"ag-state-overlay\" role=\"status\" aria-live=\"polite\">{{ emptyTextLabel() }}</div>\n }\n\n @if (showSidebar()) {\n <agrid-sidebar [open]=\"sidebarOpen()\" [activeTab]=\"sidebarTab()\" [columns]=\"colDefs()\"\n [headerGroups]=\"headerGroups()\" [row]=\"sidebarRow()\" [rowIndex]=\"selectedRowIndex()\"\n [hiddenColumns]=\"sidebarHiddenColumns()\" [locale]=\"locale()\"\n [localeText]=\"localeText()\" [readonlyGrid]=\"readonlyGrid()\" [useSidebarEditor]=\"useSidebarEditor()\"\n [isCellEditable]=\"isCellEditableForRow\"\n [errors]=\"sidebarValidationErrors()\" (close)=\"toggleSidebar()\" (tabChange)=\"onSidebarStripClick($event)\"\n (toggleColumn)=\"onSidebarToggleColumn($event)\"\n (toggleColumnGroup)=\"onSidebarToggleColumnGroup($event.fields, $event.visible)\"\n (detailEdit)=\"onSidebarDetailEdit($event)\" (save)=\"onSidebarDetailSave($event)\" />\n }\n </div><!-- /.ag-main-area -->\n\n @if (showPagination()) {\n <nav class=\"ag-pagination\" [attr.aria-label]=\"localeText().pagination\">\n <button class=\"ag-page-btn\" [attr.aria-label]=\"localeText().firstPage\" [disabled]=\"control()!.currentPage() <= 1\"\n (click)=\"goToFirstPage()\">«</button>\n <button class=\"ag-page-btn\" [attr.aria-label]=\"localeText().previous\" [disabled]=\"control()!.currentPage() <= 1\"\n (click)=\"goToPrevPage()\">‹</button>\n <span class=\"ag-page-info\" aria-live=\"polite\">{{ control()!.currentPage() }} / {{ totalPages() }}</span>\n <button class=\"ag-page-btn\" [disabled]=\"control()!.currentPage() >= totalPages()\"\n [attr.aria-label]=\"localeText().next\" (click)=\"goToNextPage()\">›</button>\n <button class=\"ag-page-btn\" [disabled]=\"control()!.currentPage() >= totalPages()\"\n [attr.aria-label]=\"localeText().lastPage\" (click)=\"goToLastPage()\">»</button>\n <span class=\"ag-page-count\">{{ localeText().rows(filteredRowCount()) }}</span>\n </nav>\n }\n\n @if (findOpen()) {\n <agrid-find-panel [query]=\"findQuery()\" [matchCount]=\"findMatches().length\" [activeIndex]=\"findActiveIndex()\"\n [localeText]=\"localeText()\" (queryChange)=\"onFindInput($event)\" (previous)=\"goToFindMatch(-1)\"\n (next)=\"goToFindMatch(1)\" (close)=\"closeFind()\" />\n }\n\n <!-- Row context menu -->\n @if (contextMenu(); as menu) {\n @if(hasContextMenuEntries()) {\n <div class=\"ag-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n @if (!treeConfig()) {\n @if (rowPinState(menu.rowIndex)) {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, null)\">{{ localeText().unpinRow\n }}</button>\n } @else {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, 'top')\">{{ localeText().pinRowTop\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, 'bottom')\">{{\n localeText().pinRowBottom }}</button>\n }\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n }\n @if (!readonlyGrid()) {\n <button class=\"ag-context-item ag-context-item--danger\" role=\"menuitem\" (click)=\"deleteRow(menu.rowIndex)\">\n {{ localeText().deleteRow }}\n </button>\n }\n </div>\n }\n }\n\n <!-- Cell context menu -->\n @if (cellContextMenuState(); as menu) {\n @let col = getColDef(menu.field)!;\n <div class=\"ag-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"copyCellToClipboard(menu.rowIndex, col)\">{{\n localeText().copyCellValue\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"copyRowToClipboard(menu.rowIndex)\">{{ localeText().copyRow\n }}</button>\n @if (!treeConfig()) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n @if (rowPinState(menu.rowIndex)) {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, null)\">{{ localeText().unpinRow\n }}</button>\n } @else {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, 'top')\">{{ localeText().pinRowTop\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, 'bottom')\">{{\n localeText().pinRowBottom }}</button>\n }\n }\n @if (allowAddRows() && !readonlyGrid()) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"insertRowAt(menu.rowIndex)\">{{ localeText().insertRowAbove\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"insertRowAt(menu.rowIndex + 1)\">{{\n localeText().insertRowBelow }}</button>\n }\n @if (!readonlyGrid()) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n <button class=\"ag-context-item ag-context-item--danger\" role=\"menuitem\" (click)=\"deleteRow(menu.rowIndex)\">{{\n localeText().deleteRow }}</button>\n }\n @if (cellMenuItems().length) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n @for (item of cellMenuItems(); track $index) {\n @if (item === null) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n } @else {\n <button class=\"ag-context-item\" role=\"menuitem\" [class.ag-context-item--danger]=\"item.danger\"\n [disabled]=\"item.disabled\" (click)=\"runCellMenuItem(item, menu)\">{{\n item.label }}</button>\n }\n }\n }\n </div>\n }\n\n <!-- Group actions menu -->\n @if (groupActionsMenu(); as menu) {\n <div class=\"ag-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n @for (action of groupActions(); track action.label) {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onGroupAction(action, menu.label)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n\n <!-- Filter dropdown -->\n @if (filterMenu(); as menu) {\n <agrid-column-menu [x]=\"menu.x\" [y]=\"menu.y\" [header]=\"getColDef(menu.field)?.header ?? menu.field\"\n [sortDir]=\"getSort(menu.field)\" [sortable]=\"sortOption() !== 'none'\" [showColumnActions]=\"!!control()\"\n [pinned]=\"getColumnPinState(menu.field)\" [groupable]=\"!!getColDef(menu.field)?.groupable\"\n [grouped]=\"isGroupedByField(menu.field)\" [filterable]=\"!!getColDef(menu.field)?.filterable\"\n [showValueFilter]=\"!serverSideFiltering()\" [filterType]=\"getMenuFilterType(menu.field)\"\n [operator]=\"getMenuOperator(menu.field)\" [operand]=\"getMenuOperand(menu.field)\"\n [operand2]=\"getMenuOperand2(menu.field)\" (operatorChange)=\"onMenuOperatorChange(menu.field, $event)\"\n (operandChange)=\"onMenuOperandChange(menu.field, $event)\"\n (operand2Change)=\"onMenuOperand2Change(menu.field, $event)\" [search]=\"filterMenuSearch()\"\n [allSelected]=\"isMenuAllSelected(menu.field)\"\n [valueItems]=\"serverSideFiltering() || !getColDef(menu.field)?.filterable ? [] : columnMenuValueItems()\"\n [localeText]=\"localeText()\" [sortPriority]=\"getSortPriority(menu.field)\" [hasMultiSort]=\"hasMultiSort()\"\n (sort)=\"onMenuSort(menu.field, $event)\" (resetSort)=\"onMenuResetSort(menu.field, $event)\"\n (autosize)=\"onMenuAutosizeColumn(menu.field)\" (togglePin)=\"onMenuTogglePin(menu.field)\"\n (togglePinRight)=\"onMenuTogglePinRight(menu.field)\" (hide)=\"onMenuHideColumn(menu.field)\"\n (toggleGroup)=\"onMenuToggleGroupBy(menu.field)\" (clearFilter)=\"onMenuClearFilter(menu.field)\"\n (clearAll)=\"onMenuClearAll()\" (searchChange)=\"onFilterMenuSearch($event)\" (toggleAll)=\"onMenuToggleAll(menu.field)\"\n (toggleValue)=\"onMenuToggleValue(menu.field, $event)\" [aggregate]=\"getEffectiveAggregate(getColDef(menu.field)!)\"\n (setAggregate)=\"onMenuSetAggregate(menu.field, $event)\" />\n }\n\n @if (columnDragPreview(); as preview) {\n <div class=\"ag-column-drag-preview\" [style.left.px]=\"preview.x\" [style.top.px]=\"preview.y\"\n [style.width.px]=\"preview.width\" [style.height.px]=\"preview.height\">\n <span>{{ preview.label }}</span>\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\n/** Identifier supported by the standalone page selector. */\nexport type AgridPageId = string | number;\n\n/** One selectable page. IDs must be unique within the item list. */\nexport interface AgridPageItem<TId extends AgridPageId = AgridPageId> {\n id: string;\n pageNumber: TId;\n label: string;\n}\n\nlet nextPageSelectorId = 0;\n\n/** Compact previous/input/dropdown/next control for navigating a labeled page list. */\n@Component({\n selector: 'agrid-page-selector',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-page-selector.component.html',\n styleUrl: './agrid-page-selector.component.css',\n})\nexport class AgridPageSelectorComponent<TId extends AgridPageId = AgridPageId> {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly listboxId = `agrid-page-options-${nextPageSelectorId++}`;\n\n items = input<readonly AgridPageItem<TId>[]>([]);\n selectedId = input<string | null>(null);\n selectedPageNumber = input<TId | null>(null);\n disabled = input<boolean>(false);\n previousLabel = input<string>('Previous page');\n nextLabel = input<string>('Next page');\n inputLabel = input<string>('Page ID');\n menuLabel = input<string>('Choose a page');\n emptyText = input<string>('No pages');\n\n selectPage = output<AgridPageItem<TId>>();\n\n readonly menuOpen = signal(false);\n readonly draft = signal('');\n readonly invalid = signal(false);\n readonly activeId = signal<string | null>(null);\n readonly focusedOptionIndex = signal(-1);\n\n readonly activeIndex = computed(() =>\n this.items().findIndex(item => this.idsEqual(item.id, this.activeId())),\n );\n readonly hasPrevious = computed(() => !this.disabled() && this.activeIndex() > 0);\n readonly hasNext = computed(() => {\n const index = this.activeIndex();\n return !this.disabled() && index >= 0 && index < this.items().length - 1;\n });\n\n constructor() {\n effect(() => {\n const id = this.selectedId();\n this.activeId.set(id);\n const item = this.items().find(i=>i.id===id);\n this.draft.set(item?.pageNumber == null ? '' : String(item?.pageNumber));\n this.draft.set(id == null ? '' : String(id));\n this.invalid.set(false);\n });\n\n effect(() => {\n const nr = this.selectedPageNumber();\n // fetch the page \n const item = this.items().find(i=>i.pageNumber===nr);\n this.activeId.set(item?.id??null);\n this.draft.set(item?.pageNumber == null ? '' : String(item?.pageNumber));\n this.invalid.set(false);\n });\n }\n\n previous(): void {\n if (!this.hasPrevious()) return;\n this.choose(this.items()[this.activeIndex() - 1]);\n }\n\n next(): void {\n if (!this.hasNext()) return;\n this.choose(this.items()[this.activeIndex() + 1]);\n }\n\n toggleMenu(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n if (this.disabled() || this.items().length === 0) return;\n this.menuOpen() ? this.closeMenu() : this.openMenu();\n }\n\n openMenu(): void {\n if (this.disabled() || this.items().length === 0) return;\n const current = this.activeIndex();\n this.focusedOptionIndex.set(current >= 0 ? current : 0);\n this.menuOpen.set(true);\n this.scrollFocusedOptionIntoView();\n }\n\n closeMenu(): void {\n this.menuOpen.set(false);\n this.focusedOptionIndex.set(-1);\n }\n\n onInput(event: Event): void {\n this.draft.set((event.target as HTMLInputElement).value);\n this.invalid.set(false);\n this.closeMenu();\n }\n\n onInputKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closeMenu();\n this.resetDraft();\n return;\n }\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n if (!this.menuOpen()) this.openMenu();\n else this.moveOption(event.key === 'ArrowDown' ? 1 : -1);\n return;\n }\n if (event.key === 'Home' && this.menuOpen()) {\n event.preventDefault();\n this.focusedOptionIndex.set(0);\n this.scrollFocusedOptionIntoView();\n return;\n }\n if (event.key === 'End' && this.menuOpen()) {\n event.preventDefault();\n this.focusedOptionIndex.set(this.items().length - 1);\n this.scrollFocusedOptionIntoView();\n return;\n }\n if (event.key !== 'Enter') return;\n event.preventDefault();\n const focused = this.menuOpen() ? this.items()[this.focusedOptionIndex()] : undefined;\n if (focused) this.choose(focused);\n else this.selectDraft();\n }\n\n choose(item: AgridPageItem<TId>): void {\n if (this.disabled()) return;\n this.activeId.set(item.id);\n this.draft.set(String(item.id));\n this.invalid.set(false);\n this.closeMenu();\n this.selectPage.emit(item);\n }\n\n optionId(index: number): string {\n return `${this.listboxId}-option-${index}`;\n }\n\n isSelected(item: AgridPageItem<TId>): boolean {\n return this.idsEqual(item.id, this.activeId());\n }\n\n @HostListener('document:pointerdown', ['$event'])\n onDocumentPointerDown(event: PointerEvent): void {\n if (!this.menuOpen()) return;\n if (!this.elementRef.nativeElement.contains(event.target as Node)) this.closeMenu();\n }\n\n private selectDraft(): void {\n const value = this.draft().trim();\n const item = this.items().find(candidate => String(candidate.id) === value);\n if (item) this.choose(item);\n else this.invalid.set(true);\n }\n\n private resetDraft(): void {\n const id = this.activeId();\n this.draft.set(id == null ? '' : String(id));\n this.invalid.set(false);\n }\n\n private moveOption(direction: 1 | -1): void {\n const count = this.items().length;\n if (count === 0) return;\n const current = this.focusedOptionIndex();\n this.focusedOptionIndex.set((current + direction + count) % count);\n this.scrollFocusedOptionIntoView();\n }\n\n private scrollFocusedOptionIntoView(): void {\n queueMicrotask(() => this.elementRef.nativeElement\n .querySelector<HTMLElement>(`#${this.optionId(this.focusedOptionIndex())}`)\n ?.scrollIntoView?.({ block: 'nearest' }));\n }\n\n private idsEqual(left: string, right: string | null): boolean {\n return right !== null && left === right;\n }\n}\n","<div class=\"ag-page-selector\" [class.ag-page-selector--disabled]=\"disabled()\">\n <button type=\"button\" class=\"ag-page-nav\" [disabled]=\"!hasPrevious()\"\n [attr.aria-label]=\"previousLabel()\" [title]=\"previousLabel()\" (click)=\"previous()\">\n <span aria-hidden=\"true\">‹</span>\n </button>\n\n <div class=\"ag-page-combo\">\n <div class=\"ag-page-input-group\" [class.ag-page-input-group--open]=\"menuOpen()\"\n [class.ag-page-input-group--invalid]=\"invalid()\">\n <input class=\"ag-page-input\" type=\"text\" inputmode=\"text\" autocomplete=\"off\"\n role=\"combobox\" [value]=\"draft()\" [disabled]=\"disabled()\"\n [attr.aria-label]=\"inputLabel()\" [attr.aria-expanded]=\"menuOpen()\"\n [attr.aria-controls]=\"menuOpen() ? listboxId : null\"\n [attr.aria-activedescendant]=\"menuOpen() && focusedOptionIndex() >= 0 ? optionId(focusedOptionIndex()) : null\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n (input)=\"onInput($event)\" (keydown)=\"onInputKeydown($event)\" />\n <button type=\"button\" class=\"ag-page-trigger\" [disabled]=\"disabled() || items().length === 0\"\n [attr.aria-label]=\"menuLabel()\" [title]=\"menuLabel()\"\n [attr.aria-expanded]=\"menuOpen()\" aria-haspopup=\"listbox\"\n (click)=\"toggleMenu($event)\">\n <span aria-hidden=\"true\">▾</span>\n </button>\n </div>\n\n @if (menuOpen()) {\n <div [id]=\"listboxId\" class=\"ag-page-options\" role=\"listbox\"\n [attr.aria-label]=\"menuLabel()\" (pointerdown)=\"$event.stopPropagation()\">\n @for (item of items(); track item.id; let index = $index) {\n <button type=\"button\" class=\"ag-page-option\" role=\"option\" [id]=\"optionId(index)\"\n [class.ag-page-option--selected]=\"isSelected(item)\"\n [class.ag-page-option--focused]=\"focusedOptionIndex() === index\"\n [attr.aria-selected]=\"isSelected(item)\"\n (mouseenter)=\"focusedOptionIndex.set(index)\" (click)=\"choose(item)\">\n <span class=\"ag-page-option-id\">{{ item.pageNumber }}</span>\n <span class=\"ag-page-option-label\">{{ item.label }}</span>\n </button>\n } @empty {\n <div class=\"ag-page-empty\">{{ emptyText() }}</div>\n }\n </div>\n }\n </div>\n\n <button type=\"button\" class=\"ag-page-nav\" [disabled]=\"!hasNext()\"\n [attr.aria-label]=\"nextLabel()\" [title]=\"nextLabel()\" (click)=\"next()\">\n <span aria-hidden=\"true\">›</span>\n </button>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { AgridDataSource } from './agrid-datasource';\nimport { AgridTreeProvider } from './agrid-tree-provider';\nimport { AgridTreeController } from './rows/agrid-tree.controller';\nimport {\n AgridTreeNodeEvent,\n AgridTreeSelectionEvent,\n GridItem,\n PathTreeNodeItem,\n TreeRowItem,\n} from './agrid.types';\nimport {\n buildPathTreeItems,\n buildTreeItems,\n isPathTreeConfig,\n pathTreeNodeId,\n} from './agrid.utils';\n\ntype StandaloneTreeItem<T extends object> = TreeRowItem<T> | PathTreeNodeItem;\n\nfunction isPathNode<T extends object>(item: StandaloneTreeItem<T>): item is PathTreeNodeItem {\n return 'pathNodeId' in item;\n}\n\n/** Standalone accessible tree control backed by the same projection logic as `AgridComponent`. */\n@Component({\n selector: 'agrid-tree',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-tree.component.html',\n styleUrl: './agrid-tree.component.css',\n host: { '[style.--agrid-tree-row-height.px]': 'provider().rowHeight' },\n})\nexport class AgridTreeComponent<T extends object = any> {\n provider = input.required<AgridTreeProvider<T>>();\n\n nodeClick = output<AgridTreeNodeEvent<T>>();\n nodeDoubleClicked = output<AgridTreeNodeEvent<T>>();\n selectionChange = output<AgridTreeSelectionEvent<T>>();\n\n private readonly treeController = new AgridTreeController();\n private readonly treeElement = viewChild<ElementRef<HTMLElement>>('tree');\n private initializedProvider: AgridTreeProvider<T> | null = null;\n\n readonly focusedIndex = signal(0);\n readonly selectedKeys = signal<Set<string>>(new Set());\n readonly expandedIds = this.treeController.expandedIds;\n\n readonly items = computed<StandaloneTreeItem<T>[]>(() => {\n const provider = this.provider();\n const rows = provider.datasource.rows();\n const indices = rows.map((_, index) => index);\n const config = provider.treeConfig;\n const projected: GridItem<T>[] = isPathTreeConfig(config)\n ? buildPathTreeItems(rows, indices, config, this.expandedIds())\n : buildTreeItems(rows, indices, config, this.expandedIds());\n return projected.filter((item): item is StandaloneTreeItem<T> =>\n item !== null && typeof item === 'object' && 'level' in item\n && ('pathNodeId' in item || 'row' in item),\n );\n });\n\n constructor() {\n effect(() => {\n const provider = this.provider();\n if (provider === this.initializedProvider) return;\n this.initializedProvider = provider;\n this.selectedKeys.set(new Set());\n this.focusedIndex.set(0);\n provider.treeConfig.defaultExpanded ? this.expandAllNodes() : this.collapseAllNodes();\n });\n }\n\n /** Expands every branch currently represented by the datasource. */\n expandAllNodes(): void {\n const provider = this.provider();\n const config = provider.treeConfig;\n const rows = provider.datasource.rows();\n if (isPathTreeConfig(config)) {\n const ids = new Set<string>();\n for (const row of rows) {\n const path = config.getPath(row).map(String).filter(Boolean);\n for (let length = 1; length < path.length; length++) {\n ids.add(pathTreeNodeId(path.slice(0, length)));\n }\n }\n this.treeController.expandAll(ids);\n return;\n }\n const ids = new Set<string | number>();\n for (const row of rows) {\n const parentId = config.getParentId(row);\n if (parentId != null) ids.add(parentId);\n }\n this.treeController.expandAll(ids);\n }\n\n /** Collapses every branch. */\n collapseAllNodes(): void {\n this.treeController.collapseAll();\n }\n\n /** Toggles one expandable node. */\n toggleNode(item: StandaloneTreeItem<T>): void {\n if (!item.expandable) return;\n this.treeController.toggle(this.expansionId(item));\n }\n\n /** @internal */\n label(item: StandaloneTreeItem<T>): string {\n if (isPathNode(item)) return item.pathLabel;\n if (item.treeLabel !== undefined) return item.treeLabel;\n const provider = this.provider();\n return provider.getLabel?.(item.row) ?? String(item.row[provider.treeConfig.treeField] ?? '');\n }\n\n /** @internal */\n description(item: StandaloneTreeItem<T>): string | undefined {\n return isPathNode(item) ? undefined : this.provider().getDescription?.(item.row);\n }\n\n /** @internal */\n isSelected(item: StandaloneTreeItem<T>): boolean {\n return this.selectedKeys().has(this.selectionKey(item));\n }\n\n /** @internal */\n onNodeClick(event: MouseEvent, item: StandaloneTreeItem<T>, index: number): void {\n event.stopPropagation();\n this.focusedIndex.set(index);\n this.select(item, event.metaKey || event.ctrlKey);\n this.nodeClick.emit(this.toEvent(item));\n }\n\n /** @internal */\n onNodeDoubleClick(event: MouseEvent, item: StandaloneTreeItem<T>): void {\n event.stopPropagation();\n this.nodeDoubleClicked.emit(this.toEvent(item));\n }\n\n /** @internal */\n onKeydown(event: KeyboardEvent, item: StandaloneTreeItem<T>, index: number): void {\n const items = this.items();\n if (event.key === 'ArrowDown') return this.moveFocus(event, Math.min(index + 1, items.length - 1));\n if (event.key === 'ArrowUp') return this.moveFocus(event, Math.max(index - 1, 0));\n if (event.key === 'Home') return this.moveFocus(event, 0);\n if (event.key === 'End') return this.moveFocus(event, items.length - 1);\n if (event.key === 'ArrowRight' && item.expandable) {\n event.preventDefault();\n if (!item.expanded) this.toggleNode(item);\n else this.moveFocus(event, Math.min(index + 1, items.length - 1));\n return;\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n if (item.expandable && item.expanded) this.toggleNode(item);\n else {\n const parent = this.findParentIndex(index, item.level);\n if (parent >= 0) this.focusNode(parent);\n }\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.select(item, event.metaKey || event.ctrlKey);\n this.nodeClick.emit(this.toEvent(item));\n }\n }\n\n /** @internal */\n trackItem(_index: number, item: StandaloneTreeItem<T>): string {\n return this.selectionKey(item);\n }\n\n private select(item: StandaloneTreeItem<T>, additive: boolean): void {\n const mode = this.provider().selection;\n if (mode === 'none') return;\n const key = this.selectionKey(item);\n this.selectedKeys.update(current => {\n const next = mode === 'multi' && additive ? new Set(current) : new Set<string>();\n if (mode === 'multi' && additive && next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n const selected = this.items().filter(candidate => this.selectedKeys().has(this.selectionKey(candidate)));\n this.selectionChange.emit({ nodes: selected.map(candidate => this.toEvent(candidate)) });\n }\n\n private toEvent(item: StandaloneTreeItem<T>): AgridTreeNodeEvent<T> {\n if (isPathNode(item)) {\n return {\n kind: 'branch', id: item.pathNodeId, uuid: item.uuid, label: item.pathLabel,\n level: item.level, expandable: true, expanded: item.expanded,\n };\n }\n const config = this.provider().treeConfig;\n const id = isPathTreeConfig(config) ? item.originalIndex : config.getId(item.row);\n return {\n kind: 'row', id, label: this.label(item), level: item.level,\n expandable: item.expandable, expanded: item.expanded,\n row: item.row, originalIndex: item.originalIndex,\n };\n }\n\n private expansionId(item: StandaloneTreeItem<T>): string | number {\n if (isPathNode(item)) return item.pathNodeId;\n const config = this.provider().treeConfig;\n return isPathTreeConfig(config) ? item.originalIndex : config.getId(item.row);\n }\n\n private selectionKey(item: StandaloneTreeItem<T>): string {\n return isPathNode(item)\n ? `branch:${item.pathNodeId}`\n : `row:${this.expansionId(item)}`;\n }\n\n private moveFocus(event: KeyboardEvent, index: number): void {\n event.preventDefault();\n this.focusNode(index);\n }\n\n private focusNode(index: number): void {\n this.focusedIndex.set(index);\n queueMicrotask(() => this.treeElement()?.nativeElement\n .querySelector<HTMLElement>(`[data-tree-index=\"${index}\"]`)?.focus());\n }\n\n private findParentIndex(index: number, level: number): number {\n for (let candidate = index - 1; candidate >= 0; candidate--) {\n if (this.items()[candidate].level < level) return candidate;\n }\n return -1;\n }\n}\n","<div #tree class=\"ag-tree\" role=\"tree\" [attr.aria-label]=\"provider().ariaLabel\"\n [attr.aria-multiselectable]=\"provider().selection === 'multi' ? 'true' : null\">\n @for (item of items(); track trackItem($index, item); let index = $index) {\n <div class=\"ag-tree-node\" role=\"treeitem\" [attr.data-tree-index]=\"index\"\n [attr.tabindex]=\"focusedIndex() === index ? 0 : -1\"\n [attr.aria-level]=\"item.level + 1\"\n [attr.aria-expanded]=\"item.expandable ? item.expanded : null\"\n [attr.aria-selected]=\"provider().selection !== 'none' ? isSelected(item) : null\"\n [class.ag-tree-node--selected]=\"isSelected(item)\"\n [style.padding-left.px]=\"8 + item.level * 20\"\n (click)=\"onNodeClick($event, item, index)\"\n (dblclick)=\"onNodeDoubleClick($event, item)\"\n (keydown)=\"onKeydown($event, item, index)\">\n <button class=\"ag-tree-toggle\" type=\"button\" tabindex=\"-1\"\n [class.ag-tree-toggle--expanded]=\"item.expanded\"\n [class.ag-tree-toggle--hidden]=\"!item.expandable\"\n [attr.aria-label]=\"(item.expanded ? 'Collapse ' : 'Expand ') + label(item)\"\n (click)=\"toggleNode(item); $event.stopPropagation()\">▸</button>\n <span class=\"ag-tree-content\">\n <span class=\"ag-tree-label\">{{ label(item) }}</span>\n @if (description(item); as detail) {\n <span class=\"ag-tree-description\">{{ detail }}</span>\n }\n </span>\n </div>\n } @empty {\n <div class=\"ag-tree-empty\">{{ provider().emptyText }}</div>\n }\n</div>\n","import { AgridDataSource } from './agrid-datasource';\nimport { AgridTreeConfig, AgridTreeSelectionMode } from './agrid.types';\n\n/** Configuration accepted by {@link AgridTreeProvider}. */\nexport interface AgridTreeProviderConfig<T extends object> {\n datasource: AgridDataSource<T>;\n treeConfig: AgridTreeConfig<T>;\n /** Label for parent-linked rows. Defaults to the configured `treeField` value. */\n getLabel?: (row: T) => string;\n /** Optional secondary text shown beneath a row label. */\n getDescription?: (row: T) => string | undefined;\n /** Selection behavior. Defaults to `single`. */\n selection?: AgridTreeSelectionMode;\n /** Fixed node height in pixels. Defaults to `36`. */\n rowHeight?: number;\n /** Accessible name for the tree. Defaults to `Tree`. */\n ariaLabel?: string;\n /** Text shown when the datasource is empty. */\n emptyText?: string;\n}\n\n/** Provider-style configuration and datasource container for `<agrid-tree>`. */\nexport class AgridTreeProvider<T extends object = any> {\n readonly datasource: AgridDataSource<T>;\n readonly treeConfig: AgridTreeConfig<T>;\n readonly getLabel?: (row: T) => string;\n readonly getDescription?: (row: T) => string | undefined;\n readonly selection: AgridTreeSelectionMode;\n readonly rowHeight: number;\n readonly ariaLabel: string;\n readonly emptyText: string;\n\n constructor(config: AgridTreeProviderConfig<T>) {\n this.datasource = config.datasource;\n this.treeConfig = config.treeConfig;\n this.getLabel = config.getLabel;\n this.getDescription = config.getDescription;\n this.selection = config.selection ?? 'single';\n this.rowHeight = config.rowHeight ?? 36;\n this.ariaLabel = config.ariaLabel ?? 'Tree';\n this.emptyText = config.emptyText ?? 'No items';\n }\n}\n","import type { AgridDataSource } from './agrid-datasource';\nimport type { AgridProvider } from './agrid-provider';\nimport type { FilterOperator } from './agrid-control';\n\n/** String-valued property names available on a row type. */\nexport type AgridField<T extends object> = Extract<keyof T, string>;\n\n/** Behavior after pressing Enter while an inline cell editor is active. */\nexport type AgridEnterEditAction = 'nothing' | 'nextColumn' | 'nextRow';\n\n/** Parameters passed to a row-aware cell readonly resolver. */\nexport interface CellReadonlyParams<\n T extends object = any,\n K extends AgridField<T> = AgridField<T>,\n> {\n /** Datasource row containing the cell. */\n row: T;\n /** Current raw field value. */\n value: T[K];\n /** Column definition for the cell. */\n column: ColDef<T, K>;\n /** Zero-based index of the row in the datasource. */\n originalIndex: number;\n}\n\n/** Global options shared by grid providers. */\nexport interface AGridOptions {\n /**\n * Locale used for built-in labels, date formatting, and comparisons.\n * Use `'auto'` to resolve the browser locale.\n */\n locale: string;\n}\n\n/**\n * A single item in the cell right-click context menu.\n * Pass `null` in the array to render a separator line.\n */\nexport interface CellContextMenuItem<T extends object = any> {\n /** Label shown in the menu. */\n label: string;\n /** Called when the item is clicked. */\n action: (params: {\n value: T[AgridField<T>];\n row: T;\n field: AgridField<T>;\n originalIndex: number;\n }) => void;\n /** Grays out the item and prevents clicks. */\n disabled?: boolean;\n /** Renders the item in red (destructive action). */\n danger?: boolean;\n}\n\n/** Current grid state supplied to menu-bar visibility, active, and disabled resolvers. */\nexport interface AgridMenuBarContext<T extends object = any> {\n /** Current datasource rows. */\n rows: readonly T[];\n /** Currently selected rows with their original datasource indices. */\n selectedRows: readonly { row: T; originalIndex: number }[];\n /** Currently selected cell, or `null`. */\n selectedCell: CellPosition | null;\n /** Provider that owns the menu bar. */\n provider: AgridProvider<T>;\n /** Datasource that owns the current rows. */\n datasource: AgridDataSource<T>;\n}\n\n/** Static or runtime-resolved menu-bar state. */\nexport type AgridMenuBarState<T extends object = any> =\n | boolean\n | ((context: AgridMenuBarContext<T>) => boolean);\n\n/** Shared configuration for menu-bar buttons and dropdown items. */\nexport interface AgridMenuBarMenuItem<T extends object = any> {\n /** Stable command id emitted through `(menuBarAction)`. */\n id: string;\n /** Visible command label. */\n label: string;\n /** Optional compact icon or glyph shown before the label. */\n icon?: string;\n /** Whether the command is rendered. Defaults to `true`. */\n visible?: AgridMenuBarState<T>;\n /** Whether the command receives active styling. Defaults to `false`. */\n active?: AgridMenuBarState<T>;\n /** Whether the command is disabled. Defaults to `false`. */\n disabled?: AgridMenuBarState<T>;\n}\n\n/** Top-level menu-bar button with optional additional dropdown commands. */\nexport interface AgridMenuBarItem<T extends object = any>\n extends AgridMenuBarMenuItem<T> {\n /** Additional commands opened from the button's dropdown chevron. */\n items?: AgridMenuBarMenuItem<T>[];\n}\n\n/**\n * A structured value option used when the data field stores a raw value (e.g. a numeric ID)\n * but the cell should display a human-readable label.\n *\n * @example\n * ```ts\n * values: [\n * { value: 1, label: 'Engineering' },\n * { value: 2, label: 'Sales' },\n * ]\n * ```\n */\nexport interface ValueOption<TValue = unknown> {\n /** Raw value stored in the data source (e.g. `1`, `'ENG'`). */\n value: TValue;\n /** Human-readable label shown in the cell, dropdown, and filter menu. */\n label: string;\n}\n\n/** Width sentinel that makes a column fill the remaining horizontal space. */\nexport const ColDefAutoSize = -1;\n\n/** Label definition for a group displayed above contiguous column headers. */\nexport interface HeaderGroup {\n /** Stable identifier referenced by {@link ColDefBase.group}. */\n id: string;\n /** Text displayed in the grouped header row. */\n label: string;\n}\n\n/** Defines the behavior shared by every typed column. */\nexport interface ColDefBase<T extends object, K extends AgridField<T>> {\n /** Data field name — must match a key in the row object. */\n field: K;\n /** Text displayed in the column header. */\n header: string;\n /** Optional header-group identifier configured through `AgridProvider.headerGroups`. */\n group?: string;\n /**\n * Default column width in pixels. Can be overridden at runtime via {@link AgridControl}.\n * Use `-1` (or omit) to make the column auto-scale and fill available space (`1fr`).\n */\n width?: number;\n /**\n * Semantic type of the field.\n * - `'number'` — blank rows initialize this field to `0` instead of `''`; enables numeric\n * range filters (`>`, `<`, `between`, …) in the column menu.\n * - `'date'` — uses a native date editor and built-in localized display formatting; enables\n * date range filters (before / after / between) in the column menu.\n * - `'boolean'` — renders an inline checkbox that toggles the value on click (no edit mode).\n */\n type?: 'text' | 'number' | 'date' | 'boolean';\n /**\n * Set to `false` to make the column read-only.\n * Defaults to `true` (editable) when omitted.\n */\n editable?: boolean;\n /**\n * Return `true` to make this specific cell read-only at runtime.\n * Runs with the current row, value, column definition, and original datasource index.\n * `editable: false` still makes the whole column read-only before this callback is checked.\n *\n * @example\n * ```ts\n * { field: 'approval', cellReadonly: ({ row }) => row.status !== 'Draft' }\n * ```\n */\n cellReadonly?: (params: CellReadonlyParams<T, K>) => boolean;\n /**\n * Fixed list of allowed values shown in a `<select>` dropdown when editing.\n *\n * - `string[]` — simple list; the stored value equals the displayed label.\n * - `ValueOption[]` — structured list; the stored value (`value`) differs from the\n * displayed label (`label`). Useful when the dataset stores IDs but should show names.\n */\n values?: string[] | ValueOption<T[K]>[];\n /**\n * Optional display formatter applied when the column has no `values` list.\n * Receives the raw cell value and returns the string to display in the cell.\n *\n * @example\n * ```ts\n * { field: 'salary', formatter: v => `$${Number(v).toLocaleString()}` }\n * ```\n */\n formatter?: (value: T[K]) => string;\n /**\n * Resolve an input mask for this specific string cell. The callback receives the current\n * row, cell value, and column definition, so different rows in one column can use different\n * regular expressions. Return `null` or `undefined` to leave the cell unrestricted.\n *\n * The expression is matched against the complete proposed editor value. It should accept\n * partial values so the user can build the final value one character at a time.\n *\n * @example\n * ```ts\n * {\n * field: 'reference',\n * inputMask: ({ row }) => row.numeric\n * ? /\\d{0,3}(?:-\\d{0,5}(?:-\\d{0,5})?)?/\n * : /[a-z0-9]{0,3}(?: [a-z0-9]{0,3}(?: [a-z0-9]{0,5})?)?/i,\n * }\n * ```\n */\n inputMask?: (params: InputMaskParams<T, K>) => RegExp | null | undefined;\n /**\n * Set to `true` to show a filter input and value-picker in the filter row for this column.\n * At least one filterable column must exist for the filter row to appear.\n */\n filterable?: boolean;\n /**\n * Set to `true` to allow grouping the grid by this column.\n * When set, the filter dropdown shows a \"Group by\" toggle for this column.\n */\n groupable?: boolean;\n /**\n * Set to `true` to hide this column when the grid first renders.\n * The column remains in the dataset and can be re-shown via the sidebar column picker\n * or programmatically via `AgridControl.setColumnVisibility()`.\n */\n hidden?: boolean;\n /**\n * Pin this column to the left edge of the grid so it stays visible during horizontal scroll.\n * Can also be toggled at runtime via `AgridControl.setPinned()`.\n */\n pinned?: 'left' | 'right';\n /**\n * Aggregate function shown in the footer row for this column.\n * Built-in: `'sum'`, `'avg'`, `'min'`, `'max'`, `'count'`.\n * Pass a custom function to compute any value from the visible row values.\n * The footer only appears when at least one column has `aggregate` set.\n *\n * @example\n * ```ts\n * { field: 'salary', aggregate: 'sum' }\n * { field: 'score', aggregate: values => values.filter(v => Number(v) > 90).length }\n * ```\n */\n aggregate?: 'sum' | 'avg' | 'min' | 'max' | 'count' | ((values: unknown[]) => unknown);\n /**\n * Return one or more CSS class names to apply to every cell in this column based on the\n * cell's value and row data. Useful for conditional highlighting without a custom renderer.\n *\n * @example\n * ```ts\n * { field: 'score', cellClass: ({ value }) => Number(value) < 50 ? 'cell-danger' : '' }\n * ```\n */\n cellClass?: (params: { value: T[K]; row: T }) => string;\n /**\n * Set to `true` to prevent the column from being resized, reordered, or autosized.\n * The column can still be hidden, filtered, and sorted.\n */\n locked?: boolean;\n /**\n * Validate a committed value before it is written to the row. Return an error message to\n * reject the edit (the value is not written and the message is shown), or `null`/`undefined`\n * to accept it. Runs on inline commit, boolean-checkbox toggle, and sidebar save.\n *\n * @example\n * ```ts\n * { field: 'email', validate: v => /@/.test(String(v)) ? null : 'Invalid email' }\n * ```\n */\n validate?: (value: T[K], row: T) => string | null | undefined;\n /**\n * Custom cell renderer. Returns an HTML string displayed instead of the plain text value.\n * Angular's built-in HTML sanitization is applied automatically.\n *\n * @example\n * ```ts\n * { field: 'status', cellRenderer: ({ value }) =>\n * `<span class=\"badge badge-${value}\">${value}</span>` }\n * ```\n */\n cellRenderer?: (params: { value: T[K]; row: T }) => string;\n /**\n * Show a right-aligned info button in this column's cells.\n * Pass a predicate to show it only for selected rows or values.\n */\n infoIcon?: boolean | ((params: { value: T[K]; row: T }) => boolean);\n}\n\n/**\n * Defines a column whose `field`, formatter value, renderer value, and row are\n * derived from the supplied row type.\n */\nexport type ColDef<\n T extends object = any,\n K extends AgridField<T> = AgridField<T>,\n> = K extends AgridField<T> ? ColDefBase<T, K> : never;\n\n/** Parameters passed to a row-aware {@link ColDefBase.inputMask} resolver. */\nexport interface InputMaskParams<\n T extends object = any,\n K extends AgridField<T> = AgridField<T>,\n> {\n row: T;\n value: T[K];\n column: ColDef<T, K>;\n}\n\n/**\n * Defines a single action shown in the group header's action menu.\n * Pass an array of these to `<agrid [groupActions]=\"...\">`.\n */\nexport interface GroupAction {\n /** Label shown in the dropdown. */\n label: string;\n /** Called with the group's display label when the item is clicked. */\n action: (groupLabel: string) => void;\n}\n\n/**\n * Internal row item used in the virtual scroll list.\n * - `{ row, originalIndex }` — a real data row\n * - `null` — the add-row placeholder\n * - `'ghost'` — the drop-target ghost inserted while dragging\n * - `{ groupLabel, count, collapsed, aggregates? }` — group header row when grouping is active\n * (`aggregates` holds per-group subtotals when aggregated columns exist)\n * - `{ row, originalIndex, level, expandable, expanded }` — a tree row when tree mode is active\n */\nexport type GridItem<T extends object = Record<string, unknown>> =\n | { row: T; originalIndex: number }\n | null\n | 'ghost'\n | { groupLabel: string; count: number; collapsed: boolean; aggregates?: Record<string, unknown> }\n | TreeRowItem<T>\n | PathTreeNodeItem\n | DetailRowItem<T>;\n\n/** A generated, display-only branch node produced by path-based tree data. */\nexport interface PathTreeNodeItem {\n /** Stable UUID for this generated branch node. */\n uuid: string;\n /** Stable expansion id derived from the complete path to this node. */\n pathNodeId: string;\n /** Segment label shown for this branch. */\n pathLabel: string;\n /** Zero-based depth in the generated tree. */\n level: number;\n /** Path branch nodes always have descendants. */\n expandable: true;\n /** Whether the branch's descendants are currently visible. */\n expanded: boolean;\n}\n\n/**\n * A master/detail panel row rendered immediately beneath its expanded parent data row.\n *\n * Carries the parent's `originalIndex` (so the panel can be re-collapsed and tracked) and the\n * parent `row` (passed to `detailRenderer`). It is intentionally *not* a data-row item — selection,\n * editing, and cell rendering skip it.\n */\nexport interface DetailRowItem<T extends object = Record<string, unknown>> {\n /** Original index of the parent data row this detail panel belongs to. */\n detailFor: number;\n /** The parent row's data, passed to `detailRenderer`. */\n row: T;\n}\n\n/**\n * A data row rendered inside a hierarchical tree.\n *\n * Structurally a superset of the plain `{ row, originalIndex }` data-row item, so it also\n * satisfies {@link GridItem}'s data-row checks — selection, editing, and cell rendering treat\n * it exactly like a flat row. The extra fields drive indentation and the expand/collapse twisty.\n */\nexport interface TreeRowItem<T extends object = Record<string, unknown>> {\n /** The underlying row object from the data source. */\n row: T;\n /** Zero-based index of the row in the (flat) data source. */\n originalIndex: number;\n /** Depth in the tree. Root rows are `0`; each level of nesting adds `1`. */\n level: number;\n /** `true` when this row has at least one child row in the current projection. */\n expandable: boolean;\n /** `true` when this row is expandable and currently expanded (its children are visible). */\n expanded: boolean;\n /** Optional display-only label for the tree cell, used by path-based trees. */\n treeLabel?: string;\n}\n\n/**\n * Host-supplied configuration that turns the grid into a tree.\n *\n * Hierarchy is expressed over the existing flat row array using either stable id/parent-id\n * accessors or a path accessor. Path mode creates display-only branch nodes while leaves retain\n * their original datasource indices, so selection, editing, and persistence remain row-based.\n *\n * @example\n * ```ts\n * treeConfig: {\n * getId: row => row.id,\n * getParentId: row => row.managerId,\n * treeField: 'name',\n * }\n *\n * // Or derive branches from a delimited field:\n * treeConfig: {\n * getPath: row => row.oz.split('.'),\n * treeField: 'oz',\n * }\n * ```\n */\ninterface AgridTreeConfigBase<T extends object> {\n /** Field whose cell shows the indentation and expand/collapse twisty. */\n treeField: AgridField<T>;\n /** Expand all nodes when the tree first renders. Defaults to `false` (all collapsed). */\n defaultExpanded?: boolean;\n /**\n * When filtering, keep the ancestors of any matching row visible even if they don't match.\n * Defaults to `true`. (Applied by the projection layer, not by {@link GridItem} flattening.)\n */\n keepAncestorsOnFilter?: boolean;\n}\n\n/** Tree configuration for rows that already expose stable id and parent-id values. */\nexport interface AgridParentTreeConfig<T extends object = any> extends AgridTreeConfigBase<T> {\n /** Return a stable, unique id for a row. Used as the expansion key and for parent lookups. */\n getId: (row: T) => string | number;\n /** Return the id of a row's parent, or `null`/`undefined` for a root row. */\n getParentId: (row: T) => string | number | null | undefined;\n getPath?: never;\n}\n\n/** Values supplied when formatting one path-tree segment for display. */\nexport interface AgridPathSegmentParams<T extends object = any> {\n /** Datasource row that produced this path. Shared branches use the first matching row. */\n row: T;\n /** Raw segment returned by `getPath`. */\n segment: string | number;\n /** Zero-based position of the segment in the path. */\n level: number;\n /** Raw path prefix ending at this segment. */\n path: readonly (string | number)[];\n /** Whether this segment represents the datasource-backed leaf row. */\n leaf: boolean;\n}\n\n/** Tree configuration that derives display-only branch nodes from each row's path segments. */\nexport interface AgridPathTreeConfig<T extends object = any> extends AgridTreeConfigBase<T> {\n /** Return ordered path segments, for example `['01', '01', '0001']`. */\n getPath: (row: T) => readonly (string | number)[];\n /**\n * Return a stable UUID for generated branch nodes created from this row.\n * Shared branches use the first matching row, matching {@link formatPathSegment}.\n */\n nodeUuid?: (row: T) => string | number;\n /**\n * Return a stable UUID for generated branch nodes created from this row.\n * @deprecated Use {@link nodeUuid}. Kept as a compatibility alias for the original typo.\n */\n nodeUUid?: (row: T) => string | number;\n /** Format a segment for display without changing its identity, grouping, or sort order. */\n formatPathSegment?: (params: AgridPathSegmentParams<T>) => string;\n getId?: never;\n getParentId?: never;\n}\n\n/** Supported tree data modes: explicit parent links or generated path segments. */\nexport type AgridTreeConfig<T extends object = any> =\n | AgridParentTreeConfig<T>\n | AgridPathTreeConfig<T>;\n\n/** Selection behavior for the standalone tree control. */\nexport type AgridTreeSelectionMode = 'none' | 'single' | 'multi';\n\n/** Normalized row or generated-branch event emitted by the standalone tree control. */\nexport interface AgridTreeNodeEvent<T extends object = any> {\n kind: 'row' | 'branch';\n id: string | number;\n uuid?: string;\n label: string;\n level: number;\n expandable: boolean;\n expanded: boolean;\n row?: T;\n originalIndex?: number;\n}\n\n/** Current standalone-tree selection after a user interaction. */\nexport interface AgridTreeSelectionEvent<T extends object = any> {\n nodes: AgridTreeNodeEvent<T>[];\n}\n\n/** Zero-based position of a cell inside the grid. */\nexport interface CellPosition {\n /** Zero-based row index in the data array. */\n rowIndex: number;\n /** Zero-based column index in {@link ColDef} order. */\n colIndex: number;\n}\n\n/**\n * Emitted by `(validationFailed)` when a {@link ColDefBase.validate} hook rejects a committed\n * value. The value is not written to the row.\n */\nexport interface ValidationFailedEvent<T extends object = any> {\n /** Zero-based index of the row whose edit was rejected. */\n rowIndex: number;\n /** Field that failed validation. */\n field: AgridField<T>;\n /** The rejected value. */\n value: unknown;\n /** Message returned by the `validate` hook. */\n message: string;\n /** Which editing surface produced the rejected edit. */\n source: 'inline' | 'sidebar';\n}\n\n/** Emitted by `(cellEdit)` after the user commits a cell change. */\nexport type GridEditEvent<T extends object = any> = {\n [K in AgridField<T>]: {\n /** Position of the edited cell. */\n position: CellPosition;\n /** The `ColDef.field` that was changed. */\n field: K;\n /** Previous field value before the edit. */\n oldValue: T[K];\n /** New field value after the edit. */\n newValue: T[K];\n }\n}[AgridField<T>];\n\n/** Emitted when the optional info button inside a cell is clicked. */\nexport type CellInfoEvent<T extends object = any> = {\n [K in AgridField<T>]: {\n /** Datasource row containing the clicked cell. */\n row: T;\n /** Column field containing the clicked info button. */\n field: K;\n /** Current raw field value. */\n value: T[K];\n /** Zero-based index of the row in the datasource. */\n originalIndex: number;\n /** Column definition for the clicked cell. */\n column: ColDef<T, K>;\n }\n}[AgridField<T>];\n\n/**\n * Emitted asynchronously after an edit changes a row and the data source has been updated.\n *\n * Unlike {@link GridEditEvent}, this row-level event identifies the provider and\n * data source that own the edited record, which is useful when rendering multiple grids.\n */\nexport interface RecordEditEvent<T extends object = any> {\n /** Zero-based index of the edited row in the data source. */\n index: number;\n /** Current row data after the edit has been applied. */\n data: T;\n /** Exact provider instance that emitted the event. */\n provider: AgridProvider<T>;\n /** Exact data source containing the edited row. */\n datasource: AgridDataSource<T>;\n}\n\n/**\n * Compatibility alias for the provider-aware event emitted by `(rowRemoved)`.\n * @deprecated Use {@link RecordEditEvent}.\n */\nexport type RowRemovedEvent<T extends object = any> = RecordEditEvent<T>;\n\n/**\n * Emitted by `(rowSelect)` when the selection changes. `null` means all rows were deselected.\n * In `'single'` mode `rows` always has at most one entry.\n */\nexport interface RowSelectEvent<T extends object = any> {\n /** Selected rows and their original data-source indices. */\n rows: { row: T; originalIndex: number }[];\n}\n\n/** Emitted when the user clicks a data row. */\nexport interface RowClickEvent<T extends object = any> {\n /** Snapshot of the clicked row. */\n row: T;\n /** Zero-based index of the row in the data source. */\n originalIndex: number;\n}\n\n/** Emitted when the user clicks or double-clicks a generated path-tree branch node. */\nexport interface TreeNodeClickEvent {\n /** Stable UUID for the generated branch node. */\n uuid: string;\n /** Stable expansion id derived from the complete path to this node. */\n pathNodeId: string;\n /** Segment label shown for this branch. */\n pathLabel: string;\n /** Zero-based depth in the generated tree. */\n level: number;\n /** Whether the branch's descendants are currently visible. */\n expanded: boolean;\n /** Snapshot of the generated branch node. */\n node: PathTreeNodeItem;\n}\n\n/**\n * Emitted after an inline-edited row is left, or after the user saves through the sidebar editor.\n */\nexport interface RowUpdateEvent<T extends object = any> {\n /** Updated row data. */\n row: T;\n /** Zero-based index of the updated row in the data source. */\n originalIndex: number;\n}\n\n/**\n * Emitted by `(rowReorder)` when the user finishes dragging a row to a new position.\n * The grid does **not** reorder data itself — call `dataSource.moveRow(oldIndex, newIndex)`\n * (or your own equivalent) inside the handler.\n */\nexport interface RowReorderEvent<T extends object = any> {\n /** Snapshot of the row data at drag time. */\n row: T;\n /** Index of the row in the data source before the move. */\n oldIndex: number;\n /**\n * Target position in the data source (insert-before semantics).\n * Pass both `oldIndex` and `newIndex` to {@link AgridDataSource.moveRow}.\n */\n newIndex: number;\n}\n\n/**\n * Emitted by `(pageChange)` when the user navigates to a different page in server-side\n * pagination mode (i.e. when `AgridControl.totalRows` is set to a value greater than zero).\n * The host should fetch the rows for `startRow..endRow` from the server and push them into\n * the data source — the grid itself does not slice or filter the data in this mode.\n */\nexport interface PageChangeEvent {\n /** New page number (1-based). */\n page: number;\n /** Rows per page as configured on `AgridControl`. */\n pageSize: number;\n /** Zero-based index of the first row on this page. */\n startRow: number;\n /** Zero-based index of the last row on this page (inclusive). */\n endRow: number;\n}\n\n/** Emitted when a header text filter or column-menu condition changes server-side. */\nexport interface FilterChangeEvent {\n /** Field name of the filtered column. */\n field: string;\n /** Current free-text filter value. An empty string clears the text filter. */\n value: string;\n /**\n * Text, number, or date condition operator from the column-menu UI.\n * `null` clears the condition.\n * When set, `value` is empty and the operands live in {@link operand} / {@link operand2}.\n */\n operator?: FilterOperator | null;\n /** Primary condition operand. Present with {@link operator}. */\n operand?: string | null;\n /** Upper-bound operand, present only when {@link operator} is `'between'`. */\n operand2?: string | null;\n}\n\n/** Emitted when a sort changes in server-side filtering mode. */\nexport interface SortChangeEvent {\n /** Field name of the sorted column. */\n field: string;\n /** Current direction. `null` clears the sort. */\n direction: 'asc' | 'desc' | null;\n}\n\n/**\n * Emitted by `(prepareAddRecord)` when the grid has inserted a blank row.\n * Use this to populate the new row with real defaults via {@link AgridDataSource.updateRow} or\n * {@link AgridDataSource.patchRow}.\n */\nexport interface NewRecord<T extends object = any> {\n /** Index at which the blank row was inserted in the data source. */\n index: number;\n /** The empty row object the grid created (field values are `''` / `0` by type). */\n data: T;\n /** Exact provider instance that emitted this event. Useful when rendering multiple grids. */\n provider: AgridProvider<T>;\n /** Exact data source containing the inserted row. */\n datasource: AgridDataSource<T>;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["isDataRowItemFn","isDetailRowItemFn","isGroupHeaderItemFn","isPathTreeNodeItemFn","isTreeRowItemFn"],"mappings":";;;;;;;AAYA;AAEA;AACA,MAAM,WAAW,GAAG,0EAA0E;AAE9F;AACM,SAAU,aAAa,CAAC,GAAY,EAAA;IACxC,IAAI,GAAG,YAAY,IAAI;AAAE,QAAA,OAAO,IAAI;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AAChE,IAAA,OAAO,KAAK;AACd;AAEA;;;;AAIG;AACG,SAAU,eAAe,CAAC,GAAY,EAAE,MAAe,EAAE,YAAY,GAAG,KAAK,EAAA;AACjF,IAAA,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE;AAAE,QAAA,OAAO,EAAE;AACxC,IAAA,MAAM,cAAc,GAAG,YAAY,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE;IACjE,MAAM,CAAC,GAAG;AACR,UAAE,IAAI,IAAI,CAAC,CAAA,EAAG,cAAc,gBAAgB;AAC5C,UAAE,GAAG,YAAY,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAa,CAAC;AACvD,IAAA,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAAE,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC;AAC1C,IAAA,OAAO,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;AAClC,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,IAAI,YAAY,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC7C,KAAA,CAAC;AACJ;AAEA;AACM,SAAU,iBAAiB,CAAC,GAAY,EAAA;AAC5C,IAAA,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE;AAAE,QAAA,OAAO,EAAE;AACxC,IAAA,MAAM,IAAI,GAAG,GAAG,YAAY,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAa,CAAC;IAChE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AAC5E;AAEA;;;;;AAKG;AACG,SAAU,oBAAoB,CAAC,KAAa,EAAE,aAAsB,EAAA;IACxE,IAAI,KAAK,KAAK,EAAE;AAAE,QAAA,OAAO,EAAE;IAC3B,IAAI,aAAa,YAAY,IAAI;AAAE,QAAA,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,CAAA,cAAA,CAAgB,CAAC;IAC5E,IACE,OAAO,aAAa,KAAK;AACtB,WAAA,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,EAC5C;QACA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA,CAAE;IAC7C;AACA,IAAA,OAAO,KAAK;AACd;AAEA;SACgB,kBAAkB,CAAC,GAAuB,EAAE,GAAY,EAAE,MAAe,EAAA;AACvF,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;AAClC,IAAA,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE;AACtB,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAC3B,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,KAAK,GAAG,GAAI,CAAiB,CAAC,KAAK,KAAK,GAAG,CACrE;QACD,IAAI,GAAG,KAAK,SAAS;AAAE,YAAA,OAAO,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAI,GAAmB,CAAC,KAAK;IAC1F;IACA,IAAI,GAAG,CAAC,SAAS;AAAE,QAAA,OAAO,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;IAC5C,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE;AAC7C,QAAA,OAAO,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;IAC1D;AACA,IAAA,OAAO,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;AAC1B;AAEA;AACM,SAAU,aAAa,CAC3B,IAAiB,EAAA;AAEjB,IAAA,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,EAAE,WAAW,IAAI,IAAI,CAAC;AAC7F;AAEA;AACM,SAAU,eAAe,CAAmB,IAAiB,EAAA;AACjE,IAAA,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,WAAW,IAAI,IAAI;AACzE;AAEA;AACM,SAAU,iBAAiB,CAC/B,IAAc,EAAA;AAEd,IAAA,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,YAAY,IAAI,IAAI;AAC1E;AAEA;;;;;AAKG;AACG,SAAU,aAAa,CAAmB,IAAiB,EAAA;IAC/D,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI;AAC/C;AAEA;AACM,SAAU,kBAAkB,CAAC,IAAc,EAAA;AAC/C,IAAA,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,YAAY,IAAI,IAAI;AAC1E;AAEA;AACM,SAAU,gBAAgB,CAC9B,MAA0B,EAAA;AAE1B,IAAA,OAAO,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU;AAC7C;AAEA;AAEA;AACM,SAAU,wBAAwB,CACtC,IAA+B,EAC/B,OAAiB,EACjB,OAAqC,EACrC,MAA2B,EAC3B,MAAe,EAAA;IAEf,IAAI,MAAM,GAAG,OAAO;AACpB,IAAA,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QACrD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;YACf,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;AACpC,YAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzG;AACA,QAAA,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI,EAAE;YAClC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC;YAC9C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxE;AACA,QAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,EAAE,EAAE;YACtE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACzF;IACF;AACA,IAAA,OAAO,MAAM;AACf;AAEA;;AAEG;AACG,SAAU,qBAAqB,CACnC,GAAuB,EACvB,GAAY,EACZ,MAAoB,EACpB,MAAe,EAAA;AAEf,IAAA,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,IAAI,GAAG,EAAE,IAAI,KAAK,MAAM,EAAE;AAClD,QAAA,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC;AAC5E,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC;AACtE,QAAA,QAAQ,MAAM,CAAC,QAAQ;AACrB,YAAA,KAAK,IAAI,EAAE,OAAO,KAAK,KAAK,OAAO;AACnC,YAAA,KAAK,KAAK,EAAE,OAAO,KAAK,KAAK,OAAO;YACpC,KAAK,YAAY,EAAE,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC;YACnD,KAAK,UAAU,EAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC/C,KAAK,UAAU,EAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC/C,KAAK,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YACnD,KAAK,MAAM,EAAE;gBACX,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC;AAC9D,gBAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAC9D,gBAAA,OAAO,IAAI,MAAM,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YACpD;AACA,YAAA,SAAS,OAAO,IAAI;;IAExB;AAEA,IAAA,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,KAAK,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC;AACzD,IAAA,MAAM,KAAK,GAAG,CAAC,CAAU,KACvB;WACK,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAW,CAAC,CAAC,OAAO,EAAE;AACpE,UAAE,MAAM,CAAC,CAAC,CAAC;AACf,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;AACxB,IAAA,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;IACrC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;AAC/B,IAAA,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAAE,QAAA,OAAO,IAAI;AAChC,IAAA,QAAQ,MAAM,CAAC,QAAQ;AACrB,QAAA,KAAK,IAAI,EAAG,OAAO,KAAK,KAAK,CAAC;AAC9B,QAAA,KAAK,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC;AAC9B,QAAA,KAAK,IAAI,EAAG,OAAO,KAAK,GAAG,CAAC;AAC5B,QAAA,KAAK,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;AAC7B,QAAA,KAAK,IAAI,EAAG,OAAO,KAAK,GAAG,CAAC;AAC5B,QAAA,KAAK,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;QAC7B,KAAK,SAAS,EAAE;YACd,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;AAChC,YAAA,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,IAAI,CAAC;YACtC,OAAO,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3D;AACA,QAAA,SAAS,OAAO,IAAI;;AAExB;AAEA;;;AAGG;AACG,SAAU,gBAAgB,CAC9B,IAA+B,EAC/B,OAAiB,EACjB,IAAY,EACZ,IAAc,EACd,MAAe,EAAA;IAEf,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,IAAA,IAAI,CAAC,CAAC;AAAE,QAAA,OAAO,OAAO;AACtB,IAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,IACrB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAChG;AACH;AAEA;AAEA;;;;AAIG;AACG,SAAU,kBAAkB,CAChC,IAA+B,EAC/B,OAAiB,EACjB,WAAqC,EACrC,MAA2B,EAC3B,MAAe,EAAA;AAEf,IAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,OAAO;AAE5C,IAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAClF,IAAA,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAI;QACjD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC;QACnD,MAAM,aAAa,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC;AACtD,QAAA,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAC9B,MAAM,aAAa,GAAG,IAAI,KAAK,CAAS,OAAO,CAAC,MAAM,CAAC;AAEvD,QAAA,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;AAC5D,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AAC9B,YAAA,MAAM,UAAU,GAAG,GAAG,EAAE,IAAI,KAAK,MAAM,IAAI,aAAa,CAAC,GAAG,CAAC;YAC7D,MAAM,SAAS,GAAG;kBACd,GAAG,YAAY,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,GAAa,CAAC,CAAC,OAAO;AACvE,kBAAE,MAAM,CAAC,GAAG;AACd,YAAA,MAAM,YAAY,GAAG,GAAG,EAAE,IAAI,KAAK;mBAC9B,CAAC,GAAG,CAAC;AACL,mBAAA,CAAC,GAAG,CAAC,MAAM,EAAE;mBACb,OAAO,GAAG,KAAK;AACf,mBAAA,MAAM,CAAC,QAAQ,CAAC,GAAG;AACtB,kBAAE;AACF,kBAAE,MAAM,CAAC,GAAG;AACd,YAAA,QAAQ,CAAC,QAAQ,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,CAAC;AACvC,YAAA,UAAU,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS;AAC/D,YAAA,aAAa,CAAC,QAAQ,CAAC,GAAG,YAAY;YACtC,aAAa,CAAC,QAAQ,CAAC,GAAG,UAAU,GAAG,EAAE,GAAG,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC;QAClF;QAEA,OAAO;AACL,YAAA,SAAS,EAAE,MAAM,CAAC,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;YAC1C,QAAQ;YACR,UAAU;YACV,aAAa;YACb,aAAa;SACd;AACH,IAAA,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,QAAQ,CAAC;IAEnF,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACtB,QAAA,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;AACjE,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,YAAA,IAAI,UAAkB;AACtB,YAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;AAC1C,gBAAA,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACxD;iBAAO,IACL,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;AACjC,mBAAA,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EACxC;AACA,gBAAA,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;YAC9D;iBAAO;AACL,gBAAA,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAC/E;AACA,YAAA,IAAI,UAAU,KAAK,CAAC,EAAE;AACpB,gBAAA,OAAO,UAAU,GAAG,KAAK,CAAC,SAAS;YACrC;QACF;QACA,OAAO,CAAC,GAAG,CAAC;AACd,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;AACrD;AAYA;;;;AAIG;AACG,SAAU,iBAAiB,CAC/B,IAA+B,EAC/B,OAAiB,EACjB,IAAc,EACd,iBAAmD,EAAA;IAEnD,MAAM,MAAM,GAA4B,EAAE;AAC1C,IAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,MAAM,SAAS,GAAwB,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS;AACpF,QAAA,IAAI,CAAC,SAAS;YAAE;AAChB,QAAA,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;YACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3D,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAI,SAA4C,CAAC,MAAM,CAAC;YACzE;QACF;QAEA,IAAI,KAAK,GAAG,CAAC;QACb,IAAI,YAAY,GAAG,CAAC;QACpB,IAAI,GAAG,GAAG,CAAC;QACX,IAAI,GAAG,GAAG,QAAQ;AAClB,QAAA,IAAI,GAAG,GAAG,CAAC,QAAQ;AACnB,QAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,YAAA,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE;AAAE,gBAAA,KAAK,EAAE;AAEtC,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE;AACzB,YAAA,YAAY,EAAE;YACd,GAAG,IAAI,KAAK;YACZ,IAAI,KAAK,GAAG,GAAG;gBAAE,GAAG,GAAG,KAAK;YAC5B,IAAI,KAAK,GAAG,GAAG;gBAAE,GAAG,GAAG,KAAK;QAC9B;QAEA,QAAQ,SAAS;AACf,YAAA,KAAK,KAAK;AACR,gBAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG;gBACvB;AACF,YAAA,KAAK,KAAK;AACR,gBAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,GAAG,GAAG,YAAY,GAAG,IAAI;gBAC5D;AACF,YAAA,KAAK,KAAK;AACR,gBAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,GAAG,GAAG,IAAI;gBAC7C;AACF,YAAA,KAAK,KAAK;AACR,gBAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,GAAG,GAAG,IAAI;gBAC7C;AACF,YAAA,KAAK,OAAO;AACV,gBAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK;gBACzB;;IAEN;AACA,IAAA,OAAO,MAAM;AACf;AAEM,SAAU,iBAAiB,CAC/B,IAA+B,EAC/B,OAAiB,EACjB,UAAkB,EAClB,MAA2B,EAC3B,WAAqC,EACrC,cAA2B,EAC3B,MAAe,EACf,aAAA,GAA0B,EAAE,EAC5B,iBAAA,GAAsD,EAAE,EAAA;IAExD,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CACtC,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS,CACrD;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;AAEvC,IAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB;AAC1C,IAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;AACvB,QAAA,MAAM,GAAG,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;AACrE,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1B;AAEA,IAAA,MAAM,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAC9C,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CACpD;AAED,IAAA,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC;AACnE,IAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;QAC5B,KAAK,MAAM,GAAG,SAAS,CAAC,IAAI,MAAM,EAAE;AAClC,YAAA,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC;AACjF,YAAA,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC;QAClD;IACF;IAEA,MAAM,KAAK,GAAe,EAAE;AAC5B,IAAA,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE;QAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE;QAClC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;QAC1C,MAAM,UAAU,GAAG;cACf,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB;cACnE,SAAS;QACb,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;QAC5F,IAAI,UAAU,EAAE;YACd,KAAK,MAAM,CAAC,IAAI,SAAS;AAAE,gBAAA,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;QAC3E;IACF;AACA,IAAA,OAAO,KAAK;AACd;AAQA;;;;;;;;;;;;;;;AAeG;AACG,SAAU,cAAc,CAC5B,IAAS,EACT,OAAiB,EACjB,SAA2B,EAC3B,WAAiC,EACjC,gBAAuC,EAAA;AAEvC,IAAA,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS;AAExC,IAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmB;IAC9C,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;;AAGxD,IAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA6B;IAC7D,MAAM,KAAK,GAAa,EAAE;AAC1B,IAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrC,QAAA,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAClD,YAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACb;QACF;QACA,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC/C,QAAA,IAAI,QAAQ;AAAE,YAAA,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;;YACzB,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C;IAEA,MAAM,KAAK,GAAkB,EAAE;AAC/B,IAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB;AAE1C,IAAA,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,KAAa,KAAU;AACnD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;AACvB,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC;AACrB,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AAAE,YAAA,OAAO;AAC5B,QAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAEf,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;AACzC,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM;QACrC,MAAM,QAAQ,GAAG,UAAU,KAAK,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AACnF,QAAA,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAEtE,QAAA,IAAI,QAAQ,IAAI,QAAQ,EAAE;YACxB,KAAK,MAAM,UAAU,IAAI,QAAQ;AAAE,gBAAA,KAAK,CAAC,UAAU,EAAE,KAAK,GAAG,CAAC,CAAC;QACjE;AACF,IAAA,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,KAAK;AAAE,QAAA,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;AAClD,IAAA,OAAO,KAAK;AACd;AAEA;AACM,SAAU,cAAc,CAAC,IAAkC,EAAA;AAC/D,IAAA,OAAO,CAAA,cAAA,EAAiB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE;AAC5D;AAEM,SAAU,gBAAgB,CAAC,IAAkC,EAAA;AACjE,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,UAAU;IAClB,IAAI,CAAC,GAAG,UAAU;IAClB,IAAI,CAAC,GAAG,UAAU;IAClB,IAAI,CAAC,GAAG,UAAU;AAElB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACjC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC;QACnC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC;QACnC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC;QACnC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC;IACrC;IAEA,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SACpB,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;SACxD,IAAI,CAAC,EAAE;SACP,KAAK,CAAC,EAAE,CAAC;AACZ,IAAA,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;IACb,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;AAC5D,IAAA,OAAO,CAAA,EAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;AAC7J;AAEA;AACM,SAAU,kBAAkB,CAChC,IAAS,EACT,OAAiB,EACjB,MAA8B,EAC9B,WAAiC,EACjC,aAAa,GAAG,KAAK,EAAA;AAWrB,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB;AACvC,IAAA,KAAK,MAAM,aAAa,IAAI,OAAO,EAAE;QACnC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CACxD,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CACtC;AACD,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,QAAA,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,IAAa,KACjD,MAAM,CAAC,iBAAiB,GAAG;AACzB,YAAA,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC;AACxB,YAAA,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;YACvB,KAAK;YACL,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;YACjC,IAAI;AACL,SAAA,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;AACnB,QAAA,MAAM,eAAe,GAAG,CAAC,MAAyB,KAChD,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;eACvC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;AACrC,eAAA,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,QAAQ,GAAG,KAAK;AACpB,QAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE;AACpD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;AACvC,YAAA,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC;YACjC,IAAI,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,MAAM,GAAG;oBACP,EAAE;AACF,oBAAA,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC;AAC7B,oBAAA,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC;oBAClC,KAAK;oBACL,QAAQ,EAAE,IAAI,GAAG,EAAE;AACnB,oBAAA,MAAM,EAAE,EAAE;iBACX;AACD,gBAAA,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC;YAC1B;YACA,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,gBAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,aAAa;oBACb,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC;AAC5C,iBAAA,CAAC;YACJ;AACA,YAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ;QAC5B;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACrB,YAAA,MAAM,EAAE,GAAG,cAAc,CAAC,EAAE,CAAC;YAC7B,IAAI,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,MAAM,GAAG;oBACP,EAAE;AACF,oBAAA,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;AACzB,oBAAA,KAAK,EAAE,EAAE;oBACT,KAAK,EAAE,CAAC,CAAC;oBACT,QAAQ,EAAE,IAAI,GAAG,EAAE;AACnB,oBAAA,MAAM,EAAE,EAAE;iBACX;AACD,gBAAA,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC;YACvB;AACA,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QACtE;IACF;IAEA,MAAM,KAAK,GAAkB,EAAE;AAC/B,IAAA,MAAM,KAAK,GAAG,CAAC,MAAc,KAAU;AACrC,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC;AACrC,QAAA,MAAM,QAAQ,GAAG,aAAa,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,EAAE;YACjB,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,UAAU,EAAE,MAAM,CAAC,EAAE;gBACrB,SAAS,EAAE,MAAM,CAAC,KAAK;gBACvB,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,gBAAA,UAAU,EAAE,IAAI;gBAChB,QAAQ;AACT,aAAA,CAAC;QACJ;AACA,QAAA,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ;YAAE;QAChC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;YAAE,KAAK,CAAC,KAAK,CAAC;AAC1D,QAAA,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE;YAChC,KAAK,CAAC,IAAI,CAAC;AACT,gBAAA,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;gBAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;AACjC,gBAAA,KAAK,EAAE,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC;AAC1C,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,QAAQ,EAAE,KAAK;gBACf,SAAS,EAAE,IAAI,CAAC,KAAK;AACtB,aAAA,CAAC;QACJ;AACF,IAAA,CAAC;AACD,IAAA,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,MAAM,CAAC;AAClD,IAAA,OAAO,KAAK;AACd;AAEA;AAEA;SACgB,mBAAmB,CAAC,QAAgB,EAAE,MAAc,EAAE,KAAiB,EAAA;IACrF,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC;IAChG,MAAM,MAAM,GAAK,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM,CAAC;IAC9F,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE;IACtD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACzE,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,IAAA,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;AAC7B,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;QACrB,IAAI,aAAa,CAAC,IAAI,CAAC;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;IACvD;AACA,IAAA,OAAO,IAAI;AACb;AAEA;AACM,SAAU,gBAAgB,CAAC,KAAc,EAAE,IAAY,EAAA;AAC3D,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IAC7C,OAAO,IAAI,MAAM,CAAC,CAAA,IAAA,EAAO,IAAI,CAAC,MAAM,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC5E;;ACznBA;;;;;;;AAOG;MAuFU,kBAAkB,CAAA;;AAE7B,IAAA,GAAG,GAAG,KAAK,CAAC,QAAQ,yEAAU;;AAG9B,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAU;;AAGnC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAU;;AAGnC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAW;;AAGjC,IAAA,oBAAoB,GAAG,KAAK,CAAgB,IAAI,2FAAC;;AAGjD,IAAA,GAAG,GAAG,KAAK,CAA0B,EAAE,0EAAC;;AAGxC,IAAA,MAAM,GAAG,KAAK,CAAqB,SAAS,6EAAC;;AAG7C,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;;AAGhC,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;;AAG/B,IAAA,QAAQ,GAAG,KAAK,CAAU,IAAI,+EAAC;;AAG/B,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;;AAGpC,IAAA,KAAK,GAAG,KAAK,CAAgB,IAAI,4EAAC;;AAGlC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;;AAGhC,IAAA,SAAS,GAAG,KAAK,CAAS,CAAC,gFAAC;;AAG5B,IAAA,cAAc,GAAG,KAAK,CAAU,KAAK,qFAAC;;AAGtC,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;;IAGpC,UAAU,GAAG,MAAM,EAAQ;;IAGlB,UAAU,GAAG,EAAE;AAExB;;;AAGG;AACH,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;;AAG5B,IAAA,gBAAgB,GAAG,KAAK,CAAU,IAAI,uFAAC;AAEvC;;;AAGG;IACH,QAAQ,GAAG,MAAM,EAAc;;IAG/B,SAAS,GAAG,MAAM,EAAQ;;IAG1B,aAAa,GAAG,MAAM,EAAW;;IAGjC,SAAS,GAAG,MAAM,EAAQ;AAE1B;;;AAGG;IACH,WAAW,GAAG,MAAM,EAAW;;AAGtB,IAAA,KAAK,GAAG,MAAM,CAAU,EAAE,4EAAC;;AAG3B,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAa;AAC3C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;QAC1B,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE;AAC9B,YAAA,OAAO,iBAAiB,CAAC,KAAK,CAAC;QACjC;AACA,QAAA,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;AAC5B,IAAA,CAAC,kFAAC;;AAGO,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAoB;AACxD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtB,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE;AAC5F,YAAA,OAAO,IAAI;QACb;QACA,OAAO,GAAG,CAAC,SAAS,CAAC;AACnB,YAAA,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;AACf,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,YAAA,MAAM,EAAE,GAAG;SACZ,CAAC,IAAI,IAAI;AACZ,IAAA,CAAC,wFAAC;;IAGO,WAAW,GAAG,QAAQ,CAC7B,MAAe,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACzE;;AAGQ,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAc;AAC/C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,QAAA,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG;AAC3D,IAAA,CAAC,qFAAC;AAEO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAa;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY;AACxC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;AACxB,QAAA,OAAO,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAC3D,IAAA,CAAC,mFAAC;AAEF;;;AAGG;AACM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE;QACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IACf,OAAO,CAAC,KAAK;cACT,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAY;AACpC,cAAE,EAAE,KAAK,EAAG,CAAiB,CAAC,KAAK,EAAE,QAAQ,EAAG,CAAiB,CAAC,KAAK,EAAE,CAC5E;AACH,IAAA,CAAC,mFAAC;AAEF;;;AAGG;AACM,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAa;QAC5C,OAAO,IAAI,CAAC,oBAAoB;AAC3B,eAAA,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAClE,IAAA,CAAC,mFAAC;AAEF;;;;AAIG;AACM,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAa;AACnD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE;AACxB,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC;AAC/D,IAAA,CAAC,0FAAC;AAEe,IAAA,OAAO,GAAG,SAAS,CAA+B,WAAW,8EAAC;AAC9D,IAAA,QAAQ,GAAG,SAAS,CAAgC,YAAY,+EAAC;AAElF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAClB,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;gBAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK,MAAM;AACzC,gBAAA,MAAM,YAAY,GAAG,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE;AAClE,gBAAA,MAAM,WAAW,GAAG,YAAY,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;gBACxG,MAAM,YAAY,GAAG;AACnB,sBAAE;AACF,sBAAE,IAAI,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE;AACrC,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACrC,gBAAA,MAAM,oBAAoB,GAAG,IAAI,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI;AACtF,sBAAE,IAAI,CAAC,KAAK;sBACV,YAAY;AAChB,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC;gBAEpC,UAAU,CAAC,MAAK;oBACd,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa;oBAC3C,IAAI,KAAK,EAAE;wBACT,MAAM,WAAW,GAAG;AAClB,8BAAE;AACF,8BAAE,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAAC;AACtC,wBAAA,KAAK,CAAC,KAAK,GAAG,WAAW;wBACzB,KAAK,CAAC,KAAK,EAAE;AACb,wBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE;4BAAE,KAAK,CAAC,MAAM,EAAE;AACxE,6BAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;AAC9B,4BAAA,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM;AAC9B,4BAAA,KAAK,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC;wBACnC;wBACA;oBACF;oBAEA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;oBAC1C,IAAI,GAAG,EAAE;AACP,wBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,EAAE;wBACtC,IAAI,GAAG,IAAI,CAAC;AAAE,4BAAA,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;wBACrC,GAAG,CAAC,KAAK,EAAE;AACX,wBAAA,IAAI;AACD,4BAAA,GAAuD,CAAC,UAAU,IAAI;wBACzE;AAAE,wBAAA,MAAM;4BACN,GAAG,CAAC,KAAK,EAAE;wBACb;oBACF;AACF,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,eAAe,CAAC,KAAiB,EAAA;QAC/B,KAAK,CAAC,eAAe,EAAE;QACvB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;QACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;IACjD;;AAGA,IAAA,YAAY,CAAC,KAAiB,EAAA;QAC5B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;;AAGA,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK;AACvB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACrC,IAAI,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;AACxC,YAAA,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;AACxC,YAAA,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;YAC/D;QACF;QACA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,KAAK;cAC9B,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE;cACtC,GAAG;AACP,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;AAEA;;;AAGG;AACH,IAAA,cAAc,CAAC,KAAY,EAAA;QACzB,MAAM,GAAG,GAAG,MAAM,CAAE,KAAK,CAAC,MAA4B,CAAC,KAAK,CAAC;AAC7D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,IAAI,EAAE;AAC1C,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;IACjC;wGAlQW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,0BAAA,EAAA,8BAAA,EAAA,oBAAA,EAAA,+BAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAvEnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoET,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,krFAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGU,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAtF9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,eAAA,EACL,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,IAAI,EAAE,UAAU;AAChB,wBAAA,kBAAkB,EAAE,YAAY;AAChC,wBAAA,iBAAiB,EAAE,WAAW;AAC9B,wBAAA,uBAAuB,EAAE,YAAY;AACrC,wBAAA,4BAA4B,EAAE,8BAA8B;AAC5D,wBAAA,sBAAsB,EAAE,6BAA6B;AACrD,wBAAA,cAAc,EAAE,gBAAgB;AAChC,wBAAA,SAAS,EAAE,uBAAuB;AAClC,wBAAA,YAAY,EAAE,kBAAkB;AAChC,wBAAA,QAAQ,EAAE,IAAI;qBACf,EAAA,QAAA,EACS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoET,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,krFAAA,CAAA,EAAA;AAkKkE,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,KAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,WAAW,kEACT,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACjRnF;MACa,mBAAmB,CAAA;AAGX,IAAA,GAAA;AAEA,IAAA,GAAA;;IAHnB,WAAA,CACmB,GAAA,GACf,OAAO,QAAQ,KAAK,WAAW,GAAG,IAAI,GAAG,QAAQ,EAClC,GAAA,GACf,OAAO,MAAM,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,EAAA;QAH9B,IAAA,CAAA,GAAG,GAAH,GAAG;QAEH,IAAA,CAAA,GAAG,GAAH,GAAG;IAEnB;;AAGH,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI;IAC/C;;IAGA,mBAAmB,CACjB,IAAO,EACP,QAA8C,EAAA;QAE9C,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,IAAI,EAAE,QAAyB,CAAC;IAC7D;;IAGA,sBAAsB,CACpB,IAAO,EACP,QAA8C,EAAA;QAE9C,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,IAAI,EAAE,QAAyB,CAAC;IAChE;;IAGA,iBAAiB,CAAC,CAAS,EAAE,CAAS,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,GAAG,EAAE,iBAAiB,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE;IAClD;;AAGA,IAAA,YAAY,CAAC,OAAoB,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI;AAAE,YAAA,OAAO,KAAK;QACjC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AAClC,QAAA,OAAO,IAAI;IACb;;IAGA,kBAAkB,CAAC,MAAc,EAAE,UAAkB,EAAA;AACnD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI;YAAE;QACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;QACnC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,UAAU;IAC7C;;IAGA,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,GAAG,EAAE,UAAU,IAAI,MAAM,CAAC,iBAAiB;IACzD;;IAGA,cAAc,GAAA;QACZ,OAAO,IAAI,CAAC,GAAG,EAAE,WAAW,IAAI,MAAM,CAAC,iBAAiB;IAC1D;;AAGA,IAAA,aAAa,CAAC,OAAgB,EAAA;QAC5B,OAAO,IAAI,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,IAAI;IACtD;;IAGA,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI;IACnE;;AAGA,IAAA,QAAQ,CAAC,QAAoB,EAAE,KAAK,GAAG,CAAC,EAAA;AACtC,QAAA,OAAO,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC;IACpC;;IAGA,MAAM,cAAc,CAAC,IAAY,EAAA;AAC/B,QAAA,IAAI;YACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,SAAS;YAC/C,IAAI,CAAC,SAAS,EAAE,SAAS;AAAE,gBAAA,OAAO,KAAK;AACvC,YAAA,MAAM,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;AAC/B,YAAA,OAAO,IAAI;QACb;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;;AAGA,IAAA,YAAY,CAAC,QAAgB,EAAE,IAAY,EAAE,QAAgB,EAAA;AAC3D,QAAA,MAAM,MAAM,GAAI,IAAI,CAAC,GAA8C,EAAE;AAChE,gBAAC,OAAO,GAAG,KAAK,WAAW,GAAG,IAAI,GAAG,GAAG,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,eAAe;AAAE,YAAA,OAAO,KAAK;QAC7D,IAAI,GAAG,GAAkB,IAAI;QAC7B,IAAI,MAAM,GAA6B,IAAI;AAC3C,QAAA,IAAI;AACF,YAAA,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC;AACpC,YAAA,MAAM,CAAC,IAAI,GAAG,GAAG;AACjB,YAAA,MAAM,CAAC,QAAQ,GAAG,QAAQ;AAC1B,YAAA,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;YAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACjC,MAAM,CAAC,KAAK,EAAE;AACd,YAAA,OAAO,IAAI;QACb;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;gBAAU;YACR,MAAM,EAAE,MAAM,EAAE;AAChB,YAAA,IAAI,GAAG;AAAE,gBAAA,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC;QACtC;IACF;AACD;;AC/ED;MACa,qBAAqB,CAAA;AACH,IAAA,IAAA;AAA7B,IAAA,WAAA,CAA6B,IAAkC,EAAA;QAAlC,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAiC;;AAGlE,IAAA,IAAI,CAAC,KAAqB,EAAA;AACxB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;AAClC,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;QAChD,KAAK,CAAC,cAAc,EAAE;IACxB;;AAGA,IAAA,KAAK,CAAC,KAAqB,EAAA;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,YAAY,CAAC;QACvD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAAE;QACxC,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;IACjC;;IAGA,cAAc,GAAA;AACZ,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,EAAE;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;QAC3C,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;QAExD,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,KAC/B,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CACzD;AACD,QAAA,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,QAAQ;QACzC,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,QAAQ,EAAE,QAAQ,IAAI,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,QAAQ,EAAE;eACtC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QAC9C,MAAM,KAAK,GAAa,EAAE;AAC1B,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU;AAEvC,QAAA,IAAI,QAAQ,IAAI,CAAC,EAAE;AACjB,YAAA,KAAK,IAAI,YAAY,GAAG,QAAQ,EAAE,YAAY,IAAI,MAAM,EAAE,YAAY,EAAE,EAAE;AACxE,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;AAC/B,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;oBAAE;AAC1B,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC/D,gBAAA,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;YACvC;QACF;QAEA,KAAK,MAAM,aAAa,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE;AAC7D,YAAA,IAAI,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC;gBAAE;AACtC,YAAA,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC;AACnC,YAAA,IAAI,CAAC,GAAG;gBAAE;AACV,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5D;AAEA,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IACzB;AAEQ,IAAA,YAAY,CAClB,GAA4B,EAC5B,IAAc,EACd,QAAgB,EAChB,MAAc,EAAA;QAEd,MAAM,KAAK,GAAa,EAAE;AAC1B,QAAA,KAAK,IAAI,QAAQ,GAAG,QAAQ,EAAE,QAAQ,IAAI,MAAM,EAAE,QAAQ,EAAE,EAAE;AAC5D,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC1B,YAAA,IAAI,CAAC,GAAG;gBAAE;YACV,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAC5B,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAC5D,CAAC;QACJ;AACA,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IACzB;;AAGA,IAAA,oBAAoB,CAAC,IAAY,EAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB,EAAE;AAC9C,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AAC1C,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE;QAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;QACzC,IAAI,YAAY,GAAG,KAAK;QACxB,MAAM,cAAc,GAAmB,EAAE;AAEzC,QAAA,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;YAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;AAC/C,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAAE;AAC1B,YAAA,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;AACvE,gBAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,SAAS;AAC3C,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC1B,gBAAA,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC;oBAAE;AAChE,gBAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;AACjE,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC;gBACxE,IAAI,QAAQ,KAAK,QAAQ;oBAAE;AAE3B,gBAAA,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;AAClE,gBAAA,MAAM,IAAI,GAAG;oBACX,QAAQ,EAAE,IAAI,CAAC,aAAa;oBAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,QAAQ;oBACR,QAAQ;iBACT;AACD,gBAAA,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;oBACnB,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE;oBACpD,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,QAAQ;oBACR,QAAQ;AACT,iBAAA,CAAC;gBACF,YAAY,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE;YAC3D;QACF;QAEA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,cAAc,CAAC;AAClD,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;AACxC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC;IAC7F;IAEQ,qBAAqB,GAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AACvB,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;AACvE,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;AACrE,QAAA,IAAI,kBAAkB,GAAG,CAAC,IAAI,iBAAiB,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;QAChE,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;YACzD,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;AACvD,YAAA,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;AAC/D,YAAA,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;SAC9D;IACH;IAEQ,wBAAwB,GAAA;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,EAAE;AAC1C,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,KAAK;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACzC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI;QAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7D,IAAI,YAAY,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;QACjC,OAAO;AACL,YAAA,QAAQ,EAAE,YAAY;AACtB,YAAA,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,MAAM,EAAE,QAAQ,CAAC,QAAQ;SAC1B;IACH;AAEQ,IAAA,gBAAgB,CAAC,aAAqB,EAAA;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,SAAS,CACxC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa,CACpE;IACH;IAEQ,uBAAuB,CAAC,YAAoB,EAAE,QAAgB,EAAA;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC;QACpD,IAAI,aAAa,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE;AAC1E,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE;IAC9D;AAEQ,IAAA,cAAc,CAAC,KAAa,EAAA;QAClC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAA,CAAA,EAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,KAAK;IAC3E;AAEQ,IAAA,kBAAkB,CAAC,IAAY,EAAA;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACtF,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG;QACxD,MAAM,IAAI,GAAe,EAAE;QAC3B,IAAI,GAAG,GAAa,EAAE;QACtB,IAAI,IAAI,GAAG,EAAE;QACb,IAAI,MAAM,GAAG,KAAK;AAElB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,YAAA,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC;YAC1B,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,IAAI,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;oBAC7C,IAAI,IAAI,GAAG;AACX,oBAAA,CAAC,EAAE;gBACL;AAAO,qBAAA,IAAI,IAAI,KAAK,GAAG,EAAE;oBACvB,MAAM,GAAG,KAAK;gBAChB;qBAAO;oBACL,IAAI,IAAI,IAAI;gBACd;YACF;AAAO,iBAAA,IAAI,IAAI,KAAK,GAAG,EAAE;gBACvB,MAAM,GAAG,IAAI;YACf;AAAO,iBAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AAC7B,gBAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBACd,IAAI,GAAG,EAAE;YACX;AAAO,iBAAA,IAAI,IAAI,KAAK,IAAI,EAAE;AACxB,gBAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACd,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBACd,GAAG,GAAG,EAAE;gBACR,IAAI,GAAG,EAAE;YACX;iBAAO;gBACL,IAAI,IAAI,IAAI;YACd;QACF;AAEA,QAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IACrE;IAEQ,iBAAiB,CAAC,KAAa,EAAE,GAAW,EAAA;AAClD,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE;AACtB,YAAA,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAClC,OAAO,MAAM,KAAK;kBACd,MAAM,KAAK;AACb,kBAAE,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAC7D;YACD,IAAI,KAAK,KAAK,SAAS;AAAE,gBAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK;QACjF;AACA,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACzB,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;YACjC,OAAO,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,KAAK,GAAG,WAAW;QAC/E;AACA,QAAA,OAAO,KAAK;IACd;AACD;;ACvOD;;;AAGG;MACU,sBAAsB,CAAA;AACJ,IAAA,IAAA;AAA7B,IAAA,WAAA,CAA6B,IAA8B,EAAA;QAA9B,IAAA,CAAA,IAAI,GAAJ,IAAI;IAA6B;;AAGrD,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QACnC,IAAI,OAAO,GAAG;cACV,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3E,cAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;QAElD,IAAI,OAAO,EAAE;AACX,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE;AACnC,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACrE,gBAAA,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAC/B,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAC1E;YACH;AACA,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE;AACtC,YAAA,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE;AACnB,gBAAA,OAAO,GAAG;AACR,oBAAA,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC/C,oBAAA,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;iBACjD;YACH;QACF;aAAO;AACL,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;AAC3D,YAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACrB,OAAO,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;YACxE;QACF;AACA,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC,qFAAC;;AAGO,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QACnC,IAAI,OAAO,EAAE;AACX,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE;AACtC,YAAA,OAAO,MAAM,CAAC,IAAI,GAAG;kBACjB,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;kBACzD,EAAE;QACR;AACA,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;AACnE,IAAA,CAAC,oFAAC;;AAGO,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QACnC,IAAI,OAAO,EAAE;AACX,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE;AAC3C,YAAA,OAAO,MAAM,CAAC,IAAI,GAAG;kBACjB,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;kBACzD,EAAE;QACR;AACA,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC;AACpE,IAAA,CAAC,yFAAC;;AAGO,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;QACzC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;AACtE,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC3F,IAAA,CAAC,wFAAC;IAEO,aAAa,GAAG,QAAQ,CAAC,MAChC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACjE;AACQ,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,GAAG,CAAC,yFAAC;IACzE,oBAAoB,GAAG,QAAQ,CAAC,MACvC,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAClD;AACQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,sFACvE;AAEQ,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MACxC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,4FACxD;AACQ,IAAA,yBAAyB,GAAG,QAAQ,CAAC,MAC5C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,QAAQ,CAAC,gGAC9D;AACQ,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MACvC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC,2FAC9D;AAEQ,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;AACvD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB;cAC9B,CAAA,EAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAA,GAAA,EAAM,OAAO,CAAA;cAC9C,OAAO;AACb,IAAA,CAAC,0FAAC;AAEO,IAAA,yBAAyB,GAAG,QAAQ,CAAC,MAAK;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;AACtD,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;YACjC,MAAM,YAAY,GAAG,CAAA,EAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAA,EAAA,CAAI;AAC1D,YAAA,OAAO,OAAO,GAAG,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,GAAG,YAAY;QAC9D;AACA,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC,gGAAC;AAEO,IAAA,6BAA6B,GAAG,QAAQ,CAAC,MAChD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,oGAC3C;AACQ,IAAA,wBAAwB,GAAG,QAAQ,CAAC,MAC3C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,+FAC5C;AAEQ,IAAA,UAAU,GAAG,QAAQ,CAAC,MAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE;WAC3B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACzE;AACQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE;WAC1B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACzE;AACQ,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,2FAAC;AAC5E,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,2FAAC;AAE5E,IAAA,KAAK,CAAC,OAAiB,EAAA;QAC7B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E;AAEQ,IAAA,WAAW,CAAC,OAAiB,EAAA;QACnC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IACzE;IAEQ,oBAAoB,CAAC,OAAiB,EAAE,IAAY,EAAA;QAC1D,MAAM,IAAI,GAA0B,EAAE;AACtC,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AACxC,YAAA,MAAM,EAAE,GAAG,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACtC,IAAI,EAAE,KAAK,IAAI,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE;gBACtC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC/B,QAAQ,CAAC,IAAI,EAAE;gBACf;YACF;YACA,IAAI,CAAC,IAAI,CAAC;AACR,gBAAA,GAAG,EAAE,CAAA,EAAG,IAAI,IAAI,GAAG,CAAC,KAAK,CAAA,CAAE;gBAC3B,EAAE;gBACF,KAAK,EAAE,KAAK,IAAI,EAAE;AAClB,gBAAA,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AACnB,gBAAA,IAAI,EAAE,CAAC;AACR,aAAA,CAAC;QACJ;AACA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,UAAU,CAAC,OAA2B,EAAA;AAC5C,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,KAAK,IAAI,IAAI;IACpF;AACD;;AChGD;AACO,MAAM,iBAAiB,GAA4C;AACxE,IAAA,EAAE,EAAE;AACF,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,SAAS,EAAE,WAAW;AACtB,QAAA,YAAY,EAAE,SAAS;AACvB,QAAA,cAAc,EAAE,OAAO;AACvB,QAAA,YAAY,EAAE,SAAS;AACvB,QAAA,YAAY,EAAE,SAAS;AACvB,QAAA,YAAY,EAAE,KAAK;AACnB,QAAA,cAAc,EAAE,iBAAiB;AACjC,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,eAAe,EAAE,mBAAmB;AACpC,QAAA,WAAW,EAAE,cAAc;AAC3B,QAAA,SAAS,EAAE,YAAY;AACvB,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,UAAU,EAAE,aAAa;AACzB,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,MAAM,EAAE,QAAQ;AAChB,QAAA,YAAY,EAAE,qBAAqB;AACnC,QAAA,YAAY,EAAE,UAAU;AACxB,QAAA,eAAe,EAAE,WAAW;AAC5B,QAAA,mBAAmB,EAAE,kBAAkB;AACvC,QAAA,WAAW,EAAE,OAAO;AACpB,QAAA,iBAAiB,EAAE,cAAc;AACjC,QAAA,cAAc,EAAE,QAAQ;AACxB,QAAA,iBAAiB,EAAE,WAAW;AAC9B,QAAA,eAAe,EAAE,cAAc;AAC/B,QAAA,oBAAoB,EAAE,kBAAkB;AACxC,QAAA,YAAY,EAAE,WAAW;AACzB,QAAA,iBAAiB,EAAE,eAAe;AAClC,QAAA,eAAe,EAAE,SAAS;AAC1B,QAAA,cAAc,EAAE,QAAQ;AACxB,QAAA,aAAa,EAAE,OAAO;AACtB,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,YAAY,EAAE,0BAA0B;AACxC,QAAA,kBAAkB,EAAE,aAAa;AACjC,QAAA,gBAAgB,EAAE,WAAW;AAC7B,QAAA,gBAAgB,EAAE,UAAU;AAC5B,QAAA,mBAAmB,EAAE,kBAAkB;AACvC,QAAA,aAAa,EAAE,WAAW;AAC1B,QAAA,OAAO,EAAE,UAAU;AACnB,QAAA,gBAAgB,EAAE,iBAAiB;AACnC,QAAA,SAAS,EAAE,IAAI;AACf,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,SAAS,EAAE,YAAY;AACvB,QAAA,iBAAiB,EAAE,WAAW;AAC9B,QAAA,eAAe,EAAE,MAAM;AACvB,QAAA,SAAS,EAAE,YAAY;AACvB,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,OAAO,EAAE,MAAM,IAAI,CAAA,SAAA,EAAY,MAAM,CAAA,CAAE;AACvC,QAAA,UAAU,EAAE,aAAa;AACzB,QAAA,cAAc,EAAE,kBAAkB;AAClC,QAAA,cAAc,EAAE,kBAAkB;AAClC,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,OAAO,EAAE,YAAY;AACrB,QAAA,OAAO,EAAE,sBAAsB;AAC/B,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,MAAM,EAAE,oBAAoB;AAC5B,QAAA,UAAU,EAAE,YAAY;AACxB,QAAA,SAAS,EAAE,UAAU;AACrB,QAAA,cAAc,EAAE,WAAW;AAC3B,QAAA,gBAAgB,EAAE,aAAa;AAC/B,QAAA,SAAS,EAAE,gBAAgB;AAC3B,QAAA,YAAY,EAAE,mBAAmB;AACjC,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,YAAY,EAAE,eAAe;AAC7B,QAAA,IAAI,EAAE,KAAK,IAAI,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,KAAK,CAAC,GAAG,KAAK,GAAG,MAAM,CAAA,CAAE;AACzD,QAAA,sBAAsB,EAAE,uBAAuB;AAC/C,QAAA,uBAAuB,EAAE,kBAAkB;AAC3C,QAAA,SAAS,EAAE,cAAc;AACzB,QAAA,cAAc,EAAE,0BAA0B;AAC1C,QAAA,aAAa,EAAE,gBAAgB;AAC/B,QAAA,cAAc,EAAE,iBAAiB;AACjC,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,WAAW,EAAE,cAAc;AAC3B,QAAA,IAAI,EAAE,MAAM;AACb,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,OAAO,EAAE,UAAU;AACnB,QAAA,MAAM,EAAE,kBAAkB;AAC1B,QAAA,SAAS,EAAE,UAAU;AACrB,QAAA,YAAY,EAAE,cAAc;AAC5B,QAAA,cAAc,EAAE,QAAQ;AACxB,QAAA,YAAY,EAAE,SAAS;AACvB,QAAA,YAAY,EAAE,SAAS;AACvB,QAAA,YAAY,EAAE,OAAO;AACrB,QAAA,cAAc,EAAE,wBAAwB;AACxC,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,eAAe,EAAE,qBAAqB;AACtC,QAAA,WAAW,EAAE,gBAAgB;AAC7B,QAAA,SAAS,EAAE,oBAAoB;AAC/B,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,UAAU,EAAE,aAAa;AACzB,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,YAAY,EAAE,0BAA0B;AACxC,QAAA,YAAY,EAAE,gBAAgB;AAC9B,QAAA,eAAe,EAAE,WAAW;AAC5B,QAAA,mBAAmB,EAAE,iBAAiB;AACtC,QAAA,WAAW,EAAE,MAAM;AACnB,QAAA,iBAAiB,EAAE,iBAAiB;AACpC,QAAA,cAAc,EAAE,QAAQ;AACxB,QAAA,iBAAiB,EAAE,UAAU;AAC7B,QAAA,eAAe,EAAE,YAAY;AAC7B,QAAA,oBAAoB,EAAE,oBAAoB;AAC1C,QAAA,YAAY,EAAE,aAAa;AAC3B,QAAA,iBAAiB,EAAE,qBAAqB;AACxC,QAAA,eAAe,EAAE,UAAU;AAC3B,QAAA,cAAc,EAAE,KAAK;AACrB,QAAA,aAAa,EAAE,MAAM;AACrB,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,YAAY,EAAE,2BAA2B;AACzC,QAAA,kBAAkB,EAAE,aAAa;AACjC,QAAA,gBAAgB,EAAE,WAAW;AAC7B,QAAA,gBAAgB,EAAE,SAAS;AAC3B,QAAA,mBAAmB,EAAE,eAAe;AACpC,QAAA,aAAa,EAAE,gBAAgB;AAC/B,QAAA,OAAO,EAAE,gBAAgB;AACzB,QAAA,gBAAgB,EAAE,mBAAmB;AACrC,QAAA,SAAS,EAAE,MAAM;AACjB,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,SAAS,EAAE,eAAe;AAC1B,QAAA,iBAAiB,EAAE,YAAY;AAC/B,QAAA,eAAe,EAAE,QAAQ;AACzB,QAAA,SAAS,EAAE,aAAa;AACxB,QAAA,IAAI,EAAE,cAAc;AACpB,QAAA,OAAO,EAAE,MAAM,IAAI,CAAA,KAAA,EAAQ,MAAM,CAAA,WAAA,CAAa;AAC9C,QAAA,UAAU,EAAE,mBAAmB;AAC/B,QAAA,cAAc,EAAE,wBAAwB;AACxC,QAAA,cAAc,EAAE,yBAAyB;AACzC,QAAA,QAAQ,EAAE,cAAc;AACxB,QAAA,OAAO,EAAE,iBAAiB;AAC1B,QAAA,OAAO,EAAE,8BAA8B;AACvC,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,MAAM,EAAE,wBAAwB;AAChC,QAAA,UAAU,EAAE,kBAAkB;AAC9B,QAAA,SAAS,EAAE,gBAAgB;AAC3B,QAAA,cAAc,EAAE,iBAAiB;AACjC,QAAA,gBAAgB,EAAE,cAAc;AAChC,QAAA,SAAS,EAAE,qBAAqB;AAChC,QAAA,YAAY,EAAE,sBAAsB;AACpC,QAAA,QAAQ,EAAE,uBAAuB;AACjC,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,YAAY,EAAE,sBAAsB;AACpC,QAAA,IAAI,EAAE,KAAK,IAAI,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,KAAK,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAA,CAAE;AAC7D,QAAA,sBAAsB,EAAE,6BAA6B;AACrD,QAAA,uBAAuB,EAAE,iBAAiB;AAC1C,QAAA,SAAS,EAAE,kBAAkB;AAC7B,QAAA,cAAc,EAAE,kCAAkC;AAClD,QAAA,aAAa,EAAE,uBAAuB;AACtC,QAAA,cAAc,EAAE,sBAAsB;AACtC,QAAA,OAAO,EAAE,sBAAsB;AAC/B,QAAA,WAAW,EAAE,iBAAiB;AAC9B,QAAA,IAAI,EAAE,WAAW;AAClB,KAAA;;AAGH;AACM,SAAU,aAAa,CAAC,MAAc,EAAA;IAC1C,IAAI,MAAM,KAAK,MAAM;AAAE,QAAA,OAAO,MAAM;AACpC,IAAA,OAAO,CAAC,OAAO,SAAS,KAAK,WAAW,GAAG,SAAS,CAAC,QAAQ,GAAG,IAAI,KAAK,OAAO;AAClF;AAEA;;;;AAIG;AACG,SAAU,sBAAsB,CACpC,MAA0B,EAC1B,aAA4D,EAAA;IAE5D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,IAAI,MAAM,CAAC;AAChD,IAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE;IACzC,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,EAAE,GAAG,iBAAiB,CAAC,EAAE;;AAGtF,IAAA,IAAI,SAA+C;IACnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,aAAa,EAAE;AACxC,QAAA,MAAM,CAAC,GAAG,GAAG,CAAC,WAAW,EAAE;AAC3B,QAAA,IAAI,CAAC,KAAK,UAAU,EAAE;YAAE,SAAS,GAAG,KAAK;YAAE;QAAO;AAClD,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE;YAAE,SAAS,GAAG,KAAK;QAAE;IACzE;AAEA,IAAA,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE;AAClC;;ACnQA;SACgB,uBAAuB,CACrC,CAAS,EACT,CAAS,EACT,KAAa,EACb,MAAc,EACd,aAAqB,EACrB,cAAsB,EACtB,MAAM,GAAG,CAAC,EAAA;IAEV,OAAO;AACL,QAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;AAChE,QAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;KACnE;AACH;AAcA;MAOa,wBAAwB,CAAA;AAClB,IAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AACxD,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,OAAO,GAAG,IAAI,mBAAmB,EAAE;IAC5C,cAAc,GAA0B,IAAI;;AAGpD,IAAA,UAAU,GAAG,KAAK,CAAkB,iBAAiB,CAAC,EAAE,iFAAC;;AAGzD,IAAA,CAAC,GAAG,KAAK,CAAC,QAAQ,uEAAU;;AAG5B,IAAA,CAAC,GAAG,KAAK,CAAC,QAAQ,uEAAU;;AAGnB,IAAA,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,+EAAC;;AAG1C,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAU;;AAGjC,IAAA,OAAO,GAAG,KAAK,CAAwB,IAAI,8EAAC;;AAG5C,IAAA,QAAQ,GAAG,KAAK,CAAU,IAAI,+EAAC;;AAG/B,IAAA,iBAAiB,GAAG,KAAK,CAAU,KAAK,wFAAC;;AAGzC,IAAA,MAAM,GAAG,KAAK,CAA2B,KAAK,6EAAC;;AAG/C,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;;AAGjC,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,8EAAC;;AAG/B,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,iFAAC;;AAGlC,IAAA,eAAe,GAAG,KAAK,CAAU,IAAI,sFAAC;;AAGtC,IAAA,UAAU,GAAG,KAAK,CAAoC,IAAI,iFAAC;;AAG3D,IAAA,QAAQ,GAAG,KAAK,CAAwB,IAAI,+EAAC;;AAG7C,IAAA,OAAO,GAAG,KAAK,CAAS,EAAE,8EAAC;;AAG3B,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,+EAAC;;IAG5B,cAAc,GAAG,MAAM,EAAyB;;IAGhD,aAAa,GAAG,MAAM,EAAU;;IAGhC,cAAc,GAAG,MAAM,EAAU;;AAGjC,IAAA,MAAM,GAAG,KAAK,CAAS,EAAE,6EAAC;;AAG1B,IAAA,WAAW,GAAG,KAAK,CAAU,IAAI,kFAAC;;AAGlC,IAAA,UAAU,GAAG,KAAK,CAA6B,EAAE,iFAAC;;AAGlD,IAAA,YAAY,GAAG,KAAK,CAAS,CAAC,mFAAC;;AAG/B,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;AAEpC;;;AAGG;IACH,IAAI,GAAG,MAAM,EAAkB;;IAG/B,SAAS,GAAG,MAAM,EAAkB;;IAGpC,QAAQ,GAAG,MAAM,EAAQ;;IAGzB,SAAS,GAAG,MAAM,EAAQ;;IAG1B,cAAc,GAAG,MAAM,EAAQ;;IAG/B,IAAI,GAAG,MAAM,EAAQ;;IAGrB,WAAW,GAAG,MAAM,EAAQ;;IAG5B,WAAW,GAAG,MAAM,EAAQ;;IAG5B,QAAQ,GAAG,MAAM,EAAQ;;IAGzB,YAAY,GAAG,MAAM,EAAU;;IAG/B,SAAS,GAAG,MAAM,EAAQ;;IAG1B,WAAW,GAAG,MAAM,EAAU;;AAG9B,IAAA,SAAS,GAAG,KAAK,CAAiD,IAAI,gFAAC;;IAGvE,YAAY,GAAG,MAAM,EAAkD;AAE9D,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;QAC3B,OAAO;AACL,YAAA,EAAE,KAAK,EAAE,KAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE;AAC/D,YAAA,EAAE,KAAK,EAAE,KAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE;AAC/D,YAAA,EAAE,KAAK,EAAE,KAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE;AAC/D,YAAA,EAAE,KAAK,EAAE,KAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE;AAC/D,YAAA,EAAE,KAAK,EAAE,OAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,cAAc,EAAE;SAClE;AACH,IAAA,CAAC,uFAAC;;AAGO,IAAA,eAAe,GAAG,QAAQ,CAA6C,MAAK;AACnF,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;AAC3B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,EAAE;YAChC,OAAO;gBACL,EAAE,KAAK,EAAE,IAAI,EAAO,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE;gBACzC,EAAE,KAAK,EAAE,IAAI,EAAO,KAAK,EAAE,CAAC,CAAC,cAAc,EAAE;gBAC7C,EAAE,KAAK,EAAE,IAAI,EAAO,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE;gBAC5C,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,eAAe,EAAE;aAC/C;QACH;AACA,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,EAAE;YAChC,OAAO;gBACL,EAAE,KAAK,EAAE,IAAI,EAAW,KAAK,EAAE,CAAC,CAAC,cAAc,EAAE;gBACjD,EAAE,KAAK,EAAE,KAAK,EAAU,KAAK,EAAE,CAAC,CAAC,iBAAiB,EAAE;gBACpD,EAAE,KAAK,EAAE,MAAM,EAAS,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE;gBAC/C,EAAE,KAAK,EAAE,YAAY,EAAG,KAAK,EAAE,CAAC,CAAC,kBAAkB,EAAE;gBACrD,EAAE,KAAK,EAAE,UAAU,EAAK,KAAK,EAAE,CAAC,CAAC,gBAAgB,EAAE;gBACnD,EAAE,KAAK,EAAE,UAAU,EAAK,KAAK,EAAE,CAAC,CAAC,gBAAgB,EAAE;gBACnD,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,mBAAmB,EAAE;aACvD;QACH;QACA,OAAO;YACL,EAAE,KAAK,EAAE,IAAI,EAAO,KAAK,EAAE,CAAC,CAAC,cAAc,EAAE;YAC7C,EAAE,KAAK,EAAE,KAAK,EAAM,KAAK,EAAE,CAAC,CAAC,iBAAiB,EAAE;YAChD,EAAE,KAAK,EAAE,IAAI,EAAO,KAAK,EAAE,CAAC,CAAC,eAAe,EAAE;YAC9C,EAAE,KAAK,EAAE,KAAK,EAAM,KAAK,EAAE,CAAC,CAAC,oBAAoB,EAAE;YACnD,EAAE,KAAK,EAAE,IAAI,EAAO,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE;YAC3C,EAAE,KAAK,EAAE,KAAK,EAAM,KAAK,EAAE,CAAC,CAAC,iBAAiB,EAAE;YAChD,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,eAAe,EAAE;SAC/C;AACH,IAAA,CAAC,sFAAC;;AAGO,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MACnC,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,QAAQ,GAAG,QAAQ,GAAG,MAAM,uFAC3F;AAED,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/C,IAAI,CAAC,mBAAmB,EAAE;AAC5B,QAAA,CAAC,CAAC;QAEF,eAAe,CAAC,MAAK;AACnB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;YAC/B,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,IAAI,IAAI,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;AACjD,gBAAA,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;AACpE,gBAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;YACnC;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC;IACpE;IAEQ,mBAAmB,GAAA;QACzB,UAAU,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IACxC;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS;YAAE;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE;AACzC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,uBAAuB,CACvC,IAAI,CAAC,CAAC,EAAE,EACR,IAAI,CAAC,CAAC,EAAE,EACR,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAC5B,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAC9B,CAAC;IACJ;IAEQ,WAAW,GAAA;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAc,iBAAiB,CAAC;IACpF;wGArNW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,y0GCpDrC,mxNA8KA,EAAA,MAAA,EAAA,CAAA,i9HAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FD1Ha,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;+BACE,mBAAmB,EAAA,eAAA,EACZ,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,mxNAAA,EAAA,MAAA,EAAA,CAAA,i9HAAA,CAAA,EAAA;;;AEnBjD;MACa,yBAAyB,CAAA;AAiFjB,IAAA,IAAA;AAEA,IAAA,OAAA;AAlFV,IAAA,IAAI,GAAG,MAAM,CAA8B,IAAI,2EAAC;AAChD,IAAA,MAAM,GAAG,MAAM,CAAC,EAAE,6EAAC;AAEnB,IAAA,KAAK,GAAG,QAAQ,CAAsC,MAAK;AAClE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QACtC,IAAI,CAAC,GAAG,EAAE,UAAU;AAAE,YAAA,OAAO,EAAE;AAC/B,QAAA,MAAM,MAAM,GAAG,GAAG,EAAE,MAAM;AAC1B,QAAA,IAAI,MAAM,EAAE,MAAM,EAAE;AAClB,YAAA,OAAO;iBACJ,GAAG,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK;kBAC3B,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;AAC/B,kBAAE;oBACE,KAAK,EAAG,KAAqB,CAAC,KAAK;AACnC,oBAAA,MAAM,EAAE,MAAM,CAAE,KAAqB,CAAC,KAAK,CAAC;iBAC7C;iBACJ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QACvF;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;AAC1C,QAAA,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9E,QAAA,OAAO;AACJ,aAAA,GAAG,CAAC,MAAM,KAAK;AACd,YAAA,KAAK,EAAE,GAAG,EAAE,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM;YACtD,MAAM;AACP,SAAA,CAAC;AACD,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KACT,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAClF;AACL,IAAA,CAAC,4EAAC;AAEO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE;QAC1C,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1F,IAAA,CAAC,mFAAC;AAEO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,GAAG,EAAU;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC;QAC3C,IAAI,OAAO,EAAE;AACX,YAAA,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE;AAC/D,gBAAA,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK;oBAAE;AAC1B,gBAAA,IAAI,MAAM,CAAC,IAAI,EAAE;oBACf,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;AACxC,oBAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAChE;gBACH;AACA,gBAAA,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI,EAAE;oBAClC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC;oBAC9C,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAClF;AACA,gBAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,EAAE,EAAE;oBACtE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;oBACvC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAC5B,qBAAqB,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAC7D;gBACH;YACF;QACF;QACA,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC7E,IAAA,CAAC,mFAAC;AAEO,IAAA,UAAU,GAAG,QAAQ,CAA6B,MAAK;AAC9D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;QACpB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK;AACtC,YAAA,GAAG,IAAI;YACP,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5C,YAAA,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;AACxD,SAAA,CAAC,CAAC;AACL,IAAA,CAAC,iFAAC;AAEe,IAAA,eAAe,GAAG,IAAI,GAAG,EAAyC;AAEnF,IAAA,WAAA,CACmB,IAAsC,EACvD,UAAsB,EACL,OAAA,GAAU,IAAI,mBAAmB,EAAE,EAAA;QAFnC,IAAA,CAAA,IAAI,GAAJ,IAAI;QAEJ,IAAA,CAAA,OAAO,GAAP,OAAO;AAExB,QAAA,UAAU,CAAC,SAAS,CAAC,MAAK;YACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;gBAAE,YAAY,CAAC,KAAK,CAAC;AACtE,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;AAC9B,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE;IACzD;;AAGA,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,GAAG,EAAE,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;QAC3D,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG,GAAG,CAAC,IAAI,GAAG,MAAM;IACzE;;AAGA,IAAA,iBAAiB,CAAC,KAAa,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,IAAI;IAC/D;;AAGA,IAAA,gBAAgB,CAAC,KAAa,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,IAAI,EAAE;IAC5D;;AAGA,IAAA,iBAAiB,CAAC,KAAa,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,EAAE;IAC7D;;IAGA,iBAAiB,CAAC,KAAa,EAAE,QAA+B,EAAA;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACjD;aAAO;YACL,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;AACxC,YAAA,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QACxF;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC;IACpC;;IAGA,gBAAgB,CAAC,KAAa,EAAE,KAAa,EAAA;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;AACxC,QAAA,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;AACtF,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC;IACnC;;IAGA,iBAAiB,CAAC,KAAa,EAAE,KAAa,EAAA;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;AACxC,QAAA,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,KAAK,CAAC;AAC1F,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC;IACnC;AAEA;;;;AAIG;IACK,eAAe,CAAC,KAAa,EAAE,QAAiB,EAAA;AACtD,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAAE;QACtC,MAAM,IAAI,GAAG,MAAK;AAChB,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC;AAC/C,YAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;gBACvB,KAAK;AACL,gBAAA,KAAK,EAAE,EAAE;AACT,gBAAA,QAAQ,EAAE,CAAC,EAAE,QAAQ,IAAI,IAAI;AAC7B,gBAAA,OAAO,EAAE,CAAC,EAAE,OAAO,IAAI,IAAI;AAC3B,gBAAA,QAAQ,EAAE,CAAC,EAAE,QAAQ,IAAI,IAAI;AAC9B,aAAA,CAAC;AACJ,QAAA,CAAC;AACD,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC1C,QAAA,IAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,CAAC,EAAE;AAC5B,YAAA,IAAI,EAAE;YACN;QACF;QACA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,MAAK;AAC9C,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC;AAClC,YAAA,IAAI,EAAE;AACR,QAAA,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ;;AAGA,IAAA,OAAO,CAAC,KAAa,EAAA;AACnB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK;AAChC,cAAE;AACF,cAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,IAAI;IACxD;;AAGA,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;IACzD;;IAGA,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,GAAG,CAAC;IACxF;;AAGA,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,cAAc,KAAK,IAAI;IACtE;;AAGA,IAAA,aAAa,CAAC,MAAc,EAAA;QAC1B,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;IACxC;;IAGA,eAAe,CAAC,KAAa,EAAE,KAAa,EAAA;AAC1C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,cAAc;QACrE,OAAO,QAAQ,IAAI,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;IACrD;;AAGA,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK;IAC7D;;IAGA,kBAAkB,CAAC,KAAY,EAAE,KAAa,EAAA;AAC5C,QAAA,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK;AACtD,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAAE;AAEtC,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC1C,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YAC1C;QACF;QACA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,MAAK;AAC9C,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC5C,QAAA,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ;;IAGA,IAAI,CAAC,KAAiB,EAAE,KAAa,EAAA;QACnC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YACZ,KAAK;AACL,YAAA,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,GAAG,CAAC;YAC9D,CAAC,EAAE,KAAK,CAAC,OAAO;AACjB,SAAA,CAAC;IACJ;;IAGA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACrB;;AAGA,IAAA,SAAS,CAAC,KAAa,EAAA;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;;IAGA,IAAI,CAAC,KAAa,EAAE,SAAyB,EAAA;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QACnC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM;YAAE;QACnD,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE;YAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;AACzC,YAAA,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;YAC1B,IAAI,QAAQ,CAAC,IAAI;gBAAE,OAAO,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC;AAC9D,YAAA,IAAI,QAAQ,CAAC,cAAc,KAAK,IAAI,EAAE;gBACpC,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC;YAC3D;AACA,YAAA,IAAI,QAAQ,CAAC,QAAQ,EAAE;gBACrB,OAAO,CAAC,cAAc,CACpB,KAAK,EACL,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,OAAO,IAAI,IAAI,EACxB,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAC1B;YACH;AACA,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;AACnC,gBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACpD;QACF;aAAO,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,QAAQ,EAAE;AAC9C,YAAA,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,WAAW,IAAI,WAAW,KAAK,KAAK,CAAC;AACvF,YAAA,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;AACjC,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;AACnC,gBAAA,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;AAC1C,oBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBACnE;gBACA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAC9C;QACF;aAAO;AACL,YAAA,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;AACjC,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;gBACnC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAC9C;QACF;QACA,IAAI,CAAC,KAAK,EAAE;IACd;;AAGA,IAAA,WAAW,CAAC,KAAa,EAAA;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;AACzC,QAAA,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;YACnC,IAAI,QAAQ,CAAC,IAAI;AAAE,gBAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACjE,YAAA,IAAI,QAAQ,CAAC,QAAQ,EAAE;gBACrB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC/F;YACA,IAAI,QAAQ,CAAC,IAAI;AAAE,gBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACvE;QACA,IAAI,CAAC,KAAK,EAAE;IACd;;IAGA,SAAS,CAAC,KAAa,EAAE,SAAyB,EAAA;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QACnC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,OAAO;YAAE;AACpD,QAAA,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,WAAW,IAAI,WAAW,KAAK,KAAK,CAAC;AACvF,QAAA,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;AACjC,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;AACnC,YAAA,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;AAC1C,gBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACnE;YACA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC9C;QACA,IAAI,CAAC,KAAK,EAAE;IACd;;AAGA,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;QACnE,IAAI,CAAC,KAAK,EAAE;IACd;;IAGA,QAAQ,GAAA;QACN,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;AAAE,YAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;AACjF,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE;QAClC,OAAO,CAAC,eAAe,EAAE;AACzB,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;AACnC,YAAA,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACtD,IAAI,MAAM,CAAC,IAAI;AAAE,oBAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAC/D,gBAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;oBACnB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;gBAC/F;gBACA,IAAI,MAAM,CAAC,IAAI;AAAE,oBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACrE;QACF;QACA,IAAI,CAAC,KAAK,EAAE;IACd;;AAGA,IAAA,SAAS,CAAC,KAAa,EAAA;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,OAAO,CAAC,iBAAiB,CACvB,KAAK,EACL,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,cAAc,KAAK,IAAI,GAAG,EAAE,GAAG,IAAI,CAC7D;IACH;;IAGA,WAAW,CAAC,KAAa,EAAE,MAAc,EAAA;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC;AACvD,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,cAAc,IAAI,SAAS;AACpE,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM;AAClC,cAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,MAAM;AAC1C,cAAE,CAAC,GAAG,OAAO,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAClF;;AAGA,IAAA,SAAS,CAAC,KAAa,EAAA;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE;IACd;;AAGA,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,KAAK,CAAC;QAC7C,IAAI,CAAC,KAAK,EAAE;IACd;;AAGA,IAAA,QAAQ,CAAC,KAAa,EAAA;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACjC,QAAA,IAAI,CAAC,GAAG;YAAE;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;QAC7B,IAAI,CAAC,KAAK,EAAE;IACd;;IAGA,YAAY,CACV,KAAa,EACb,SAAyD,EAAA;AAEzD,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC;QACnD,IAAI,CAAC,KAAK,EAAE;IACd;;AAGA,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC;QACtD,IAAI,CAAC,KAAK,EAAE;IACd;;AAGA,IAAA,sBAAsB,CAAC,KAAa,EAAA;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,sBAAsB,CAAC,KAAK,CAAC;IACpD;;IAGA,oBAAoB,CAAC,MAAgB,EAAE,OAAgB,EAAA;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,OAAO,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC;QAC7C;IACF;AAEQ,IAAA,SAAS,CAAC,KAAa,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC;IAC7D;AAEQ,IAAA,oBAAoB,CAAC,KAAa,EAAA;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7C,IAAI,KAAK,KAAK,SAAS;YAAE;QACzB,YAAY,CAAC,KAAK,CAAC;AACnB,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC;IACpC;AACD;;AClbD;MACa,4BAA4B,CAAA;AAgBpB,IAAA,IAAA;AAEA,IAAA,OAAA;AAjBF,IAAA,UAAU,GAAG,MAAM,CAAW,EAAE,iFAAC;AACjC,IAAA,aAAa,GAAG,MAAM,CAAgB,IAAI,oFAAC;AAC3C,IAAA,gBAAgB,GAAG,MAAM,CAAC,IAAI,uFAAC;AACvC,IAAA,OAAO,GAAG,MAAM,CAAgC,IAAI,8EAAC;IACtD,eAAe,GAAa,EAAE;IAC9B,SAAS,GAAG,EAAE;IACd,UAAU,GAAG,CAAC;IACd,UAAU,GAAG,CAAC;IACd,cAAc,GAAG,CAAC;IAClB,cAAc,GAAG,CAAC;IAClB,YAAY,GAAG,CAAC;IAChB,aAAa,GAAG,CAAC;IACjB,WAAW,GAA4B,EAAE;AAEjD,IAAA,WAAA,CACmB,IAAyC,EAC1D,UAAsB,EACL,OAAA,GAAU,IAAI,mBAAmB,EAAE,EAAA;QAFnC,IAAA,CAAA,IAAI,GAAJ,IAAI;QAEJ,IAAA,CAAA,OAAO,GAAP,OAAO;QAExB,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IAC3C;;IAGA,KAAK,CAAC,KAAmB,EAAE,KAAa,EAAA;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,IAAI,KAAK,CAAC;IACxD;;AAGA,IAAA,UAAU,CAAC,KAAmB,EAAE,MAAyB,EAAE,KAAa,EAAA;QACtE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;IACxC;AAEQ,IAAA,WAAW,CAAC,KAAmB,EAAE,MAAyB,EAAE,KAAa,EAAA;AAC/E,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;QAChD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAE;AACrF,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAmC;AACxD,QAAA,MAAM,IAAI,GAAG,MAAM,EAAE,qBAAqB,EAAE;AAC5C,QAAA,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,MAAM,CAAC;AAClC,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO;AAC/B,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO;QAC/B,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE;AACvC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;AAC1D,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;QACzD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC;IACpE;;AAGA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC1C;;AAGA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;AACpF,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,GAAG,QAAQ,GAAG,OAAO;IACrD;;AAGA,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE;AACtC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE;AACtC,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK;eACrE,IAAI,CAAC,YAAY,IAAI,CAAC;AAAE,YAAA,OAAO,CAAC;AAErC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC;AAC/D,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzE,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QAC9C,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3C,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC;AAAE,YAAA,OAAO,CAAC;AAE9D,QAAA,MAAM,cAAc,GAAG,SAAS,IAAI,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AACpE,QAAA,IAAI,cAAc,GAAG,SAAS,IAAI,UAAU,IAAI,cAAc,IAAI,UAAU,GAAG,SAAS,EAAE;YACxF,OAAO,IAAI,CAAC,YAAY;QAC1B;AACA,QAAA,IAAI,cAAc,GAAG,SAAS,IAAI,UAAU,IAAI,SAAS,IAAI,UAAU,GAAG,cAAc,EAAE;AACxF,YAAA,OAAO,CAAC,IAAI,CAAC,YAAY;QAC3B;AACA,QAAA,OAAO,CAAC;IACV;AAEiB,IAAA,QAAQ,GAAG,CAAC,KAAmB,KAAU;AACxD,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;YAAE;QACvC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE;AACnD,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;AAC9C,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AACf,gBAAA,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;AAC9B,gBAAA,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;gBACjC,KAAK,EAAE,IAAI,CAAC,SAAS;AACrB,gBAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc;AACtC,gBAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc;gBACtC,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,MAAM,EAAE,IAAI,CAAC,aAAa;AAC3B,aAAA,CAAC;QACJ;aAAO;AACL,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,GAAG;AACvC,gBAAA,GAAG,OAAO;AACV,gBAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc;AACtC,gBAAA,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc;AACvC,aAAA,GAAG,IAAI,CAAC;QACX;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;AACvE,QAAA,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACzD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;YACrC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;QACjD;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B;AACF,IAAA,CAAC;IAEgB,MAAM,GAAG,MAAW;QACnC,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE;QAC/B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAC9B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,EAChD,IAAI,EACJ,EAAE,EACF,IAAI,CAAC,gBAAgB,EAAE,CACxB;QACH;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACvB,IAAA,CAAC;IAEgB,UAAU,GAAG,MAAY,IAAI,CAAC,MAAM,EAAE;IAE/C,MAAM,GAAA;QACZ,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;IACvB;IAEQ,eAAe,GAAA;QACrB,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;QAC7D,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC;IACvE;IAEQ,oBAAoB,CAAC,CAAS,EAAE,EAAU,EAAA;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC;AAC/E,QAAA,OAAO;cACH,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC;cACvF,IAAI;IACV;AAEQ,IAAA,kBAAkB,CAAC,MAA0B,EAAA;AACnD,QAAA,MAAM,IAAI,GAAG,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,IAAI,MAAM,EAAE,aAAa;AACpE,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,EAAE;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAc,iCAAiC,CAAC;aACpF,GAAG,CAAC,OAAO,IAAG;YACb,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;AACzC,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE;YAC5C,OAAO,KAAK,GAAG;gBACb,KAAK;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,GAAG,IAAI;AACV,QAAA,CAAC;aACA,MAAM,CAAC,CAAC,MAAM,KAAsC,MAAM,KAAK,IAAI,CAAC;IACzE;AAED;;ACrMD;;;AAGG;MACU,2BAA2B,CAAA;AAKnB,IAAA,IAAA;AAEA,IAAA,OAAA;AANF,IAAA,WAAW,GAAG,MAAM,CAAyB,EAAE,kFAAC;IACzD,WAAW,GAAiE,IAAI;AAExF,IAAA,WAAA,CACmB,IAA8B,EAC/C,UAAsB,EACL,OAAA,GAAU,IAAI,mBAAmB,EAAE,EAAA;QAFnC,IAAA,CAAA,IAAI,GAAJ,IAAI;QAEJ,IAAA,CAAA,OAAO,GAAP,OAAO;QAExB,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IACjD;;AAGA,IAAA,QAAQ,CAAC,GAAW,EAAA;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9C,IAAI,QAAQ,KAAK,SAAS;AAAE,YAAA,OAAO,QAAQ;QAC3C,OAAO,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK;IAC9D;;AAGA,IAAA,aAAa,CAAC,GAAW,EAAA;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9C,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAA,CAAI;QAClD,OAAO,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,KAAK,CAAA,EAAA,CAAI;IACzE;;IAGA,QAAQ,CAAC,KAAa,EAAE,KAAa,EAAA;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QACnC,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC;QACtC;aAAO;YACL,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK;AACjC,gBAAA,GAAG,MAAM;gBACT,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC;AAC7B,aAAA,CAAC,CAAC;QACL;IACF;;IAGA,WAAW,CAAC,KAAiB,EAAE,GAAW,EAAA;QACxC,IAAI,GAAG,CAAC,MAAM;YAAE;QAChB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,MAAM,aAAa,GAAI,KAAK,CAAC;aAC1B,OAAO,CAAc,iBAAiB;AACvC,cAAE,qBAAqB,EAAE,CAAC,KAAK;QACjC,IAAI,CAAC,WAAW,GAAG;YACjB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,KAAK,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,aAAa,IAAI,GAAG;SACvD;QACD,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,YAAY,EAAE,MAAM,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC;IAC5D;;IAGA,kBAAkB,CAAC,KAAoB,EAAE,GAAW,EAAA;AAClD,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,CAAC;YAAE;QAC7E,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK,WAAW,GAAG,CAAC,EAAE,GAAG,EAAE;AAClD,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtD;;AAGA,IAAA,cAAc,CAAC,GAAW,EAAA;QACxB,IAAI,GAAG,CAAC,MAAM;YAAE;AAChB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACzC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnE;;IAGA,kBAAkB,GAAA;AAChB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACzC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;YAC5C,IAAI,CAAC,GAAG,CAAC,MAAM;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpF;IACF;;AAGA,IAAA,yBAAyB,CAAC,QAAgB,EAAA;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC;AAChD,QAAA,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE;QAEjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AAC5C,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChE,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;AAC9E,QAAA,IAAI,cAAc,GAAG,QAAQ,CAAC,UAAU;AAExC,QAAA,IAAI,KAAK,GAAG,cAAc,EAAE;YAC1B,cAAc,GAAG,KAAK;QACxB;aAAO,IAAI,GAAG,GAAG,cAAc,GAAG,QAAQ,CAAC,WAAW,EAAE;AACtD,YAAA,cAAc,GAAG,GAAG,GAAG,QAAQ,CAAC,WAAW;QAC7C;AAEA,QAAA,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;AACrE,QAAA,IAAI,cAAc,KAAK,QAAQ,CAAC,UAAU;AAAE,YAAA,QAAQ,CAAC,UAAU,GAAG,cAAc;IAClF;AAEiB,IAAA,UAAU,GAAG,CAAC,KAAiB,KAAU;QACxD,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE;QACvB,IAAI,CAAC,QAAQ,CACX,IAAI,CAAC,WAAW,CAAC,KAAK,EACtB,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CACxE;AACH,IAAA,CAAC;IAEgB,QAAQ,GAAG,MAAY,IAAI,CAAC,YAAY,EAAE;IAEnD,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACvB,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC;IAC/D;AAEQ,IAAA,aAAa,CAAC,KAAa,EAAA;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC;IAChF;AAEQ,IAAA,yBAAyB,CAAC,KAAa,EAAA;QAC7C,IAAI,KAAK,GAAG,CAAC;QACb,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AAChC,YAAA,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK;gBAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,EAAE;YAC7D,KAAK,IAAI,KAAK;QAChB;QACA,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;IAC7B;IAEQ,oBAAoB,CAC1B,GAAW,EACX,OAAiC,EAAA;AAEjC,QAAA,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;AAC5C,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAAE;YAC1B,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/E;AACA,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAC/D,CAAC,CACF;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9D;IAEQ,kBAAkB,GAAA;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;AAClD,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;AACzB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;AACpE,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,CAAC,IAAI,GAAG,CAAA,EAAG,KAAK,CAAC,UAAU,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAC,UAAU,EAAE;AACrF,QAAA,OAAO,OAAO;IAChB;AACD;;ACpKD;MACa,uBAAuB,CAAA;AACL,IAAA,IAAA;AAA7B,IAAA,WAAA,CAA6B,IAA6B,EAAA;QAA7B,IAAA,CAAA,IAAI,GAAJ,IAAI;IAA4B;AAE5C,IAAA,cAAc,GAAG,QAAQ,CAAC,MACzC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,qFAC1D;AAEgB,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAC9C,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,0FAC5E;;AAGD,IAAA,SAAS,CAAC,KAAa,EAAA;QACrB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;IACzC;;AAGA,IAAA,kBAAkB,CAAC,KAAa,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpD;;AAGA,IAAA,eAAe,CAAC,QAAgB,EAAA;QAC9B,OAAO,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/D;;AAGA,IAAA,cAAc,CAAC,KAAa,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK;IAC5D;;AAGA,IAAA,gBAAgB,CAAC,KAAa,EAAA;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,KAAK,KAAK;IACtD;;AAGA,IAAA,cAAc,CAAC,KAAa,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC;IACnE;;AAGA,IAAA,mBAAmB,CAAC,KAAa,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC;IACxE;;AAGA,IAAA,iBAAiB,CAAC,KAAa,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,MAAM;AAC7C,QAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,OAAO;AACnD,QAAA,OAAO,KAAK;IACd;;AAGA,IAAA,wBAAwB,CAAC,KAAa,EAAA;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;AAC3C,QAAA,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK;IACnD;;AAGA,IAAA,kBAAkB,CAAC,KAAa,EAAA;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACtC,QAAA,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK;IACjE;AACD;;AC/DD;;;;;;;;AAQG;MACU,gBAAgB,CAAA;AAWR,IAAA,IAAA;AAEA,IAAA,OAAA;AAZV,IAAA,oBAAoB,GAAG,MAAM,CAAgB,IAAI,2FAAC;AAClD,IAAA,gBAAgB,GAAO,MAAM,CAAgB,IAAI,uFAAC;AAClD,IAAA,mBAAmB,GAAI,MAAM,CAAU,IAAI,0FAAC;IAE7C,UAAU,GAAuB,IAAI;IACrC,QAAQ,GAAG,CAAC;IACZ,QAAQ,GAAG,CAAC;IACZ,cAAc,GAAkB,IAAI;AAE5C,IAAA,WAAA,CACmB,IAA6B,EAC9C,UAAsB,EACL,OAAA,GAAU,IAAI,mBAAmB,EAAE,EAAA;QAFnC,IAAA,CAAA,IAAI,GAAJ,IAAI;QAEJ,IAAA,CAAA,OAAO,GAAP,OAAO;QAExB,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAClD,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACtD;;IAGA,YAAY,CAAC,KAAmB,EAAE,aAAqB,EAAA;QACrD,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,KAAK,GAAI,KAAK,CAAC,aAA6B,CAAC,OAAO,CAAc,SAAS,CAAC;AAClF,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE;AAC1C,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,aAAa,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;QACzC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;QAExC,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAgB;AACpD,QAAA,OAAO,CAAC,eAAe,CAAC,qBAAqB,CAAC;AAC9C,QAAA,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;AAC3B,YAAA,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAA,EAAA,CAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI;AAC/D,YAAA,KAAK,EAAE,CAAA,EAAG,IAAI,CAAC,KAAK,CAAA,EAAA,CAAI,EAAE,MAAM,EAAE,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAA,CAAI;YACpD,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;AACzD,YAAA,MAAM,EAAE,mBAAmB,EAAE,YAAY,EAAE,KAAK;AAChD,YAAA,SAAS,EAAE,6BAA6B,EAAE,QAAQ,EAAE,QAAQ;AAC5D,YAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU;AACpC,SAAA,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;YACvC,IAAI,CAAC,aAAa,EAAE;YACpB;QACF;AACA,QAAA,IAAI,CAAC,UAAU,GAAG,OAAO;QACzB,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC;IACxE;;AAGA,IAAA,eAAe,CAAC,GAAW,EAAA;AACzB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,EAAE;QACvC,IAAI,GAAG,KAAK,IAAI;AAAE,YAAA,OAAO,EAAE;AAC3B,QAAA,OAAO,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACrG;AAEiB,IAAA,YAAY,GAAG,CAAC,CAAe,KAAU;AACxD,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,GAAI,CAAA,EAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI;AAC7D,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI;QAC/D;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;QACzD,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAQ,OAAO,CAAC,aAAa;gBAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;AAC1G,YAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE,KAAK,OAAO,CAAC,YAAY;gBAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;QAC9G;aAAO;AACL,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC;AACF,IAAA,CAAC;AAEgB,IAAA,UAAU,GAAG,CAAC,EAAgB,KAAU;QACvD,IAAI,CAAC,uBAAuB,EAAE;AAC9B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU;AAC/B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACtB,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,mBAAmB;AAC9C,YAAA,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC3B,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;QACnD;AACA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAC5C,QAAA,MAAM,OAAO,GAAI,IAAI,CAAC,gBAAgB,EAAE;QACxC,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE;AACzC,YAAA,MAAM,QAAQ,GAAM,IAAI,CAAC,mBAAmB,EAAE,GAAG,OAAO,GAAG,OAAO,GAAG,CAAC;AACtE,YAAA,MAAM,UAAU,GAAI,QAAQ,KAAK,QAAQ;YACzC,IAAI,CAAC,aAAa,EAAE;YACpB,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;YAClG;QACF;aAAO;YACL,IAAI,CAAC,aAAa,EAAE;QACtB;AACF,IAAA,CAAC;IAEgB,cAAc,GAAG,MAAY,IAAI,CAAC,eAAe,EAAE;IAE5D,eAAe,GAAA;QACrB,IAAI,CAAC,uBAAuB,EAAE;AAC9B,QAAA,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACtB,IAAI,CAAC,aAAa,EAAE;IACtB;IAEQ,uBAAuB,GAAA;QAC7B,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC;QACrE,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC;IAC3E;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;IACpC;;AAGA,IAAA,eAAe,CAAC,aAAqB,EAAA;AACnC,QAAA,IAAI,CAAC,cAAc,GAAG,aAAa;QACnC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC;IACxE;AAEiB,IAAA,YAAY,GAAG,CAAC,CAAe,KAAU;AACxD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc;QAClC,IAAI,MAAM,KAAK,IAAI;YAAE;AACrB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;AACzD,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAC3B,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAC9E;AACH,IAAA,CAAC;IAEgB,UAAU,GAAG,MAAW;QACvC,IAAI,CAAC,0BAA0B,EAAE;AACjC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AAC/B,IAAA,CAAC;IAEgB,cAAc,GAAG,MAAY,IAAI,CAAC,iBAAiB,EAAE;IAE9D,iBAAiB,GAAA;QACvB,IAAI,CAAC,0BAA0B,EAAE;AACjC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;IAC5B;IAEQ,0BAA0B,GAAA;QAChC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC;QACrE,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC;IAC3E;IAEQ,cAAc,CAAC,CAAS,EAAE,CAAS,EAAA;AACzC,QAAA,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACrD,MAAM,KAAK,GAAI,EAAkB,CAAC,OAAO,CAAc,8BAA8B,CAAC;AACtF,YAAA,IAAI,CAAC,KAAK;gBAAE;AACZ,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE;YAC1C,OAAO;gBACL,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBACrD,YAAY,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;aAC7C;QACH;AACA,QAAA,OAAO,IAAI;IACb;AACD;;AC/JD;;;AAGG;MACU,mBAAmB,CAAA;AASD,IAAA,IAAA;AARpB,IAAA,WAAW,GAAG,MAAM,CAAsB,IAAI,kFAAC;AAC/C,IAAA,YAAY,GAAG,MAAM,CAAU,IAAI,mFAAC;AACpC,IAAA,YAAY,GAAG,MAAM,CAAS,EAAE,mFAAC;;AAEjC,IAAA,gBAAgB,GAAG,MAAM,CAAU,IAAI,uFAAC;;AAExC,IAAA,eAAe,GAAG,MAAM,CAA6B,IAAI,sFAAC;AAEnE,IAAA,WAAA,CAA6B,IAAgC,EAAA;QAAhC,IAAA,CAAA,IAAI,GAAJ,IAAI;IAA+B;;IAGhE,cAAc,CAAC,GAAuB,EAAE,aAAsB,EAAA;AAC5D,QAAA,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;AAC5E,QAAA,IAAI,aAAa,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,YAAY;AAAE,YAAA,OAAO,IAAI;AACjE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC;AACxD,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,KAAK;AACtB,QAAA,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YACvB,GAAG;AACH,YAAA,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,YAAA,MAAM,EAAE,GAAG;YACX,aAAa;AACd,SAAA,CAAC;IACJ;;AAGA,IAAA,QAAQ,CAAC,KAAc,EAAA;AACrB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B;;IAGA,KAAK,CAAC,aAAqB,EAAE,QAAgB,EAAE,QAAgB,EAAE,UAAU,GAAG,IAAI,EAAA;QAChF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC;YAAE;AAC9C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5E,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;AACjE,QAAA,IAAI,YAAqB;AACzB,QAAA,IAAI,QAAQ,KAAK,EAAE,EAAE;YACnB,YAAY,GAAG,QAAQ;QACzB;AAAO,aAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,KAAK,YAAY,IAAI,IAAI,IAAI,YAAY,KAAK,EAAE,CAAC,EAAE;AAC/E,YAAA,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACtD;aAAO;YACL,YAAY,GAAG,YAAY;QAC7B;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;AACnC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC;AACrC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;QAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;QAC9D,IAAI,YAAY,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC;IACvE;AAEA;;;;AAIG;IACH,MAAM,GAAA;AACJ,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;AACnC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACzD,IAAI,CAAC,GAAG,EAAE;YACR,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC5D,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAChD,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,OAAO,IAAI;QACb;QACA,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;AACpC,QAAA,IAAI,QAAQ,KAAK,QAAQ,EAAE;AACzB,YAAA,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,QAAiB,EAAE,GAAY,CAAC,IAAI,IAAI;YACvE,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;gBACpE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACzG,gBAAA,OAAO,KAAK;YACd;YACA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;AAC7E,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC;gBAC5B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,QAAQ;gBACR,QAAQ;AACT,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC1E;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACrB,QAAA,OAAO,IAAI;IACb;AAEA;;;AAGG;AACH,IAAA,YAAY,CAAC,QAAgB,EAAE,QAAgB,EAAE,QAAiB,EAAA;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC;AAAE,YAAA,OAAO,KAAK;AACrD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;QACnD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B,IAAI,QAAQ,KAAK,QAAQ;AAAE,YAAA,OAAO,IAAI;AACtC,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,QAAiB,EAAE,GAAY,CAAC,IAAI,IAAI;QACvE,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;YAC3E,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACtF,YAAA,OAAO,KAAK;QACd;QACA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACjF,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AACnB,YAAA,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE;YAChC,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,QAAQ;YACR,QAAQ;AACT,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAA,OAAO,IAAI;IACb;;IAGA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,cAAc,EAAE;IACvB;;IAGA,IAAI,GAAA;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE;AACxC,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC;IACnD;;IAGA,IAAI,GAAA;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE;AACxC,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC;IACnD;;AAGA,IAAA,YAAY,CAAC,aAAqB,EAAA;AAChC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;AAClC,QAAA,IAAI,OAAO,EAAE,QAAQ,KAAK,aAAa,EAAE;YACvC,IAAI,CAAC,cAAc,EAAE;QACvB;aAAO,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,GAAG,aAAa,EAAE;AACtD,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;QACtE;IACF;IAEQ,gBAAgB,CAAC,IAAiB,EAAE,QAAiC,EAAA;AAC3E,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;AACnD,QAAA,MAAM,OAAO,GAAG,QAAQ,KAAK,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,OAAO;QAC1E,KAAK,MAAM,KAAK,IAAI,OAAO;YAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC7E;IAEQ,iBAAiB,CAAC,KAAmB,EAAE,KAAc,EAAA;QAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAC3E,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;AACvF,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;YACnB,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE;YAChD,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ;AACR,YAAA,QAAQ,EAAE,KAAK;AAChB,SAAA,CAAC;IACJ;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC;AACD;;AC1LD;MACa,mBAAmB,CAAA;AAyBD,IAAA,IAAA;AAxBpB,IAAA,IAAI,GAAG,MAAM,CAAC,KAAK,2EAAC;AACpB,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAClB,IAAA,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,kFAAC;AAExB,IAAA,OAAO,GAAG,QAAQ,CAAmB,MAAK;AACjD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAC/C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,EAAE;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QAC1C,MAAM,OAAO,GAAqB,EAAE;QACpC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAG;AACnD,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC1B,YAAA,IAAI,CAAC,GAAG;gBAAE;AACV,YAAA,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;AACzD,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC1B,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW,EAAE;AACvF,gBAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;oBACzB,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;gBACtC;YACF;AACF,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC,8EAAC;AAEF,IAAA,WAAA,CAA6B,IAAgC,EAAA;QAAhC,IAAA,CAAA,IAAI,GAAJ,IAAI;IAA+B;;IAGhE,IAAI,GAAA;QACF,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACrB;;IAGA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;IACvB;;AAGA,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1B;;AAGA,IAAA,SAAS,CAAC,SAAiB,EAAA;AACzB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACxB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxB;QACF;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;AAClC,QAAA,MAAM,IAAI,GAAG,OAAO,GAAG;AACrB,eAAG,SAAS,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;AAC3C,cAAE,CAAC,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;AAC3D,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;AAClF,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC;IACvD;;IAGA,WAAW,CAAC,aAAqB,EAAE,QAAgB,EAAA;QACjD,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CACxB,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,aAAa,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CACzE;IACH;;IAGA,iBAAiB,CAAC,aAAqB,EAAE,QAAgB,EAAA;AACvD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAChD,QAAA,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,aAAa,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;IACnF;AACD;;AC3FD;MAOa,uBAAuB,CAAA;;AAElC,IAAA,UAAU,GAAG,KAAK,CAAkB,iBAAiB,CAAC,EAAE,iFAAC;;AAGzD,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;;AAGzB,IAAA,UAAU,GAAG,KAAK,CAAS,CAAC,iFAAC;;AAG7B,IAAA,WAAW,GAAG,KAAK,CAAS,CAAC,CAAC,kFAAC;;IAG/B,WAAW,GAAG,MAAM,EAAU;;IAG9B,IAAI,GAAG,MAAM,EAAQ;;IAGrB,QAAQ,GAAG,MAAM,EAAQ;;IAGzB,KAAK,GAAG,MAAM,EAAQ;AAEL,IAAA,SAAS,GAAG,SAAS,CAAC,QAAQ,CAA+B,WAAW,CAAC;;IAG1F,eAAe,GAAA;QACb,UAAU,CAAC,MAAK;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa;YAC5C,KAAK,CAAC,KAAK,EAAE;YACb,KAAK,CAAC,MAAM,EAAE;AAChB,QAAA,CAAC,CAAC;IACJ;;IAGA,UAAU,GAAA;AACR,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;QAC/B,OAAO,KAAK,KAAK,CAAC,GAAG,OAAO,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA,GAAA,EAAM,KAAK,EAAE;IACvE;;AAGA,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACzB,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAC1D;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YACjC,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QACnB;IACF;wGApDW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,6zBClBpC,65BAkBA,EAAA,MAAA,EAAA,CAAA,+5BAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDAa,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;+BACE,kBAAkB,EAAA,eAAA,EACX,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,65BAAA,EAAA,MAAA,EAAA,CAAA,+5BAAA,CAAA,EAAA;2pBA6B+B,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE1B3F;MACa,oBAAoB,CAAA;AAOF,IAAA,IAAA;IANpB,cAAc,GAAG,MAAM,CAAsB;AACpD,QAAA,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI,GAAG,EAAE;AAClB,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACO,IAAA,WAAW,GAAG,MAAM,CAAiD,IAAI,kFAAC;AAEnF,IAAA,WAAA,CAA6B,IAAiC,EAAA;QAAjC,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAgC;;AAGjE,IAAA,MAAM,CAAC,KAAa,EAAA;AAClB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,IAAI;AAC9D,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,IAAG;YACjC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,EAAU;AACrF,YAAA,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AAAE,gBAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;;AACtC,gBAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,YAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE;AACtC,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,SAAS,CAAC,KAAiB,EAAA;AACzB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,IAAI;AAC9D,QAAA,IAAI,CAAC,UAAU;YAAE;AACjB,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU;AAChC,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,iBAAiB,CAAC,IAAI,CAAC;AAAE,gBAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1D;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IACxD;;IAGA,WAAW,GAAA;AACT,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,IAAI;AAC9D,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IACnE;;AAGA,IAAA,cAAc,CAAC,KAAa,EAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE;IACpD;;IAGA,eAAe,CAAC,KAAiB,EAAE,KAAa,EAAA;QAC9C,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IACrE;;IAGA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;;IAGA,SAAS,CAAC,MAAmB,EAAE,KAAa,EAAA;AAC1C,QAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,gBAAgB,EAAE;IACzB;AACD;;AC1ED;;;;;;;;;;;AAWG;MACU,mBAAmB,CAAA;;AAErB,IAAA,WAAW,GAAG,MAAM,CAAuB,IAAI,GAAG,EAAE,kFAAC;;AAG9D,IAAA,UAAU,CAAC,EAAmB,EAAA;QAC5B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACnC;;AAGA,IAAA,MAAM,CAAC,EAAmB,EAAA;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,IAAG;AAC5B,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;;AAC5B,gBAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;;IAGA,WAAW,CAAC,EAAmB,EAAE,QAAiB,EAAA;AAChD,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,IAAG;AAC5B,YAAA,IAAI,QAAQ,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;AAAE,gBAAA,OAAO,GAAG;AACxC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,QAAQ;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;;AACrB,gBAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACpB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,SAAS,CAAC,GAA8B,EAAA;QACtC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC;;IAGA,WAAW,GAAA;QACT,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACjC;AACD;;ACLD;;;AAGG;MACU,yBAAyB,CAAA;AACP,IAAA,IAAA;AAA7B,IAAA,WAAA,CAA6B,IAAsC,EAAA;QAAtC,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAqC;;AAGtE,IAAA,YAAY,CAAC,aAAqB,EAAE,QAAgB,EAAE,KAAkB,EAAA;QACtE,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC;YAAE;AAClD,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;QACtB,IAAI,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;YAC/C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,QAAQ,CAAC;AAChD,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACrB;QACF;QACA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC;AAChD,QAAA,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC;;AACnE,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;IAC5B;;IAGA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;QACtB,IAAI,CAAC,eAAe,EAAE;IACxB;;IAGA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;QACtB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;IACnC;;AAGA,IAAA,WAAW,CAAC,OAAe,EAAA;AACzB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;AACrC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC;AACtE,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACxE;;AAGA,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,IAAK,KAAK,CAAC,MAAkB,EAAE,OAAO,CACpC,8DAA8D,CAC/D;YAAE;QAEH,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YACxF,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACpB;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE;AACrD,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;gBACrB,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAC5D;YACF;AACA,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;gBACrB,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACpB;YACF;QACF;QAEA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACpC,QAAA,IACE,KAAK,CAAC,GAAG,KAAK;AACX,gBAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;eAC/B,CAAC,KAAK,CAAC;eACP,CAAC,KAAK,CAAC;eACP;AACA,eAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,EACvD;YACA,KAAK,CAAC,cAAc,EAAE;YACtB;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;AAC3B,YAAA,QAAQ,KAAK,CAAC,GAAG;AACf,gBAAA,KAAK,KAAK;oBACR,KAAK,CAAC,cAAc,EAAE;AACtB,oBAAA,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAAE,wBAAA,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC1E;AACF,gBAAA,KAAK,OAAO;oBACV,KAAK,CAAC,cAAc,EAAE;AACtB,oBAAA,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAAE,wBAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC;oBACrE;AACF,gBAAA,KAAK,QAAQ;oBACX,KAAK,CAAC,cAAc,EAAE;AACtB,oBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACtB,oBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;oBACrB;;YAEJ;QACF;AAEA,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY;AACpC,eAAA,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW;eACtB,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM;AACpD,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,SAAS;gBACZ,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;gBACzC;AACF,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;gBACxC;AACF,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;gBACzC;AACF,YAAA,KAAK,YAAY;gBACf,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;gBACxC;AACF,YAAA,KAAK,KAAK;gBACR,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC9C;AACF,YAAA,KAAK,OAAO;gBACV,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,GAAG,EAAE;AACP,oBAAA,IAAI,UAAU;wBAAE,IAAI,CAAC,eAAe,EAAE;;AACjC,wBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC1D;gBACA;AACF,YAAA,KAAK,IAAI;gBACP,KAAK,CAAC,cAAc,EAAE;gBACtB,IAAI,GAAG,EAAE;AACP,oBAAA,IAAI,UAAU;wBAAE,IAAI,CAAC,eAAe,EAAE;;AACjC,wBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC1D;gBACA;AACF,YAAA;gBACE,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACtF,oBAAA,IAAI,UAAU;wBAAE,IAAI,CAAC,eAAe,EAAE;;AACjC,wBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC;gBACjE;;IAEN;AAEQ,IAAA,oBAAoB,CAAC,OAAgB,EAAA;AAC3C,QAAA,QAAQ,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACjC,YAAA,KAAK,YAAY;AACf,gBAAA,IAAI,CAAC,wBAAwB,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC/C;AACF,YAAA,KAAK,SAAS;AACZ,gBAAA,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvC;AACF,YAAA,KAAK,SAAS;AACZ,gBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBACrB;;IAEN;AAEQ,IAAA,wBAAwB,CAAC,SAAiB,EAAA;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACzC,QAAA,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACxD,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACrB;QACF;AAEA,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACvD,QAAA,IAAI,mBAAmB,GAAG,CAAC,EAAE;AAC3B,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACrB;QACF;QAEA,IAAI,YAAY,GAAG,mBAAmB;AACtC,QAAA,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,SAAS;QAE5C,OAAO,YAAY,IAAI,CAAC,IAAI,YAAY,GAAG,KAAK,CAAC,MAAM,EAAE;YACvD,OAAO,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE;AAC9C,gBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC;AAChC,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC1B,gBAAA,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE;oBAC5E,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,oBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC;AACtE,oBAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC;AAChD,oBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AAAE,wBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,CAAC;;AACnF,wBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;oBAC1B;gBACF;gBACA,QAAQ,IAAI,SAAS;YACvB;YACA,YAAY,IAAI,SAAS;AACzB,YAAA,QAAQ,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;YAC9C,OACE,YAAY,IAAI;mBACb,YAAY,GAAG,KAAK,CAAC;AACrB,mBAAA,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EACzC;gBACA,YAAY,IAAI,SAAS;YAC3B;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;IACvB;AAEQ,IAAA,YAAY,CAAC,GAAW,EAAA;QAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;IAC/E;;AAGA,IAAA,gBAAgB,CAAC,aAAqB,EAAA;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,SAAS,CACxC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,aAAa,CACpE;IACH;;AAGA,IAAA,SAAS,CAAC,aAAqB,EAAA;AAC7B,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;QAC9E,IAAI,aAAa,GAAG,CAAC;YAAE;QAEvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QAChC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC;AACtC,QAAA,IAAI,IAAI,IAAI,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AAC1E,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxD;QAEA,UAAU,CAAC,MAAK;YACd,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;YACzD,IAAI,YAAY,IAAI,CAAC;AAAE,gBAAA,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,CAAC,CAAC;AAClE,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,mBAAmB,CAAC,YAAoB,EAAE,QAAA,GAA0B,IAAI,EAAA;QACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACtC,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,mBAAmB,EAAE;AACnD,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,EAAE;AAC/C,QAAA,IAAI,YAAY,GAAG,QAAQ,GAAG,YAAY,EAAE;AAC1C,YAAA,QAAQ,CAAC,cAAc,CAAC,YAAY,GAAG,QAAQ,CAAC;QAClD;AAAO,aAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,QAAQ,GAAG,YAAY,GAAG,YAAY,EAAE;AACtE,YAAA,QAAQ,CAAC,cAAc,CAAC,CAAC,YAAY,GAAG,CAAC,IAAI,QAAQ,GAAG,YAAY,CAAC;QACvE;QAEA,IAAI,QAAQ,KAAK,IAAI;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC;IACtE;AAEQ,IAAA,aAAa,CAAC,IAAY,EAAE,IAAY,EAAE,WAAW,GAAG,KAAK,EAAA;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,IACE,IAAI,CAAC,IAAI,CAAC,YAAY;AACnB,mBAAA,IAAI,CAAC,IAAI,CAAC,WAAW;mBACrB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,KAAK,CAAC,EACtC;gBACA,IAAI,CAAC,eAAe,EAAE;YACxB;YACA;QACF;QACA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM;AAC9C,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACpC,QAAA,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,IAAI,CAAC;AAChD,QAAA,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE;YACb,EAAE,GAAG,CAAC;YACN,EAAE,GAAG,CAAC;QACR;AACA,QAAA,IAAI,KAAK,GAAG,EAAE,GAAG,IAAI;AACrB,QAAA,IAAI,KAAK,GAAG,EAAE,GAAG,IAAI;QACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI;QACtC,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACb,gBAAA,KAAK,EAAE;AACP,gBAAA,KAAK,GAAG,IAAI,GAAG,CAAC;YAClB;AACA,YAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,gBAAA,KAAK,EAAE;gBACP,KAAK,GAAG,CAAC;YACX;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;QACjC,IAAI,MAAM,GAAG,KAAK;AAClB,QAAA,OAAO,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAAE,MAAM,IAAI,OAAO;QAClG,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM;YAAE,KAAK,GAAG,MAAM;AAExD,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE;AACpD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;AACrC,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC7D,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC;YAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;AAC1D,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;YACjE,IAAI,aAAa,IAAI,CAAC;AAAE,gBAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,QAAQ,CAAC;AACzE,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACrB,YAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACtE;QACF;QAEA,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AACtD,QAAA,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAC9C,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,OAAO,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACtF;AAAO,aAAA,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE;YACjC,IAAI,WAAW,EAAE;gBACf,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC;YACvD;iBAAO;gBACL,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,gBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAClF;QACF;AACA,QAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;IACvB;IAEQ,oBAAoB,GAAA;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACpC,QAAA,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;QACvC,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC;QAC1E,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,GAAG,CAAC,QAAQ,CAAC;IAC5F;IAEQ,eAAe,GAAA;AACrB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;AACrC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACpE,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;QACrB,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;QACvD,IAAI,UAAU,IAAI,CAAC;AAAE,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,CAAC,CAAC;AAC5D,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACxE;IAEQ,aAAa,GAAA;QACnB,MAAM,GAAG,GAA4B,EAAE;QACvC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AAAE,YAAA,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,QAAQ,GAAG,CAAC,GAAG,EAAE;AACtF,QAAA,OAAO,GAAG;IACZ;AACD;;ACrXD;;;AAGG;MACU,wBAAwB,CAAA;AAEhB,IAAA,IAAA;AACA,IAAA,OAAA;AAFnB,IAAA,WAAA,CACmB,IAA8B,EAC9B,OAAA,GAAU,IAAI,mBAAmB,EAAE,EAAA;QADnC,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,OAAO,GAAP,OAAO;IACvB;;IAGH,YAAY,CAAC,GAAW,EAAE,KAAc,EAAA;AACtC,QAAA,OAAO,kBAAkB,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAC3D;;AAGA,IAAA,YAAY,CAAC,GAAW,EAAE,KAAc,EAAE,GAA4B,EAAA;AACpE,QAAA,OAAO,GAAG,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE;IAC9C;;IAGA,WAAW,CAAC,GAA4B,EAAE,KAAa,EAAA;AACrD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE;IAC1D;;AAGA,IAAA,iBAAiB,CAAC,GAAW,EAAA;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS;AAC/E,QAAA,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,UAAU;AAAE,YAAA,OAAO,EAAE;QAC5D,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE;IAChF;;AAGA,IAAA,YAAY,CAAC,GAAW,EAAA;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS;IACtF;;IAGA,gBAAgB,CAAC,GAAW,EAAE,KAAc,EAAA;AAC1C,QAAA,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;AAAE,YAAA,OAAO,EAAE;QAC5C,IAAI,GAAG,CAAC,SAAS;AAAE,YAAA,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC;QAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC9E,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;;AAGA,IAAA,SAAS,CAAC,QAAgB,EAAA;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa;aACjC,MAAM,CAAC,aAAa;aACpB,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC;AACxB,QAAA,MAAM,MAAM,GAAG,CAAC,KAAa,KAC3B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAA,CAAA,EAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA,CAAA,CAAG,GAAG,KAAK;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QACjC,MAAM,IAAI,GAAG;AACV,aAAA,GAAG,CAAC,GAAG,IAAI;aACT,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;aAClE,IAAI,CAAC,GAAG,CAAC;aACX,IAAI,CAAC,IAAI,CAAC;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,YAAY,CACvB,QAAQ,EACR,CAAA,EAAG,MAAM,KAAK,IAAI,CAAA,CAAE,EACpB,yBAAyB,CAC1B;IACH;AACD;;AC1ED;MAOa,qBAAqB,CAAA;AAChC,IAAA,KAAK,GAAG,KAAK,CAAiC,EAAE,4EAAC;AACjD,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,6EAA0B;AAClD,IAAA,KAAK,GAAG,KAAK,CAAS,SAAS,4EAAC;AAChC,IAAA,UAAU,GAAG,KAAK,CAAgB,IAAI,iFAAC;IAEvC,MAAM,GAAG,MAAM,EAAU;IACzB,gBAAgB,GAAG,MAAM,EAAiB;IAE1C,YAAY,CAAC,KAAuC,EAAE,QAAiB,EAAA;QACrE,IAAI,OAAO,KAAK,KAAK,UAAU;AAAE,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7D,OAAO,KAAK,IAAI,QAAQ;IAC1B;AAEA,IAAA,QAAQ,CAAC,IAA6B,EAAA;QACpC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;IAC9C;AAEA,IAAA,UAAU,CAAC,IAA6B,EAAA;QACtC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;IAChD;AAEA,IAAA,eAAe,CAAC,IAAyB,EAAA;QACvC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnF;IAEA,SAAS,CAAC,KAAY,EAAE,IAA6B,EAAA;QACnD,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE;QACrE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;IAClC;IAEA,UAAU,CAAC,KAAY,EAAE,IAAyB,EAAA;QAChD,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE;QACtE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;IAC5E;IAEA,gBAAgB,CAAC,KAAoB,EAAE,IAAyB,EAAA;QAC9D,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;YAAE;QAC1D,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE;QACtE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,KAAK,GAAI,KAAK,CAAC,aAA6B,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAChF,UAAU,CAAC,MAAK;YACd,MAAM,OAAO,GAAG,KAAK,EAAE,gBAAgB,CACrC,wDAAwD,CACzD;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;YACrF,MAAM,EAAE,KAAK,EAAE;AACjB,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,aAA4B;AAC/C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,IAAI,CAAC,gBAAgB,CAAoB,kCAAkC,CAAC,CAC7E;AACD,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;AACvB,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;AAChC,YAAA,IAAI,CAAC,OAAO,CAAC,oBAAoB;kBAC7B,aAAa,CAAoB,sBAAsB;kBACvD,KAAK,EAAE;YACX;QACF;QACA,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;QACxF,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAA2B,CAAC;AAChE,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK;AACzB,cAAE;AACF,cAAE,KAAK,CAAC,GAAG,KAAK;AACd,kBAAE,KAAK,CAAC,MAAM,GAAG;AACjB,kBAAE,KAAK,CAAC,GAAG,KAAK;AACd,sBAAE,CAAC,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC;AACvC,sBAAE,CAAC,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;AACnD,QAAA,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;IACrB;wGAlFW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,+oBCflC,u0EA6CA,EAAA,MAAA,EAAA,CAAA,8/FAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FD9Ba,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;+BACE,gBAAgB,EAAA,eAAA,EACT,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,u0EAAA,EAAA,MAAA,EAAA,CAAA,8/FAAA,CAAA,EAAA;;;AEuFjD;;;;;;;;;;;;;;;;AAgBG;MACU,YAAY,CAAA;AACN,IAAA,aAAa,GAAG,MAAM,CAAyB,EAAE,oFAAC;AAClD,IAAA,QAAQ,GAAG,MAAM,CAA+B,EAAE,+EAAC;AACnD,IAAA,YAAY,GAAG,MAAM,CAAS,EAAE,mFAAC;AACjC,IAAA,gBAAgB,GAAG,MAAM,CAAU,KAAK,uFAAC;AACzC,IAAA,aAAa,GAAG,MAAM,CAAgB,IAAI,oFAAC;AAC3C,IAAA,cAAc,GAAI,MAAM,CAAc,IAAI,GAAG,EAAE,qFAAC;AAChD,IAAA,YAAY,GAAM,MAAM,CAAW,EAAE,mFAAC;AACtC,IAAA,cAAc,GAAQ,MAAM,CAAc,IAAI,GAAG,EAAE,qFAAC;AACpD,IAAA,mBAAmB,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,0FAAC;AACpD,IAAA,SAAS,GAAG,MAAM,CAAS,CAAC,gFAAC;AAC7B,IAAA,YAAY,GAAG,MAAM,CAAS,CAAC,mFAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAS,CAAC,iFAAC;AAC9B,IAAA,WAAW,GAAG,MAAM,CAA0D,EAAE,kFAAC;AACjF,IAAA,UAAU,GAAG,MAAM,CAAW,EAAE,iFAAC;;AAGlD,IAAA,WAAA,CAAY,KAAkC,EAAA;QAC5C,IAAI,KAAK,EAAE,YAAY;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QAC1E,IAAI,KAAK,EAAE,OAAO;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3D,IAAI,KAAK,EAAE,WAAW;YAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;QAChE,IAAI,KAAK,EAAE,eAAe;YAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC;AAC5E,QAAA,IAAI,KAAK,EAAE,YAAY,KAAK,SAAS;YAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC;AACzF,QAAA,IAAI,KAAK,EAAE,aAAa,EAAE,MAAM;AAAE,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AACvF,QAAA,IAAI,KAAK,EAAE,WAAW,EAAE,MAAM;AAAI,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;AAC/E,QAAA,IAAI,KAAK,EAAE,aAAa,EAAE,MAAM;AAAO,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAC5F,QAAA,IAAI,KAAK,EAAE,kBAAkB,EAAE,MAAM;AAAE,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtG,IAAI,KAAK,EAAE,QAAQ;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACvD,IAAI,KAAK,EAAE,WAAW;YAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;QAChE,IAAI,KAAK,EAAE,SAAS;YAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;QAC1D,IAAI,KAAK,EAAE,UAAU;AAAE,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;AACpE,QAAA,IAAI,KAAK,EAAE,SAAS,EAAE,MAAM;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IACzE;AAEA;;;AAGG;AACM,IAAA,eAAe,GAAoB,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;;AAG9E,IAAA,kBAAkB,CAAC,KAAc,EAAA;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;IAClC;AAEA;;;;AAIG;AACM,IAAA,YAAY,GAA0B,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;AAE9E;;AAEG;AACH,IAAA,UAAU,CAAC,KAAoB,EAAA;AAC7B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;IAC/B;AAEA;;;;AAIG;AACM,IAAA,WAAW,GAAmB,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;;AAGrE,IAAA,cAAc,CAAC,IAAY,EAAA;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;AAEA;;;AAGG;AACM,IAAA,aAAa,GAAwB,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;;AAG9E,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;IACzC;AAEA;;;AAGG;IACH,mBAAmB,CAAC,KAAa,EAAE,OAAgB,EAAA;AACjD,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,IAAG;AAC/B,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,OAAO;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;;AAC1B,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,sBAAsB,CAAC,KAAa,EAAA;AAClC,QAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC7D;;AAIA;;;AAGG;AACM,IAAA,WAAW,GAAqB,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;;AAGvE,IAAA,cAAc,CAAC,MAAgB,EAAA;QAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IACpC;AAEA;;;;AAIG;AACH,IAAA,UAAU,CAAC,mBAA6B,EAAE,SAAiB,EAAE,OAAe,EAAE,YAAqB,EAAA;AACjG,QAAA,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC;IAC3E;AAEA;;;AAGG;AACH,IAAA,WAAW,CACT,mBAA6B,EAC7B,UAA6B,EAC7B,OAAe,EACf,YAAqB,EAAA;AAErB,QAAA,MAAM,KAAK,GAAG,CAAC,GAAG,mBAAmB,CAAC;AACtC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE;AACrD,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;QACxC,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE;QAClB,SAAS,CAAC,MAAM,CAAC,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC;AAChE,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;IAClC;;;AAKS,IAAA,aAAa,GAAwB,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;;AAG9E,IAAA,QAAQ,CAAC,KAAa,EAAA;QACpB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;IACzC;;IAGA,SAAS,CAAC,KAAa,EAAE,MAAe,EAAA;AACtC,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,IAAG;AAC/B,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,MAAM;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;AAAO,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AACpD,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,IAAG,EAAG,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG;;AAGA,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C;;;AAKS,IAAA,kBAAkB,GAAwB,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE;;AAGxF,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9C;;IAGA,cAAc,CAAC,KAAa,EAAE,MAAe,EAAA;AAC3C,QAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,IAAG;AACpC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,MAAM;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;AAAO,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AACpD,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAG,EAAG,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACnG;;AAGA,IAAA,iBAAiB,CAAC,KAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACxD;;;AAKS,IAAA,QAAQ,GAAmB,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;;AAGtD,IAAA,WAAW,GAAmB,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;;AAGrE,IAAA,WAAW,CAAC,IAAY,EAAA;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B;;AAGA,IAAA,OAAO,CAAC,IAAY,EAAA;AAClB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1C;AAEA;;;;;;;;AAQG;AACH,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACzC;AAEA;;AAEG;AACM,IAAA,SAAS,GAAmB,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;;;AAKxD,IAAA,UAAU,GAAoE,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;AAEpH;;;AAGG;IACH,YAAY,CAAC,KAAa,EAAE,EAAkD,EAAA;AAC5E,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAG;AAC1B,YAAA,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE;YACrB,IAAI,EAAE,KAAK,IAAI;AAAE,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC;;AAC9B,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;AACrB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;;AAIiB,IAAA,QAAQ,GAAG,MAAM,CAAgB,EAAE,+EAAC;AACpC,IAAA,eAAe,GAAG,MAAM,CAAS,CAAC,CAAC,sFAAC;AAC7C,IAAA,OAAgB,WAAW,GAAG,GAAG;;AAGhC,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,8EAAC;;IAGrD,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,8EAAC;AAEtF;;;;AAIG;AACH,IAAA,QAAQ,CAAC,KAAmB,EAAA;AAC1B,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;IAC7B;;AAGA,IAAA,aAAa,CAAC,OAAuB,EAAA;AACnC,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE;QAC1B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IACxE;AAEQ,IAAA,eAAe,CAAC,IAAiB,EAAA;AACvC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC;AAClD,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;AACzC,cAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,WAAW;cACjD,IAAI;AACR,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;QAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9C;AAEA;;;;AAIG;IACH,IAAI,GAAA;AACF,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE;QAChC,IAAI,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;QACtB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/B,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC3B;AAEA;;;;AAIG;IACH,IAAI,GAAA;AACF,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE;AAChC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;QAClC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/B,QAAA,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjB;;IAGA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9B;AAEA;;;;AAIG;AACM,IAAA,YAAY,GAAmC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;AAEvF;;;AAGG;AACM,IAAA,OAAO,GAAyC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;;AAInF;;;AAGG;IACH,cAAc,CAAC,KAAa,EAAE,YAAoB,EAAA;QAChD,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,IAAI,YAAY;IACpD;AAEA;;;AAGG;IACH,cAAc,CAAC,KAAa,EAAE,KAAa,EAAA;AACzC,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1E;;AAIA;;;AAGG;AACH,IAAA,SAAS,CAAC,KAAa,EAAA;QACrB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IACjF;AAEA;;;AAGG;IACH,aAAa,CAAC,KAAa,EAAE,IAAY,EAAA;QACvC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK;AACzB,YAAA,GAAG,CAAC;AACJ,YAAA,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE;AAC5C,SAAA,CAAC,CAAC;IACL;AAEA;;;AAGG;IACH,iBAAiB,CAAC,KAAa,EAAE,MAAuB,EAAA;QACtD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK;AACzB,YAAA,GAAG,CAAC;AACJ,YAAA,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE;AAC9D,SAAA,CAAC,CAAC;IACL;AAEA;;;;;AAKG;IACH,cAAc,CACZ,KAAa,EACb,QAA+B,EAC/B,OAAsB,EACtB,WAA0B,IAAI,EAAA;QAE9B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK;AACzB,YAAA,GAAG,CAAC;AACJ,YAAA,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;AACnE,SAAA,CAAC,CAAC;IACL;;AAGS,IAAA,SAAS,GAAqB,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;;AAGnE,IAAA,eAAe,CAAC,KAAa,EAAA;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AAC5C,QAAA,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;IACjC;AAEA;;;;AAIG;IACH,OAAO,CAAC,KAAa,EAAE,IAA2B,EAAA;AAChD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAG;YACvB,MAAM,IAAI,GAAiC,EAAE;AAC7C,YAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACtC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;YAC/D;AACA,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAAE,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE;AACxE,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAC1C;AAEA;;;;AAIG;IACH,OAAO,CAAC,KAAa,EAAE,IAAoB,EAAA;QACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK;AACzB,YAAA,GAAG,CAAC;YACJ,CAAC,KAAK,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE;AACvE,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,IAC1B,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,CAClD;IACH;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAG;AACvB,YAAA,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC;AAClB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;IACzD;;IAGA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3B;AAEA;;;AAGG;AACH,IAAA,eAAe,CAAC,KAAa,EAAA;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC/B,QAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;AACtE,QAAA,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,cAAc,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC;IACtE;;IAGA,kBAAkB,GAAA;AAChB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CACjE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,cAAc,KAAK,IAAI,IAAI,CAAC,CAAC;AACzC,gBAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC,CAC7D;IACH;;;IAKA,MAAM,GAAA;QACJ,OAAO;AACL,YAAA,YAAY,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE;AACzC,YAAA,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE;AAC/B,YAAA,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,SAAS;AAC7C,YAAA,eAAe,EAAE,IAAI,CAAC,gBAAgB,EAAE;AACxC,YAAA,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,SAAS;AAC/C,YAAA,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;AACzC,YAAA,WAAW,EAAI,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;AACvC,YAAA,aAAa,EAAO,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;AAC9C,YAAA,kBAAkB,EAAE,CAAC,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;AACnD,YAAA,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE;AAC1B,YAAA,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE;AAChC,YAAA,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE;AAC5B,YAAA,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE;AACrC,YAAA,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;SAClC;IACH;;IAGA,OAAO,QAAQ,CAAC,KAAiC,EAAA;AAC/C,QAAA,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC;IAChC;;;ACrmBF;;;;;;;;;;;;;;;AAeG;MACU,eAAe,CAAA;AACT,IAAA,WAAW,GAAG,MAAM,CAAqB,IAAI,kFAAC;AAC9C,IAAA,KAAK,GAAG,YAAY,CAAM,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,4EAAC;IACtE,mBAAmB,GAA+B,IAAI;AAC7C,IAAA,SAAS,GAAG,MAAM,CAA6C,IAAI,gFAAC;IAC7E,eAAe,GAAG,CAAC;AAE3B;;;AAGG;AACH,IAAA,WAAA,CAAY,cAAmB,EAAE,EAAA;QAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;IAClC;AAEA;;;AAGG;AACM,IAAA,IAAI,GAAgB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;;AAG3C,IAAA,QAAQ,GACf,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AAE7B;;;;;;AAME;AACF,IAAA,UAAU,CAAC,MAAmB,EAAA;AAC5B,QAAA,IAAI,CAAC,mBAAmB,GAAG,gBAAgB,CAAC,MAAM;AAChD,cAAE;cACA,IAAI;AACR,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;IAC9B;AAEA;;;AAGG;AACH,IAAA,OAAO,CAAC,IAAS,EAAA;QACf,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACzB;AAEA;;;AAGG;IACH,SAAS,CAAC,KAAa,EAAE,GAAM,EAAA;AAC7B,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,IAAG;AACrB,YAAA,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG;AACjB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA;;;AAGG;IACH,QAAQ,CAAC,KAAa,EAAE,KAAiB,EAAA;AACvC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,IAAG;AACrB,YAAA,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;AACtB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,EAAO;AAC/C,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;;AAMG;IACH,MAAM,CAAC,GAAM,EAAE,OAAgB,EAAA;AAC7B,QAAA,IAAI,UAAmB;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,IAAG;AACrB,YAAA,IAAI,OAAO,KAAK,SAAS,EAAE;AACzB,gBAAA,UAAU,GAAG,IAAI,CAAC,MAAM;AACxB,gBAAA,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC;YACvB;YACA,UAAU,GAAG,OAAO;AACpB,YAAA,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC;AAC5B,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;AAC3E,QAAA,OAAO,UAAU;IACnB;AAEA;;;;AAIG;AACH,IAAA,SAAS,CAAC,KAAa,EAAA;QACrB,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;IAC7D;AAEA;;;;;;AAMG;IACH,OAAO,CAAC,IAAY,EAAE,EAAU,EAAA;QAC9B,IAAI,IAAI,KAAK,EAAE;YAAE;AACjB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,IAAG;AACrB,YAAA,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;AACrB,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAClC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC;AAC5C,YAAA,OAAO,GAAG;AACZ,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,MAAM,CAAC,KAAa,EAAA;AAClB,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;IAC5B;;AAGA,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM;IAC5B;AAEQ,IAAA,UAAU,CAAC,MAA0B,EAAA;QAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACpC;AAEQ,IAAA,OAAO,CAAC,IAAS,EAAA;AACvB,QAAA,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;IACtB;AACD;;ACED;;;;;AAKG;MACU,aAAa,CAAA;;AAExB,IAAA,UAAU;;AAEV,IAAA,OAAO;;AAEE,IAAA,OAAO;;AAEhB,IAAA,YAAY;;AAEZ,IAAA,UAAU;;AAEV,IAAA,OAAO;AAEU,IAAA,cAAc,GAAG,IAAI,GAAG,EAAoC;;AAG7E,IAAA,IAAI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,cAAc;IAC5B;AAEA;;;;;;;AAOG;IACH,eAAe,CAAC,MAAc,EAAE,SAAmC,EAAA;QACjE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;AAC1C,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,SAAS;;AAET,IAAA,SAAS;;AAET,IAAA,SAAS;;AAET,IAAA,YAAY;;AAEZ,IAAA,iBAAiB;;AAEjB,IAAA,gBAAgB;;AAEhB,IAAA,WAAW;;AAEX,IAAA,cAAc;;AAEd,IAAA,mBAAmB;;AAEnB,IAAA,gBAAgB;;AAEhB,IAAA,iBAAiB;;AAEjB,IAAA,YAAY;;AAEZ,IAAA,UAAU;;AAED,IAAA,WAAW;;AAEpB,IAAA,YAAY;;AAEZ,IAAA,eAAe;;AAEf,IAAA,gBAAgB;;AAEhB,IAAA,YAAY;;AAEZ,IAAA,aAAa;;AAEb,IAAA,YAAY;;AAEZ,IAAA,wBAAwB;;AAExB,IAAA,gBAAgB;;AAEhB,IAAA,SAAS;;AAET,IAAA,gBAAgB;;AAGhB,IAAA,WAAW;;AAEX,IAAA,MAAM;;AAEN,IAAA,YAAY;;AAEZ,IAAA,cAAc;;AAEd,IAAA,eAAe;;AAGN,IAAA,OAAO;;AAEP,IAAA,YAAY;;AAGrB,IAAA,WAAA,CAAY,SAAiC,EAAE,EAAA;AAC7C,QAAA,IAAI,CAAC,OAAO,GAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,EAAE;AACvD,QAAA,IAAI,CAAC,UAAU,GAAK,MAAM,CAAC,UAAU,IAAI,IAAI,eAAe,CAAI,EAAE,CAAC;AACnE,QAAA,IAAI,CAAC,OAAO,GAAQ,MAAM,CAAC,OAAO,IAAI,IAAI,YAAY,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;QACjF,IAAI,CAAC,OAAO,GAAQ,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QAChD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE;QAC7C,IAAI,CAAC,UAAU,GAAK,MAAM,CAAC,UAAU,IAAI,IAAI;QAE7C,IAAI,CAAC,SAAS,GAAU,MAAM,CAAC,SAAS,IAAI,EAAE;AAC9C,QAAA,IAAI,CAAC,SAAS,GAAU,MAAM,CAAC,SAAS;AACxC,QAAA,IAAI,CAAC,SAAS,GAAU,MAAM,CAAC,SAAS;QACxC,IAAI,CAAC,YAAY,GAAO,MAAM,CAAC,YAAY,IAAI,KAAK;QACpD,IAAI,CAAC,WAAW,GAAQ,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QAC3D,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,KAAK;QAC1D,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,KAAK;QACxD,IAAI,CAAC,WAAW,GAAQ,MAAM,CAAC,WAAW,IAAI,KAAK;QACnD,IAAI,CAAC,cAAc,GAAK,MAAM,CAAC,cAAc,IAAI,KAAK;QACtD,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,IAAI,KAAK;AAC9D,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,gBAAgB,IAAI,GAAG,CAAC;QACnE,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,KAAK;QAC1D,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,EAAE;QAC7C,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,OAAO;QAC9C,IAAI,CAAC,YAAY,GAAO,MAAM,CAAC,YAAY,IAAI,MAAM;QACrD,IAAI,CAAC,eAAe,GAAI,MAAM,CAAC,eAAe,IAAI,SAAS;QAC3D,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,IAAI;QACvD,IAAI,CAAC,YAAY,GAAO,MAAM,CAAC,YAAY,IAAI,EAAE;QACjD,IAAI,CAAC,aAAa,GAAM,MAAM,CAAC,aAAa,IAAI,EAAE;QAClD,IAAI,CAAC,YAAY,GAAO,MAAM,CAAC,YAAY,IAAI,KAAK;QACpD,IAAI,CAAC,wBAAwB,GAAG,MAAM,CAAC,wBAAwB,IAAI,KAAK;QACxE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,KAAK;AACxD,QAAA,IAAI,CAAC,SAAS,GAAU,MAAM,CAAC,SAAS;QACxC,IAAI,CAAC,OAAO,GAAY,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QACvD,IAAI,CAAC,YAAY,GAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QACxD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,KAAK;AACxD,QAAA,IAAI,CAAC,WAAW,GAAQ,MAAM,CAAC,WAAW;AAC1C,QAAA,IAAI,CAAC,MAAM,GAAa,MAAM,CAAC,MAAM;QACrC,IAAI,CAAC,YAAY,GAAO,MAAM,CAAC,YAAY,IAAI,KAAK;AACpD,QAAA,IAAI,CAAC,cAAc,GAAK,MAAM,CAAC,cAAc;QAC7C,IAAI,CAAC,eAAe,GAAI,MAAM,CAAC,eAAe,IAAI,GAAG;IACvD;;IAGA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IAC/B;AACD;;ACxQD;;;AAGG;MACU,oBAAoB,CAAA;AACF,IAAA,IAAA;AAA7B,IAAA,WAAA,CAA6B,IAA4B,EAAA;QAA5B,IAAA,CAAA,IAAI,GAAJ,IAAI;IAA2B;;AAGnD,IAAA,qBAAqB,GAAG,QAAQ,CAAW,MAAK;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;AAC/B,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC;QAE3C,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;AAAE,YAAA,OAAO,OAAO;AAE/D,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE;AACjC,QAAA,OAAO,GAAG,wBAAwB,CAChC,IAAI,EACJ,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CACnB;AACD,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE;QACnC,IAAI,KAAK,EAAE;YACT,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAClG;QACA,IAAI,OAAO,CAAC,YAAY,EAAE;AAAE,YAAA,OAAO,OAAO;QAE1C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QAC7C,OAAO,WAAW,CAAC;AACjB,cAAE,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;cACzE,OAAO;AACb,IAAA,CAAC,4FAAC;;AAGO,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC,MAAM,uFAAC;;IAG9D,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAElG;;;AAGG;AACc,IAAA,eAAe,GAAG,QAAQ,CAA4D,MAAK;AAC1G,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AAAE,YAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAU,EAAE;QACrF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAO,EAAG;QACnC,MAAM,GAAG,GAAa,EAAE;QACxB,MAAM,MAAM,GAAa,EAAE;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;YAChD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;YACxC,IAAI,KAAK,KAAK,KAAK;AAAE,gBAAA,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;iBAC/B,IAAI,KAAK,KAAK,QAAQ;AAAE,gBAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;;AAC1C,gBAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;AACA,QAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;AACjC,IAAA,CAAC,sFAAC;;AAGO,IAAA,cAAc,GAAG,QAAQ,CAA4D,MAAK;QACjG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QAC1C,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;AACvG,IAAA,CAAC,qFAAC;;AAGO,IAAA,iBAAiB,GAAG,QAAQ,CAA4D,MAAK;QACpG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QAC1C,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;AAC1G,IAAA,CAAC,wFAAC;;AAGe,IAAA,gBAAgB,GAAG,QAAQ,CAAW,MAAK;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC;QAC7C,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;AAAE,YAAA,OAAO,OAAO;QAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvD,OAAO,WAAW,CAAC;cACf,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;cACnF,OAAO;AACb,IAAA,CAAC,uFAAC;;AAGO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QACnC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;QACzC,IAAI,QAAQ,IAAI,CAAC;AAAE,YAAA,OAAO,CAAC;QAC3B,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI;AAC1C,cAAE,OAAQ,CAAC,SAAS;AACpB,cAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,MAAM;AACvC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC;AACjD,IAAA,CAAC,iFAAC;;AAGO,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,OAAO,KAAK;AACxC,QAAA,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE;AACnE,IAAA,CAAC,qFAAC;;AAGO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;QAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACvF,IAAA,CAAC,iFAAC;;AAGO,IAAA,YAAY,GAAG,QAAQ,CAA0B,MACxD,iBAAiB,CACf,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAC7B,IAAI,CAAC,qBAAqB,EAAE,EAC5B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CACxC,mFACF;;AAGQ,IAAA,aAAa,GAAG,QAAQ,CAAa,MAAK;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,qBAAqB,EAAE;;;QAI1C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;QACzC,IAAI,UAAU,EAAE;YACd,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;;;YAI/C,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;YACxC,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB;mBAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,cAAc,KAAK,IAAI,CAAC;AAE1E,YAAA,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE;AAChC,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CACtC,kBAAkB,CAChB,IAAI,EACJ,OAAO,EACP,UAAU,EACV,WAAW,EACX,YAAY,IAAI,UAAU,CAAC,qBAAqB,KAAK,KAAK,CAC3D,EACD,IAAI,EACJ,UAAU,CACX;AACD,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACxB,gBAAA,OAAO,KAAK;YACd;YAEA,IAAI,YAAY,IAAI,UAAU,CAAC,qBAAqB,KAAK,KAAK,EAAE;AAC9D,gBAAA,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,UAAU;AACzC,gBAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B;gBACpD,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AAE9D,gBAAA,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,OAAO,CAAC;AACxC,gBAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB;AACzC,gBAAA,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE;oBAC7B,IAAI,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACzC,OAAO,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;wBAClD,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAE;AAC5C,wBAAA,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;AACpB,wBAAA,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAAE,4BAAA,MAAM;AACpC,wBAAA,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;wBACxB,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC3C;gBACF;gBAEA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CACtC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,EAC9D,IAAI,EACJ,UAAU,CACX;AACD,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACxB,gBAAA,OAAO,KAAK;YACd;YAEA,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CACtC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,EACtD,IAAI,EACJ,UAAU,CACX;AACD,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACxB,YAAA,OAAO,KAAK;QACd;;AAGA,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO;AAC9C,YAAA,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACvD;QAEA,IAAI,OAAO,EAAE;AACX,YAAA,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE;AACzC,YAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE;YACnC,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;YAChD,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,UAAU,EAAE;gBACpD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AAC5E,gBAAA,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC;YACjE;YAEA,IAAI,UAAU,EAAE;gBACd,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAC5C,gBAAA,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,KAAK;sBACvC,SAAS,CAAC;AACZ,sBAAE,IAAI,GAAG,EAAU;AACrB,gBAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE;AACjC,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB;AAC/C,sBAAE;AACF,sBAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AAC7B,gBAAA,MAAM,KAAK,GAAG,iBAAiB,CAC7B,IAAI,EACJ,OAAO,EACP,UAAU,EACV,IAAI,CAAC,SAAS,EAAE,EAChB,WAAW,EACX,cAAc,EACd,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAClB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAC1B,OAAO,CAAC,UAAU,EAAE,CACrB;AACD,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACxB,gBAAA,OAAO,KAAK;YACd;QACF;;QAGA,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,GAAG,IAAI;QAC1F,MAAM,KAAK,GAAe,EAAE;AAC5B,QAAA,KAAK,MAAM,aAAa,IAAI,OAAO,EAAE;AACnC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;AAClC,YAAA,IAAI,cAAc,EAAE,GAAG,CAAC,aAAa,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;QACvF;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACxB,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,oFAAC;;IAGF,kBAAkB,GAAA;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;QACrC,IAAI,MAAM,KAAK,MAAM;AAAE,YAAA,OAAO,EAAE;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;AACpD,QAAA,OAAO,MAAM,KAAK,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;IACtD;IAEQ,SAAS,GAAA;QACf,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAClE;AAEQ,IAAA,WAAW,CAAC,OAAqC,EAAA;QACvD,OAAO,IAAI,CAAC,kBAAkB;AAC3B,aAAA,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAA2B;AAC9D,aAAA,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC;IAC3C;AAEQ,IAAA,qBAAqB,CAC3B,KAAiB,EACjB,IAA+B,EAC/B,UAA2B,EAAA;QAE3B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,GAAG,IAAI;QAC1F,IAAI,CAAC,cAAc,EAAE,IAAI;AAAE,YAAA,OAAO,KAAK;AAEvC,QAAA,MAAM,SAAS,GAAG,CAAC,gBAAgB,CAAC,UAAU;AAC5C,cAAE,IAAI,GAAG,CACP;iBACG,GAAG,CAAC,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC;AACtC,iBAAA,MAAM,CAAC,CAAC,EAAE,KAA4B,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS,CAAC;AAE3E,cAAE,IAAI,GAAG,EAAmB;QAC9B,MAAM,MAAM,GAAe,EAAE;AAC7B,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACjB,YAAA,IACE;mBACG,OAAO,IAAI,KAAK;AAChB,mBAAA,eAAe,IAAI;oBAEpB,gBAAgB,CAAC,UAAU;AACxB,uBAAA,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;mBAE5C,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EACzC;AACA,gBAAA,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/D;QACF;AACA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,YAAY,CAAC,KAAiB,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5E;AACD;;ACxTD;MACa,oBAAoB,CAAA;AAKZ,IAAA,IAAA;AAEA,IAAA,OAAA;AANV,IAAA,iBAAiB,GAAG,MAAM,CAA2B,IAAI,wFAAC;IAC3D,cAAc,GAA6B,IAAI;AAEvD,IAAA,WAAA,CACmB,IAAiC,EAClD,UAAsB,EACL,OAAA,GAAU,IAAI,mBAAmB,EAAE,EAAA;QAFnC,IAAA,CAAA,IAAI,GAAJ,IAAI;QAEJ,IAAA,CAAA,OAAO,GAAP,OAAO;QAExB,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC/C;;IAGA,QAAQ,CAAC,QAAgB,EAAE,QAAgB,EAAA;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACzC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,MAAM,IAAI,QAAQ,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE;AACtF,QAAA,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACpC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChD;;IAGA,qBAAqB,GAAA;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AACvB,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC5E,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;AAC1E,QAAA,IAAI,kBAAkB,GAAG,CAAC,IAAI,iBAAiB,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;QAChE,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;YACzD,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;AACvD,YAAA,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;AAC/D,YAAA,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;SAC9D;IACH;;IAGA,wBAAwB,GAAA;AACtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,EAAE;AAC1C,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,KAAK;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACzC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI;AAC1B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAClE,IAAI,YAAY,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;QACjC,OAAO;AACL,YAAA,QAAQ,EAAE,YAAY;AACtB,YAAA,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,MAAM,EAAE,QAAQ,CAAC,QAAQ;SAC1B;IACH;;IAGA,eAAe,CAAC,aAAqB,EAAE,QAAgB,EAAA;AACrD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,EAAE;AAC1C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;QAC9D,OAAO,YAAY,IAAI,KAAK,CAAC,QAAQ,IAAI,YAAY,IAAI,KAAK,CAAC;eAC1D,QAAQ,IAAI,KAAK,CAAC,QAAQ,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM;IAC7D;;IAGA,gBAAgB,CAAC,aAAqB,EAAE,QAAgB,EAAA;AACtD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB,EAAE;AAC9C,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;QACzB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;QAC9D,OAAO,YAAY,KAAK,MAAM,CAAC,MAAM,IAAI,QAAQ,KAAK,MAAM,CAAC,MAAM;IACrE;;IAGA,iBAAiB,CAAC,aAAqB,EAAE,QAAgB,EAAA;AACvD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc;AAClC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACvC,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;AAC9D,QAAA,MAAM,YAAY,GAAG,YAAY,IAAI,MAAM,CAAC,QAAQ,IAAI,YAAY,IAAI,MAAM,CAAC;eAC1E,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM;AAC7D,QAAA,MAAM,YAAY,GAAG,YAAY,IAAI,MAAM,CAAC,QAAQ,IAAI,YAAY,IAAI,MAAM,CAAC;eAC1E,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM;AAC7D,QAAA,OAAO,YAAY,IAAI,CAAC,YAAY;IACtC;;AAGA,IAAA,SAAS,CAAC,KAAmB,EAAE,aAAqB,EAAE,QAAgB,EAAA;AACpE,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC;YAAE;AAC3E,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAAE;AAClC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB,EAAE;AAC9C,QAAA,IAAI,CAAC,MAAM;YAAE;QACb,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACtB,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM;AAC5B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC;IACxE;;IAGA,SAAS,CAAC,MAAyB,EAAE,MAAyB,EAAA;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACvC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;AAC7E,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QAC7E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE;QAExD,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,IAAG;AACjD,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC;YAChC,OAAO,aAAa,CAAC,IAAI;AACvB,kBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;kBAC7E,EAAE;AACR,QAAA,CAAC,CAAC;QAEF,IAAI,YAAY,GAAwB,IAAI;QAC5C,MAAM,cAAc,GAAmB,EAAE;AACzC,QAAA,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;AAClE,YAAA,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC;AAC1C,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC;AAChC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAAE;AAC1B,YAAA,KAAK,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;AAC1E,gBAAA,MAAM,YAAY,GAAG,YAAY,IAAI,MAAM,CAAC,QAAQ,IAAI,YAAY,IAAI,MAAM,CAAC;uBAC1E,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM;AAC7D,gBAAA,IAAI,YAAY;oBAAE;AAClB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;AAC1B,gBAAA,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC;oBAAE;AAChE,gBAAA,MAAM,cAAc,GAAG,SAAS,GAAG,YAAY,CAAC,MAAM;AACtD,gBAAA,MAAM,eAAe,GAAG,YAAY,CAAC,cAAc,CAAC;AACpD,gBAAA,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;oBAAE;AAClC,gBAAA,MAAM,cAAc,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,eAAe,CAAC,MAAM;gBAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7E,gBAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC;gBAChD,IAAI,QAAQ,KAAK,QAAQ;oBAAE;gBAE3B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;gBAC9E,cAAc,CAAC,IAAI,CAAC;oBAClB,QAAQ,EAAE,IAAI,CAAC,aAAa;oBAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,QAAQ;oBACR,QAAQ;AACT,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;oBACnB,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE;oBACpD,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,QAAQ;oBACR,QAAQ;AACT,iBAAA,CAAC;gBACF,YAAY,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE;YAC3D;QACF;QAEA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,cAAc,CAAC;QAClD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;AACvC,QAAA,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE;YAC7B,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC3F,YAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAC1B,gBAAA,MAAM,EAAE,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;AACtE,gBAAA,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;AACvE,aAAA,CAAC;QACJ;aAAO,IAAI,YAAY,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;QAC1C;IACF;AAEiB,IAAA,YAAY,GAAG,CAAC,KAAmB,KAAU;AAC5D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc;AAClC,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;YAChC;QACF;AACA,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC;AACtE,QAAA,IAAI,kBAAkB,GAAG,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;YAChC;QACF;AACA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC;AAC1D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC;AACvD,QAAA,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE;AACxD,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;YAChC;QACF;AACA,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM;YACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM;AACP,SAAA,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;AACxC,IAAA,CAAC;IAEgB,UAAU,GAAG,MAAW;QACvC,IAAI,CAAC,iBAAiB,EAAE;AACxB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc;AAClC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACvC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,MAAM,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;AACtD,IAAA,CAAC;IAEgB,cAAc,GAAG,MAAY,IAAI,CAAC,UAAU,EAAE;IAEvD,UAAU,GAAA;QAChB,IAAI,CAAC,iBAAiB,EAAE;AACxB,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC;IAEQ,iBAAiB,GAAA;QACvB,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC;QACrE,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC;IAC3E;AAEQ,IAAA,eAAe,CAAC,KAAmB,EAAA;QACzC,MAAM,IAAI,GAAI,KAAK,CAAC,aAA6B,CAAC,qBAAqB,EAAE;AACzE,QAAA,OAAO,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;IAC5E;IAEQ,sBAAsB,CAAC,CAAS,EAAE,CAAS,EAAA;AACjD,QAAA,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YAC1D,MAAM,IAAI,GAAI;iBACX,OAAO,CAAc,0CAA0C,CAAC;AACnE,YAAA,IAAI,CAAC,IAAI;gBAAE;YACX,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChD,YAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AAC1D,gBAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;YAC/B;QACF;AACA,QAAA,OAAO,IAAI;IACb;IAEQ,qBAAqB,CAAC,KAAa,EAAE,GAAW,EAAA;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;QACvC,MAAM,OAAO,GAAa,EAAE;AAC5B,QAAA,KAAK,IAAI,YAAY,GAAG,KAAK,EAAE,YAAY,IAAI,GAAG,EAAE,YAAY,EAAE,EAAE;AAClE,YAAA,IAAI,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAAE,gBAAA,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;QACpE;AACA,QAAA,OAAO,OAAO;IAChB;IAEQ,uBAAuB,CAAC,YAAoB,EAAE,QAAgB,EAAA;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC;QACpD,IAAI,aAAa,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE;AAC1E,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE;IAC9D;AACD;;AC1QD;;;;AAIG;AACH,SAAS,qBAAqB,CAAC,MAA0B,EAAA;IACvD,OAAO,MAAM,YAAY;AACpB,WAAA,MAAM,YAAY;AAClB,WAAA,MAAM,YAAY;YACjB,MAAM,YAAY,WAAW,IAAI,MAAM,CAAC,iBAAiB,CAAC;AAClE;AAoCA;;;AAGG;MACU,kBAAkB,CAAA;AAcV,IAAA,IAAA;AACA,IAAA,OAAA;AAdV,IAAA,WAAW,GAAG,MAAM,CAA6B,IAAI,kFAAC;AACtD,IAAA,eAAe,GAAG,MAAM,CAA8B,IAAI,sFAAC;AAC3D,IAAA,eAAe,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,sFAAC;AAChD,IAAA,kBAAkB,GACzB,IAAI,CAAC,eAAe,CAAC,UAAU,EAAiC;AACzD,IAAA,gBAAgB,GAAG,QAAQ,CAAgB,MAAK;AACvD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;AACvC,QAAA,OAAO,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;AACpD,IAAA,CAAC,uFAAC;IAEM,cAAc,GAAkB,IAAI;AAE5C,IAAA,WAAA,CACmB,IAA+B,EAC/B,OAAA,GAAU,IAAI,mBAAmB,EAAE,EAAA;QADnC,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,OAAO,GAAP,OAAO;IACvB;;AAGH,IAAA,aAAa,CAAC,aAAqB,EAAA;QACjC,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC;IAClD;;AAGA,IAAA,uBAAuB,CAAC,IAAc,EAAA;AACpC,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;IACtE;;IAGA,cAAc,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,KAAK,CAAC;YAAE;QACvC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IAC7B;;AAGA,IAAA,iBAAiB,CAAC,KAAmB,EAAE,aAAqB,EAAE,eAAwB,EAAA;QACpF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;QACrC,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;AAE3C,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC;YACzD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,aAAa,EAAE;YACpB;QACF;QAEA,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;AAC3C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ;QAE5B,IAAI,IAAI,EAAE;YACR,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AAC5C,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;;AAClD,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AAC5B,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,YAAA,IAAI,CAAC,cAAc,GAAG,aAAa;YACnC,IAAI,CAAC,aAAa,EAAE;QACtB;aAAO,IAAI,KAAK,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;YAChD,IAAI,CAAC,eAAe,CAAC,GAAG,CACtB,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CACnF;YACD,IAAI,CAAC,aAAa,EAAE;QACtB;aAAO;AACL,YAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC;gBAAE,KAAK,CAAC,cAAc,EAAE;AAChE,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AAClD,YAAA,IAAI,CAAC,cAAc,GAAG,aAAa;AAEnC,YAAA,IAAI,eAAe;AAAE,gBAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;;gBACxD,IAAI,CAAC,aAAa,EAAE;QAC3B;IACF;;AAGA,IAAA,QAAQ,CAAC,IAA6D,EAAA;AACpE,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5E;;IAGA,kBAAkB,CAAC,KAAiB,EAAE,aAAqB,EAAA;QACzD,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;IACvF;;IAGA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;;IAGA,mBAAmB,CACjB,KAAiB,EACjB,QAAgB,EAChB,QAAgB,EAChB,GAAW,EACX,GAA4B,EAAA;QAE5B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;AACjC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;YACvB,CAAC,EAAE,KAAK,CAAC,OAAO;YAChB,CAAC,EAAE,KAAK,CAAC,OAAO;YAChB,QAAQ;YACR,QAAQ;YACR,KAAK,EAAE,GAAG,CAAC,KAAK;AAChB,YAAA,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;YACrB,GAAG;AACJ,SAAA,CAAC;IACJ;;IAGA,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC;;IAGA,mBAAmB,CAAC,aAAqB,EAAE,GAAW,EAAA;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;AAC1C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa;aACxC,GAAG,CAAC,KAAK,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;aAClF,IAAI,CAAC,IAAI,CAAC;QACb,KAAK,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC;QACtC,IAAI,CAAC,oBAAoB,EAAE;IAC7B;;AAGA,IAAA,kBAAkB,CAAC,aAAqB,EAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa;AACxC,aAAA,GAAG,CAAC,KAAK,IAAI;aACX,GAAG,CAAC,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;aAChF,IAAI,CAAC,IAAI,CAAC;aACZ,IAAI,CAAC,IAAI,CAAC;QACb,KAAK,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC;QACtC,IAAI,CAAC,oBAAoB,EAAE;IAC7B;AAEQ,IAAA,WAAW,CAAC,YAAoB,EAAA;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM;AAC5C,QAAA,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE;YAC3E,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,MAAM;AAAE,gBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACjF;AACA,QAAA,OAAO,OAAO;IAChB;;AAGA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,oBAAoB,EAAE;IAC7B;;AAGA,IAAA,SAAS,CAAC,aAAqB,EAAA;AAC7B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC;QAE/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AAC7C,QAAA,IAAI,YAAY,EAAE,QAAQ,KAAK,aAAa,EAAE;YAC5C,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAClC;aAAO,IAAI,YAAY,IAAI,YAAY,CAAC,QAAQ,GAAG,aAAa,EAAE;AAChE,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;QAC/F;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;QAEzC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;AAC7C,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,IAAG;AACpC,gBAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC7B,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;AAC1B,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC;YACF,IAAI,CAAC,aAAa,EAAE;QACtB;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACpE;;IAGA,aAAa,GAAA;AACX,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE;AACtC,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAC3B;QACF;QACA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;YACpB,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9E,SAAA,CAAC;IACJ;AACD;;AC3OD;MACa,sBAAsB,CAAA;AAaJ,IAAA,IAAA;AAZpB,IAAA,IAAI,GAAG,MAAM,CAAC,KAAK,2EAAC;AACpB,IAAA,GAAG,GAAG,MAAM,CAAuB,SAAS,0EAAC;AAC7C,IAAA,GAAG,GAAG,QAAQ,CAAiC,MAAK;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;QAC1C,OAAO,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI;AAC7E,IAAA,CAAC,0EAAC;IACO,aAAa,GAAG,QAAQ,CAC/B,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,IAAI,GAAG,EAAU,oFAChE;;AAEQ,IAAA,gBAAgB,GAAG,MAAM,CAAyB,EAAE,uFAAC;AAE9D,IAAA,WAAA,CAA6B,IAAmC,EAAA;QAAnC,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAkC;;AAG3D,IAAA,eAAe,CAAC,KAAa,EAAA;QACnC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAAE;AACzC,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,IAAG;AACpC,YAAA,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE;AAC1B,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC;AAClB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;;IAGA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;AACvE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;QACxB;IACF;;IAGA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC;IACnC;;IAGA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACrB;;IAGA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACtB;;AAGA,IAAA,SAAS,CAAC,GAAyB,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,EAAE;AACrC,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB;aAAO;AACL,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AACjB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QACrB;IACF;;AAGA,IAAA,IAAI,CAAC,KAAuB,EAAA;AAC1B,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC;IACtD;;IAGA,gBAAgB,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;IACrC;;AAGA,IAAA,UAAU,CAAC,KAAa,EAAE,GAAW,EAAE,WAAmB,EAAA;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;QAC1C,IAAI,KAAK,KAAK,IAAI;YAAE;QACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC;YAAE;QAC3C,IAAI,QAAQ,GAAY,WAAW;AACnC,QAAA,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACzB,YAAA,QAAQ,GAAG,WAAW,KAAK,EAAE,GAAG,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;QAC5D;AAAO,aAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;YAC9B,QAAQ,GAAG,oBAAoB,CAC7B,WAAW,EACX,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAC5C;QACH;AAAO,aAAA,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE;AAC7B,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAClC,OAAO,KAAK,KAAK;kBACb,KAAK,KAAK;kBACV,MAAM,CAAE,KAAqB,CAAC,KAAK,CAAC,KAAK,WAAW,CACzD;YACD,QAAQ,GAAG,MAAM,KAAK;AACpB,kBAAE;AACF,kBAAE,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAI,MAAsB,CAAC,KAAK;QACzE;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;AAChD,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC;QAC3B,IAAI,QAAQ,KAAK,QAAQ;YAAE;AAC3B,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,QAAiB,EAAE,GAAY,CAAC,IAAI,IAAI;QACvE,IAAI,OAAO,EAAE;YACX,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,GAAG,MAAM,EAAE,CAAC,KAAK,GAAG,OAAO,EAAE,CAAC,CAAC;AACzE,YAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YAClF;QACF;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC;QACvF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC7E,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;YACvC,KAAK;YACL,QAAQ;YACR,QAAQ;SACT;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE;AACjC,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAC7B;IACF;AACD;;AC9FD;MAOa,qBAAqB,CAAA;AAChC,IAAA,IAAI,GAAG,KAAK,CAAU,KAAK,2EAAC;AAC5B,IAAA,SAAS,GAAG,KAAK,CAAuB,SAAS,gFAAC;AAClD,IAAA,OAAO,GAAG,KAAK,CAAW,EAAE,8EAAC;AAC7B,IAAA,YAAY,GAAG,KAAK,CAAgB,EAAE,mFAAC;AACvC,IAAA,GAAG,GAAG,KAAK,CAAiC,IAAI,0EAAC;AACjD,IAAA,QAAQ,GAAG,KAAK,CAAgB,IAAI,+EAAC;AACrC,IAAA,aAAa,GAAG,KAAK,CAAsB,IAAI,GAAG,EAAE,oFAAC;AACrD,IAAA,MAAM,GAAG,KAAK,CAAqB,SAAS,6EAAC;AAC7C,IAAA,UAAU,GAAG,KAAK,CAAkB,iBAAiB,CAAC,EAAE,iFAAC;AACzD,IAAA,YAAY,GAAG,KAAK,CAAU,KAAK,mFAAC;AACpC,IAAA,gBAAgB,GAAG,KAAK,CAAU,KAAK,uFAAC;AACxC,IAAA,cAAc,GAAG,KAAK,CACpB,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,qFAC9B;;AAED,IAAA,MAAM,GAAG,KAAK,CAAyB,EAAE,6EAAC;IAE1C,KAAK,GAAG,MAAM,EAAQ;IACtB,SAAS,GAAG,MAAM,EAAwB;IAC1C,YAAY,GAAG,MAAM,EAAU;IAC/B,iBAAiB,GAAG,MAAM,EAA2B;IACrD,UAAU,GAAG,MAAM,EAAoB;IACvC,IAAI,GAAG,MAAM,EAA6B;AAEjC,IAAA,aAAa,GAAG,QAAQ,CAA4B,MAAK;QAChE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACtF,MAAM,OAAO,GAA8B,EAAE;AAC7C,QAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAA+D;QAE7F,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAChC,YAAA,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK;AACzB,YAAA,MAAM,UAAU,GAAG,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,SAAS;AACjE,YAAA,IAAI,CAAC,OAAO,IAAI,CAAC,UAAU,EAAE;gBAC3B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;gBACrC;YACF;YAEA,IAAI,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE;AACV,gBAAA,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;AACtE,gBAAA,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC;AAClC,gBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YACrB;AACA,YAAA,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QACzB;AAEA,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC,oFAAC;;AAGF,IAAA,cAAc,CAAC,OAAiB,EAAA;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrD;;AAGA,IAAA,uBAAuB,CAAC,OAAiB,EAAA;AACvC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;QACzE,OAAO,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,OAAO,CAAC,MAAM;IAC1D;;IAGA,aAAa,CAAC,OAAiB,EAAE,KAAY,EAAA;AAC3C,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC1B,YAAA,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC;AACrC,YAAA,OAAO,EAAG,KAAK,CAAC,MAA2B,CAAC,OAAO;AACpD,SAAA,CAAC;IACJ;;IAGA,iBAAiB,CAAC,KAA8B,EAAE,KAAY,EAAA;AAC5D,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtB,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;AAC1F,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;gBAC/B,GAAG;gBACH,KAAK,EAAE,KAAK,CAAC,QAAQ;gBACrB,MAAM,EAAE,KAAK,CAAC,GAAG;AAClB,aAAA,CAAC;AACF,YAAA,IAAI,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;AAChD,gBAAA,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,UAAU;gBACjE;YACF;YACA,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,KAAK;QAC/C;IACF;;IAGA,cAAc,CAAC,KAA8B,EAAE,KAAY,EAAA;AACzD,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACnB,YAAA,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;YACtB,GAAG,EAAE,KAAK,CAAC,GAAG;AACd,YAAA,KAAK,EAAG,KAAK,CAAC,MAA2B,CAAC,KAAK;AAChD,SAAA,CAAC;IACJ;AAES,IAAA,YAAY,GAAG,QAAQ,CAAmC,MAAK;AACtE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AACrB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AACxC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AAC1C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,IAAG;YAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;YAC/B,IAAI,UAAU,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YACvC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE;AAClD,gBAAA,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC;YAC1C;YACA,OAAO;gBACL,KAAK,EAAE,GAAG,CAAC,MAAM;gBACjB,KAAK,EAAE,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAChD,QAAQ;gBACR,UAAU;gBACV,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,gBAAA,QAAQ,EAAE,CAAC,YAAY,IAAI,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC;gBACpF,GAAG;aACJ;AACH,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,mFAAC;wGA1HS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,q7DCrDlC,49JAuHA,EAAA,MAAA,EAAA,CAAA,k6HAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDlEa,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;+BACE,eAAe,EAAA,eAAA,EACR,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,49JAAA,EAAA,MAAA,EAAA,CAAA,k6HAAA,CAAA,EAAA;;;AExCjD;AACA,MAAM,SAAS,GAAG,GAAG;AAErB;;;;;;;;;;;AAWG;MACU,4BAA4B,CAAA;IAC/B,QAAQ,GAAoC,IAAI;IAChD,KAAK,GAAa,EAAE;;AAEpB,IAAA,OAAO,GAAa,CAAC,CAAC,CAAC;AAEd,IAAA,WAAW,GAAG,IAAI,OAAO,EAAU;IAC3C,mBAAmB,GAAuB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAEhG,IAAA,MAAM,CAAC,QAAkC,EAAA;AACvC,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;QACxB,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE;AAC3B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;;AAGA,IAAA,eAAe,CAAC,KAAe,EAAA;AAC7B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,MAAM,OAAO,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACnD,QAAA,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACd,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;AAAE,YAAA,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AAC7E,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,sBAAsB,EAAE;YAC7B,IAAI,CAAC,mBAAmB,EAAE;QAC5B;IACF;IAEA,iBAAiB,GAAA;QACf,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEA,mBAAmB,GAAA;QACjB,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEA,iBAAiB,GAAA;;IAEjB;IAEA,uBAAuB,GAAA;;IAEvB;IAEA,aAAa,CAAC,KAAa,EAAE,QAAwB,EAAA;QACnD,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/D,QAAA,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACpE;AAEA,IAAA,IAAY,SAAS,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;IACnD;IAEQ,sBAAsB,GAAA;QAC5B,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC;IACpD;;AAGQ,IAAA,OAAO,CAAC,MAAc,EAAA;AAC5B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO;QACtB,IAAI,EAAE,GAAG,CAAC;AACV,QAAA,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC;AACrB,QAAA,OAAO,EAAE,GAAG,EAAE,EAAE;YACd,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC;AAC9B,YAAA,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,MAAM;gBAAE,EAAE,GAAG,GAAG;;AACzB,gBAAA,EAAE,GAAG,GAAG,GAAG,CAAC;QACnB;AACA,QAAA,OAAO,EAAE;IACX;IAEQ,mBAAmB,GAAA;AACzB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAC9B,QAAA,IAAI,CAAC,QAAQ;YAAE;AAEf,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,EAAE;AAC3C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC;AACjD,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AACX,YAAA,QAAQ,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAC/C,YAAA,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC;AACpC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YACxB;QACF;AAEA,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,mBAAmB,EAAE;AACnD,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,EAAE;AAC/C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;AAElF,QAAA,MAAM,KAAK,GAAc,EAAE,KAAK,EAAE,GAAG,EAAE;AACvC,QAAA,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC;AAChC,QAAA,QAAQ,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACnD;AACD;AAED;;;;;;;AAOG;MAWU,6BAA6B,CAAA;;IAE/B,SAAS,GAAG,KAAK,CAAW,EAAE,iFAAI,KAAK,EAAE,sBAAsB,EAAA,CAAG;AAElE,IAAA,QAAQ,GAAG,IAAI,4BAA4B,EAAE;IAEtD,WAAW,GAAA;QACT,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACjD;wGARW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA7B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mDAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAR7B;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,uBAAuB;gBAChC,UAAU,EAAE,CAAC,CAAgC,KAAK,CAAC,CAAC,QAAQ;gBAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,6BAA6B,CAAC,CAAC;AACxD,aAAA;AACF,SAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAEU,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAVzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mDAAmD;AAC7D,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,uBAAuB;4BAChC,UAAU,EAAE,CAAC,CAAgC,KAAK,CAAC,CAAC,QAAQ;4BAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,MAAK,6BAA8B,CAAC,CAAC;AACxD,yBAAA;AACF,qBAAA;AACF,iBAAA;;;AC3ED;;;;;;;;;;;;;;;;;;;AAmBG;MAsBU,cAAc,CAAA;;;AAKzB,IAAA,QAAQ,GAAG,KAAK,CAAmB,IAAI,aAAa,EAAK,+EAAC;;AAGjD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,gFAAC;AACrD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,gFAAC;AACrD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,gFAAC;AACrD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,mFAAC;AAC3D,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,kFAAC;AAC3D,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,gBAAgB,uFAAC;IACnE,iBAAiB,GAAG,QAAQ,CAAC,MACpC,IAAI,CAAC,QAAQ,EAAE,CAAC,iBAAiB,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACpF;AACQ,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,GAAG,EAAE,yFAAC;AACtE,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,WAAW,kFAAC;AACzD,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,qFAAC;AAC/D,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,mBAAmB,0FAAC;AACzE,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,gBAAgB,uFAAC;AACnE,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,iBAAiB,wFAAC;AACrE,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,mFAAC;AAC3D,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,uFAAC;AACtE,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU,iFAAC;AACvD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,mFAAC;AAC3D,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,sFAAC;AACjE,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,gBAAgB,uFAAC;AACnE,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,mFAAC;AAC3D,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,oFAAC;AAC7D,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,mFAAC;AAC3D,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU,iFAAC;AACvD,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,mFAAC;AAC3D,IAAA,wBAAwB,GAAG,QAAQ,CAC1C,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,wBAAwB,+FAC/C;AACQ,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,gBAAgB,uFAAC;AACnE,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,EAAE,mFAAC;AAC7D,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,8EAAC;AACnD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,gFAAC;AACrD,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,gBAAgB,uFAAC;;AAGnE,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,WAExC,iFAAC;;AAEL,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,MAEtC,+EAAC;AAEd;;;;AAIG;AACM,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACvC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE;AACjC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE;AACpC,QAAA,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;AAAE,YAAA,OAAO,SAAS;AACxD,QAAA,OAAO,CAAC,GAA4B,EAAE,KAAa,KAAkC;YACnF,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YACrC,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO,QAAQ,IAAI,SAAS;AACxD,YAAA,OAAO,SAAS,GAAG,GAAG,EAAE,KAAK,CAAC;AAChC,QAAA,CAAC;AACH,IAAA,CAAC,sFAAC;;IAEO,YAAY,GAAG,QAAQ,CAC9B,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,YAAY,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;WACnD,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,mFACrC;;AAEQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,eAAe,sFAAC;;AAGjE,IAAA,OAAO,GAAG,QAAQ,CACzB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAyB,8EACvD;;AAGQ,IAAA,UAAU,GAAG,QAAQ,CAAkB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU,iFAAC;AAEhE,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,IAAI,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,GAAG,EAAmB;AAC1E,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmB;QACtC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,GAAQ,CAAC;AAC7C,YAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS;AAAE,gBAAA,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;QACpE;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,oFAAC;;AAGO,IAAA,OAAO,GAAG,QAAQ,CAAsB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,8EAAC;;AAGtE,IAAA,MAAM,GAAG,QAAQ,CAAS,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,6EAAC;;IAG9E,UAAU,GAAG,QAAQ,CAAkB,MAC9C,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACtF;;AAGQ,IAAA,cAAc,GAAG,QAAQ,CAAS,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,qFAAC;;;IAK9F,QAAQ,GAAG,MAAM,EAAoB;AAErC;;;AAGG;IACH,UAAU,GAAG,MAAM,EAAsB;;IAGzC,UAAU,GAAG,MAAM,EAAsB;;IAGzC,gBAAgB,GAAG,MAAM,EAAgB;;IAGzC,UAAU,GAAG,MAAM,EAAsB;;IAGzC,SAAS,GAAG,MAAM,EAA4B;IAE9C,gBAAgB,GAAG,MAAM,EAAoB;;IAG7C,QAAQ,GAAG,MAAM,EAAoB;;IAGrC,aAAa,GAAG,MAAM,EAAsB;;IAG5C,qBAAqB,GAAG,MAAM,EAAsB;AAEpD;;;AAGG;IACH,UAAU,GAAG,MAAM,EAAqB;AACxC;;;;AAIG;IACH,UAAU,GAAG,MAAM,EAAmB;;IAGtC,YAAY,GAAG,MAAM,EAAqB;;IAG1C,UAAU,GAAG,MAAM,EAAmB;AAEtC;;;;AAIG;IACH,iBAAiB,GAAG,MAAM,EAAU;;IAGpC,gBAAgB,GAAG,MAAM,EAAyB;;IAGlD,QAAQ,GAAG,MAAM,EAAoB;;IAGrC,aAAa,GAAG,MAAM,EAAU;;;AAKvB,IAAA,YAAY,GAAG,MAAM,CAAsB,IAAI,mFAAC;;AAGhD,IAAA,gBAAgB,GAAG,MAAM,CAAgB,IAAI,uFAAC;;AAGtC,IAAA,kBAAkB,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,yFAAC;AAEpE;;;;AAIG;AACc,IAAA,WAAW,GAAG,MAAM,CAAuC,IAAI,GAAG,EAAE,kFAAC;AAErE,IAAA,aAAa,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,oFAAC;;AAGtD,IAAA,gBAAgB,GACvB,IAAI,CAAC,aAAa,CAAC,UAAU,EAAiC;;AAGvD,IAAA,sBAAsB,GAAG,MAAM,CAAC,CAAC,6FAAC;;AAGlC,IAAA,uBAAuB,GAAG,MAAM,CAAC,CAAC,8FAAC;;AAGnC,IAAA,aAAa,GAAG,MAAM,CAAmB,IAAI,oFAAC;;AAG9C,IAAA,oBAAoB,GAAG,CAAC,GAAW,EAAE,aAAqB,KACjE,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC;;IAGzC,IAAI,iBAAiB,GAAA,EAAK,OAAO,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;;IAGzE,IAAI,WAAW,GAAA,EAAK,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;;IAG5D,IAAI,YAAY,GAAA,EAAK,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;;IAG9D,IAAI,YAAY,GAAA,EAAK,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;;IAG9D,IAAI,gBAAgB,GAAA,EAAK,OAAO,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;;IAGtE,aAAa,GAAA,EAAW,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;;AAGzD,IAAA,mBAAmB,CAAC,GAAyB,EAAA;AAC3C,QAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC;IACvC;;AAGA,IAAA,mBAAmB,CAAC,KAAuB,EAAA;AACzC,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;IACpC;;AAGA,IAAA,gBAAgB,CAAC,KAAa,EAAE,GAAW,EAAE,WAAmB,EAAA;QAC9D,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC;IAC5D;AAEA,IAAA,mBAAmB,CAAC,MAAiC,EAAA;QACnD,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,EAAE;QAC/D,IAAI,aAAa,KAAK,IAAI;YAAE;AAC5B,QAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;AAClC,QAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;AAClC,QAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;IACvC;AAEA;;;;;;AAMG;IACH,SAAS,CAAC,QAAQ,GAAG,YAAY,EAAA;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC;IACvC;AAEA,qBAAiB,aAAa,GAAA,EAAW,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AACrE,qBAAiB,YAAY,GAAA,EAAW,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AACpF,qBAAiB,YAAY,GAAA,EAAW,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC;QAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;AACtI,qBAAiB,YAAY,GAAA,EAAW,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC;AAAE,QAAA,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;;IAGtH,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE;IACxC;AAEA;;;AAGG;IACH,iBAAiB,CAAC,aAAsB,EAAE,MAA0B,EAAA;AAClE,QAAA,IAAI,aAAa,KAAK,SAAS,EAAE;YAC/B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;YAChC;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI;AAChD,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,IAAG;AACjC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC7B,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;gBACzB,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;gBAC5C,IAAI,MAAM,CAAC,QAAQ,KAAK,aAAa,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AAClF,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;gBAClB;YACF;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;;IAGA,aAAa,CAAC,aAAqB,EAAE,KAAa,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAC3E;;IAGA,YAAY,CAAC,GAAW,EAAE,KAAc,EAAA;QACtC,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;IACnD;;AAGA,IAAA,YAAY,CAAC,GAAW,EAAE,KAAc,EAAE,GAA4B,EAAA;AACpE,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC;IACxD;;AAGA,IAAA,iBAAiB,CAAC,GAAW,EAAA;QAC3B,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC;IACjD;;AAGA,IAAA,YAAY,CAAC,GAAW,EAAA;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC;IAC5C;;IAGA,gBAAgB,CAAC,GAAW,EAAE,KAAc,EAAA;QAC1C,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC;IACvD;;IAIiB,eAAe,GAAG,IAAI,oBAAoB,CAAC;QAC1D,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;AACxC,KAAA,CAAC;AAEO,IAAA,cAAc,GAAG,IAAI,mBAAmB,EAAE;;IAI1C,eAAe,GAAG,QAAQ,CAAC,MAClC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAChF;;AAGQ,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,KAAK,8EAAC;;AAG5D,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,KAAK,8EAAC;IAEpD,YAAY,GAAG,IAAI,sBAAsB,CAAC;QACzD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,cAAc,EAAE,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;QAC/C,mBAAmB,EAAE,GAAG,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;AAC1D,KAAA,CAAC;;AAGO,IAAA,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc;;AAEjD,IAAA,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa;;AAE/C,IAAA,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB;;AAEzD,IAAA,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB;AACvD,IAAA,wBAAwB,GAAG,IAAI,CAAC,YAAY,CAAC,wBAAwB;AACrE,IAAA,oBAAoB,GAAG,IAAI,CAAC,YAAY,CAAC,oBAAoB;AAC7D,IAAA,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB;AACzD,IAAA,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa;AAC/C,IAAA,oBAAoB,GAAG,IAAI,CAAC,YAAY,CAAC,oBAAoB;AAC7D,IAAA,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe;AACnD,IAAA,qBAAqB,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB;AAC/D,IAAA,yBAAyB,GAAG,IAAI,CAAC,YAAY,CAAC,yBAAyB;AACvE,IAAA,oBAAoB,GAAG,IAAI,CAAC,YAAY,CAAC,oBAAoB;IAErD,WAAW,GAAG,IAAI,uBAAuB,CAAC;QACzD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;AAC1C,KAAA,CAAC;IAEe,UAAU,GAAyB,IAAI,oBAAoB,CAAC;QAC3E,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;AAC7B,QAAA,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,cAAc;QACnD,UAAU,EAAE,IAAI,CAAC,UAAU;AAC3B,QAAA,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW;QAChD,MAAM,EAAE,IAAI,CAAC,eAAe;QAC5B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,iBAAiB,EAAE,IAAI,CAAC,kBAAkB;AAC3C,KAAA,CAAC;IAEe,cAAc,GAAG,IAAI,mBAAmB,CAAC;QACxD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,gBAAgB,EAAE,aAAa,IAAI,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;AACvE,QAAA,YAAY,EAAE,CAAC,YAAY,EAAE,QAAQ,KAAK,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC;AAC1F,QAAA,SAAS,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;QACvD,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC/C,QAAA,kBAAkB,EAAE,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACxF,KAAA,CAAC;;AAGO,IAAA,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,gBAAgB;;AAGnD,IAAA,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU;AAEvC,IAAA,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc;;AAG/C,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,qFAAC;;AAG/D,IAAA,YAAY,GAAG,QAAQ,CAAC,MAC/B,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC;AAC7E,UAAA,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,mFACjE;;AAGQ,IAAA,YAAY,GAAG,QAAQ,CAAC,MAC/B,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAClE;;AAGQ,IAAA,OAAO,GAAG,QAAQ,CAAC,MAC1B,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,OAAO,CAAC,8EACzF;AAED;;;AAGG;AACH,IAAA,qBAAqB,CAAC,GAAW,EAAA;AAC/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QACvD,IAAI,OAAO,KAAK,SAAS;AAAE,YAAA,OAAO,OAAO;AACzC,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS;AAC5B,QAAA,OAAO,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,IAAI;IACnD;;AAGS,IAAA,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU;;AAGvC,IAAA,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY;AAE3C,IAAA,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB;AAC3D,IAAA,yBAAyB,GAAG,IAAI,CAAC,YAAY,CAAC,yBAAyB;AACvE,IAAA,6BAA6B,GAAG,IAAI,CAAC,YAAY,CAAC,6BAA6B;AAC/E,IAAA,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU;AACzC,IAAA,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe;AACnD,IAAA,oBAAoB,GAAG,IAAI,CAAC,YAAY,CAAC,oBAAoB;AAEtE;;;AAGG;AACM,IAAA,aAAa,GAAuB,IAAI,CAAC,UAAU,CAAC,aAAa;;;AAIjE,IAAA,YAAY,GAAG,QAAQ,CAAuB,MAAK;AAC1D,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmB;QACtC,IAAI,IAAI,GAAG,CAAC;QACZ,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YACvC,IAAIA,aAAe,CAAC,IAAI,CAAC;AAAE,gBAAA,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5E;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC,mFAAC;AAEO,IAAA,YAAY,GAAG,QAAQ,CAAa,MAAK;AAChD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE;QACvD,IAAI,OAAO,KAAK,IAAI;AAAE,YAAA,OAAO,KAAK;QAElC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,IAAIA,aAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,CAAC;AAClG,QAAA,MAAM,aAAa,GAAe,SAAS,KAAK,CAAC;AAC/C,cAAE,CAAC,GAAG,KAAK;cACT,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAEjE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE;QACnD,IAAI,OAAO,KAAK,IAAI;AAAE,YAAA,OAAO,aAAa;QAE1C,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,IAAIA,aAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,CAAC;QAC1G,IAAI,SAAS,KAAK,CAAC,CAAC;AAAE,YAAA,OAAO,aAAa;AAE1C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,GAAG,SAAS,GAAG,SAAS,GAAG,CAAC;AACnF,QAAA,MAAM,MAAM,GAAG,CAAC,GAAG,aAAa,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC;AACnC,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,mFAAC;;AAGO,IAAA,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc;;AAE/C,IAAA,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB;;AAErD,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC,uFAAC;;AAEnE,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM,GAAG,CAAC,0FAAC;AAElF;;;;AAIG;AACM,IAAA,SAAS,GAAG,QAAQ,CAAW,MAAK;AAC3C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;AAC1B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE;QACjC,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,KAAKC,eAAiB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC5E,IAAA,CAAC,gFAAC;;AAIO,IAAA,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW;;AAI3C,IAAA,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAA2B,gBAAgB,CAAC;AACzE,IAAA,cAAc,GAAG,SAAS,CAA2B,gBAAgB,qFAAC;AACtE,IAAA,mBAAmB,GAAG,SAAS,CAA2B,qBAAqB,0FAAC;AAChF,IAAA,SAAS,GAAG,SAAS,CAAC,QAAQ,CAA6B,SAAS,CAAC;AACrE,IAAA,oBAAoB,GACnC,SAAS,CAAC,QAAQ,CAA6B,oBAAoB,CAAC;AACrD,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,OAAO,GAAG,MAAM,EAAC,UAAuB,EAAC;AACzC,IAAA,OAAO,GAAG,IAAI,mBAAmB,EAAE;IAEnC,eAAe,GAAG,IAAI,oBAAoB,CAAC;QAC1D,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;AACjC,QAAA,cAAc,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC;AAC/E,QAAA,UAAU,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE;QACtC,gBAAgB,EAAE,aAAa,IAAI,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;AACvE,QAAA,YAAY,EAAE,CAAC,YAAY,EAAE,QAAQ,KAAK,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC;QAC1F,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAChD,KAAA,EAAE,IAAI,CAAC,UAAU,CAAC;IAEF,YAAY,GAAG,IAAI,2BAA2B,CAAC;QAC9D,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,cAAc,EAAE,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QACnD,cAAc,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa;QACpD,eAAe,EAAE,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC,aAAa;AACjE,KAAA,EAAE,IAAI,CAAC,UAAU,CAAC;IAEF,oBAAoB,GAAG,IAAI,yBAAyB,CAAC;QACpE,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,kBAAkB,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE;AAC9D,QAAA,cAAc,EAAE,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC;AAC5D,QAAA,cAAc,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AACtD,QAAA,YAAY,EAAE,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;AACnD,KAAA,EAAE,IAAI,CAAC,UAAU,CAAC;AAEV,IAAA,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI;AAC3C,IAAA,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM;AACnD,IAAA,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK;AACjD,IAAA,sBAAsB,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY;AAC/D,IAAA,sBAAsB,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY;AAC/D,IAAA,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU;IAEnD,YAAY,GAAG,IAAI,wBAAwB,CAAC;QAC3D,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,UAAU;AAC7B,KAAA,CAAC;IAEe,cAAc,GAAG,IAAI,mBAAmB,CAAC;QACxD,UAAU,EAAE,IAAI,CAAC,UAAU;AAC3B,QAAA,qBAAqB,EAAE,IAAI,CAAC,UAAU,CAAC,qBAAqB;QAC5D,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;AACjC,QAAA,WAAW,EAAE,CAAC,aAAa,EAAE,QAAQ,KAAK,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,QAAQ,CAAC;AACvF,QAAA,SAAS,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;AACxD,KAAA,CAAC;AAEO,IAAA,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI;AACnC,IAAA,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK;AACrC,IAAA,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW;AACjD,IAAA,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO;IAEjC,oBAAoB,GAAG,IAAI,yBAAyB,CAAC;QACpE,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;AACjC,QAAA,qBAAqB,EAAE,IAAI,CAAC,UAAU,CAAC,qBAAqB;QAC5D,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;AACjC,QAAA,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW;AAC5C,QAAA,SAAS,EAAE,CAAC,aAAa,EAAE,QAAQ,KAAK,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC;AAC/E,QAAA,cAAc,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC;AAC9F,QAAA,cAAc,EAAE,CAAC,aAAa,EAAE,QAAQ,KACtC,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC;QAC9C,SAAS,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,KACvD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC1E,UAAU,EAAE,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;QAC9C,UAAU,EAAE,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;QAC9C,QAAQ,EAAE,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;QAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;AAC1C,QAAA,aAAa,EAAE,CAAC,aAAa,EAAE,QAAQ,KACrC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC;QACxD,QAAQ,EAAE,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;AAC1C,QAAA,SAAS,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;AACvD,QAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE;AAC/B,QAAA,yBAAyB,EAAE,QAAQ,IACjC,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,QAAQ,CAAC;QACvD,kBAAkB,EAAE,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACtD,YAAA,GAAG,KAAK;AACR,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;SAC9B,CAAC;AACH,KAAA,CAAC;IAEe,aAAa,GAAG,IAAI,kBAAkB,CAAC;QACtD,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;AAC/B,QAAA,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW;QAC5C,WAAW,EAAE,KAAK,IAAG;AACnB,YAAA,IAAI,CAAC,iCAAiC,CAAC,KAAK,CAAC;AAC7C,YAAA,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,KAAK,CAAC;QAC9C,CAAC;AACD,QAAA,eAAe,EAAE,aAAa,IAAI,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC;AACjF,QAAA,WAAW,EAAE,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AAChD,QAAA,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9C,YAAY,EAAE,KAAK,IAAG;AACpB,YAAA,IAAI,CAAC,oCAAoC,CAAC,KAAK,CAAC,KAAK,CAAC;AACtD,YAAA,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC,KAAK,CAAC;AACjD,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC;AACD,QAAA,gBAAgB,EAAE,aAAa,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,aAAa,CAAC;QAClF,eAAe,EAAE,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;AACxD,QAAA,qBAAqB,EAAE,MAAM,IAAI,CAAC,qBAAqB,EAAE;AAC1D,KAAA,CAAC;AAEO,IAAA,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB;AAC1D,IAAA,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB;AACtD,IAAA,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW;AAC5C,IAAA,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe;;AAGzD,IAAA,iBAAiB,GAAG,MAAM,CAAgB,IAAI,wFAAC;;AAG/C,IAAA,cAAc,GAAG,QAAQ,CAAyB,MAAK;AAC9D,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAS;QACrC,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE;aAC/C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;AACpB,aAAA,GAAG,CAAC,aAAa,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;AAClE,aAAA,MAAM,CAAC,CAAC,KAAK,KAAiD,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;QAC7E,OAAO;YACL,IAAI;YACJ,YAAY;AACZ,YAAA,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE;AACjC,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;YACzB,UAAU;SACX;AACH,IAAA,CAAC,qFAAC;;IAGO,mBAAmB,GAAG,QAAQ,CAAC,MACtC,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACpE;IAEgB,iBAAiB,GAAG,IAAI,sBAAsB,CAAC;QAC9D,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;AACvC,QAAA,cAAc,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC;QAC/E,aAAa,EAAE,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QACnD,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;AACtD,QAAA,kBAAkB,EAAE,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACzF,KAAA,CAAC;AAEO,IAAA,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI;;AAEzC,IAAA,uBAAuB,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB;AACjE,IAAA,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG;AACvC,IAAA,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG;AACvC,IAAA,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa;IAEnD,gBAAgB,GAAG,IAAI,qBAAqB,CAAC;QAC5D,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;AACvC,QAAA,cAAc,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC;QAC/E,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC/C,QAAA,YAAY,EAAE,CAAC,YAAY,EAAE,QAAQ,KAAK,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC;AAC3F,KAAA,CAAC;IAEO,WAAW,GAAG,IAAI,gBAAgB,CAAC;QAC1C,UAAU,EAAE,IAAI,CAAC,UAAU;AAC3B,QAAA,aAAa,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE;AACzC,QAAA,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE;AAC3B,QAAA,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,eAAe;QACnD,SAAS,EAAE,CAAC,IAAG;YACb,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;AACzD,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACzB,CAAC;QACD,iBAAiB,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE;AAC5D,KAAA,EAAE,IAAI,CAAC,UAAU,CAAC;IAEF,aAAa,GAAG,IAAI,4BAA4B,CAAC;QAChE,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC1C,KAAA,EAAE,IAAI,CAAC,UAAU,CAAC;AAEV,IAAA,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO;;IAGvD,sBAAsB,CAAC,KAAmB,EAAE,KAAa,EAAA;QACvD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;IACxC;;AAGA,IAAA,wBAAwB,CAAC,KAAmB,EAAE,MAAgB,EAAE,KAAa,EAAA;QAC3E,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;IACrD;;AAGA,IAAA,qBAAqB,CAAC,MAAgB,EAAA;AACpC,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACnE;;AAGA,IAAA,mBAAmB,CAAC,MAAgB,EAAA;AAClC,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAC5D;;AAGA,IAAA,aAAa,CAAC,KAAa,EAAA;QACzB,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC;IAC7C;;AAGA,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC;IAC9C;;AAGA,IAAA,mBAAmB,CAAC,KAAa,EAAA;QAC/B,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC;IAClD;IAEA,qBAAqB,GAAA;AACnB,QAAA,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AACxD,QAAA,OAAO,GAAG;IACZ;;AAIiB,IAAA,eAAe,GAAG,IAAI,OAAO,EAAgB;AAC7C,IAAA,eAAe,GAAG,IAAI,GAAG,EAAU;IAC5C,mBAAmB,GAA2B,IAAI;AACzC,IAAA,YAAY,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE,mFAAC;IAC9D,sBAAsB,GAA2B,IAAI;AAErD,IAAA,cAAc,CAAC,KAAoB,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAyB,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC5C,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAChD,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;IAC7B;AAEQ,IAAA,qBAAqB,CAAC,KAAoB,EAAA;AAChD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAyB,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC9C;AAEQ,IAAA,cAAc,CAAC,KAAa,EAAA;AAClC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,QAAA,cAAc,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD;AAEQ,IAAA,kBAAkB,CAAC,KAAa,EAAA;AACtC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,UAAU,EAAE;AAC3C,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;AAC5B,YAAA,IAAI,CAAC,mBAAmB,GAAG,UAAU;QACvC;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;IACjC;AAEQ,IAAA,eAAe,CAAC,KAAoB,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;YAAE;AACtC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,IAAI,IAAI,CAAC,sBAAsB,KAAK,UAAU,EAAE;YAC9C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AAChC,YAAA,IAAI,CAAC,sBAAsB,GAAG,UAAU;QAC1C;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,IAAG;AACjC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC7B,YAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AACnE,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;IAEQ,cAAc,CAAC,QAAgB,EAAE,KAAa,EAAA;QACpD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1C;AAEQ,IAAA,mBAAmB,CAAC,GAAW,EAAA;AACrC,QAAA,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB;AAC7D,QAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE;IAC5B;IAEQ,oBAAoB,CAAC,iBAAgC,IAAI,EAAA;AAC/D,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,QAAA,IAAI,IAAI,CAAC,mBAAmB,KAAK,UAAU,EAAE;AAC3C,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;AAC5B,YAAA,IAAI,CAAC,mBAAmB,GAAG,UAAU;YACrC;QACF;QAEA,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE;YACnE,IAAI,KAAK,KAAK,cAAc;gBAAE;AAC9B,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC;YAClC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,UAAU,CAAC,MAAM;AAAE,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QACzE;IACF;AAEQ,IAAA,oCAAoC,CAAC,YAAoB,EAAA;AAC/D,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU;AACjC,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE;YACxC,IAAI,KAAK,GAAG,YAAY;AAAE,gBAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;iBACvC,IAAI,KAAK,GAAG,YAAY;AAAE,gBAAA,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;QACvD;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;QAC5B,KAAK,MAAM,KAAK,IAAI,OAAO;AAAE,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5D,QAAA,IAAI,CAAC,iCAAiC,CAAC,YAAY,CAAC;IACtD;AAEQ,IAAA,iCAAiC,CAAC,YAAoB,EAAA;AAC5D,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU;QACjC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;AAC5C,YAAA,IAAI,MAAM,CAAC,QAAQ,GAAG,YAAY;AAAE,gBAAA,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/C,iBAAA,IAAI,MAAM,CAAC,QAAQ,GAAG,YAAY,EAAE;AACvC,gBAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACrE;QACF;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;IAChC;AAEQ,IAAA,cAAc,CAAC,aAAqB,EAAA;AAC1C,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACnB,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC;YAC5C,aAAa;AACO,SAAA,CAAC;IACzB;IAEQ,iBAAiB,CAAC,KAAa,EAAE,IAA6B,EAAA;AACpE,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;QACpC,OAAO;YACL,KAAK;YACL,IAAI;AACJ,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;YACzB,UAAU;SACX;IACH;AAEA,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC;QAEnD,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;AACpC,YAAA,IAAI,IAAI,CAAC,sBAAsB,KAAK,UAAU;gBAAE;AAChD,YAAA,IAAI,CAAC,sBAAsB,GAAG,UAAU;YACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AAClC,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,IAAI,IAAI;AAC5D,YAAA,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;AAC3C,QAAA,CAAC,CAAC;QAEF,eAAe,CAAC,MAAK;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa;AAC9C,YAAA,MAAM,SAAS,GAAG,CAAC,KAAoB,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACjE,YAAA,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACjE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MACxB,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CACrE;AACH,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAG,CAAC,KAAoB,KAAI;YACjD,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,gBAAgB;gBAAE;AACtD,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;gBACzB,KAAK,CAAC,cAAc,EAAE;gBACtB,KAAK,CAAC,eAAe,EAAE;YACzB;AACF,QAAA,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,iBAAiB,CAAC;;QAG9D,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAC3B,YAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;gBAAE;AAC5D,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;YAClC,MAAM,QAAQ,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,QAAQ;AACtC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC;AACvD,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC5D,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE;AAC1C,YAAA,IAAI,CAAC,KAAK;gBAAE;YACZ,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;AAClD,QAAA,CAAC,CAAC;;AAGF,QAAA,MAAM,oBAAoB,GAAG,CAAC,CAAe,KAAI;AAC/C,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC;YAC1E,IAAI,CAAC,YAAY,EAAE;gBACjB,IAAI,CAAC,cAAc,EAAE;gBACrB,cAAc,CAAC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACnD;AACA,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,MAAM;gBAAE;AACpC,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,KAAK,CAAC;gBAAE;AAC1C,YAAA,IAAI,YAAY;gBAAE;AAClB,YAAA,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE;AACrC,QAAA,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,EAAE,oBAAoB,CAAC;AACrE,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;YAC7B,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,SAAS,EAAE,iBAAiB,CAAC;YACjE,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,aAAa,EAAE,oBAAoB,CAAC;AACxE,YAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;AAAE,gBAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACzE,QAAA,CAAC,CAAC;;;;QAKF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,YAAY,EAAE;YACnB,UAAU,CAAC,MAAK;AACd,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;gBAChC,QAAQ,CAAC,iBAAiB,EAAE;AAC5B,gBAAA,IAAI,CAAC,cAAc,EAAE,EAAE,iBAAiB,EAAE;AAC1C,gBAAA,IAAI,CAAC,mBAAmB,EAAE,EAAE,iBAAiB,EAAE;AAE/C,gBAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,mBAAmB,EAAE;gBAC7C,IAAI,CAAC,cAAc,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC;gBAC7C,IAAI,CAAC,mBAAmB,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC;YACpD,CAAC,EAAE,CAAC,CAAC;AACP,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAC3B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;YAC3B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE;AAC7C,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;gBACtB,IAAI,GAAG,CAAC,MAAM;oBAAE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;AAC1D,gBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;oBAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;AAC1D,gBAAA,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO;oBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;YAClE;AACF,QAAA,CAAC,CAAC;IACJ;;;AAKA,IAAA,aAAa,CAAC,IAAc,EAAA;AAC1B,QAAA,OAAOD,aAAe,CAAC,IAAI,CAAC;IAC9B;;AAGA,IAAA,iBAAiB,CAAC,IAAc,EAAA;AAC9B,QAAA,OAAOE,iBAAmB,CAAC,IAAI,CAAC;IAClC;;AAGA,IAAA,kBAAkB,CAAC,IAAc,EAAA;AAC/B,QAAA,OAAOC,kBAAoB,CAAC,IAAI,CAAC;IACnC;;AAGA,IAAA,oBAAoB,CAAC,IAAc,EAAA;AACjC,QAAA,OAAOH,aAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI;IAC1D;;AAGA,IAAA,eAAe,CAAC,IAAc,EAAA;AAC5B,QAAA,OAAOC,eAAiB,CAAC,IAAI,CAAC;IAChC;;AAGA,IAAA,KAAK,CAAC,IAAc,EAAA;AAClB,QAAA,OAAOA,eAAiB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;IAC5E;;AAGA,IAAA,UAAU,CAAC,IAAc,EAAA;AACvB,QAAA,IAAI,CAACA,eAAiB,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,EAAE;AACvC,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAQ,EAAE,CAAC,IAAI,EAAE;IACvE;;IAGA,WAAW,CAAC,GAA4B,EAAE,KAAa,EAAA;QACrD,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC;IAClD;;AAGA,IAAA,gBAAgB,CAAC,aAAqB,EAAA;QACpC,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC;IACrD;;AAGA,IAAA,eAAe,CAAC,IAAc,EAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAACD,aAAe,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,KAAK;AAChE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,OAAO,CAAC;eACH,gBAAgB,CAAC,MAAM;AACvB,eAAA,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAQ,CAAC,CAAC;IAC7D;;AAGA,IAAA,YAAY,CAAC,aAAqB,EAAA;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC;AACnD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,IACE,CAAC;AACE,gBACD;mBACG,CAAC,gBAAgB,CAAC,MAAM;AACxB,mBAAA,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAQ,CAAC,CAAC,CACpD;YACD;AACF,QAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,IAAG;AACnC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AACzB,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;;AAClD,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AAC5B,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,cAAc,CAAC,aAAqB,EAAA;AAClC,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;IAClC;;AAGA,IAAA,WAAW,CAAC,aAAqB,EAAA;AAC/B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE;AACvC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,SAAS;AAC/B,QAAA,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IACzE;AAEA;;;AAGG;IACH,QAAQ,CAAC,aAAqB,EAAE,QAAiC,EAAA;AAC/D,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,IAAG;AAC5B,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;;YAEzB,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;;AAChE,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC;AACtC,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;;IAGA,QAAQ,CAAC,aAAqB,EAAE,QAAiC,EAAA;AAC/D,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC;AACtC,QAAA,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE;AACrC,QAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE;IAC3C;;;AAKA,IAAA,UAAU,CAAC,GAAW,EAAA;QACpB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,KAAK,GAAG,CAAC,KAAK;IACnD;;AAGA,IAAA,YAAY,CAAC,IAAc,EAAA;AACzB,QAAA,OAAOI,aAAe,CAAC,IAAI,CAAC,IAAID,kBAAoB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;IAC7E;;AAGA,IAAA,iBAAiB,CAAC,IAAc,EAAA;AAC9B,QAAA,OAAO,CAACC,aAAe,CAAC,IAAI,CAAC,IAAID,kBAAoB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU;IACjF;;AAGA,IAAA,eAAe,CAAC,IAAc,EAAA;AAC5B,QAAA,OAAO,CAACC,aAAe,CAAC,IAAI,CAAC,IAAID,kBAAoB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ;IAC/E;;IAGA,uBAAuB,CAAC,IAAc,EAAE,GAAW,EAAA;QACjD,OAAOC,aAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,GAAG,IAAI;IACtF;;IAGA,gBAAgB,CAAC,GAAW,EAAE,GAA4B,EAAA;AACxD,QAAA,OAAO,OAAO,GAAG,CAAC,QAAQ,KAAK;AAC7B,cAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE;AAC7C,cAAE,GAAG,CAAC,QAAQ,KAAK,IAAI;IAC3B;;AAGA,IAAA,UAAU,CAAC,aAAqB,EAAE,GAAW,EAAE,GAA4B,EAAA;AACzE,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjB,YAAA,GAAG,EAAE,GAAQ;YACb,KAAK,EAAE,GAAG,CAAC,KAAsB;AACjC,YAAA,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;YACrB,aAAa;AACb,YAAA,MAAM,EAAE,GAAG;AACmB,SAAA,CAAC;IACnC;;AAGA,IAAA,aAAa,CAAC,IAAc,EAAA;AAC1B,QAAA,OAAOD,kBAAoB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,EAAE;IACzD;;AAGA,IAAA,YAAY,CAAC,IAAc,EAAA;AACzB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,IAAIA,kBAAoB,CAAC,IAAI,CAAC,EAAE;YAC9B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QAC7C;aAAO,IAAIC,aAAe,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE;AAC7D,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAQ,CAAC,CAAC;QACzD;IACF;;AAGA,IAAA,eAAe,CAAC,IAAc,EAAA;AAC5B,QAAA,IAAI,CAACD,kBAAoB,CAAC,IAAI,CAAC;YAAE;AACjC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC1D;;AAGA,IAAA,qBAAqB,CAAC,IAAc,EAAA;AAClC,QAAA,IAAI,CAACA,kBAAoB,CAAC,IAAI,CAAC;YAAE;AACjC,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAClE;AAEQ,IAAA,oBAAoB,CAAC,IAAsB,EAAA;QACjD,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,YAAA,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE;SAClB;IACH;IAEQ,cAAc,CAAC,aAAqB,EAAE,QAAgB,EAAA;AAC5D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC;AAC3C,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS,KAAK,GAAG,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;QAEnE,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CACnC,SAAS,IAAIH,aAAe,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,aAAa,KAAK,aAAa,CACrF;AACD,QAAA,IAAI,CAAC,IAAI,IAAI,CAACI,aAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,gBAAgB,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,KAAK;AAEjG,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAQ,CAAC,CAAC;AACvD,QAAA,OAAO,IAAI;IACb;;IAGA,cAAc,GAAA;AACZ,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE;AAC5B,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU;YAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAS,EAAE;AACjD,gBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAC5D,gBAAA,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;AACnD,oBAAA,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBAChD;YACF;AACA,YAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC;YAClC;QACF;AACA,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAmB;QAC7C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,GAAQ,CAAC;YAC7C,IAAI,QAAQ,IAAI,IAAI;AAAE,gBAAA,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChD;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,UAAU,CAAC;IAC3C;;IAGA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;IACnC;;AAGS,IAAA,WAAW,GAAG,CAAC,GAAW,EAAE,IAAc,KAAqB;QACtE,IAAI,IAAI,KAAK,OAAO;AAAE,YAAA,OAAO,WAAW;QACxC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC;QAC5B,IAAIF,iBAAmB,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,CAAA,SAAA,EAAY,IAAI,CAAC,UAAU,EAAE;QACnE,IAAID,eAAiB,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,CAAA,UAAA,EAAa,IAAI,CAAC,SAAS,EAAE;QACjE,IAAIE,kBAAoB,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,UAAU;QACtD,OAAO,IAAI,CAAC,aAAa;AAC3B,IAAA,CAAC;;;IAKD,UAAU,CAAC,aAAqB,EAAE,EAAU,EAAA;AAC1C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;QAC/B,OAAO,GAAG,EAAE,QAAQ,KAAK,aAAa,IAAI,GAAG,EAAE,QAAQ,KAAK,EAAE;IAChE;;IAGA,SAAS,CAAC,aAAqB,EAAE,EAAU,EAAA;AACzC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;QAC7B,OAAO,EAAE,EAAE,QAAQ,KAAK,aAAa,IAAI,EAAE,EAAE,QAAQ,KAAK,EAAE;IAC9D;;IAGA,WAAW,CAAC,aAAqB,EAAE,EAAU,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;IACrE;;IAGA,gBAAgB,GAAA;AACd,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE;AAC/B,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM;IAC1E;;AAGA,IAAA,aAAa,CAAC,aAAqB,EAAA;QACjC,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC;IACxD;;AAGA,IAAA,uBAAuB,CAAC,IAAc,EAAA;QACpC,OAAO,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC,IAAI,CAAC;IACzD;;;;AAMA,IAAA,eAAe,CAAC,KAAa,EAAA,EAAY,OAAO,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;;IAGlG,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE;IACjD;AAEA,IAAA,aAAa,CAAC,KAAa,EAAA,EAAY,OAAO,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;;AAG9F,IAAA,iBAAiB,CAAC,KAAa,EAAA;QAC7B,OAAO,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,KAAK,CAAC;IACvD;;AAGA,IAAA,uBAAuB,CAAC,KAAa,EAAA;AACnC,QAAA,QAAQ,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AACjC,YAAA,KAAK,IAAI,EAAE,OAAO,GAAG;AACrB,YAAA,KAAK,KAAK,EAAE,OAAO,GAAG;AACtB,YAAA,KAAK,IAAI,EAAE,OAAO,GAAG;AACrB,YAAA,KAAK,KAAK,EAAE,OAAO,GAAG;AACtB,YAAA,KAAK,IAAI,EAAE,OAAO,GAAG;AACrB,YAAA,KAAK,KAAK,EAAE,OAAO,GAAG;AACtB,YAAA,KAAK,SAAS,EAAE,OAAO,GAAG;AAC1B,YAAA,KAAK,MAAM,EAAE,OAAO,GAAG;AACvB,YAAA,KAAK,YAAY,EAAE,OAAO,IAAI;AAC9B,YAAA,KAAK,UAAU,EAAE,OAAO,IAAI;AAC5B,YAAA,KAAK,UAAU,EAAE,OAAO,GAAG;AAC3B,YAAA,KAAK,aAAa,EAAE,OAAO,GAAG;AAC9B,YAAA,SAAS,OAAO,GAAG;;IAEvB;;AAGA,IAAA,eAAe,CAAC,KAAa,EAAA;QAC3B,OAAO,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC3D;;AAGA,IAAA,cAAc,CAAC,KAAa,EAAA,EAAY,OAAO,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;;AAGlG,IAAA,eAAe,CAAC,KAAa,EAAA;QAC3B,OAAO,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC3D;;IAGA,oBAAoB,CAAC,KAAa,EAAE,QAA+B,EAAA;QACjE,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC;IAC9D;;IAGA,mBAAmB,CAAC,KAAa,EAAE,KAAa,EAAA;QAC9C,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC;IAC1D;;IAGA,oBAAoB,CAAC,KAAa,EAAE,KAAa,EAAA;QAC/C,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;IAC3D;;AAGA,IAAA,OAAO,CAAC,KAAa,EAAA;QACnB,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC;IACjD;;AAGA,IAAA,iBAAiB,CAAC,KAAa,EAAA;QAC7B,OAAO,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,KAAK,CAAC;IACvD;;AAGA,IAAA,iBAAiB,CAAC,MAAc,EAAA;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,MAAM,CAAC;IACxD;;IAGA,mBAAmB,CAAC,KAAa,EAAE,KAAa,EAAA;QAC9C,OAAO,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC;IAChE;;AAGA,IAAA,eAAe,CAAC,KAAa,EAAA;QAC3B,OAAO,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,KAAK,CAAC;IACzD;;AAGA,IAAA,SAAS,CAAC,KAAa,EAAA,EAAwB,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;;AAGzF,IAAA,kBAAkB,CAAC,KAAa,EAAA;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,KAAK,CAAC;IACnD;;AAGA,IAAA,eAAe,CAAC,QAAgB,EAAA;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC;IACnD;;AAGA,IAAA,cAAc,CAAC,KAAa,EAAA,EAAa,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;;AAGxF,IAAA,gBAAgB,CAAC,KAAa,EAAA,EAAa,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;;AAG5F,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CAAC;IAC/C;AAEA,IAAA,mBAAmB,CAAC,KAAa,EAAA;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC;IACpD;;AAGA,IAAA,iBAAiB,CAAC,KAAa,EAAA;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAClD;AAEA,IAAA,wBAAwB,CAAC,KAAa,EAAA;QACpC,OAAO,IAAI,CAAC,WAAW,CAAC,wBAAwB,CAAC,KAAK,CAAC;IACzD;;AAGA,IAAA,kBAAkB,CAAC,KAAa,EAAA;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,KAAK,CAAC;IACnD;;;IAKA,gBAAgB,CAAC,KAAmB,EAAE,aAAqB,EAAA;QACzD,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC;IAClE;;IAGA,UAAU,CAAC,KAAiB,EAAE,IAA6D,EAAA;AACzF,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;IACnC;;;AAKA,IAAA,UAAU,CAAC,aAAqB,EAAE,EAAU,EAAE,KAAkB,EAAA;QAC9D,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,CAAC;IAClE;;IAGA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE;IAC5C;;IAGA,WAAW,CAAC,aAAqB,EAAE,EAAU,EAAA;AAC3C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC;QACnD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;AAClD,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,CAAC;YAAE;QACvC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,CAAC;IACvC;;AAGA,IAAA,aAAa,CAAC,KAAc,EAAA,EAAU,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAEnE,gBAAgB,GAAyC,IAAI;AAErE;;;AAGG;AACH,IAAA,kBAAkB,CAAC,KAAY,EAAA;AAC7B,QAAA,MAAM,IAAI,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK;QACrD,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAAE;AACjC,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACvE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACrC,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;YACjC;QACF;AACA,QAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAK;AACtC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,CAAC,EAAE,KAAK,CAAC;IACX;;IAGA,aAAa,CAAC,GAAW,EAAE,aAAsB,EAAA;QAC/C,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC;IAC/D;;IAGA,mBAAmB,CAAC,aAAqB,EAAE,EAAU,EAAA;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE;QACnD,OAAO,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,aAAa,IAAI,KAAK,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI;IAClG;;AAGA,IAAA,eAAe,CAAC,aAAqB,EAAE,EAAU,EAAE,KAAc,EAAA;QAC/D,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,CAAC;IAC5D;;AAGA,IAAA,iBAAiB,CAAC,KAAmB,EAAE,aAAqB,EAAE,QAAgB,EAAA;QAC5E,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,CAAC;IAChE;;AAGA,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YACnD,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;YACvB;QACF;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;YAC9D,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;YACvB,IAAI,CAAC,eAAe,EAAE;YACtB;QACF;AACA,QAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,KAAK,CAAC;IAChD;;AAGA,IAAA,aAAa,CAAC,KAAiB,EAAA;QAC7B,IAAK,KAAK,CAAC,MAAyB,EAAE,OAAO,CAAC,mCAAmC,CAAC,EAAE;AAClF,YAAA,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE;QAC5C;IACF;;IAGA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;IAC5B;;IAGA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;IAC7B;;AAGA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC;IACrC;;AAGA,IAAA,aAAa,CAAC,SAAiB,EAAA;AAC7B,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC;IAC1C;IAEQ,eAAe,CAAC,aAAqB,EAAE,QAAgB,EAAA;AAC7D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;QAChC,IAAI,MAAM,EAAE;YACV,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAS;AAC5C,YAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;AAC3D,YAAA,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE;gBAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAC5E,gBAAA,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;AACnD,oBAAA,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBACrD;YACF;iBAAO;gBACL,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAClE,gBAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB;gBAC1C,IAAI,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACtD,gBAAA,OAAO,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC5E,oBAAA,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AACrB,oBAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;oBACtB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AACpC,oBAAA,IAAI,CAAC,MAAM;wBAAE;AACb,oBAAA,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;gBACvC;YACF;AACA,YAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC;QACzC;aAAO;AACL,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;YAC9B,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;AACzC,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;AACpF,YAAA,IAAI,OAAO,IAAI,QAAQ,GAAG,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,aAAa,IAAI,CAAC,EAAE;AAC9E,gBAAA,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC3D;QACF;QAEA,UAAU,CAAC,MAAK;YACd,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,aAAa,CAAC;AAC9E,YAAA,IAAI,YAAY,IAAI,CAAC,EAAE;gBACrB,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC;YACvE;AACF,QAAA,CAAC,CAAC;IACJ;;;AAKA,IAAA,mBAAmB,CAAC,GAAW,EAAA,EAAY,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;;IAGzF,mBAAmB,CAAC,KAAmB,EAAE,aAAqB,EAAA;AAC5D,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YAAE;QAC7B,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC;IACrD;;IAGA,oBAAoB,CAAC,KAAmB,EAAE,aAAqB,EAAA;QAC7D,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACjF,YAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,aAAa,CAAC;YAC9C;QACF;QACA,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC;IACnE;;AAGA,IAAA,eAAe,CAAC,aAAqB,EAAA;AACnC,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,IAAG;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC7B,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;;AAClD,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AAC5B,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,WAAW,CAAC,aAAqB,EAAA;QAC/B,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC;IAChD;;IAGA,eAAe,GAAA;QACb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACnC;;AAGA,IAAA,MAAM,CAAC,KAAqB,EAAA;AAC1B,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;IACnC;;AAGA,IAAA,OAAO,CAAC,KAAqB,EAAA;QAC3B,IAAI,IAAI,CAAC,WAAW,EAAE;YAAE;AACxB,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;IACpC;;;IAKA,aAAa,CAAC,KAAiB,EAAE,GAAW,EAAA;QAC1C,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC;IAC3C;;IAGA,eAAe,CAAC,KAAoB,EAAE,GAAW,EAAA;QAC/C,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC;IAClD;;IAGA,gBAAgB,CAAC,KAAiB,EAAE,GAAW,EAAA;QAC7C,IAAI,GAAG,CAAC,MAAM;YAAE;QAChB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC;AACrC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;AACpC,QAAA,IAAI,QAAQ;YAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC9E;;;IAKA,oBAAoB,CAAC,KAAiB,EAAE,aAAqB,EAAA;QAC3D,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAC;IAC7D;;IAGA,gBAAgB,GAAA,EAAW,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC;;IAGlE,iBAAiB,CAAC,KAAiB,EAAE,QAAgB,EAAE,QAAgB,EAAE,GAAW,EAAE,GAA4B,EAAA;AAChH,QAAA,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC;IAC7E;;IAGA,oBAAoB,GAAA,EAAW,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,CAAC,CAAC;;IAG1E,cAAc,GAAA;AACZ,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK;AACtC,eAAA,IAAI,CAAC,oBAAoB,EAAE,KAAK;AAChC,eAAA,IAAI,CAAC,iBAAiB,EAAE,KAAK;AAC7B,eAAA,IAAI,CAAC,gBAAgB,EAAE,KAAK;AAC5B,eAAA,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI;AAC/B,QAAA,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,KAAK;AAC9B,QAAA,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE;AACrC,QAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE;QACzC,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE;AACvC,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;AACjC,QAAA,OAAO,IAAI;IACb;;IAGA,mBAAmB,CAAC,KAAuC,EAAE,QAAiB,EAAA;QAC5E,IAAI,OAAO,KAAK,KAAK,UAAU;AAAE,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpE,OAAO,KAAK,IAAI,QAAQ;IAC1B;;AAGA,IAAA,oBAAoB,CAAC,IAA6B,EAAA;QAChD,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;IACrD;;AAGA,IAAA,mBAAmB,CAAC,IAA6B,EAAA;QAC/C,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;IACrD;;AAGA,IAAA,qBAAqB,CAAC,IAA6B,EAAA;QACjD,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;IACvD;;AAGA,IAAA,sBAAsB,CAAC,IAAyB,EAAA;QAC9C,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC7E;;IAGA,gBAAgB,CAAC,KAAY,EAAE,IAA6B,EAAA;QAC1D,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;YAAE;QAC1E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,gBAAgB,EAAE;IACzB;;IAGA,iBAAiB,CAAC,KAAY,EAAE,IAAyB,EAAA;QACvD,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE;AACpD,QAAA,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE;AACrC,QAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE;AACzC,QAAA,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE;AACvC,QAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;QACjC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;IACtE;;IAGA,uBAAuB,CAAC,KAAoB,EAAE,IAAyB,EAAA;QACrE,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;YAAE;QAC1D,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE;QACpD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,KAAK,GAAI,KAAK,CAAC,aAA6B,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAChF,UAAU,CAAC,MAAK;YACd,MAAM,OAAO,GAAG,KAAK,EAAE,gBAAgB,CACrC,wDAAwD,CACzD;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;YACrF,MAAM,EAAE,KAAK,EAAE;AACjB,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,oBAAoB,CAAC,KAAoB,EAAA;AACvC,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,aAA4B;AAC/C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAC5C,kCAAkC,CACnC,CAAC;AACF,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;YACvB,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,OAAO,CAAC,oBAAoB;kBAC7B,aAAa,CAAoB,sBAAsB;kBACvD,KAAK,EAAE;YACX;QACF;QACA,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;QACxF,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAA2B,CAAC;AAChE,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,KAAK;AACzB,cAAE;AACF,cAAE,KAAK,CAAC,GAAG,KAAK;AACd,kBAAE,KAAK,CAAC,MAAM,GAAG;AACjB,kBAAE,KAAK,CAAC,GAAG,KAAK;AACd,sBAAE,CAAC,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC;AACvC,sBAAE,CAAC,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;AACnD,QAAA,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;IACrB;;IAGA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC;;AAGA,IAAA,uBAAuB,CAAC,EAAiB,EAAA;AACvC,QAAA,IAAI,EAAE,KAAK,IAAI,EAAE;AACf,YAAA,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE;AACrC,YAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE;AACzC,YAAA,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE;AACvC,YAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE;QACnC;AACA,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;IAChC;;IAGA,eAAe,CAAC,IAA4B,EAAE,IAA0B,EAAA;QACtE,IAAI,CAAC,MAAM,CAAC;YACV,KAAK,EAAE,IAAI,CAAC,KAAyB;YACrC,GAAG,EAAE,IAAI,CAAC,GAAmB;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAsB;YAClC,aAAa,EAAE,IAAI,CAAC,QAAQ;AAC7B,SAAA,CAAC;QACF,IAAI,CAAC,oBAAoB,EAAE;IAC7B;;IAGA,mBAAmB,CAAC,aAAqB,EAAE,GAAW,EAAA;QACpD,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,aAAa,EAAE,GAAG,CAAC;IAC5D;;AAGA,IAAA,kBAAkB,CAAC,aAAqB,EAAA;AACtC,QAAA,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,aAAa,CAAC;IACtD;;AAGA,IAAA,WAAW,CAAC,OAAe,EAAA;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC;IACzC;;AAGA,IAAA,SAAS,CAAC,aAAqB,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;YAC3B,IAAI,CAAC,gCAAgC,EAAE;AACvC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC;AACxC,YAAA,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE;AACrC,YAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE;AACzC,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAK;gBACxB,IAAI,CAAC,OAAO,CAAC;qBACX,aAAa,CAAoB,0BAA0B;sBAC1D,KAAK,EAAE;AACb,YAAA,CAAC,CAAC;YACF;QACF;AACA,QAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC;IAC1C;;AAGA,IAAA,kBAAkB,CAAC,aAAqB,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,KAAK,aAAa;IAClD;;IAGA,uBAAuB,GAAA;AACrB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE;QAC7C,IAAI,aAAa,KAAK,IAAI;YAAE;AAC5B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC;IAC1C;;IAGA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;IACxC;AAEQ,IAAA,oBAAoB,CAAC,aAAqB,EAAA;AAChD,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC;AAC3C,QAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE;IAC3C;IAEQ,gCAAgC,GAAA;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC,aAAa;QAC1D,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;QACpD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC;IACxD;;;AAKA,IAAA,kBAAkB,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC;IACpC;;IAGA,YAAY,GAAA;QACV,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IACtD;;IAGA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE;IACpC;;AAGA,IAAA,mBAAmB,CAAC,KAAa,EAAA;QAC/B,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC;IACnD;;IAGA,oBAAoB,CAAC,KAAiB,EAAE,KAAa,EAAA;QACnD,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC;IACpD;;IAGA,qBAAqB,GAAA,EAAW,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,CAAC;;IAGzE,aAAa,CAAC,MAAmB,EAAE,KAAa,EAAA;QAC9C,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC;IAC/C;;;IAKA,kBAAkB,CAAC,KAAY,EAAE,KAAa,EAAA;QAC5C,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC;IAC5D;;IAGA,cAAc,CAAC,KAAiB,EAAE,KAAa,EAAA;QAC7C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;IAC9C;;IAGA,eAAe,GAAA,EAAW,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC;;AAG7D,IAAA,kBAAkB,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC;IAC5C;;IAGA,UAAU,CAAC,KAAa,EAAE,GAAmB,EAAA;QAC3C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;IAC5C;;AAGA,IAAA,iBAAiB,CAAC,KAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,KAAK,CAAC;IAC9C;;;IAIA,eAAe,CAAC,KAAa,EAAE,GAAmB,EAAA;QAChD,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC;IACjD;AAEA,IAAA,mBAAmB,CAAC,KAAa,EAAA;AAC/B,QAAA,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,KAAK,CAAC;IAChD;;IAGA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE;IACtC;;AAGA,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC;IAC5C;;IAGA,iBAAiB,CAAC,KAAa,EAAE,MAAc,EAAA;QAC7C,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC;IACtD;;AAGA,IAAA,qBAAqB,CAAC,KAAa,EAAA;AACjC,QAAA,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,KAAK,CAAC;IACzD;;IAGA,0BAA0B,CAAC,MAAgB,EAAE,OAAgB,EAAA;QAC3D,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE;;IAGA,YAAY,GAAA;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,mBAAmB,EAAE;QACpD,IAAI,CAAC,cAAc,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC;QAC7C,IAAI,CAAC,mBAAmB,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC;IACpD;;IAGA,kBAAkB,GAAA;QAChB,IAAI,CAAC,gCAAgC,EAAE;IACzC;;IAGA,uBAAuB,GAAA;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE;AACxC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,mBAAmB,EAAE;AAC1C,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC;YAAE;QAClE,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,cAAc,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC;IAC/C;;AAGA,IAAA,eAAe,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC;IAC5C;;AAGA,IAAA,oBAAoB,CAAC,KAAa,EAAA;AAChC,QAAA,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,KAAK,CAAC;IACjD;;AAGA,IAAA,oBAAoB,CAAC,KAAa,EAAA;AAChC,QAAA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC3C;;IAGA,kBAAkB,CAAC,KAAa,EAAE,GAAmD,EAAA;QACnF,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC;IACpD;;AAGA,IAAA,gBAAgB,CAAC,KAAa,EAAA;AAC5B,QAAA,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,KAAK,CAAC;IAC7C;;AAIQ,IAAA,gBAAgB,CAAC,aAAqB,EAAA;QAC5C,OAAO,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,aAAa,CAAC;IAClE;AAEQ,IAAA,iCAAiC,CAAC,aAAqB,EAAA;AAC7D,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,KAAK,CAAC;YAAE;AACrC,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,GAAG,CAC1C,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,IAAI,aAAa,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CACtE,CAAC;IACJ;AAEQ,IAAA,+BAA+B,CAAC,YAAoB,EAAA;AAC1D,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,KAAK,CAAC;YAAE;AACrC,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,GAAG,CAC1C,CAAC,GAAG,OAAO;aACR,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,YAAY;aACtC,GAAG,CAAC,KAAK,IAAI,KAAK,GAAG,YAAY,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAC1D,CAAC;IACJ;IAEQ,4BAA4B,CAAC,QAAgB,EAAE,QAAgB,EAAA;QACrE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,QAAQ,KAAK,QAAQ;YAAE;AAC9D,QAAA,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG,QAAQ;QACjE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,IAAG;YACpE,IAAI,KAAK,KAAK,QAAQ;AAAE,gBAAA,OAAO,WAAW;YAC1C,IAAI,QAAQ,GAAG,WAAW,IAAI,KAAK,GAAG,QAAQ,IAAI,KAAK,IAAI,WAAW;gBAAE,OAAO,KAAK,GAAG,CAAC;YACxF,IAAI,WAAW,GAAG,QAAQ,IAAI,KAAK,IAAI,WAAW,IAAI,KAAK,GAAG,QAAQ;gBAAE,OAAO,KAAK,GAAG,CAAC;AACxF,YAAA,OAAO,KAAK;QACd,CAAC,CAAC,CAAC,CAAC;IACN;IAEQ,cAAc,CAAC,GAAW,EAAE,aAAsB,EAAA;QACxD,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC;IAC/D;IAEQ,SAAS,CAAC,aAAqB,EAAE,EAAU,EAAE,QAAgB,EAAE,UAAU,GAAG,IAAI,EAAA;AACtF,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC;IACpE;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;IAC9B;;IAGA,eAAe,CAAC,aAAqB,EAAE,QAAgB,EAAA;QACrD,OAAO,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,EAAE,QAAQ,CAAC;IACtE;;IAGA,eAAe,CAAC,aAAqB,EAAE,QAAgB,EAAA;QACrD,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC;IACjE;;IAGA,qBAAqB,CAAC,aAAqB,EAAE,QAAgB,EAAA;QAC3D,OAAO,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC;IACvE;;IAGA,gBAAgB,CAAC,aAAqB,EAAE,QAAgB,EAAA;QACtD,OAAO,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC;IACvE;;IAGA,iBAAiB,CAAC,aAAqB,EAAE,QAAgB,EAAA;QACvD,OAAO,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC;IACxE;AAEQ,IAAA,mBAAmB,CAAC,YAAoB,EAAE,QAAA,GAA0B,IAAI,EAAA;QAC9E,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC;IACvE;;AAGA,IAAA,cAAc,CAAC,GAAW,EAAA;QACxB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;IACxC;AAEQ,IAAA,mBAAmB,CAAC,GAAW,EAAA;QACrC,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,GAAG,CAAC;IAC7C;wGA3jEW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,68CC7G3B,88nDA6yBA,EAAA,MAAA,EAAA,CAAA,kinBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjtBI,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,gCAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,6BAA6B,EAAA,QAAA,EAAA,mDAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC7B,kBAAkB,wYAClB,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,GAAA,EAAA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,aAAA,EAAA,aAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,uBAAuB,kLACvB,qBAAqB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,EAAA,SAAA,EAAA,cAAA,EAAA,KAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,YAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAUZ,cAAc,EAAA,UAAA,EAAA,CAAA;kBArB1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,OAAO,EAAA,eAAA,EACA,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,eAAe;wBACf,gBAAgB;wBAChB,6BAA6B;wBAC7B,kBAAkB;wBAClB,qBAAqB;wBACrB,wBAAwB;wBACxB,uBAAuB;wBACvB,qBAAqB;qBACtB,EAAA,IAAA,EAGK;AACJ,wBAAA,kBAAkB,EAAE,gBAAgB;AACpC,wBAAA,oBAAoB,EAAE,aAAa;AACnC,wBAAA,oBAAoB,EAAE,aAAa;AACpC,qBAAA,EAAA,QAAA,EAAA,88nDAAA,EAAA,MAAA,EAAA,CAAA,kinBAAA,CAAA,EAAA;AAwhBwE,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,gBAAgB,wEACnB,gBAAgB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACX,qBAAqB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACpB,SAAS,8EAEpC,oBAAoB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEjnBvE,IAAI,kBAAkB,GAAG,CAAC;AAE1B;MAOa,0BAA0B,CAAA;AACpB,IAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AAChE,IAAA,SAAS,GAAG,CAAA,mBAAA,EAAsB,kBAAkB,EAAE,EAAE;AAEjE,IAAA,KAAK,GAAG,KAAK,CAAgC,EAAE,4EAAC;AAChD,IAAA,UAAU,GAAG,KAAK,CAAgB,IAAI,iFAAC;AACvC,IAAA,kBAAkB,GAAG,KAAK,CAAa,IAAI,yFAAC;AAC5C,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,+EAAC;AAChC,IAAA,aAAa,GAAG,KAAK,CAAS,eAAe,oFAAC;AAC9C,IAAA,SAAS,GAAG,KAAK,CAAS,WAAW,gFAAC;AACtC,IAAA,UAAU,GAAG,KAAK,CAAS,SAAS,iFAAC;AACrC,IAAA,SAAS,GAAG,KAAK,CAAS,eAAe,gFAAC;AAC1C,IAAA,SAAS,GAAG,KAAK,CAAS,UAAU,gFAAC;IAErC,UAAU,GAAG,MAAM,EAAsB;AAEhC,IAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AACxB,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAClB,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;AACvB,IAAA,QAAQ,GAAG,MAAM,CAAgB,IAAI,+EAAC;AACtC,IAAA,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,yFAAC;AAE/B,IAAA,WAAW,GAAG,QAAQ,CAAC,MAC9B,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,kFACxE;AACQ,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,kFAAC;AACxE,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;QAChC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC;AAC1E,IAAA,CAAC,8EAAC;AAEF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;AAC5B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAE,CAAC,CAAC,EAAE,KAAG,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACxE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;AAC5C,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,CAAC,CAAC;QAED,MAAM,CAAC,MAAK;AACX,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE;;AAEpC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,IAAE,CAAC,CAAC,UAAU,KAAG,EAAE,CAAC;YACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAE,IAAI,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACxE,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD;AAEA,IAAA,UAAU,CAAC,KAAY,EAAA;QACrB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE;AAClD,QAAA,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;IACtD;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE;AAClD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;AAClC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,2BAA2B,EAAE;IACpC;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjC;AAEA,IAAA,OAAO,CAAC,KAAY,EAAA;QAClB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;AACxD,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,cAAc,CAAC,KAAoB,EAAA;AACjC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC1B,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,UAAU,EAAE;YACjB;QACF;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;YACxD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAAE,IAAI,CAAC,QAAQ,EAAE;;AAChC,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,KAAK,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD;QACF;QACA,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YAC3C,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,2BAA2B,EAAE;YAClC;QACF;QACA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YAC1C,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACpD,IAAI,CAAC,2BAA2B,EAAE;YAClC;QACF;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO;YAAE;QAC3B,KAAK,CAAC,cAAc,EAAE;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,GAAG,SAAS;AACrF,QAAA,IAAI,OAAO;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;;YAC5B,IAAI,CAAC,WAAW,EAAE;IACzB;AAEA,IAAA,MAAM,CAAC,IAAwB,EAAA;QAC7B,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B;AAEA,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,OAAO,GAAG,IAAI,CAAC,SAAS,CAAA,QAAA,EAAW,KAAK,EAAE;IAC5C;AAEA,IAAA,UAAU,CAAC,IAAwB,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAChD;AAGA,IAAA,qBAAqB,CAAC,KAAmB,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC;YAAE,IAAI,CAAC,SAAS,EAAE;IACrF;IAEQ,WAAW,GAAA;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC;AAC3E,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;;AACtB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;IAEQ,UAAU,GAAA;AAChB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;AAC5C,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IACzB;AAEQ,IAAA,UAAU,CAAC,SAAiB,EAAA;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM;QACjC,IAAI,KAAK,KAAK,CAAC;YAAE;AACjB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACzC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,SAAS,GAAG,KAAK,IAAI,KAAK,CAAC;QAClE,IAAI,CAAC,2BAA2B,EAAE;IACpC;IAEQ,2BAA2B,GAAA;QACjC,cAAc,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC;AAClC,aAAA,aAAa,CAAc,CAAA,CAAA,EAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAA,CAAE;cACxE,cAAc,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7C;IAEQ,QAAQ,CAAC,IAAY,EAAE,KAAoB,EAAA;AACjD,QAAA,OAAO,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK;IACzC;wGA3KW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,s5CChCvC,8iFAgDA,EAAA,MAAA,EAAA,CAAA,irGAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDhBa,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBANtC,SAAS;+BACE,qBAAqB,EAAA,eAAA,EACd,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,8iFAAA,EAAA,MAAA,EAAA,CAAA,irGAAA,CAAA,EAAA;;sBA4I9C,YAAY;uBAAC,sBAAsB,EAAE,CAAC,QAAQ,CAAC;;;AE1IlD,SAAS,UAAU,CAAmB,IAA2B,EAAA;IAC/D,OAAO,YAAY,IAAI,IAAI;AAC7B;AAEA;MAQa,kBAAkB,CAAA;AAC7B,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,8EAAwB;IAEjD,SAAS,GAAG,MAAM,EAAyB;IAC3C,iBAAiB,GAAG,MAAM,EAAyB;IACnD,eAAe,GAAG,MAAM,EAA8B;AAErC,IAAA,cAAc,GAAG,IAAI,mBAAmB,EAAE;AAC1C,IAAA,WAAW,GAAG,SAAS,CAA0B,MAAM,kFAAC;IACjE,mBAAmB,GAAgC,IAAI;AAEtD,IAAA,YAAY,GAAG,MAAM,CAAC,CAAC,mFAAC;AACxB,IAAA,YAAY,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,mFAAC;AAC7C,IAAA,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW;AAE7C,IAAA,KAAK,GAAG,QAAQ,CAA0B,MAAK;AACtD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE;AACvC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC;AAC7C,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU;AAClC,QAAA,MAAM,SAAS,GAAkB,gBAAgB,CAAC,MAAM;AACtD,cAAE,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE;AAC9D,cAAE,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QAC7D,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAC3B,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI;gBACpD,YAAY,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAC3C;AACH,IAAA,CAAC,4EAAC;AAEF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,YAAA,IAAI,QAAQ,KAAK,IAAI,CAAC,mBAAmB;gBAAE;AAC3C,YAAA,IAAI,CAAC,mBAAmB,GAAG,QAAQ;YACnC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;AAChC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AACxB,YAAA,QAAQ,CAAC,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACvF,QAAA,CAAC,CAAC;IACJ;;IAGA,cAAc,GAAA;AACZ,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU;QAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE;AACvC,QAAA,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE;AAC5B,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU;AAC7B,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,gBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AAC5D,gBAAA,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;AACnD,oBAAA,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;gBAChD;YACF;AACA,YAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC;YAClC;QACF;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmB;AACtC,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC;YACxC,IAAI,QAAQ,IAAI,IAAI;AAAE,gBAAA,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzC;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC;IACpC;;IAGA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE;IACnC;;AAGA,IAAA,UAAU,CAAC,IAA2B,EAAA;QACpC,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AACtB,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACpD;;AAGA,IAAA,KAAK,CAAC,IAA2B,EAAA;QAC/B,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,SAAS;AAC3C,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS;AACvD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,OAAO,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC/F;;AAGA,IAAA,WAAW,CAAC,IAA2B,EAAA;QACrC,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC;IAClF;;AAGA,IAAA,UAAU,CAAC,IAA2B,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzD;;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAE,IAA2B,EAAE,KAAa,EAAA;QACvE,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;AACjD,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC;;IAGA,iBAAiB,CAAC,KAAiB,EAAE,IAA2B,EAAA;QAC9D,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD;;AAGA,IAAA,SAAS,CAAC,KAAoB,EAAE,IAA2B,EAAE,KAAa,EAAA;AACxE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAClG,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACjF,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;AACzD,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK;AAAE,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACvE,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE;YACjD,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;;gBACpC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjE;QACF;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;YAC7B,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ;AAAE,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;iBACtD;AACH,gBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;gBACtD,IAAI,MAAM,IAAI,CAAC;AAAE,oBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YACzC;YACA;QACF;AACA,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;AACjD,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzC;IACF;;IAGA,SAAS,CAAC,MAAc,EAAE,IAA2B,EAAA;AACnD,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;IAChC;IAEQ,MAAM,CAAC,IAA2B,EAAE,QAAiB,EAAA;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS;QACtC,IAAI,IAAI,KAAK,MAAM;YAAE;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,IAAG;YACjC,MAAM,IAAI,GAAG,IAAI,KAAK,OAAO,IAAI,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAU;YAChF,IAAI,IAAI,KAAK,OAAO,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;;AAC9D,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;QACxG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;IAC1F;AAEQ,IAAA,OAAO,CAAC,IAA2B,EAAA;AACzC,QAAA,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE;YACpB,OAAO;AACL,gBAAA,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS;AAC3E,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ;aAC7D;QACH;QACA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU;QACzC,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;QACjF,OAAO;AACL,YAAA,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK;YAC3D,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACpD,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa;SACjD;IACH;AAEQ,IAAA,WAAW,CAAC,IAA2B,EAAA;QAC7C,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,UAAU;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU;QACzC,OAAO,gBAAgB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/E;AAEQ,IAAA,YAAY,CAAC,IAA2B,EAAA;QAC9C,OAAO,UAAU,CAAC,IAAI;AACpB,cAAE,CAAA,OAAA,EAAU,IAAI,CAAC,UAAU,CAAA;cACzB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA,CAAE;IACrC;IAEQ,SAAS,CAAC,KAAoB,EAAE,KAAa,EAAA;QACnD,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IACvB;AAEQ,IAAA,SAAS,CAAC,KAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B,cAAc,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,EAAE;aACtC,aAAa,CAAc,qBAAqB,KAAK,CAAA,EAAA,CAAI,CAAC,EAAE,KAAK,EAAE,CAAC;IACzE;IAEQ,eAAe,CAAC,KAAa,EAAE,KAAa,EAAA;AAClD,QAAA,KAAK,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE;YAC3D,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,GAAG,KAAK;AAAE,gBAAA,OAAO,SAAS;QAC7D;QACA,OAAO,CAAC,CAAC;IACX;wGAvMW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,8gBC1C/B,kjDA6BA,EAAA,MAAA,EAAA,CAAA,q5DAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDaa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;+BACE,YAAY,EAAA,eAAA,EACL,uBAAuB,CAAC,MAAM,QAGzC,EAAE,oCAAoC,EAAE,sBAAsB,EAAE,EAAA,QAAA,EAAA,kjDAAA,EAAA,MAAA,EAAA,CAAA,q5DAAA,CAAA,EAAA;mYAUJ,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE7B1E;MACa,iBAAiB,CAAA;AACnB,IAAA,UAAU;AACV,IAAA,UAAU;AACV,IAAA,QAAQ;AACR,IAAA,cAAc;AACd,IAAA,SAAS;AACT,IAAA,SAAS;AACT,IAAA,SAAS;AACT,IAAA,SAAS;AAElB,IAAA,WAAA,CAAY,MAAkC,EAAA;AAC5C,QAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;AACnC,QAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;AACnC,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;AAC/B,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc;QAC3C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,QAAQ;QAC7C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE;QACvC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM;QAC3C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,UAAU;IACjD;AACD;;ACyED;AACO,MAAM,cAAc,GAAG,CAAC;;ACpH/B;;AAEG;;;;"}
|