@reforgium/data-grid 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reforgium-data-grid.mjs","sources":["../../../../libs/data-grid/src/directives/type-cell.directive.ts","../../../../libs/data-grid/src/directives/header.directive.ts","../../../../libs/data-grid/src/directives/placeholders.directive.ts","../../../../libs/data-grid/src/data-grid.constants.ts","../../../../libs/data-grid/src/helpers/layout-columns/layout-columns.helper.ts","../../../../libs/data-grid/src/helpers/scrollbar/scrollbar.helper.ts","../../../../libs/data-grid/src/helpers/scrollbar/scroll-direction.helper.ts","../../../../libs/data-grid/src/helpers/sticky/sticky-split.helper.ts","../../../../libs/data-grid/src/data-grid.vm.ts","../../../../libs/data-grid/src/data-grid-cell.component.ts","../../../../libs/data-grid/src/helpers/selection/selection.helper.ts","../../../../libs/data-grid/src/icons/checkbox.icon.ts","../../../../libs/data-grid/src/icons/expand.icon.ts","../../../../libs/data-grid/src/icons/sort.icon.ts","../../../../libs/data-grid/src/data-grid.component.ts","../../../../libs/data-grid/src/data-grid.component.html","../../../../libs/data-grid/src/reforgium-data-grid.ts"],"sourcesContent":["import { Directive, inject, input, TemplateRef } from '@angular/core';\r\n\r\nimport { RenderTemplateData } from '../data-grid.models';\r\n\r\n@Directive({ selector: 'ng-template[ssDataGridTypeCell]' })\r\nexport class DataGridTypeCellTemplateDirective {\r\n type = input<string>('', { alias: 'ssDataGridTypeCell' });\r\n\r\n public tpl = inject(TemplateRef<RenderTemplateData>);\r\n}\r\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\r\n\r\nimport { HeaderTemplateData } from '../data-grid.models';\r\n\r\n@Directive({ selector: 'ng-template[ssDataGridHeader]' })\r\nexport class DataGridHeaderTemplateDirective {\r\n key = input<string>('', { alias: 'ssDataGridHeader' });\r\n\r\n public tpl = inject(TemplateRef<HeaderTemplateData>);\r\n}\r\n","import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\n@Directive({ selector: 'ng-template[ssDataGridEmpty]' })\r\nexport class DataGridCellEmptyDirective {\r\n public tpl = inject(TemplateRef<{ $implicit: boolean }>);\r\n}\r\n\r\n@Directive({ selector: 'ng-template[ssDataGridLoading]' })\r\nexport class DataGridCellLoadingDirective {\r\n public tpl = inject(TemplateRef<{ $implicit: boolean }>);\r\n}\r\n","import { GridColumn } from './data-grid.models';\r\n\r\nexport const GRID_INDEX_COLUMN: GridColumn = {\r\n key: '_index',\r\n type: 'index',\r\n align: 'center',\r\n header: '№',\r\n width: 72,\r\n sticky: true,\r\n};\r\n\r\nexport const GRID_CHECKBOX_COLUMN: GridColumn = {\r\n key: '_checkbox',\r\n type: 'checkbox',\r\n align: 'center',\r\n header: 'checkbox',\r\n width: 44,\r\n sticky: true,\r\n};\r\n","import { ColumnLike, LayoutResult } from './layout-columns.models';\r\n\r\nexport function layoutColumns(columns: ColumnLike[], containerWidth: number, defaultCol: number): LayoutResult {\r\n const idx = visibleIndexes(columns);\r\n const { fixedIdx, autoIdx } = splitFixed(columns, idx);\r\n\r\n const fixedWidths = computeFixedWidths(columns, fixedIdx);\r\n const baseAuto = computeBaseAuto(columns, autoIdx, defaultCol);\r\n\r\n const sumFixed = sum(fixedWidths);\r\n const sumBase = sum(baseAuto.map((w) => w.width));\r\n const free = Math.max(containerWidth - sumFixed - sumBase, 0);\r\n\r\n const grownAuto = distributeFree(columns, baseAuto, free); // water-fill\r\n const widths = new Array<number>(columns.length).fill(0);\r\n\r\n if (containerWidth <= 0) {\r\n const byKey: Record<string, number> = {};\r\n\r\n for (let i = 0; i < columns.length; i++) {\r\n // noinspection PointlessBooleanExpressionJS\r\n columns[i].visible !== false && (byKey[columns[i].key] = 0);\r\n }\r\n\r\n return { widths, total: 0, byKey };\r\n }\r\n\r\n for (const { index, width } of fixedWidths) {\r\n widths[index] = width;\r\n }\r\n\r\n for (const { index, width } of grownAuto) {\r\n widths[index] = width;\r\n }\r\n\r\n roundAndFix(columns, widths, fixedIdx, autoIdx, containerWidth);\r\n\r\n let total = 0;\r\n const byKey: Record<string, number> = {};\r\n\r\n for (const i of idx) {\r\n total += widths[i];\r\n byKey[columns[i].key] = widths[i];\r\n }\r\n\r\n return { widths, total, byKey };\r\n}\r\n\r\nfunction visibleIndexes(cols: ColumnLike[]): number[] {\r\n const out: number[] = [];\r\n\r\n for (let i = 0; i < cols.length; i++) {\r\n // noinspection PointlessBooleanExpressionJS\r\n cols[i].visible !== false && out.push(i);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nfunction splitFixed(cols: ColumnLike[], visibleIdx: number[]) {\r\n const fixedIdx: number[] = [];\r\n const autoIdx: number[] = [];\r\n\r\n for (const i of visibleIdx) {\r\n cols[i].width === undefined ? autoIdx.push(i) : fixedIdx.push(i);\r\n }\r\n\r\n return { fixedIdx, autoIdx };\r\n}\r\n\r\nconst computeFixedWidths = (cols: ColumnLike[], fixedIdx: number[]) =>\r\n fixedIdx.map((index) => {\r\n const col = cols[index];\r\n const width = clamp(col.width!, col.minWidth, col.maxWidth);\r\n\r\n return { index, width };\r\n });\r\n\r\nconst computeBaseAuto = (cols: ColumnLike[], autoIdx: number[], def: number) =>\r\n autoIdx.map((index) => {\r\n const c = cols[index];\r\n const base = clamp(c.minWidth ?? def, c.minWidth, c.maxWidth);\r\n\r\n return { index, width: base };\r\n });\r\n\r\nfunction distributeFree(cols: ColumnLike[], base: { index: number; width: number }[], free: number) {\r\n if (free <= 0 || base.length === 0) {\r\n return base;\r\n }\r\n\r\n const widths = base.map((b) => ({ ...b }));\r\n let remaining = free;\r\n\r\n let growable = widths.filter((w) => widthsCanGrow(cols, w.index, w.width)).map((w) => w.index);\r\n\r\n while (remaining > 0 && growable.length > 0) {\r\n const flexSum = growable.reduce((s, i) => s + (cols[i].flex ?? 1), 0) || 1;\r\n let distributed = 0;\r\n\r\n for (const i of growable) {\r\n const rec = widths.find((w) => w.index === i)!;\r\n const cap = (cols[i].maxWidth ?? Infinity) - rec.width;\r\n\r\n if (cap <= 0) {\r\n continue;\r\n }\r\n\r\n const ideal = remaining * ((cols[i].flex ?? 1) / flexSum);\r\n const add = ideal < cap ? ideal : cap;\r\n\r\n if (add > 0) {\r\n rec.width += add;\r\n distributed += add;\r\n }\r\n }\r\n\r\n if (distributed <= 1e-6) {\r\n break;\r\n }\r\n\r\n remaining -= distributed;\r\n\r\n growable = widths.filter((w) => widthsCanGrow(cols, w.index, w.width)).map((w) => w.index);\r\n }\r\n\r\n return widths;\r\n}\r\n\r\nfunction widthsCanGrow(cols: ColumnLike[], i: number, cur: number) {\r\n const max = cols[i].maxWidth ?? Infinity;\r\n\r\n return cur < max - 1e-6;\r\n}\r\n\r\nfunction roundAndFix(\r\n cols: ColumnLike[],\r\n widths: number[],\r\n fixedIdx: number[],\r\n autoIdx: number[],\r\n containerWidth: number,\r\n) {\r\n const sumFixed = fixedIdx.reduce((s, i) => s + widths[i], 0);\r\n let sumAuto = 0;\r\n\r\n for (const i of autoIdx) {\r\n widths[i] = Math.floor(widths[i]);\r\n sumAuto += widths[i];\r\n }\r\n\r\n let need = Math.round(Math.max(containerWidth - sumFixed - sumAuto, 0));\r\n\r\n if (need === 0) {\r\n return;\r\n }\r\n\r\n for (let k = autoIdx.length - 1; k >= 0 && need > 0; k--) {\r\n const i = autoIdx[k];\r\n const max = cols[i].maxWidth ?? Infinity;\r\n\r\n if (widths[i] + 1 <= max) {\r\n widths[i] += 1;\r\n need--;\r\n }\r\n }\r\n}\r\n\r\nfunction clamp(v: number, min?: number, max?: number) {\r\n min != null && v < min && (v = min);\r\n max != null && v > max && (v = max);\r\n\r\n return v;\r\n}\r\n\r\nfunction sum(items: { width: number }[] | number[]) {\r\n if (Array.isArray(items) && typeof items[0] === 'number') {\r\n return (items as number[]).reduce((s, x) => s + x, 0);\r\n }\r\n\r\n return (items as { width: number }[]).reduce((s, x) => s + x.width, 0);\r\n}\r\n","import { ScrollbarState } from './scrollbar.models';\r\n\r\n/**\r\n * Вычисляет визуальное состояние оверлейного скроллбара. Все аргументы - сырые DOM-числа.\r\n * Возвращает состояние, описывающее видимость, размер и позицию ползунка.\r\n */\r\nexport function computeScrollbarState(\r\n scrollHeight: number = 0,\r\n clientHeight: number = 0,\r\n scrollTop: number = 0,\r\n minThumb = 24,\r\n): ScrollbarState {\r\n const safeClient = toSafe(clientHeight);\r\n const safeScrollH = toSafe(scrollHeight);\r\n const safeTop = clamp(scrollTop, 0, Math.max(0, safeScrollH - safeClient));\r\n\r\n if (safeClient <= 0 || !isFinite(safeClient)) {\r\n return hiddenState();\r\n }\r\n\r\n if (safeScrollH <= safeClient + 1) {\r\n return hiddenState(safeClient);\r\n }\r\n\r\n const track = safeClient;\r\n const ratio = track / safeScrollH;\r\n const thumb = Math.max(minThumb, Math.floor(track * ratio));\r\n\r\n const maxScrollTop = Math.max(1, safeScrollH - track);\r\n const maxThumbTop = Math.max(1, track - thumb);\r\n const topRaw = Math.round((safeTop / maxScrollTop) * maxThumbTop);\r\n const thumbTop = clamp(isFinite(topRaw) ? topRaw : 0, 0, maxThumbTop);\r\n\r\n return {\r\n visible: true,\r\n thumbHeight: thumb,\r\n thumbTop,\r\n track,\r\n maxThumbTop,\r\n maxScrollTop,\r\n };\r\n}\r\n\r\n/** Преобразует позицию ползунка thumbTop (0..maxThumbTop) в позицию прокрутки scrollTop (0..maxScrollTop) */\r\nexport function mapThumbTopToScrollTop(thumbTop: number, maxThumbTop: number, maxScrollTop: number): number {\r\n const mt = Math.max(1, toSafe(maxThumbTop));\r\n const ms = Math.max(1, toSafe(maxScrollTop));\r\n const tt = clamp(toSafe(thumbTop), 0, mt);\r\n\r\n return (tt / mt) * ms;\r\n}\r\n\r\n/** Ограничивает новую позицию ползунка в пределах 0..maxThumbTop */\r\nexport function clampThumbTop(value: number, maxThumbTop: number): number {\r\n const mt = Math.max(1, toSafe(maxThumbTop));\r\n\r\n return clamp(toSafe(value), 0, mt);\r\n}\r\n\r\nfunction hiddenState(track = 0): ScrollbarState {\r\n return {\r\n visible: false,\r\n thumbHeight: 0,\r\n thumbTop: 0,\r\n track,\r\n maxThumbTop: 1,\r\n maxScrollTop: 1,\r\n };\r\n}\r\n\r\nfunction toSafe(n: number): number {\r\n return Number.isFinite(n) ? n : 0;\r\n}\r\n\r\nfunction clamp(v: number, min: number, max: number): number {\r\n if (v < min) return min;\r\n if (v > max) return max;\r\n\r\n return v;\r\n}\r\n","export type ScrollDirection = 'horizontal' | 'vertical' | 'none';\r\n\r\nexport class ScrollDirectionDetector {\r\n #prevTop = 0;\r\n #prevLeft = 0;\r\n\r\n constructor(private readonly el: HTMLElement) {\r\n this.#prevTop = el.scrollTop;\r\n this.#prevLeft = el.scrollLeft;\r\n }\r\n\r\n detect(): ScrollDirection {\r\n const { scrollTop, scrollLeft } = this.el;\r\n\r\n const deltaX = Math.abs(scrollLeft - this.#prevLeft);\r\n const deltaY = Math.abs(scrollTop - this.#prevTop);\r\n\r\n this.#prevTop = scrollTop;\r\n this.#prevLeft = scrollLeft;\r\n\r\n if (deltaX === 0 && deltaY === 0) return 'none';\r\n if (deltaX > deltaY) return 'horizontal';\r\n if (deltaY > deltaX) return 'vertical';\r\n\r\n return 'none';\r\n }\r\n}\r\n","import { GridColumn } from '../../data-grid.models';\r\nimport { AnyDict } from '../../utils.models';\r\n\r\nexport function splitSticky<Data extends AnyDict>(cols: GridColumn<Data>[]) {\r\n const visible = cols.filter((c) => c.visible !== false);\r\n\r\n const middleIndex = Math.floor(visible.length / 2);\r\n const left = visible.slice(0, middleIndex).filter((col) => col.sticky);\r\n const right = visible.slice(middleIndex, visible.length).filter((col) => col.sticky);\r\n\r\n return { left, right, visible };\r\n}\r\n","import { computed, effect, ElementRef, Injectable, signal, TemplateRef } from '@angular/core';\r\n\r\nimport { GridCellRendererType, GridColumn, GridPinnedRow } from './data-grid.models';\r\nimport { layoutColumns } from './helpers/layout-columns';\r\nimport { computeScrollbarState } from './helpers/scrollbar';\r\nimport { splitSticky } from './helpers/sticky';\r\nimport { AnyDict } from './utils.models';\r\n\r\n@Injectable()\r\nexport class DataGridVm<Data extends AnyDict> {\r\n scrollEl = signal<ElementRef<HTMLDivElement> | undefined>(undefined);\r\n columns = signal<GridColumn<Data>[]>([]);\r\n pinnedRows = signal<GridPinnedRow<Data>[]>([]);\r\n\r\n containerWidth = signal<number>(0);\r\n scrollbarVisible = signal(false);\r\n thumbHeightPx = signal(0);\r\n thumbTopPx = signal(0);\r\n dragging = false;\r\n\r\n globalTypeCellTpls = new Map<GridCellRendererType, TemplateRef<Data>>();\r\n\r\n #byKey = signal<Record<string, number>>({});\r\n #defaultColWidth = 140;\r\n #stickyLeftMap = new Map<string, number>();\r\n #stickyRightMap = new Map<string, number>();\r\n\r\n columnsToShow = computed<GridColumn<Data>[]>(() => {\r\n this.containerWidth();\r\n\r\n const cols = this.columns() ?? [];\r\n const { left, visible, right } = splitSticky<Data>(cols);\r\n\r\n this.recomputeStickyOffsets(left, right);\r\n\r\n return visible;\r\n });\r\n\r\n pinnedTop = computed<GridPinnedRow<Data>[]>(() =>\r\n (this.pinnedRows() ?? []).filter((r) => r.position === 'top').sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),\r\n );\r\n\r\n pinnedBottom = computed<GridPinnedRow<Data>[]>(() =>\r\n (this.pinnedRows() ?? []).filter((r) => r.position === 'bottom').sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n const cols = this.columns();\r\n const width = this.containerWidth();\r\n\r\n if (!cols.length || !width) {\r\n return;\r\n }\r\n\r\n const res = layoutColumns(cols, width, this.#defaultColWidth);\r\n\r\n this.#byKey.set(res.byKey);\r\n });\r\n }\r\n\r\n widthByKey = (key: string) => this.#byKey()[key] ?? this.#defaultColWidth;\r\n isStickyLeft = (key: string) => this.#stickyLeftMap.has(key);\r\n isStickyRight = (key: string) => this.#stickyRightMap.has(key);\r\n stickyOffset = (key: string, dir: 'left' | 'right') =>\r\n dir === 'left' && this.isStickyLeft(key)\r\n ? (this.#stickyLeftMap.get(key) ?? null)\r\n : dir === 'right' && this.isStickyRight(key)\r\n ? (this.#stickyRightMap.get(key) ?? null)\r\n : null;\r\n\r\n calcScrollbar(): void {\r\n const el = this.scrollEl()?.nativeElement;\r\n\r\n if (!el) return;\r\n\r\n const state = computeScrollbarState(el.scrollHeight, el.clientHeight, el.scrollTop);\r\n\r\n if (!state.visible) {\r\n this.scrollbarVisible.set(false);\r\n this.thumbHeightPx.set(0);\r\n this.thumbTopPx.set(0);\r\n\r\n return;\r\n }\r\n\r\n this.thumbHeightPx.set(state.thumbHeight);\r\n this.thumbTopPx.set(state.thumbTop);\r\n }\r\n\r\n private recomputeStickyOffsets(leftCols: GridColumn<Data>[], rightCols: GridColumn<Data>[]): void {\r\n let acc = 0;\r\n\r\n this.#stickyLeftMap.clear();\r\n\r\n for (const col of leftCols) {\r\n this.#stickyLeftMap.set(col.key, acc);\r\n acc += this.widthByKey(col.key);\r\n }\r\n\r\n acc = 0;\r\n this.#stickyRightMap.clear();\r\n\r\n for (let i = rightCols.length - 1; i >= 0; i--) {\r\n const col = rightCols[i];\r\n\r\n this.#stickyRightMap.set(col.key, acc);\r\n acc += this.widthByKey(col.key);\r\n }\r\n }\r\n}\r\n","import { DatePipe, DecimalPipe, NgTemplateOutlet } from '@angular/common';\r\nimport { Component, computed, inject, input } from '@angular/core';\r\n\r\nimport { GridColumn } from './data-grid.models';\r\nimport { DataGridVm } from './data-grid.vm';\r\nimport { AnyDict } from './utils.models';\r\n\r\n@Component({\r\n selector: 're-data-grid-cell',\r\n template: `\r\n @let row = item();\r\n @let col = column();\r\n @let val = value();\r\n\r\n @switch (type()) {\r\n @case ('tpl') {\r\n <ng-container\r\n [ngTemplateOutlet]=\"$any(col).renderTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: val, value: val, row, col, index }\"\r\n />\r\n }\r\n @case ('globalTypeTpl') {\r\n <ng-container\r\n [ngTemplateOutlet]=\"vm.globalTypeCellTpls.get($any(col).type)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: val, value: val, row, col }\"\r\n />\r\n }\r\n @case ('date') {\r\n {{ val | date }}\r\n }\r\n @case ('number') {\r\n {{ val | number }}\r\n }\r\n @case ('index') {\r\n {{ index() + 1 }}\r\n }\r\n @default {\r\n {{ val }}\r\n }\r\n }\r\n `,\r\n styles: `\r\n :host {\r\n width: 100%;\r\n text-align: inherit;\r\n }\r\n `,\r\n imports: [NgTemplateOutlet, DatePipe, DecimalPipe],\r\n})\r\nexport class DataGridCellComponent<Data extends AnyDict> {\r\n index = input.required<number>();\r\n item = input.required<Data>();\r\n column = input.required<GridColumn<Data>>();\r\n\r\n vm = inject(DataGridVm);\r\n\r\n type = computed(() => {\r\n const col = this.column();\r\n\r\n if ('renderTemplate' in col) {\r\n return 'tpl';\r\n }\r\n\r\n if ('type' in col && this.vm.globalTypeCellTpls.has(col.type!)) {\r\n return 'globalTypeTpl';\r\n }\r\n\r\n return 'type' in col ? col['type'] : 'plain';\r\n });\r\n\r\n value = computed(() => {\r\n const col = this.column();\r\n const row = this.item();\r\n\r\n return 'value' in col ? col.value(row) : row[col.key];\r\n });\r\n}\r\n","import { computed, signal } from '@angular/core';\r\n\r\nimport { _Selectfull, GridSelection } from '../../data-grid.models';\r\nimport { AnyDict, DataKey } from '../../utils.models';\r\n\r\nexport class Selector<Data extends AnyDict> {\r\n data = signal<Data[]>([]);\r\n selection = signal<GridSelection>({ mode: 'none' });\r\n\r\n selectedKeys = signal<DataKey<Data>[]>([]);\r\n\r\n isAllSelected = computed(() => {\r\n const selectedCount = this.selectedKeys().length;\r\n\r\n return selectedCount === this.data().length ? true : selectedCount === 0 ? false : 'mixed';\r\n });\r\n\r\n isSelected(row: Data) {\r\n const selection = this.selection();\r\n const selected = this.selectedKeys();\r\n\r\n return 'key' in selection ? selected.includes(row[selection.key]) : false;\r\n }\r\n\r\n selectAll() {\r\n if (this.selection().mode !== 'multi') {\r\n throw new Error('Cannot select all in not \"multi\" mode');\r\n }\r\n\r\n const selection = this.selection() as _Selectfull<Data>;\r\n const state = this.isAllSelected();\r\n const nextState = state === false || state === 'mixed';\r\n\r\n this.selectedKeys.set(!nextState ? [] : this.data().map((row) => row[selection.key]));\r\n\r\n return this.selectedKeys();\r\n }\r\n\r\n select(row: Data) {\r\n if (this.selection().mode === 'none') {\r\n throw new Error('Cannot select row in \"none\" mode');\r\n }\r\n\r\n const selection = this.selection() as _Selectfull<Data>;\r\n\r\n if (this.selection().mode === 'single') {\r\n const selected = [row[selection.key]];\r\n\r\n this.selectedKeys.set(selected);\r\n\r\n return selected;\r\n } else {\r\n const selectedKeys = this.selectedKeys();\r\n const has = selectedKeys.some((it) => it === row[selection.key]);\r\n const selected = has\r\n ? selectedKeys.filter((it) => it !== row[selection.key])\r\n : [...selectedKeys, row[selection.key]];\r\n\r\n this.selectedKeys.set(selected);\r\n\r\n return selected;\r\n }\r\n }\r\n}\r\n","// noinspection CssUnresolvedCustomProperty\r\n\r\nimport { ChangeDetectionStrategy, Component, effect, ElementRef, input, viewChild } from '@angular/core';\r\n\r\nexport type TriState = boolean | 'mixed';\r\n\r\n@Component({\r\n selector: 're-checkbox-ic',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <label class=\"cb\" [class.cb--disabled]=\"disabled()\">\r\n <input\r\n #box\r\n class=\"cb__input\"\r\n type=\"checkbox\"\r\n aria-hidden=\"true\"\r\n [disabled]=\"disabled()\"\r\n [checked]=\"state() === true\"\r\n [attr.data-indeterminate]=\"state() === 'mixed' ? 'true' : 'false'\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n <span class=\"cb__box\" aria-hidden=\"true\"></span>\r\n </label>\r\n `,\r\n styles: `\r\n :host {\r\n --re-data-grid-checkbox-size: 20px;\r\n --re-data-grid-checkbox-stroke: 2px;\r\n --re-data-grid-checkbox-border: var(--border-color, #9aa3af);\r\n --re-data-grid-checkbox-tick: var(--surface-neutral, #fff);\r\n --re-data-grid-checkbox-surface: var(--surface-neutral, #fff);\r\n --re-data-grid-checkbox-active-color: var(--primary-color, #2563eb);\r\n\r\n display: inline-block;\r\n width: var(--re-data-grid-checkbox-size);\r\n height: var(--re-data-grid-checkbox-size);\r\n user-select: none;\r\n }\r\n\r\n .cb {\r\n cursor: default;\r\n display: inline-block;\r\n }\r\n .cb--disabled {\r\n opacity: 0.6;\r\n }\r\n\r\n .cb__input {\r\n position: absolute;\r\n width: 0;\r\n height: 0;\r\n opacity: 0;\r\n pointer-events: none;\r\n }\r\n\r\n .cb__box {\r\n position: relative;\r\n display: inline-block;\r\n width: var(--re-data-grid-checkbox-size);\r\n height: var(--re-data-grid-checkbox-size);\r\n border: var(--re-data-grid-checkbox-stroke) solid var(--re-data-grid-checkbox-border);\r\n border-radius: 4px;\r\n background: var(--re-data-grid-checkbox-surface);\r\n transition:\r\n background 0.25s,\r\n border-color 0.25s;\r\n }\r\n\r\n .cb__input:checked + .cb__box {\r\n border-color: var(--re-data-grid-checkbox-active-color);\r\n background: var(--re-data-grid-checkbox-active-color);\r\n }\r\n .cb__input:checked + .cb__box::after {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n margin: auto;\r\n width: 10px;\r\n height: 6px;\r\n border: 2px solid var(--re-data-grid-checkbox-tick);\r\n border-top: 0;\r\n border-right: 0;\r\n transform: rotate(-45deg) translate(1px, -1px) scale(0.8);\r\n opacity: 0;\r\n animation: tick 0.25s forwards ease;\r\n }\r\n\r\n /* mixed */\r\n .cb__input[data-indeterminate='true'] + .cb__box {\r\n background: var(--re-data-grid-checkbox-active-color);\r\n border-color: var(--re-data-grid-checkbox-active-color);\r\n }\r\n .cb__input[data-indeterminate='true'] + .cb__box::after {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n right: 3px;\r\n top: 50%;\r\n border-top: 2px solid var(--re-data-grid-checkbox-tick);\r\n transform: translateY(-50%) scaleX(0.3);\r\n opacity: 0;\r\n animation: dash 0.25s forwards ease;\r\n }\r\n\r\n @keyframes tick {\r\n to {\r\n opacity: 1;\r\n transform: rotate(-45deg) translate(1px, -1px) scale(1);\r\n }\r\n }\r\n @keyframes dash {\r\n to {\r\n opacity: 1;\r\n transform: translateY(-50%) scaleX(1);\r\n }\r\n }\r\n `,\r\n})\r\nexport class CheckboxIcon {\r\n state = input<TriState>(false);\r\n disabled = input(false);\r\n\r\n private boxRef = viewChild(ElementRef<HTMLInputElement>);\r\n\r\n constructor() {\r\n effect(() => {\r\n const el = this.boxRef()?.nativeElement;\r\n\r\n if (!el) {\r\n return;\r\n }\r\n\r\n const state = this.state();\r\n\r\n if (state === 'mixed') {\r\n el.indeterminate = true;\r\n el.checked = false;\r\n el.dataset.indeterminate = 'true';\r\n } else if (state) {\r\n el.indeterminate = false;\r\n el.checked = true;\r\n el.dataset.indeterminate = 'false';\r\n } else {\r\n el.indeterminate = false;\r\n el.checked = false;\r\n el.dataset.indeterminate = 'false';\r\n }\r\n });\r\n }\r\n}\r\n","/* eslint-disable max-len */\r\nimport { booleanAttribute, Component, input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 're-expand-ic',\r\n template: `\r\n @if (expanded()) {\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\r\n <path\r\n d=\"M15.5 8C15.5 9.48336 15.0601 10.9334 14.236 12.1668C13.4119 13.4001 12.2406 14.3614 10.8701 14.9291C9.49968 15.4968 7.99168 15.6453 6.53683 15.3559C5.08197 15.0665 3.7456 14.3522 2.6967 13.3033C1.64781 12.2544 0.933503 10.918 0.644114 9.46318C0.354725 8.00832 0.50325 6.50032 1.07091 5.12987C1.63856 3.75943 2.59986 2.58809 3.83323 1.76398C5.0666 0.939867 6.51664 0.5 8 0.5C8.98492 0.5 9.96019 0.693993 10.8701 1.0709C11.7801 1.44781 12.6069 2.00026 13.3033 2.6967C13.9997 3.39314 14.5522 4.21993 14.9291 5.12987C15.306 6.03982 15.5 7.01509 15.5 8ZM12.5 8C12.5 7.80109 12.421 7.61032 12.2803 7.46967C12.1397 7.32902 11.9489 7.25 11.75 7.25H4.25C4.05109 7.25 3.86033 7.32902 3.71967 7.46967C3.57902 7.61032 3.5 7.80109 3.5 8C3.5 8.19891 3.57902 8.38968 3.71967 8.53033C3.86033 8.67098 4.05109 8.75 4.25 8.75H11.75C11.9489 8.75 12.1397 8.67098 12.2803 8.53033C12.421 8.38968 12.5 8.19891 12.5 8Z\"\r\n fill=\"var(--re-data-grid-expander-color)\"\r\n />\r\n </svg>\r\n } @else {\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\r\n <path\r\n d=\"M8 0.5C6.51664 0.5 5.0666 0.939867 3.83323 1.76398C2.59986 2.58809 1.63856 3.75943 1.07091 5.12987C0.50325 6.50032 0.354725 8.00832 0.644114 9.46318C0.933503 10.918 1.64781 12.2544 2.6967 13.3033C3.7456 14.3522 5.08197 15.0665 6.53683 15.3559C7.99168 15.6453 9.49968 15.4968 10.8701 14.9291C12.2406 14.3614 13.4119 13.4001 14.236 12.1668C15.0601 10.9334 15.5 9.48336 15.5 8C15.5 7.01509 15.306 6.03982 14.9291 5.12987C14.5522 4.21993 13.9997 3.39314 13.3033 2.6967C12.6069 2.00026 11.7801 1.44781 10.8701 1.0709C9.96019 0.693993 8.98492 0.5 8 0.5ZM11.75 8.75H8.75V11.75C8.75 11.9489 8.67099 12.1397 8.53033 12.2803C8.38968 12.421 8.19892 12.5 8 12.5C7.80109 12.5 7.61033 12.421 7.46967 12.2803C7.32902 12.1397 7.25 11.9489 7.25 11.75V8.75H4.25C4.05109 8.75 3.86033 8.67098 3.71967 8.53033C3.57902 8.38968 3.5 8.19891 3.5 8C3.5 7.80109 3.57902 7.61032 3.71967 7.46967C3.86033 7.32902 4.05109 7.25 4.25 7.25H7.25V4.25C7.25 4.05109 7.32902 3.86032 7.46967 3.71967C7.61033 3.57902 7.80109 3.5 8 3.5C8.19892 3.5 8.38968 3.57902 8.53033 3.71967C8.67099 3.86032 8.75 4.05109 8.75 4.25V7.25H11.75C11.9489 7.25 12.1397 7.32902 12.2803 7.46967C12.421 7.61032 12.5 7.80109 12.5 8C12.5 8.19891 12.421 8.38968 12.2803 8.53033C12.1397 8.67098 11.9489 8.75 11.75 8.75Z\"\r\n fill=\"var(--re-data-grid-expander-color)\"\r\n />\r\n </svg>\r\n }\r\n `,\r\n styles: '',\r\n})\r\nexport class ExpandIcon {\r\n expanded = input(false, { transform: booleanAttribute });\r\n}\r\n","/* eslint-disable max-len */\r\nimport { Component, input } from '@angular/core';\r\n\r\nimport { GridSortOrder } from '../data-grid.models';\r\n\r\n@Component({\r\n selector: 're-sort-ic',\r\n template: `\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" class=\"{{ direction() }}\">\r\n <path\r\n d=\"M12.84 8.51259L9.66754 11.6851V4.59009C9.66754 4.39118 9.58852 4.20041 9.44787 4.05976C9.30722 3.91911 9.11645 3.84009 8.91754 3.84009C8.71863 3.84009 8.52786 3.91911 8.38721 4.05976C8.24656 4.20041 8.16754 4.39118 8.16754 4.59009V11.6851L4.99504 8.51259C4.92511 8.44266 4.84209 8.38719 4.75073 8.34934C4.65936 8.3115 4.56144 8.29202 4.46254 8.29202C4.36365 8.29202 4.26572 8.3115 4.17435 8.34934C4.08299 8.38719 3.99997 8.44266 3.93004 8.51259C3.86011 8.58252 3.80464 8.66553 3.7668 8.7569C3.72895 8.84827 3.70947 8.94619 3.70947 9.04509C3.70947 9.14398 3.72895 9.24191 3.7668 9.33327C3.80464 9.42464 3.86011 9.50766 3.93004 9.57759L8.38504 14.0251C8.45349 14.0952 8.53503 14.1513 8.62504 14.1901C8.71842 14.2256 8.81762 14.2435 8.91754 14.2426C9.01505 14.2438 9.11186 14.226 9.20254 14.1901C9.29255 14.1513 9.37409 14.0952 9.44254 14.0251L13.8975 9.57759C13.9678 9.50787 14.0236 9.42491 14.0617 9.33352C14.0998 9.24213 14.1194 9.1441 14.1194 9.04509C14.1194 8.94608 14.0998 8.84805 14.0617 8.75666C14.0236 8.66526 13.9678 8.58231 13.8975 8.51259C13.757 8.3729 13.5669 8.29449 13.3688 8.29449C13.1707 8.29449 12.9806 8.3729 12.84 8.51259Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n `,\r\n styles: `\r\n svg {\r\n transition: transform 300ms ease-in-out;\r\n\r\n &:not(.asc):not(.desc) {\r\n display: none;\r\n }\r\n }\r\n\r\n .asc {\r\n transform: rotate(-180deg);\r\n }\r\n\r\n .desc {\r\n transform: rotate(0deg);\r\n }\r\n `,\r\n})\r\nexport class SortIcon {\r\n direction = input<GridSortOrder | undefined>('asc');\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n afterRenderEffect,\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n contentChildren,\r\n DestroyRef,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n numberAttribute,\r\n output,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { auditTime, fromEvent, Subscription } from 'rxjs';\r\n\r\nimport { GRID_CHECKBOX_COLUMN, GRID_INDEX_COLUMN } from './data-grid.constants';\r\nimport {\r\n GridCellClickEvent,\r\n GridPageChangeEvent,\r\n GridRowClickEvent,\r\n GridSelectEvent,\r\n GridSortEvent,\r\n} from './data-grid.events.models';\r\nimport {\r\n GridCellRendererType,\r\n GridColumn,\r\n GridPaginationMode,\r\n GridPinnedRow,\r\n GridSelection,\r\n GridSortOrder,\r\n} from './data-grid.models';\r\nimport { DataGridVm } from './data-grid.vm';\r\nimport { DataGridCellComponent } from './data-grid-cell.component';\r\nimport { DataGridHeaderTemplateDirective } from './directives/header.directive';\r\nimport { DataGridCellEmptyDirective, DataGridCellLoadingDirective } from './directives/placeholders.directive';\r\nimport { DataGridTypeCellTemplateDirective } from './directives/type-cell.directive';\r\nimport {\r\n clampThumbTop,\r\n computeScrollbarState,\r\n mapThumbTopToScrollTop,\r\n ScrollDirectionDetector,\r\n} from './helpers/scrollbar';\r\nimport { Selector } from './helpers/selection';\r\nimport { CheckboxIcon } from './icons/checkbox.icon';\r\nimport { ExpandIcon } from './icons/expand.icon';\r\nimport { SortIcon } from './icons/sort.icon';\r\nimport { AnyDict, AnyType, DataKey, RowKeyFn } from './utils.models';\r\n\r\n@Component({\r\n selector: 're-data-grid',\r\n templateUrl: 'data-grid.component.html',\r\n styleUrl: 'data-grid.component.scss',\r\n imports: [NgTemplateOutlet, DataGridCellComponent, SortIcon, ExpandIcon, CheckboxIcon],\r\n providers: [DataGridVm],\r\n})\r\nexport class DataGrid<Data extends AnyDict> {\r\n /** Массив данных для отображения в таблице */\r\n data = input<Data[]>([]);\r\n /** Конфигурация колонок таблицы */\r\n columns = input<GridColumn<Data>[]>([]);\r\n /** Режим пагинации: 'none', 'pagination' или 'infinity' */\r\n mode = input<GridPaginationMode>('none');\r\n\r\n /** Массив закрепленных строк */\r\n pinnedRows = input<GridPinnedRow<Data>[]>([]);\r\n\r\n /** Добавить ли номерную колонку */\r\n hasIndexColumn = input<boolean, string>(false, { transform: booleanAttribute });\r\n\r\n /** Поддержка выбора строк */\r\n selection = input<GridSelection>({ mode: 'none' });\r\n\r\n /** Количество элементов на странице */\r\n pageSize = input<number, string>(20, { transform: numberAttribute });\r\n /** Высота строки в пикселях */\r\n rowHeight = input<number, string>(40, { transform: numberAttribute });\r\n /** Заполнять ли доступную высоту */\r\n fillHeight = input<boolean, string>(true, { transform: booleanAttribute });\r\n /** Размер буфера виртуального скролла */\r\n virtualBuffer = input(6);\r\n\r\n /** Состояние загрузки данных */\r\n loading = input<boolean, string>(false, { transform: booleanAttribute });\r\n /** Функция или имя свойства для получения уникального ключа строки */\r\n rowKey = input<RowKeyFn<Data> | undefined>(undefined);\r\n /** Начинать отсчёт пагинации с 1 (false) или 0 (true) */\r\n pageStartFromZero = input<boolean, string>(true, { transform: booleanAttribute });\r\n\r\n /** Событие запроса данных */\r\n pageChange = output<GridPageChangeEvent>();\r\n /** Событие изменения сортировки */\r\n sortChange = output<GridSortEvent<Data>>();\r\n /** Событие изменения выбранных строк */\r\n selectChange = output<GridSelectEvent<Data>>();\r\n /** Событие клика по строке */\r\n rowClick = output<GridRowClickEvent<Data>>();\r\n /** Событие клика по ячейке */\r\n cellClick = output<GridCellClickEvent<Data>>();\r\n\r\n vm = inject<DataGridVm<Data>>(DataGridVm<Data>);\r\n selector = new Selector<Data>();\r\n\r\n private rootEl = viewChild<ElementRef<HTMLDivElement>>('root');\r\n private scrollEl = viewChild<ElementRef<HTMLDivElement>>('scroll');\r\n private headerEl = viewChild<ElementRef<HTMLDivElement>>('header');\r\n\r\n private cellSlotRefs = contentChildren(DataGridTypeCellTemplateDirective);\r\n private headerSlotRefs = contentChildren(DataGridHeaderTemplateDirective);\r\n private emptySlotRefs = contentChildren(DataGridCellEmptyDirective);\r\n private loadingSlotRefs = contentChildren(DataGridCellLoadingDirective);\r\n\r\n protected emptyTpl = computed<DataGridCellEmptyDirective | null>(() => this.emptySlotRefs()?.[0]);\r\n protected loadingTpl = computed<DataGridCellLoadingDirective | null>(() => this.loadingSlotRefs()?.[0]);\r\n\r\n protected visibleRows = signal<Data[]>([]);\r\n protected startIndex = 0;\r\n\r\n protected headerHeight = signal(40);\r\n\r\n protected expanderMap = signal<Map<DataKey<Data>, boolean>>(new Map());\r\n protected extendedColumns = computed<GridColumn<Data>[]>(() => {\r\n const hasSelection = this.selection().mode !== 'none';\r\n const hasIndex = this.hasIndexColumn();\r\n\r\n const newColumns: GridColumn<Data>[] = [];\r\n\r\n hasSelection && newColumns.push(GRID_CHECKBOX_COLUMN);\r\n hasIndex && newColumns.push(GRID_INDEX_COLUMN);\r\n\r\n return [...newColumns, ...this.columns()];\r\n });\r\n\r\n private hideSbTimeout?: AnyType;\r\n\r\n currentSortField?: string;\r\n currentSortOrder: GridSortOrder = 'asc';\r\n\r\n private subscription = new Subscription();\r\n private observer: ResizeObserver;\r\n\r\n constructor() {\r\n afterRenderEffect(() => {\r\n this.initRefs();\r\n this.initHeader();\r\n this.initScroll();\r\n this.initObserver();\r\n });\r\n\r\n afterRenderEffect(() => this.initSelector());\r\n\r\n afterRenderEffect(() => {\r\n this.initVm();\r\n this.initSort();\r\n this.initExpander();\r\n });\r\n\r\n effect(() => {\r\n this.data();\r\n this.rowHeight();\r\n this.pinnedRows();\r\n this.vm.containerWidth();\r\n\r\n this.onVerticalScroll(true);\r\n });\r\n\r\n effect(() => {\r\n const selection = this.selection();\r\n\r\n if ('defaultSelected' in selection) {\r\n this.selector.selectedKeys.set(selection.defaultSelected || []);\r\n }\r\n });\r\n\r\n inject(DestroyRef).onDestroy(() => {\r\n this.subscription.unsubscribe();\r\n this.observer?.disconnect();\r\n clearTimeout(this.hideSbTimeout);\r\n });\r\n }\r\n\r\n protected get styleHeight(): string | null {\r\n return this.fillHeight() ? null : 'auto';\r\n }\r\n\r\n protected resolvePinnedData(pr: GridPinnedRow): Partial<Data> {\r\n return typeof pr.data === 'function' ? pr.data() : (pr.data as Partial<Data>);\r\n }\r\n\r\n protected onSort(col: GridColumn<Data>) {\r\n if (!col.sortKey) {\r\n return;\r\n }\r\n\r\n if (this.currentSortField === col.sortKey) {\r\n this.currentSortOrder = this.currentSortOrder === 'asc' ? 'desc' : 'asc';\r\n } else {\r\n this.currentSortField = col.sortKey;\r\n this.currentSortOrder = 'asc';\r\n }\r\n\r\n this.sortChange.emit({ key: this.currentSortField, order: this.currentSortOrder });\r\n }\r\n\r\n protected onCellClick(row: Data, col: GridColumn<Data>, index: number) {\r\n this.cellClick.emit({ row, col, index });\r\n\r\n if (this.selection().mode !== 'none') {\r\n const selected = this.selector.select(row);\r\n\r\n this.selectChange.emit({ selected });\r\n }\r\n }\r\n\r\n protected isExpandable(column: GridColumn<Data>) {\r\n const keys = this.expanderMap();\r\n\r\n return keys.has(column.key);\r\n }\r\n\r\n protected onExpand(column: GridColumn<Data>) {\r\n const expanded = !this.expanderMap().get(column.key);\r\n\r\n this.expanderMap.update((prev) => {\r\n const map = new Map(prev);\r\n\r\n map.set(column.key, expanded);\r\n\r\n return map;\r\n });\r\n\r\n const columns = this.extendedColumns().map((col) =>\r\n col.expandBy === column.key ? { ...col, visible: expanded } : col,\r\n );\r\n\r\n this.vm.columns.set(columns);\r\n }\r\n\r\n protected onVerticalScroll(initial = false): void {\r\n const el = this.scrollEl()?.nativeElement;\r\n\r\n if (!el) return;\r\n\r\n const scrollTop = el.scrollTop ?? 0;\r\n const viewportHeight = el.clientHeight ?? 0;\r\n const data = this.data() ?? [];\r\n const total = data.length ?? 0;\r\n const rowHeight = Math.max(1, this.rowHeight());\r\n const virtualBuffer = Math.max(0, this.virtualBuffer());\r\n\r\n const limit = this.mode() === 'pagination';\r\n const cap = limit ? Math.max(1, this.pageSize()) : Number.POSITIVE_INFINITY;\r\n\r\n const viewportRows = Math.ceil(viewportHeight / rowHeight);\r\n const visibleCount = Math.min(viewportRows + virtualBuffer, cap);\r\n\r\n const start = Math.max(0, Math.floor(scrollTop / rowHeight) - Math.floor(virtualBuffer / 2));\r\n const end = Math.min(total, start + visibleCount);\r\n\r\n if (!el || viewportHeight <= 0 || !isFinite(viewportHeight) || !isFinite(rowHeight)) {\r\n this.visibleRows.set(data);\r\n this.vm.calcScrollbar();\r\n this.showScrollbar();\r\n this.hideScrollbarSoon();\r\n\r\n return;\r\n }\r\n\r\n this.startIndex = start;\r\n this.visibleRows.set(data.slice(start, end));\r\n\r\n if (!initial && this.mode() === 'infinity') {\r\n const threshold = Math.max(0, total - Math.max(1, Math.floor(visibleCount * 1.5)));\r\n const nearEnd = start + visibleCount >= threshold;\r\n\r\n if (nearEnd && !this.loading()) {\r\n const modifier = this.pageStartFromZero() ? 0 : 1;\r\n const page = Math.floor(total / this.pageSize()) + modifier;\r\n\r\n this.pageChange.emit({ page, rows: this.pageSize() });\r\n }\r\n }\r\n\r\n this.vm.calcScrollbar();\r\n this.showScrollbar();\r\n this.hideScrollbarSoon();\r\n }\r\n\r\n protected onHorizontalScroll(): void {}\r\n\r\n protected onThumbDown(e: MouseEvent): void {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const el = this.scrollEl()?.nativeElement;\r\n\r\n if (!el) return;\r\n\r\n this.vm.dragging = true;\r\n this.showScrollbar();\r\n\r\n const startY = e.clientY;\r\n const startTop = this.vm.thumbTopPx();\r\n\r\n const state = computeScrollbarState(el.scrollHeight || 1, el.clientHeight || 1, el.scrollTop || 0);\r\n const maxThumbTop = state.maxThumbTop || 1;\r\n const maxScrollTop = state.maxScrollTop || 1;\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n const delta = ev.clientY - startY;\r\n const newTop = clampThumbTop(startTop + delta, maxThumbTop);\r\n\r\n this.vm.thumbTopPx.set(newTop);\r\n el.scrollTop = mapThumbTopToScrollTop(newTop, maxThumbTop, maxScrollTop);\r\n\r\n this.vm.calcScrollbar();\r\n this.showScrollbar();\r\n };\r\n\r\n const onUp = () => {\r\n window.removeEventListener('mousemove', onMove);\r\n window.removeEventListener('mouseup', onUp);\r\n this.vm.dragging = false;\r\n this.hideScrollbarSoon();\r\n };\r\n\r\n window.addEventListener('mousemove', onMove);\r\n window.addEventListener('mouseup', onUp);\r\n }\r\n\r\n protected showScrollbar(): void {\r\n this.vm.scrollbarVisible.set(true);\r\n\r\n clearTimeout(this.hideSbTimeout);\r\n }\r\n\r\n protected hideScrollbarSoon(delay = 1200): void {\r\n if (this.vm.dragging) {\r\n return;\r\n }\r\n\r\n clearTimeout(this.hideSbTimeout);\r\n this.hideSbTimeout = setTimeout(() => this.vm.scrollbarVisible.set(false), delay);\r\n }\r\n\r\n // todo\r\n protected trackPinnedRow = (row: GridPinnedRow) => row.order;\r\n\r\n protected trackByRow = (row: Data) => {\r\n const rowKey = this.rowKey();\r\n\r\n if (!rowKey) {\r\n return row;\r\n }\r\n\r\n return typeof rowKey === 'function' ? rowKey(row) : row[rowKey];\r\n };\r\n\r\n protected cellClass(col: GridColumn<Data>, row: Data): string | undefined {\r\n if (typeof col.cellClass === 'function') {\r\n return col.cellClass(row);\r\n }\r\n\r\n return col.cellClass;\r\n }\r\n\r\n protected ariaSort(col: GridColumn<Data>): 'ascending' | 'descending' | 'none' {\r\n if (this.currentSortField !== col.sortKey) {\r\n return 'none';\r\n }\r\n\r\n return this.currentSortOrder === 'asc' ? 'ascending' : 'descending';\r\n }\r\n\r\n private initVm(): void {\r\n this.vm.scrollEl.set(this.scrollEl());\r\n this.vm.columns.set(this.extendedColumns());\r\n this.vm.pinnedRows.set(this.pinnedRows());\r\n }\r\n\r\n private initSelector(): void {\r\n this.selector.data.set(this.data());\r\n this.selector.selection.set(this.selection());\r\n }\r\n\r\n private initRefs(): void {\r\n this.cellSlotRefs()?.forEach((dir) => this.vm.globalTypeCellTpls.set(dir.type() as GridCellRendererType, dir.tpl));\r\n\r\n const headerMap = new Map<string, TemplateRef<AnyType>>();\r\n\r\n this.headerSlotRefs()?.forEach((h) => headerMap.set(h.key(), h.tpl));\r\n\r\n this.extendedColumns()?.forEach((c) => {\r\n if (!c.headerTemplate && headerMap.has(c.key)) {\r\n c.headerTemplate = headerMap.get(c.key)!;\r\n }\r\n });\r\n }\r\n\r\n private initSort() {\r\n const firstSortable = this.extendedColumns()?.find((c) => !!c.sortKey);\r\n\r\n if (firstSortable) {\r\n this.currentSortField = firstSortable.sortKey;\r\n this.currentSortOrder = 'asc';\r\n }\r\n }\r\n\r\n private initHeader() {\r\n const el = this.headerEl()?.nativeElement;\r\n\r\n if (!el) return;\r\n\r\n this.headerHeight.set(el.offsetHeight);\r\n }\r\n\r\n private initScroll() {\r\n const scrollEl = this.scrollEl()?.nativeElement;\r\n\r\n if (scrollEl) {\r\n const scrollDetector = new ScrollDirectionDetector(scrollEl);\r\n\r\n this.subscription = fromEvent(scrollEl, 'scroll')\r\n .pipe(auditTime(16))\r\n .subscribe(() => {\r\n const direction = scrollDetector.detect();\r\n\r\n direction === 'vertical' ? this.onVerticalScroll() : this.onHorizontalScroll();\r\n });\r\n }\r\n\r\n queueMicrotask(() => this.onVerticalScroll(true));\r\n }\r\n\r\n private initObserver() {\r\n const root = this.rootEl();\r\n\r\n if (!root) return;\r\n\r\n this.observer = new ResizeObserver((entries) => {\r\n const width = entries[0].contentRect.width;\r\n\r\n this.onVerticalScroll(true);\r\n this.onHorizontalScroll();\r\n this.vm.calcScrollbar();\r\n this.vm.containerWidth.set(width);\r\n });\r\n\r\n this.observer.observe(root.nativeElement);\r\n }\r\n\r\n private initExpander() {\r\n const map: Map<DataKey<Data>, boolean> = new Map();\r\n\r\n const columns = untracked(() =>\r\n this.vm.columns().map((col) => {\r\n col.expandBy && map.set(col.expandBy, false);\r\n\r\n return { ...col, visible: col.expandBy ? false : col.visible };\r\n }),\r\n );\r\n\r\n this.vm.columns.set(columns);\r\n this.expanderMap.set(map);\r\n }\r\n}\r\n","@let items = data();\n@let empty = !loading() && !items?.length;\n@let notEmpty = !!items?.length;\n\n@let pinnedTopH = vm.pinnedTop().length * rowHeight();\n@let pinnedBottomH = vm.pinnedBottom().length * rowHeight();\n\n<div\n #root\n class=\"re-dg-root\"\n [class.fill]=\"fillHeight()\"\n [class.loading]=\"loading()\"\n [style.height]=\"styleHeight\"\n role=\"table\"\n>\n @if (loading()) {\n <div class=\"re-dg-loader\">\n @let loadingTemplate = loadingTpl();\n\n @if (loadingTemplate?.tpl) {\n <ng-container [ngTemplateOutlet]=\"loadingTemplate!.tpl\" />\n } @else {\n <span class=\"re-dg-loader-text\">Загрузка…</span>\n }\n </div>\n }\n\n <div\n #scroll\n class=\"re-dg-body\"\n role=\"rowgroup\"\n (mouseenter)=\"showScrollbar()\"\n (mouseleave)=\"hideScrollbarSoon()\"\n >\n <div class=\"re-dg-header\" role=\"rowgroup\">\n <div #header class=\"re-dg-row re-dg-header-row\" role=\"row\">\n @for (col of vm.columnsToShow(); track col.key) {\n <div\n class=\"re-dg-header-cell\"\n role=\"columnheader\"\n [class.sortable]=\"!!col.sortKey\"\n [class.active-sort]=\"currentSortField && (currentSortField === col.sortKey)\"\n [class.sticky-left]=\"vm.isStickyLeft(col.key)\"\n [class.sticky-right]=\"vm.isStickyRight(col.key)\"\n [style.left.px]=\"vm.stickyOffset(col.key, 'left')\"\n [style.right.px]=\"vm.stickyOffset(col.key, 'right')\"\n [style.width.px]=\"vm.widthByKey(col.key)\"\n [style.min-width.px]=\"col.minWidth || null\"\n [style.max-width.px]=\"col.maxWidth || null\"\n [style.justify-content]=\"col.align || 'left'\"\n [attr.aria-sort]=\"ariaSort(col)\"\n [attr.tabindex]=\"col.sortKey ? 0 : -1\"\n [title]=\"col.header\"\n (click)=\"col.sortKey && onSort(col)\"\n (keydown.enter)=\"col.sortKey && onSort(col)\"\n >\n {{currentSortField }} {{ col.sortKey}}\n @if (col.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.headerTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col.header }\"\n />\n } @else {\n @let isCheckbox = 'type' in col && col.type === 'checkbox';\n @let isMultiSelect = selection().mode === 'multi';\n\n @if (isCheckbox && isMultiSelect) {\n <re-checkbox-ic mixable [state]=\"selector.isAllSelected()\" (click)=\"selector.selectAll()\" />\n } @else {\n <span class=\"re-dg-header-text\">{{ col.header }}</span>\n }\n\n @if (col.sortKey) {\n <span class=\"re-dg-sort-ind\">\n <re-sort-ic [direction]=\"currentSortField === col.sortKey ? currentSortOrder : 'desc'\" />\n </span>\n }\n\n @if (isExpandable(col)) {\n <button (click)=\"$event.stopPropagation(); onExpand(col)\">\n <re-expand-ic [expanded]=\"expanderMap().get(col.key)\" />\n </button>\n }\n }\n </div>\n }\n </div>\n\n <!-- PINNED TOP ROWS -->\n @if (notEmpty) {\n @for (pr of vm.pinnedTop(); track trackPinnedRow(pr)) {\n <div class=\"re-dg-row re-dg-pinned re-dg-top\" role=\"row\">\n @if (pr.rowTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"pr.rowTemplate!\"\n [ngTemplateOutletContext]=\"{ $implicit: resolvePinnedData(pr) }\"\n />\n } @else {\n @for (col of vm.columnsToShow(); track col.key) {\n <div\n class=\"re-dg-cell\"\n role=\"cell\"\n [class.sticky-left]=\"vm.isStickyLeft(col.key)\"\n [class.sticky-right]=\"vm.isStickyRight(col.key)\"\n [style.left.px]=\"vm.stickyOffset(col.key, 'left')\"\n [style.right.px]=\"vm.stickyOffset(col.key, 'right')\"\n [style.justify-items]=\"col.align || 'left'\"\n [style.height.px]=\"rowHeight()\"\n [style.width.px]=\"vm.widthByKey(col.key)\"\n >\n {{ resolvePinnedData(pr)[col.key] ?? '' }}\n </div>\n }\n }\n </div>\n }\n }\n </div>\n\n @if (empty) {\n @let emptyTemplate = emptyTpl()?.tpl;\n\n <div class=\"re-dg-empty\">\n @if (emptyTemplate) {\n <ng-container [ngTemplateOutlet]=\"emptyTemplate\" />\n } @else {\n <span class=\"re-dg-empty-text\">Нет данных</span>\n }\n </div>\n }\n\n <!-- Content -->\n @if (notEmpty) {\n <div class=\"re-dg-spacer\" [style.height.px]=\"items.length * rowHeight() - pinnedBottomH\"></div>\n\n @for (row of visibleRows(); track trackByRow(row); let vi = $index) {\n <div\n class=\"re-dg-row re-dg-data-row\"\n role=\"row\"\n [style.height.px]=\"rowHeight()\"\n [style.top.px]=\"(startIndex + vi) * rowHeight() + pinnedTopH + headerHeight()\"\n [attr.tabindex]=\"0\"\n (click)=\"$event.stopPropagation(); rowClick.emit({ row, index: startIndex + vi })\"\n (keydown.enter)=\"$event.stopPropagation(); rowClick.emit({ row, index: startIndex + vi })\"\n >\n @for (col of vm.columnsToShow(); track col.key) {\n <div\n class=\"re-dg-cell\"\n role=\"cell\"\n [class]=\"cellClass(col, row)\"\n [class.sticky-left]=\"vm.isStickyLeft(col.key)\"\n [class.sticky-right]=\"vm.isStickyRight(col.key)\"\n [style.left.px]=\"vm.stickyOffset(col.key, 'left')\"\n [style.right.px]=\"vm.stickyOffset(col.key, 'right')\"\n [style.justify-items]=\"col.align || 'left'\"\n [style.text-align]=\"col.align || 'left'\"\n [style.width.px]=\"vm.widthByKey(col.key)\"\n [attr.tabindex]=\"0\"\n (click)=\"onCellClick(row, col, startIndex + vi);\"\n (keydown.enter)=\"onCellClick(row, col, startIndex + vi)\"\n >\n @let isCheckbox = 'type' in col && col.type === 'checkbox';\n\n @if (isCheckbox) {\n <re-checkbox-ic mixable=\"false\" [state]=\"selector.isSelected(row)\" />\n } @else {\n <re-data-grid-cell [index]=\"startIndex + vi\" [item]=\"row\" [column]=\"col\" />\n }\n </div>\n }\n </div>\n }\n }\n\n <!-- PINNED BOTTOM ROWS -->\n @if (notEmpty) {\n <div class=\"re-dg-footer\" role=\"rowgroup\">\n @for (pr of vm.pinnedBottom(); track trackPinnedRow(pr)) {\n <div class=\"re-dg-row re-dg-pinned re-dg-bottom\" role=\"row\">\n @if (pr.rowTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"pr.rowTemplate!\"\n [ngTemplateOutletContext]=\"{ $implicit: resolvePinnedData(pr) }\"\n />\n } @else {\n @for (col of vm.columnsToShow(); track col.key) {\n <div\n class=\"re-dg-cell\"\n role=\"cell\"\n [class.sticky-left]=\"vm.isStickyLeft(col.key)\"\n [class.sticky-right]=\"vm.isStickyRight(col.key)\"\n [style.left.px]=\"vm.stickyOffset(col.key, 'left')\"\n [style.right.px]=\"vm.stickyOffset(col.key, 'right')\"\n [style.justify-items]=\"col.align || 'left'\"\n [style.height.px]=\"rowHeight()\"\n [style.width.px]=\"vm.widthByKey(col.key)\"\n >\n {{ resolvePinnedData(pr)[col.key] ?? '' }}\n </div>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Overlay scrollbar -->\n <div class=\"re-dg-scrollbar\" [class.visible]=\"vm.scrollbarVisible()\">\n <div\n class=\"re-dg-scrollbar-thumb\"\n role=\"scrollbar\"\n aria-orientation=\"vertical\"\n aria-hidden=\"false\"\n [style.height.px]=\"vm.thumbHeightPx()\"\n [style.transform]=\"'translateY(' + vm.thumbTopPx() + 'px)'\"\n (mousedown)=\"onThumbDown($event)\"\n ></div>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["clamp"],"mappings":";;;;;MAKa,iCAAiC,CAAA;IAC5C,IAAI,GAAG,KAAK,CAAS,EAAE,iDAAI,KAAK,EAAE,oBAAoB,EAAA,CAAG;AAElD,IAAA,GAAG,GAAG,MAAM,EAAC,WAA+B,EAAC;uGAHzC,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAjC,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAjC,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAD7C,SAAS;mBAAC,EAAE,QAAQ,EAAE,iCAAiC,EAAE;;;MCC7C,+BAA+B,CAAA;IAC1C,GAAG,GAAG,KAAK,CAAS,EAAE,gDAAI,KAAK,EAAE,kBAAkB,EAAA,CAAG;AAE/C,IAAA,GAAG,GAAG,MAAM,EAAC,WAA+B,EAAC;uGAHzC,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAD3C,SAAS;mBAAC,EAAE,QAAQ,EAAE,+BAA+B,EAAE;;;MCD3C,0BAA0B,CAAA;AAC9B,IAAA,GAAG,GAAG,MAAM,EAAC,WAAmC,EAAC;uGAD7C,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC,SAAS;mBAAC,EAAE,QAAQ,EAAE,8BAA8B,EAAE;;MAM1C,4BAA4B,CAAA;AAChC,IAAA,GAAG,GAAG,MAAM,EAAC,WAAmC,EAAC;uGAD7C,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADxC,SAAS;mBAAC,EAAE,QAAQ,EAAE,gCAAgC,EAAE;;;ACLlD,MAAM,iBAAiB,GAAe;AAC3C,IAAA,GAAG,EAAE,QAAQ;AACb,IAAA,IAAI,EAAE,OAAO;AACb,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,MAAM,EAAE,IAAI;CACb;AAEM,MAAM,oBAAoB,GAAe;AAC9C,IAAA,GAAG,EAAE,WAAW;AAChB,IAAA,IAAI,EAAE,UAAU;AAChB,IAAA,KAAK,EAAE,QAAQ;AACf,IAAA,MAAM,EAAE,UAAU;AAClB,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,MAAM,EAAE,IAAI;CACb;;SChBe,aAAa,CAAC,OAAqB,EAAE,cAAsB,EAAE,UAAkB,EAAA;AAC7F,IAAA,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC;AACnC,IAAA,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC;IAEtD,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC;IACzD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC;AAE9D,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC;AACjC,IAAA,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;AACjD,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,QAAQ,GAAG,OAAO,EAAE,CAAC,CAAC;AAE7D,IAAA,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC1D,IAAA,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAExD,IAAA,IAAI,cAAc,IAAI,CAAC,EAAE;QACvB,MAAM,KAAK,GAA2B,EAAE;AAExC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;;YAEvC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7D;QAEA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;IACpC;IAEA,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,WAAW,EAAE;AAC1C,QAAA,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK;IACvB;IAEA,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,SAAS,EAAE;AACxC,QAAA,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK;IACvB;IAEA,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC;IAE/D,IAAI,KAAK,GAAG,CAAC;IACb,MAAM,KAAK,GAA2B,EAAE;AAExC,IAAA,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE;AACnB,QAAA,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC;AAClB,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACnC;AAEA,IAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE;AACjC;AAEA,SAAS,cAAc,CAAC,IAAkB,EAAA;IACxC,MAAM,GAAG,GAAa,EAAE;AAExB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;;AAEpC,QAAA,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C;AAEA,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,UAAU,CAAC,IAAkB,EAAE,UAAoB,EAAA;IAC1D,MAAM,QAAQ,GAAa,EAAE;IAC7B,MAAM,OAAO,GAAa,EAAE;AAE5B,IAAA,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE;QAC1B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE;AAEA,IAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC9B;AAEA,MAAM,kBAAkB,GAAG,CAAC,IAAkB,EAAE,QAAkB,KAChE,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AACrB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;AACvB,IAAA,MAAM,KAAK,GAAGA,OAAK,CAAC,GAAG,CAAC,KAAM,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC;AAE3D,IAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;AACzB,CAAC,CAAC;AAEJ,MAAM,eAAe,GAAG,CAAC,IAAkB,EAAE,OAAiB,EAAE,GAAW,KACzE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAI;AACpB,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;AACrB,IAAA,MAAM,IAAI,GAAGA,OAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC;AAE7D,IAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;AAC/B,CAAC,CAAC;AAEJ,SAAS,cAAc,CAAC,IAAkB,EAAE,IAAwC,EAAE,IAAY,EAAA;IAChG,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1C,IAAI,SAAS,GAAG,IAAI;AAEpB,IAAA,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;IAE9F,OAAO,SAAS,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3C,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;QAC1E,IAAI,WAAW,GAAG,CAAC;AAEnB,QAAA,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE;AACxB,YAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAE;AAC9C,YAAA,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,IAAI,GAAG,CAAC,KAAK;AAEtD,YAAA,IAAI,GAAG,IAAI,CAAC,EAAE;gBACZ;YACF;AAEA,YAAA,MAAM,KAAK,GAAG,SAAS,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC;AACzD,YAAA,MAAM,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG;AAErC,YAAA,IAAI,GAAG,GAAG,CAAC,EAAE;AACX,gBAAA,GAAG,CAAC,KAAK,IAAI,GAAG;gBAChB,WAAW,IAAI,GAAG;YACpB;QACF;AAEA,QAAA,IAAI,WAAW,IAAI,IAAI,EAAE;YACvB;QACF;QAEA,SAAS,IAAI,WAAW;AAExB,QAAA,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;IAC5F;AAEA,IAAA,OAAO,MAAM;AACf;AAEA,SAAS,aAAa,CAAC,IAAkB,EAAE,CAAS,EAAE,GAAW,EAAA;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ;AAExC,IAAA,OAAO,GAAG,GAAG,GAAG,GAAG,IAAI;AACzB;AAEA,SAAS,WAAW,CAClB,IAAkB,EAClB,MAAgB,EAChB,QAAkB,EAClB,OAAiB,EACjB,cAAsB,EAAA;IAEtB,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5D,IAAI,OAAO,GAAG,CAAC;AAEf,IAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;AACvB,QAAA,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACjC,QAAA,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC;IACtB;AAEA,IAAA,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,QAAQ,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;AAEvE,IAAA,IAAI,IAAI,KAAK,CAAC,EAAE;QACd;IACF;IAEA,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AACxD,QAAA,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ;QAExC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE;AACxB,YAAA,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACd,YAAA,IAAI,EAAE;QACR;IACF;AACF;AAEA,SAASA,OAAK,CAAC,CAAS,EAAE,GAAY,EAAE,GAAY,EAAA;AAClD,IAAA,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;AACnC,IAAA,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC;AAEnC,IAAA,OAAO,CAAC;AACV;AAEA,SAAS,GAAG,CAAC,KAAqC,EAAA;AAChD,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AACxD,QAAA,OAAQ,KAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvD;AAEA,IAAA,OAAQ,KAA6B,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AACxE;;AClLA;;;AAGG;AACG,SAAU,qBAAqB,CACnC,YAAA,GAAuB,CAAC,EACxB,YAAA,GAAuB,CAAC,EACxB,SAAA,GAAoB,CAAC,EACrB,QAAQ,GAAG,EAAE,EAAA;AAEb,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;AACvC,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC;AACxC,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC,CAAC;IAE1E,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;QAC5C,OAAO,WAAW,EAAE;IACtB;AAEA,IAAA,IAAI,WAAW,IAAI,UAAU,GAAG,CAAC,EAAE;AACjC,QAAA,OAAO,WAAW,CAAC,UAAU,CAAC;IAChC;IAEA,MAAM,KAAK,GAAG,UAAU;AACxB,IAAA,MAAM,KAAK,GAAG,KAAK,GAAG,WAAW;AACjC,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;AAE3D,IAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;AACrD,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;AAC9C,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,YAAY,IAAI,WAAW,CAAC;IACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAErE,OAAO;AACL,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,WAAW,EAAE,KAAK;QAClB,QAAQ;QACR,KAAK;QACL,WAAW;QACX,YAAY;KACb;AACH;AAEA;SACgB,sBAAsB,CAAC,QAAgB,EAAE,WAAmB,EAAE,YAAoB,EAAA;AAChG,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;AAC3C,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;AAC5C,IAAA,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AAEzC,IAAA,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE;AACvB;AAEA;AACM,SAAU,aAAa,CAAC,KAAa,EAAE,WAAmB,EAAA;AAC9D,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAE3C,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AACpC;AAEA,SAAS,WAAW,CAAC,KAAK,GAAG,CAAC,EAAA;IAC5B,OAAO;AACL,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,WAAW,EAAE,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC;QACX,KAAK;AACL,QAAA,WAAW,EAAE,CAAC;AACd,QAAA,YAAY,EAAE,CAAC;KAChB;AACH;AAEA,SAAS,MAAM,CAAC,CAAS,EAAA;AACvB,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AACnC;AAEA,SAAS,KAAK,CAAC,CAAS,EAAE,GAAW,EAAE,GAAW,EAAA;IAChD,IAAI,CAAC,GAAG,GAAG;AAAE,QAAA,OAAO,GAAG;IACvB,IAAI,CAAC,GAAG,GAAG;AAAE,QAAA,OAAO,GAAG;AAEvB,IAAA,OAAO,CAAC;AACV;;MC7Ea,uBAAuB,CAAA;AAIL,IAAA,EAAA;IAH7B,QAAQ,GAAG,CAAC;IACZ,SAAS,GAAG,CAAC;AAEb,IAAA,WAAA,CAA6B,EAAe,EAAA;QAAf,IAAA,CAAA,EAAE,GAAF,EAAE;AAC7B,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,SAAS;AAC5B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,UAAU;IAChC;IAEA,MAAM,GAAA;QACJ,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE;AAEzC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;AACpD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;AAElD,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;AACzB,QAAA,IAAI,CAAC,SAAS,GAAG,UAAU;AAE3B,QAAA,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,MAAM;QAC/C,IAAI,MAAM,GAAG,MAAM;AAAE,YAAA,OAAO,YAAY;QACxC,IAAI,MAAM,GAAG,MAAM;AAAE,YAAA,OAAO,UAAU;AAEtC,QAAA,OAAO,MAAM;IACf;AACD;;ACvBK,SAAU,WAAW,CAAuB,IAAwB,EAAA;AACxE,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC;AAEvD,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC;AAEpF,IAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;AACjC;;MCFa,UAAU,CAAA;AACrB,IAAA,QAAQ,GAAG,MAAM,CAAyC,SAAS,oDAAC;AACpE,IAAA,OAAO,GAAG,MAAM,CAAqB,EAAE,mDAAC;AACxC,IAAA,UAAU,GAAG,MAAM,CAAwB,EAAE,sDAAC;AAE9C,IAAA,cAAc,GAAG,MAAM,CAAS,CAAC,0DAAC;AAClC,IAAA,gBAAgB,GAAG,MAAM,CAAC,KAAK,4DAAC;AAChC,IAAA,aAAa,GAAG,MAAM,CAAC,CAAC,yDAAC;AACzB,IAAA,UAAU,GAAG,MAAM,CAAC,CAAC,sDAAC;IACtB,QAAQ,GAAG,KAAK;AAEhB,IAAA,kBAAkB,GAAG,IAAI,GAAG,EAA2C;AAEvE,IAAA,MAAM,GAAG,MAAM,CAAyB,EAAE,kDAAC;IAC3C,gBAAgB,GAAG,GAAG;AACtB,IAAA,cAAc,GAAG,IAAI,GAAG,EAAkB;AAC1C,IAAA,eAAe,GAAG,IAAI,GAAG,EAAkB;AAE3C,IAAA,aAAa,GAAG,QAAQ,CAAqB,MAAK;QAChD,IAAI,CAAC,cAAc,EAAE;QAErB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;AACjC,QAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,CAAO,IAAI,CAAC;AAExD,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC;AAExC,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC,yDAAC;IAEF,SAAS,GAAG,QAAQ,CAAwB,MAC1C,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAC9G;IAED,YAAY,GAAG,QAAQ,CAAwB,MAC7C,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACjH;AAED,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE;AAC3B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;YAEnC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;gBAC1B;YACF;AAEA,YAAA,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC;YAE7D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,UAAU,GAAG,CAAC,GAAW,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,gBAAgB;AACzE,IAAA,YAAY,GAAG,CAAC,GAAW,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5D,IAAA,aAAa,GAAG,CAAC,GAAW,KAAK,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;AAC9D,IAAA,YAAY,GAAG,CAAC,GAAW,EAAE,GAAqB,KAChD,GAAG,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG;AACrC,WAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;UACrC,GAAG,KAAK,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG;AACzC,eAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;cACtC,IAAI;IAEZ,aAAa,GAAA;QACX,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;AAEzC,QAAA,IAAI,CAAC,EAAE;YAAE;AAET,QAAA,MAAM,KAAK,GAAG,qBAAqB,CAAC,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC;AAEnF,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AAClB,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAEtB;QACF;QAEA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;IACrC;IAEQ,sBAAsB,CAAC,QAA4B,EAAE,SAA6B,EAAA;QACxF,IAAI,GAAG,GAAG,CAAC;AAEX,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AAE3B,QAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;YACrC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;QACjC;QAEA,GAAG,GAAG,CAAC;AACP,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;AAE5B,QAAA,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC9C,YAAA,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC;YAExB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;YACtC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;QACjC;IACF;uGApGW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAV,UAAU,EAAA,CAAA;;2FAAV,UAAU,EAAA,UAAA,EAAA,CAAA;kBADtB;;;MCyCY,qBAAqB,CAAA;AAChC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAU;AAChC,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAQ;AAC7B,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,iDAAoB;AAE3C,IAAA,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;AAEvB,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AACnB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;AAEzB,QAAA,IAAI,gBAAgB,IAAI,GAAG,EAAE;AAC3B,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE;AAC9D,YAAA,OAAO,eAAe;QACxB;AAEA,QAAA,OAAO,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO;AAC9C,IAAA,CAAC,gDAAC;AAEF,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AACpB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;AACzB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE;QAEvB,OAAO,OAAO,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AACvD,IAAA,CAAC,iDAAC;uGA1BS,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,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxCtB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAOS,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,WAAW,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,EAAA,CAAA;;2FAEtC,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBA1CjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,QAAA,EACnB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BT,EAAA,CAAA,EAAA,OAAA,EAOQ,CAAC,gBAAgB,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAA,MAAA,EAAA,CAAA,wCAAA,CAAA,EAAA;;;MC1CvC,QAAQ,CAAA;AACnB,IAAA,IAAI,GAAG,MAAM,CAAS,EAAE,gDAAC;IACzB,SAAS,GAAG,MAAM,CAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEnD,IAAA,YAAY,GAAG,MAAM,CAAkB,EAAE,wDAAC;AAE1C,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;QAC5B,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM;QAEhD,OAAO,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,GAAG,aAAa,KAAK,CAAC,GAAG,KAAK,GAAG,OAAO;AAC5F,IAAA,CAAC,yDAAC;AAEF,IAAA,UAAU,CAAC,GAAS,EAAA;AAClB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;QAEpC,OAAO,KAAK,IAAI,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK;IAC3E;IAEA,SAAS,GAAA;QACP,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE;AACrC,YAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC;QAC1D;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAuB;AACvD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;QAClC,MAAM,SAAS,GAAG,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO;AAEtD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAErF,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE;IAC5B;AAEA,IAAA,MAAM,CAAC,GAAS,EAAA;QACd,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE;AACpC,YAAA,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;QACrD;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAuB;QAEvD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE;YACtC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAErC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;AAE/B,YAAA,OAAO,QAAQ;QACjB;aAAO;AACL,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;YACxC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAChE,MAAM,QAAQ,GAAG;AACf,kBAAE,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;AACvD,kBAAE,CAAC,GAAG,YAAY,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAEzC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;AAE/B,YAAA,OAAO,QAAQ;QACjB;IACF;AACD;;AC/DD;MAuHa,YAAY,CAAA;AACvB,IAAA,KAAK,GAAG,KAAK,CAAW,KAAK,iDAAC;AAC9B,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AAEf,IAAA,MAAM,GAAG,SAAS,EAAC,UAA4B,mDAAC;AAExD,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa;YAEvC,IAAI,CAAC,EAAE,EAAE;gBACP;YACF;AAEA,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAE1B,YAAA,IAAI,KAAK,KAAK,OAAO,EAAE;AACrB,gBAAA,EAAE,CAAC,aAAa,GAAG,IAAI;AACvB,gBAAA,EAAE,CAAC,OAAO,GAAG,KAAK;AAClB,gBAAA,EAAE,CAAC,OAAO,CAAC,aAAa,GAAG,MAAM;YACnC;iBAAO,IAAI,KAAK,EAAE;AAChB,gBAAA,EAAE,CAAC,aAAa,GAAG,KAAK;AACxB,gBAAA,EAAE,CAAC,OAAO,GAAG,IAAI;AACjB,gBAAA,EAAE,CAAC,OAAO,CAAC,aAAa,GAAG,OAAO;YACpC;iBAAO;AACL,gBAAA,EAAE,CAAC,aAAa,GAAG,KAAK;AACxB,gBAAA,EAAE,CAAC,OAAO,GAAG,KAAK;AAClB,gBAAA,EAAE,CAAC,OAAO,CAAC,aAAa,GAAG,OAAO;YACpC;AACF,QAAA,CAAC,CAAC;IACJ;uGA9BW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,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,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,GAII,UAA4B,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAjH7C,CAAA;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,w3DAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FA+FU,YAAY,EAAA,UAAA,EAAA,CAAA;kBAjHxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,cACd,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,CAAA;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,w3DAAA,CAAA,EAAA;4SAmG0B,UAA4B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AC3HzD;MAwBa,UAAU,CAAA;IACrB,QAAQ,GAAG,KAAK,CAAC,KAAK,qDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;uGAD7C,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,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,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnBX,CAAA;;;;;;;;;;;;;;;;AAgBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGU,UAAU,EAAA,UAAA,EAAA,CAAA;kBArBtB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,QAAA,EACd,CAAA;;;;;;;;;;;;;;;;AAgBT,EAAA,CAAA,EAAA;;;ACrBH;MAiCa,QAAQ,CAAA;AACnB,IAAA,SAAS,GAAG,KAAK,CAA4B,KAAK,qDAAC;uGADxC,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,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,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1BT,CAAA;;;;;;;AAOT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,4IAAA,CAAA,EAAA,CAAA;;2FAmBU,QAAQ,EAAA,UAAA,EAAA,CAAA;kBA5BpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,QAAA,EACZ,CAAA;;;;;;;AAOT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,4IAAA,CAAA,EAAA;;;MC+CU,QAAQ,CAAA;;AAEnB,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,gDAAC;;AAExB,IAAA,OAAO,GAAG,KAAK,CAAqB,EAAE,mDAAC;;AAEvC,IAAA,IAAI,GAAG,KAAK,CAAqB,MAAM,gDAAC;;AAGxC,IAAA,UAAU,GAAG,KAAK,CAAwB,EAAE,sDAAC;;IAG7C,cAAc,GAAG,KAAK,CAAkB,KAAK,2DAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAG/E,SAAS,GAAG,KAAK,CAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;IAGlD,QAAQ,GAAG,KAAK,CAAiB,EAAE,qDAAI,SAAS,EAAE,eAAe,EAAA,CAAG;;IAEpE,SAAS,GAAG,KAAK,CAAiB,EAAE,sDAAI,SAAS,EAAE,eAAe,EAAA,CAAG;;IAErE,UAAU,GAAG,KAAK,CAAkB,IAAI,uDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAE1E,IAAA,aAAa,GAAG,KAAK,CAAC,CAAC,yDAAC;;IAGxB,OAAO,GAAG,KAAK,CAAkB,KAAK,oDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;AAExE,IAAA,MAAM,GAAG,KAAK,CAA6B,SAAS,kDAAC;;IAErD,iBAAiB,GAAG,KAAK,CAAkB,IAAI,8DAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAGjF,UAAU,GAAG,MAAM,EAAuB;;IAE1C,UAAU,GAAG,MAAM,EAAuB;;IAE1C,YAAY,GAAG,MAAM,EAAyB;;IAE9C,QAAQ,GAAG,MAAM,EAA2B;;IAE5C,SAAS,GAAG,MAAM,EAA4B;AAE9C,IAAA,EAAE,GAAG,MAAM,EAAmB,UAAgB,EAAC;AAC/C,IAAA,QAAQ,GAAG,IAAI,QAAQ,EAAQ;AAEvB,IAAA,MAAM,GAAG,SAAS,CAA6B,MAAM,kDAAC;AACtD,IAAA,QAAQ,GAAG,SAAS,CAA6B,QAAQ,oDAAC;AAC1D,IAAA,QAAQ,GAAG,SAAS,CAA6B,QAAQ,oDAAC;AAE1D,IAAA,YAAY,GAAG,eAAe,CAAC,iCAAiC,wDAAC;AACjE,IAAA,cAAc,GAAG,eAAe,CAAC,+BAA+B,0DAAC;AACjE,IAAA,aAAa,GAAG,eAAe,CAAC,0BAA0B,yDAAC;AAC3D,IAAA,eAAe,GAAG,eAAe,CAAC,4BAA4B,2DAAC;AAE7D,IAAA,QAAQ,GAAG,QAAQ,CAAoC,MAAM,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,oDAAC;AACvF,IAAA,UAAU,GAAG,QAAQ,CAAsC,MAAM,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,sDAAC;AAE7F,IAAA,WAAW,GAAG,MAAM,CAAS,EAAE,uDAAC;IAChC,UAAU,GAAG,CAAC;AAEd,IAAA,YAAY,GAAG,MAAM,CAAC,EAAE,wDAAC;AAEzB,IAAA,WAAW,GAAG,MAAM,CAA8B,IAAI,GAAG,EAAE,uDAAC;AAC5D,IAAA,eAAe,GAAG,QAAQ,CAAqB,MAAK;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,KAAK,MAAM;AACrD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;QAEtC,MAAM,UAAU,GAAuB,EAAE;AAEzC,QAAA,YAAY,IAAI,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC;AACrD,QAAA,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAE9C,OAAO,CAAC,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;AAC3C,IAAA,CAAC,2DAAC;AAEM,IAAA,aAAa;AAErB,IAAA,gBAAgB;IAChB,gBAAgB,GAAkB,KAAK;AAE/B,IAAA,YAAY,GAAG,IAAI,YAAY,EAAE;AACjC,IAAA,QAAQ;AAEhB,IAAA,WAAA,GAAA;QACE,iBAAiB,CAAC,MAAK;YACrB,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,CAAC,YAAY,EAAE;AACrB,QAAA,CAAC,CAAC;QAEF,iBAAiB,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAE5C,iBAAiB,CAAC,MAAK;YACrB,IAAI,CAAC,MAAM,EAAE;YACb,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,CAAC,YAAY,EAAE;AACrB,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,IAAI,EAAE;YACX,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,UAAU,EAAE;AACjB,YAAA,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE;AAExB,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AAC7B,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAElC,YAAA,IAAI,iBAAiB,IAAI,SAAS,EAAE;AAClC,gBAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,IAAI,EAAE,CAAC;YACjE;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAK;AAChC,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AAC/B,YAAA,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE;AAC3B,YAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAClC,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAc,WAAW,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,GAAG,MAAM;IAC1C;AAEU,IAAA,iBAAiB,CAAC,EAAiB,EAAA;AAC3C,QAAA,OAAO,OAAO,EAAE,CAAC,IAAI,KAAK,UAAU,GAAG,EAAE,CAAC,IAAI,EAAE,GAAI,EAAE,CAAC,IAAsB;IAC/E;AAEU,IAAA,MAAM,CAAC,GAAqB,EAAA;AACpC,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YAChB;QACF;QAEA,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,CAAC,OAAO,EAAE;AACzC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK;QAC1E;aAAO;AACL,YAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,OAAO;AACnC,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;QAC/B;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACpF;AAEU,IAAA,WAAW,CAAC,GAAS,EAAE,GAAqB,EAAE,KAAa,EAAA;AACnE,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QAExC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;YAE1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;QACtC;IACF;AAEU,IAAA,YAAY,CAAC,MAAwB,EAAA;AAC7C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAE/B,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;IAC7B;AAEU,IAAA,QAAQ,CAAC,MAAwB,EAAA;AACzC,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;QAEpD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AAC/B,YAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;YAEzB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC;AAE7B,YAAA,OAAO,GAAG;AACZ,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAC7C,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,GAAG,CAClE;QAED,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IAC9B;IAEU,gBAAgB,CAAC,OAAO,GAAG,KAAK,EAAA;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;AAEzC,QAAA,IAAI,CAAC,EAAE;YAAE;AAET,QAAA,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,IAAI,CAAC;AACnC,QAAA,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,IAAI,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC;AAC9B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAC/C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QAEvD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,YAAY;QAC1C,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,iBAAiB;QAE3E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;AAC1D,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,aAAa,EAAE,GAAG,CAAC;QAEhE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;AAC5F,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,YAAY,CAAC;AAEjD,QAAA,IAAI,CAAC,EAAE,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AACnF,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,YAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;YACvB,IAAI,CAAC,aAAa,EAAE;YACpB,IAAI,CAAC,iBAAiB,EAAE;YAExB;QACF;AAEA,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAE5C,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,UAAU,EAAE;YAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC;AAClF,YAAA,MAAM,OAAO,GAAG,KAAK,GAAG,YAAY,IAAI,SAAS;YAEjD,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;AAC9B,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,GAAG,CAAC;AACjD,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,QAAQ;AAE3D,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACvD;QACF;AAEA,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;QACvB,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,iBAAiB,EAAE;IAC1B;AAEU,IAAA,kBAAkB,KAAU;AAE5B,IAAA,WAAW,CAAC,CAAa,EAAA;QACjC,CAAC,CAAC,cAAc,EAAE;QAClB,CAAC,CAAC,eAAe,EAAE;QAEnB,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;AAEzC,QAAA,IAAI,CAAC,EAAE;YAAE;AAET,QAAA,IAAI,CAAC,EAAE,CAAC,QAAQ,GAAG,IAAI;QACvB,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE;QAErC,MAAM,KAAK,GAAG,qBAAqB,CAAC,EAAE,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC;AAClG,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC;AAC1C,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,CAAC;AAE5C,QAAA,MAAM,MAAM,GAAG,CAAC,EAAc,KAAI;AAChC,YAAA,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,GAAG,MAAM;YACjC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,GAAG,KAAK,EAAE,WAAW,CAAC;YAE3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;YAC9B,EAAE,CAAC,SAAS,GAAG,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC;AAExE,YAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;YACvB,IAAI,CAAC,aAAa,EAAE;AACtB,QAAA,CAAC;QAED,MAAM,IAAI,GAAG,MAAK;AAChB,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC;AAC/C,YAAA,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC;AAC3C,YAAA,IAAI,CAAC,EAAE,CAAC,QAAQ,GAAG,KAAK;YACxB,IAAI,CAAC,iBAAiB,EAAE;AAC1B,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC;AAC5C,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC;IAC1C;IAEU,aAAa,GAAA;QACrB,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAElC,QAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;IAClC;IAEU,iBAAiB,CAAC,KAAK,GAAG,IAAI,EAAA;AACtC,QAAA,IAAI,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE;YACpB;QACF;AAEA,QAAA,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACnF;;IAGU,cAAc,GAAG,CAAC,GAAkB,KAAK,GAAG,CAAC,KAAK;AAElD,IAAA,UAAU,GAAG,CAAC,GAAS,KAAI;AACnC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAE5B,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,GAAG;QACZ;AAEA,QAAA,OAAO,OAAO,MAAM,KAAK,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;AACjE,IAAA,CAAC;IAES,SAAS,CAAC,GAAqB,EAAE,GAAS,EAAA;AAClD,QAAA,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,UAAU,EAAE;AACvC,YAAA,OAAO,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;QAC3B;QAEA,OAAO,GAAG,CAAC,SAAS;IACtB;AAEU,IAAA,QAAQ,CAAC,GAAqB,EAAA;QACtC,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,CAAC,OAAO,EAAE;AACzC,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,OAAO,IAAI,CAAC,gBAAgB,KAAK,KAAK,GAAG,WAAW,GAAG,YAAY;IACrE;IAEQ,MAAM,GAAA;AACZ,QAAA,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACrC,QAAA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AAC3C,QAAA,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3C;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IAC/C;IAEQ,QAAQ,GAAA;AACd,QAAA,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAA0B,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AAElH,QAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAgC;QAEzD,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAEpE,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,KAAI;AACpC,YAAA,IAAI,CAAC,CAAC,CAAC,cAAc,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;gBAC7C,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAE;YAC1C;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,QAAQ,GAAA;QACd,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAEtE,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC,OAAO;AAC7C,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;QAC/B;IACF;IAEQ,UAAU,GAAA;QAChB,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;AAEzC,QAAA,IAAI,CAAC,EAAE;YAAE;QAET,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC;IACxC;IAEQ,UAAU,GAAA;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa;QAE/C,IAAI,QAAQ,EAAE;AACZ,YAAA,MAAM,cAAc,GAAG,IAAI,uBAAuB,CAAC,QAAQ,CAAC;YAE5D,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ;AAC7C,iBAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;iBAClB,SAAS,CAAC,MAAK;AACd,gBAAA,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,EAAE;AAEzC,gBAAA,SAAS,KAAK,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAChF,YAAA,CAAC,CAAC;QACN;QAEA,cAAc,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACnD;IAEQ,YAAY,GAAA;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE;AAE1B,QAAA,IAAI,CAAC,IAAI;YAAE;QAEX,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;YAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK;AAE1C,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,kBAAkB,EAAE;AACzB,YAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;YACvB,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AACnC,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;IAC3C;IAEQ,YAAY,GAAA;AAClB,QAAA,MAAM,GAAG,GAAgC,IAAI,GAAG,EAAE;AAElD,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,MACxB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AAC5B,YAAA,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;YAE5C,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,GAAG,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE;QAChE,CAAC,CAAC,CACH;QAED,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AAC5B,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;IAC3B;uGAxZW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,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,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,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,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,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,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,SAAA,EAFR,CAAC,UAAU,CAAC,uDAqDgB,iCAAiC,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAC/B,+BAA+B,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,SAAA,EAChC,0BAA0B,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,SAAA,EACxB,4BAA4B,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnHxE,87QA4NA,EAAA,MAAA,EAAA,CAAA,o4NAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlKY,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,mGAAE,QAAQ,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAG1E,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAPpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,OAAA,EAGf,CAAC,gBAAgB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,EAAA,SAAA,EAC3E,CAAC,UAAU,CAAC,EAAA,QAAA,EAAA,87QAAA,EAAA,MAAA,EAAA,CAAA,o4NAAA,CAAA,EAAA;qnDAiDgC,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACJ,QAAQ,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACR,QAAQ,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAE1B,iCAAiC,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAC/B,+BAA+B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAChC,0BAA0B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MACxB,4BAA4B,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEnHxE;;AAEG;;;;"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "name": "@reforgium/data-grid",
4
+ "description": "reforgium DataGrid component",
5
+ "author": "rtommievich",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "repository": {
9
+ "type": "git"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "keywords": [
15
+ "reforgium",
16
+ "data-grid",
17
+ "table",
18
+ "signal",
19
+ "angular"
20
+ ],
21
+ "types": "../../dist/@reforgium/data-grid/index.d.ts",
22
+ "dependencies": {
23
+ "tslib": "^2.8.1"
24
+ },
25
+ "peerDependencies": {
26
+ "@angular/common": ">=19.0.0",
27
+ "@angular/core": ">=19.0.0"
28
+ },
29
+ "module": "fesm2022/reforgium-data-grid.mjs",
30
+ "typings": "types/reforgium-data-grid.d.ts",
31
+ "exports": {
32
+ "./package.json": {
33
+ "default": "./package.json"
34
+ },
35
+ ".": {
36
+ "types": "./types/reforgium-data-grid.d.ts",
37
+ "default": "./fesm2022/reforgium-data-grid.mjs"
38
+ }
39
+ },
40
+ "sideEffects": false
41
+ }
@@ -0,0 +1,249 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { TemplateRef, ElementRef } from '@angular/core';
3
+
4
+ declare class DataGridTypeCellTemplateDirective {
5
+ type: _angular_core.InputSignal<string>;
6
+ tpl: TemplateRef<any>;
7
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataGridTypeCellTemplateDirective, never>;
8
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DataGridTypeCellTemplateDirective, "ng-template[ssDataGridTypeCell]", never, { "type": { "alias": "ssDataGridTypeCell"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
9
+ }
10
+
11
+ declare class DataGridHeaderTemplateDirective {
12
+ key: _angular_core.InputSignal<string>;
13
+ tpl: TemplateRef<any>;
14
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataGridHeaderTemplateDirective, never>;
15
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DataGridHeaderTemplateDirective, "ng-template[ssDataGridHeader]", never, { "key": { "alias": "ssDataGridHeader"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
16
+ }
17
+
18
+ declare class DataGridCellEmptyDirective {
19
+ tpl: TemplateRef<any>;
20
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataGridCellEmptyDirective, never>;
21
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DataGridCellEmptyDirective, "ng-template[ssDataGridEmpty]", never, {}, {}, never, never, true, never>;
22
+ }
23
+ declare class DataGridCellLoadingDirective {
24
+ tpl: TemplateRef<any>;
25
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataGridCellLoadingDirective, never>;
26
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DataGridCellLoadingDirective, "ng-template[ssDataGridLoading]", never, {}, {}, never, never, true, never>;
27
+ }
28
+
29
+ type DataKey<Data> = (keyof Data & string) | string;
30
+ type KeyResolver<Arg = AnyType, Return = string> = (arg: Arg) => Return;
31
+ type RowKeyFn<Data> = DataKey<Data> | KeyResolver<Data, string | number>;
32
+ type AnyType = any;
33
+ type AnyDict = Record<string, AnyType>;
34
+
35
+ type GridPaginationMode = 'none' | 'pagination' | 'infinity';
36
+ type GridPinnedPosition = 'top' | 'bottom';
37
+ type GridSelectMode = 'single' | 'multi' | 'none';
38
+ type GridSortOrder = 'asc' | 'desc';
39
+ type GridCellAlign = 'left' | 'center' | 'right';
40
+ type GridCellRendererType = 'plain' | 'date' | 'number' | 'index' | 'checkbox';
41
+ type GridColumns<Data extends AnyDict = AnyDict> = GridColumn<Data>[];
42
+ type GridPinnedRows<Data extends AnyDict = AnyDict> = GridPinnedRow<Data>[];
43
+ type GridSelection<Data extends AnyDict = AnyDict> = _Selectless | _Selectfull<Data>;
44
+ type _Selectless = {
45
+ mode: 'none';
46
+ };
47
+ type _Selectfull<Data extends AnyDict> = {
48
+ mode: Omit<GridSelectMode, 'none'>;
49
+ key: DataKey<Data>;
50
+ defaultSelected?: DataKey<Data>[];
51
+ };
52
+ type GridPinnedRow<Data extends AnyDict = AnyDict> = {
53
+ position: GridPinnedPosition;
54
+ order?: number;
55
+ data: Partial<Data> | (() => Partial<Data>);
56
+ rowTemplate?: TemplateRef<{
57
+ $implicit: Partial<Data>;
58
+ }>;
59
+ };
60
+ type GridColumn<Data extends AnyDict = AnyDict> = _DefaultGridColumn<Data> | _ValuedGridColumn<Data> | _TemplatedGridColumn<Data>;
61
+ type _BaseGridColumn<Data extends AnyDict = AnyDict> = {
62
+ key: DataKey<Data>;
63
+ sortKey?: string;
64
+ header: string;
65
+ headerTemplate?: TemplateRef<HeaderTemplateData>;
66
+ align?: GridCellAlign;
67
+ cellClass?: KeyResolver<Data> | string;
68
+ width?: number;
69
+ minWidth?: number;
70
+ maxWidth?: number;
71
+ flex?: number;
72
+ disabled?: boolean;
73
+ visible?: boolean;
74
+ sticky?: boolean;
75
+ expandBy?: DataKey<Data>;
76
+ };
77
+ type _DefaultGridColumn<Data extends AnyDict = AnyDict> = _BaseGridColumn<Data> & {
78
+ type?: GridCellRendererType;
79
+ };
80
+ type _ValuedGridColumn<Data extends AnyDict = AnyDict> = _BaseGridColumn<Data> & {
81
+ track: (row: Data) => string;
82
+ value: GridCellRenderer<Data>;
83
+ };
84
+ type _TemplatedGridColumn<Data extends AnyDict = AnyDict> = _BaseGridColumn<Data> & {
85
+ track: (row: Data) => string;
86
+ renderTemplate: TemplateRef<RenderTemplateData<Data>>;
87
+ };
88
+ type GridCellRenderer<Data> = KeyResolver<Data, string | number>;
89
+ type HeaderTemplateData = {
90
+ $implicit: string;
91
+ };
92
+ type RenderTemplateData<Data extends AnyDict = AnyDict> = {
93
+ $implicit: string;
94
+ value: string;
95
+ row: Data;
96
+ col: GridColumn<Data>;
97
+ index: number;
98
+ };
99
+
100
+ type GridPageChangeEvent = {
101
+ page: number;
102
+ /** `pageSize`, для совместимости с primeNg назван `rows` */
103
+ rows: number;
104
+ /** для совместимости с primeNg */
105
+ sortField?: string;
106
+ /** для совместимости с primeNg */
107
+ sortOrder?: GridSortOrder;
108
+ };
109
+ type GridSortEvent<Data = AnyDict> = {
110
+ key: DataKey<Data>;
111
+ order?: GridSortOrder;
112
+ };
113
+ type GridSelectEvent<Data extends AnyDict = AnyDict> = {
114
+ selected: (string | Data[DataKey<Data>])[];
115
+ };
116
+ type GridRowClickEvent<Data extends AnyDict = AnyDict> = {
117
+ row: Data;
118
+ index: number;
119
+ };
120
+ type GridCellClickEvent<Data extends AnyDict = AnyDict> = {
121
+ row: Data;
122
+ col: GridColumn<Data>;
123
+ index: number;
124
+ };
125
+
126
+ declare class DataGridVm<Data extends AnyDict> {
127
+ #private;
128
+ scrollEl: _angular_core.WritableSignal<ElementRef<HTMLDivElement> | undefined>;
129
+ columns: _angular_core.WritableSignal<GridColumn<Data>[]>;
130
+ pinnedRows: _angular_core.WritableSignal<GridPinnedRow<Data>[]>;
131
+ containerWidth: _angular_core.WritableSignal<number>;
132
+ scrollbarVisible: _angular_core.WritableSignal<boolean>;
133
+ thumbHeightPx: _angular_core.WritableSignal<number>;
134
+ thumbTopPx: _angular_core.WritableSignal<number>;
135
+ dragging: boolean;
136
+ globalTypeCellTpls: Map<GridCellRendererType, TemplateRef<Data>>;
137
+ columnsToShow: _angular_core.Signal<GridColumn<Data>[]>;
138
+ pinnedTop: _angular_core.Signal<GridPinnedRow<Data>[]>;
139
+ pinnedBottom: _angular_core.Signal<GridPinnedRow<Data>[]>;
140
+ constructor();
141
+ widthByKey: (key: string) => number;
142
+ isStickyLeft: (key: string) => boolean;
143
+ isStickyRight: (key: string) => boolean;
144
+ stickyOffset: (key: string, dir: "left" | "right") => number | null;
145
+ calcScrollbar(): void;
146
+ private recomputeStickyOffsets;
147
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataGridVm<any>, never>;
148
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<DataGridVm<any>>;
149
+ }
150
+
151
+ declare class Selector<Data extends AnyDict> {
152
+ data: _angular_core.WritableSignal<Data[]>;
153
+ selection: _angular_core.WritableSignal<GridSelection>;
154
+ selectedKeys: _angular_core.WritableSignal<DataKey<Data>[]>;
155
+ isAllSelected: _angular_core.Signal<boolean | "mixed">;
156
+ isSelected(row: Data): boolean;
157
+ selectAll(): DataKey<Data>[];
158
+ select(row: Data): (string | Data[DataKey<Data>])[];
159
+ }
160
+
161
+ declare class DataGrid<Data extends AnyDict> {
162
+ /** Массив данных для отображения в таблице */
163
+ data: _angular_core.InputSignal<Data[]>;
164
+ /** Конфигурация колонок таблицы */
165
+ columns: _angular_core.InputSignal<GridColumn<Data>[]>;
166
+ /** Режим пагинации: 'none', 'pagination' или 'infinity' */
167
+ mode: _angular_core.InputSignal<GridPaginationMode>;
168
+ /** Массив закрепленных строк */
169
+ pinnedRows: _angular_core.InputSignal<GridPinnedRow<Data>[]>;
170
+ /** Добавить ли номерную колонку */
171
+ hasIndexColumn: _angular_core.InputSignalWithTransform<boolean, string>;
172
+ /** Поддержка выбора строк */
173
+ selection: _angular_core.InputSignal<GridSelection>;
174
+ /** Количество элементов на странице */
175
+ pageSize: _angular_core.InputSignalWithTransform<number, string>;
176
+ /** Высота строки в пикселях */
177
+ rowHeight: _angular_core.InputSignalWithTransform<number, string>;
178
+ /** Заполнять ли доступную высоту */
179
+ fillHeight: _angular_core.InputSignalWithTransform<boolean, string>;
180
+ /** Размер буфера виртуального скролла */
181
+ virtualBuffer: _angular_core.InputSignal<number>;
182
+ /** Состояние загрузки данных */
183
+ loading: _angular_core.InputSignalWithTransform<boolean, string>;
184
+ /** Функция или имя свойства для получения уникального ключа строки */
185
+ rowKey: _angular_core.InputSignal<RowKeyFn<Data> | undefined>;
186
+ /** Начинать отсчёт пагинации с 1 (false) или 0 (true) */
187
+ pageStartFromZero: _angular_core.InputSignalWithTransform<boolean, string>;
188
+ /** Событие запроса данных */
189
+ pageChange: _angular_core.OutputEmitterRef<GridPageChangeEvent>;
190
+ /** Событие изменения сортировки */
191
+ sortChange: _angular_core.OutputEmitterRef<GridSortEvent<Data>>;
192
+ /** Событие изменения выбранных строк */
193
+ selectChange: _angular_core.OutputEmitterRef<GridSelectEvent<Data>>;
194
+ /** Событие клика по строке */
195
+ rowClick: _angular_core.OutputEmitterRef<GridRowClickEvent<Data>>;
196
+ /** Событие клика по ячейке */
197
+ cellClick: _angular_core.OutputEmitterRef<GridCellClickEvent<Data>>;
198
+ vm: DataGridVm<Data>;
199
+ selector: Selector<Data>;
200
+ private rootEl;
201
+ private scrollEl;
202
+ private headerEl;
203
+ private cellSlotRefs;
204
+ private headerSlotRefs;
205
+ private emptySlotRefs;
206
+ private loadingSlotRefs;
207
+ protected emptyTpl: _angular_core.Signal<DataGridCellEmptyDirective | null>;
208
+ protected loadingTpl: _angular_core.Signal<DataGridCellLoadingDirective | null>;
209
+ protected visibleRows: _angular_core.WritableSignal<Data[]>;
210
+ protected startIndex: number;
211
+ protected headerHeight: _angular_core.WritableSignal<number>;
212
+ protected expanderMap: _angular_core.WritableSignal<Map<DataKey<Data>, boolean>>;
213
+ protected extendedColumns: _angular_core.Signal<GridColumn<Data>[]>;
214
+ private hideSbTimeout?;
215
+ currentSortField?: string;
216
+ currentSortOrder: GridSortOrder;
217
+ private subscription;
218
+ private observer;
219
+ constructor();
220
+ protected get styleHeight(): string | null;
221
+ protected resolvePinnedData(pr: GridPinnedRow): Partial<Data>;
222
+ protected onSort(col: GridColumn<Data>): void;
223
+ protected onCellClick(row: Data, col: GridColumn<Data>, index: number): void;
224
+ protected isExpandable(column: GridColumn<Data>): boolean;
225
+ protected onExpand(column: GridColumn<Data>): void;
226
+ protected onVerticalScroll(initial?: boolean): void;
227
+ protected onHorizontalScroll(): void;
228
+ protected onThumbDown(e: MouseEvent): void;
229
+ protected showScrollbar(): void;
230
+ protected hideScrollbarSoon(delay?: number): void;
231
+ protected trackPinnedRow: (row: GridPinnedRow) => number | undefined;
232
+ protected trackByRow: (row: Data) => string | number | Data | Data[DataKey<Data>];
233
+ protected cellClass(col: GridColumn<Data>, row: Data): string | undefined;
234
+ protected ariaSort(col: GridColumn<Data>): 'ascending' | 'descending' | 'none';
235
+ private initVm;
236
+ private initSelector;
237
+ private initRefs;
238
+ private initSort;
239
+ private initHeader;
240
+ private initScroll;
241
+ private initObserver;
242
+ private initExpander;
243
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataGrid<any>, never>;
244
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataGrid<any>, "re-data-grid", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "pinnedRows": { "alias": "pinnedRows"; "required": false; "isSignal": true; }; "hasIndexColumn": { "alias": "hasIndexColumn"; "required": false; "isSignal": true; }; "selection": { "alias": "selection"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "rowHeight": { "alias": "rowHeight"; "required": false; "isSignal": true; }; "fillHeight": { "alias": "fillHeight"; "required": false; "isSignal": true; }; "virtualBuffer": { "alias": "virtualBuffer"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "rowKey": { "alias": "rowKey"; "required": false; "isSignal": true; }; "pageStartFromZero": { "alias": "pageStartFromZero"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "sortChange": "sortChange"; "selectChange": "selectChange"; "rowClick": "rowClick"; "cellClick": "cellClick"; }, ["cellSlotRefs", "headerSlotRefs", "emptySlotRefs", "loadingSlotRefs"], never, true, never>;
245
+ }
246
+
247
+ export { DataGrid, DataGridCellEmptyDirective, DataGridCellLoadingDirective, DataGridHeaderTemplateDirective, DataGridTypeCellTemplateDirective };
248
+ export type { GridCellClickEvent, GridCellRenderer, GridColumn, GridColumns, GridPageChangeEvent, GridPinnedRow, GridPinnedRows, GridRowClickEvent, GridSelectEvent, GridSelection, GridSortEvent };
249
+ //# sourceMappingURL=reforgium-data-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reforgium-data-grid.d.ts","sources":["../../../../libs/data-grid/src/directives/type-cell.directive.ts","../../../../libs/data-grid/src/directives/header.directive.ts","../../../../libs/data-grid/src/directives/placeholders.directive.ts","../../../../libs/data-grid/src/utils.models.ts","../../../../libs/data-grid/src/data-grid.models.ts","../../../../libs/data-grid/src/data-grid.events.models.ts","../../../../libs/data-grid/src/data-grid.vm.ts","../../../../libs/data-grid/src/helpers/selection/selection.helper.ts","../../../../libs/data-grid/src/data-grid.component.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":[],"mappings":";;;AAIA;AAEE;AAEO;;;AACR;;ACLD;AAEE;AAEO;;;AACR;;ACPD;AAES;;;AACR;AAED;AAES;;;AACR;;ACVK;;;AAKA;AACA;;ACFA;;AAEA;;AAGA;AACA;AAEA;AACA;AAEA;AAEN;;;;AAEE;AACA;AACA;;AAGI;;;AAGJ;;AAC4B;AAA0B;;AAGlD;AAKN;AACE;;;AAIA;;;;;;;;;;AAaA;;AAGF;;;AAIA;AACE;AACA;;AAGF;AACE;;;AAII;AAEA;;;AACA;;;;AAIJ;;;;AC3EI;;;;;;;;;;AAUJ;;;AAGI;AAA0D;;AAC1D;;;;AACA;;AAAwE;;;;ACV9E;;AAEE;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAOA;AAWA;AAIA;;;;;;AA6BA;AAmBA;;;AAoBD;;ACzGD;AACE;AACA;AAEA;AAEA;;;;AAoDD;;ACTD;;AASE;;AAEA;;AAEA;;AAGA;;AAGA;;AAGA;;AAGA;;AAEA;;AAEA;;AAEA;;AAGA;;AAEA;;AAEA;;AAGA;;AAEA;;AAEA;;AAEA;;AAEA;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;AAgFA;;;AAuBA;;;AAkCA;;AAoDA;;AA8CA;AAUA;AAEA;AAUA;AAQA;AAQA;AAMA;AAKA;AAcA;AASA;AAQA;AAkBA;AAiBA;;;AAcD;;;"}