{"version":3,"file":"ipi-soft-ng-components-table.mjs","sources":["../../../../projects/ipi-soft/ng-components/table/src/table.component.ts","../../../../projects/ipi-soft/ng-components/table/src/table.component.html","../../../../projects/ipi-soft/ng-components/table/ipi-soft-ng-components-table.ts"],"sourcesContent":["import { Component, ViewChildren, QueryList, ViewChild, ElementRef, Input, Output, EventEmitter, ChangeDetectorRef, HostListener, SimpleChanges } from '@angular/core';\nimport { NgTemplateOutlet, NgStyle, NgClass, DecimalPipe, formatDate } from '@angular/common';\nimport { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\n\nimport { IpiChipComponent } from '@ipi-soft/ng-components/chip';\nimport { IpiImageComponent } from '@ipi-soft/ng-components/image';\nimport { IpiCheckboxComponent } from '@ipi-soft/ng-components/checkbox';\nimport { IpiSelectComponent, IpiSelectOptions } from '@ipi-soft/ng-components/select';\n\nimport { OSService, MobileOS } from '@ipi-soft/ng-components/services';\n\nimport { IpiTooltipDirective, TooltipPosition } from '@ipi-soft/ng-components/tooltip';\n\nexport interface IpiTableColumn {\n  label?: string;\n  value?: string;\n  type?: IpiTableColumnType;\n  width?: string;\n  editable?: boolean;\n  prefix?: string;\n  suffix?: string;\n  singleActions?: Action[];\n  multipleActions?: Action[];\n  dateFormat?: IpiDateFormatOptions;\n  chipLabel?: { [key: string]: string };\n  class?: string | { [key: string]: string };\n}\n\nexport enum IpiTableColumnType {\n  Text,\n  Date,\n  Currency,\n  Chip,\n  Number,\n  NumberMath,\n  Actions,\n  Checkbox,\n}\n\nexport type ActionShowType = Array<{ property: string; values: any[]; exists?: boolean; }> \n\nexport interface Action {\n  icon: string;\n  label: string;\n  class?: string;\n  showOn?: ActionShowType;\n  disabled?: boolean;\n  execute?: (row: any) => void;\n}\n\nexport interface IpiTableChange {\n  from: number;\n  to: number;\n  filter?: string;\n  sort?: any;\n}\n\nexport interface IpiDateFormatOptions {\n  format: string;\n  locale: string;\n  timezone?: string;\n}\n\ninterface PageFormControls {\n  pageSize: FormControl<{ label: string, value: number }>;\n}\n\n@Component({\n  standalone: true,\n  selector: 'ipi-table',\n  templateUrl: './table.component.html',\n  styleUrls: ['./table.component.css'],\n  imports: [\n    NgStyle,\n    NgClass,\n    DecimalPipe,\n    NgTemplateOutlet,\n    IpiChipComponent,\n    IpiImageComponent,\n    IpiSelectComponent,\n    IpiTooltipDirective,\n    IpiCheckboxComponent,\n  ]\n})\n\nexport class IpiTableComponent {\n\n  constructor(\n    private osService: OSService,\n    private formBuilder: FormBuilder,\n    private changeDetectorRef: ChangeDetectorRef) {\n      changeDetectorRef.detach();\n  }\n\n  @ViewChild('dropdownElement') DropdownElement: ElementRef<any> | null = null;\n\n  @ViewChildren('moreActionsList') moreActionsList!: QueryList<ElementRef>;\n\n  @Input() data!: any[];\n  @Input() dataLength!: number;\n  @Input() serverSide!: boolean;\n  @Input() isLoading!: boolean;\n  @Input() columns!: IpiTableColumn[];\n\n  @Input() filter!: string;\n\n  @Input() sortIndex = 0;\n  @Input() sortable = true;\n  @Input() sortDirection: 'asc' | 'desc' = 'asc';\n\n  @Input() pageSize = 10;\n  @Input() currentPage = 0;\n  @Input() pageable = false;\n  @Input() pageSizeOptions = [ 10, 25, 50, 100, 1000 ];\n\n  @Output() tableChange = new EventEmitter<IpiTableChange>()\n\n  public tooltipPosition = TooltipPosition;\n\n  public TableColumnType = IpiTableColumnType;\n\n  public totalPages!: number;\n  public visibleRange!: string;\n\n  public filteredData!: any[];\n\n  public pageSizeSelectOptions!: IpiSelectOptions;\n\n  public currentActiveRow: any;\n  public isDropdown: boolean = false;\n\n  public formGroup!: FormGroup<PageFormControls>;\n\n  private _dataLength!: number;\n\n  @HostListener('document:click', ['$event'])\n  public onClick(event: any): void {\n    // TO DO: When two tables exists the dropdown from first table is not closed\n    if (event.target !== this.DropdownElement?.nativeElement && event.target) {\n      if (this.currentActiveRow) {\n        this.currentActiveRow.isDropdown = false;\n      }\n\n      this.changeDetectorRef.detectChanges();\n    }\n  }\n\n  @HostListener('document:scroll', ['$event'])\n  public onScroll(): void {\n\n    for (let item of this.moreActionsList) {\n      if (item.nativeElement.classList.contains('opened') && this.DropdownElement) {\n        let actionPos = item.nativeElement.getBoundingClientRect();\n\n        if (this.osService.mobileOS === MobileOS.iOS) {\n          actionPos.y += window.visualViewport!.offsetTop;\n        }\n\n        this.DropdownElement.nativeElement.style.top = `${ actionPos.y + actionPos.height }px`;\n\n        break;\n      }\n    }\n  }\n\n  @HostListener('window:resize')\n  public onResize(): void {\n\n    for (let item of this.moreActionsList) {\n      if (item.nativeElement.classList.contains('opened') && this.DropdownElement) { \n        let actionPos = item.nativeElement.getBoundingClientRect();\n\n        if (this.osService.mobileOS === MobileOS.iOS) {\n          actionPos.x += window.visualViewport!.offsetLeft;\n        }\n\n        const dropdownWidth = this.DropdownElement.nativeElement.offsetWidth;\n\n        const left = actionPos.x + dropdownWidth / 2 < window.innerWidth - 10 ? actionPos.x : window.innerWidth - 10 - dropdownWidth;\n  \n        this.DropdownElement.nativeElement.style.transform = left === actionPos.x ? 'translateX(-50%)' : '';\n        this.DropdownElement.nativeElement.style.left = left  + 'px';\n\n        break;\n      }\n    }\n  }\n\n  public ngAfterViewInit(): void {\n    const from = this.currentPage * this.pageSize;\n    const to = from + this.pageSize;\n\n    if (this.serverSide && !this.data) {\n      this.tableChange.emit({ from, to, sort: { columnValue: this.columns[this.sortIndex].value, sortDirection: this.sortDirection } });\n    }\n\n    if (!this.serverSide) {\n      this.buildPaginationSelectDependecies();\n    }\n  }\n\n  public ngOnChanges(changes: SimpleChanges): void {\n    if (changes['isLoading'] && changes['isLoading'].currentValue === false) {\n      if (this.data) {\n        this._dataLength = this.data.length;\n      }\n    }\n\n    if (changes['data'] && changes['data'].currentValue) {\n      if (this.serverSide) {\n        this.filteredData = this.data;\n\n        this.preprocessData();\n      } else {\n        this.filteredData = this.filter ? this.filterData() : this.data;\n\n        this.preprocessData();\n\n        setTimeout(() => {\n          this.sortColumn(this.columns[this.sortIndex], false);\n        })\n      }\n\n      this._dataLength = this.dataLength ? this.dataLength : this.filteredData.length;\n    }\n\n    if (changes['filter'] && !changes['filter'].firstChange) {\n      // The two ways of filtering data -> local and serverSide\n      if (!this.serverSide) {\n        this.filteredData = this.filterData();\n        this._dataLength = this.filteredData.length;\n\n        setTimeout(() => {\n          this.goToFirstPage();\n        });\n\n      } else {\n        setTimeout(() => {\n          this.currentPage = 0;\n\n          this.tableChange.emit({ from: 0, to: 0 + this.pageSize, filter: this.filter, sort: { columnValue: this.columns[this.sortIndex].value, sortDirection: this.sortDirection } });\n        });\n      }\n\n    }\n\n    if (changes['pageable'] && changes['pageable'].currentValue !== undefined) {\n      this.buildPaginationSelectDependecies();\n    }\n\n    const from = this.currentPage * this.pageSize;\n    const to = Math.min(this._dataLength, from + this.pageSize);\n  \n    this.calculateTotalPages();\n    this.updateVisibleRange(from, to);\n\n    this.changeDetectorRef.detectChanges();\n  }\n\n  public getPageData(): any[] {\n    if (!this.filteredData) {\n      return [];\n    }\n\n    if (!this.pageable) {\n      return this.filteredData;\n    }\n\n    if (!this.serverSide) {\n      const start = this.currentPage * this.pageSize;\n      const end = start + this.pageSize;\n\n      return this.filteredData.slice(start, end);\n    }\n\n    return this.filteredData;\n  }\n\n  public updateVisibleRange(start: number, end: number): void {\n    this.visibleRange = `Showing ${ start + 1 } to ${end} of ${this._dataLength} results`;\n\n    this.changeDetectorRef.detectChanges();\n  }\n\n  public calculateTotalPages(): void {\n    this.totalPages =  Math.ceil(this._dataLength / this.pageSize);\n  }\n\n  public goToPage(page: number): void {\n    this.currentPage = page;\n    this.calculatePages();\n  }\n\n  public goToPreviousPage(): void {\n    this.currentPage--;\n    this.calculatePages();\n  }\n\n  public goToNextPage(): void {\n    this.currentPage++;\n    this.calculatePages();\n  }\n\n  public goToFirstPage(): void {\n    this.currentPage = 0;\n    this.calculatePages();\n  }\n\n  public goToLastPage(): void {\n    this.currentPage = this.totalPages - 1;\n    this.calculatePages();\n  }\n\n  public cellEdit(event: KeyboardEvent, column: string, currentPageRowIndex: number): void {\n    const dataIndex = currentPageRowIndex + (this.currentPage * this.pageSize);\n\n    if (column.indexOf('.') === -1) {\n      this.filteredData[dataIndex][column] = (event.target as HTMLDivElement).innerText;\n    } else { // Nested properties\n      let data = this.filteredData[dataIndex];\n      const fullPath = column.split('.');\n\n      for (let i = 0; i < fullPath.length; i++) {\n        if (i < fullPath.length - 1) {\n          data = data[fullPath[i]];\n        } else {\n          data[fullPath[i]] = (event.target as HTMLDivElement).innerText;\n        }\n      }\n    }\n  }\n\n  public formatDate(dateAsString: string, formatDateOptions: IpiDateFormatOptions = { format: 'shortDate', locale: 'en-US', timezone: undefined }): string {\n    return formatDate(dateAsString, formatDateOptions.format, formatDateOptions.locale, formatDateOptions.timezone);\n  }\n\n  public getClass(row: any, column: IpiTableColumn): { [key: string]: boolean } | string {\n    if (!column.class) {\n      return '';\n    }\n\n    if (typeof column.class === 'string') {\n      return column.class;\n    }\n\n    return {\n      [column.class[this.getDescendantProp(row, column)]]: true\n    };\n  }\n\n  public getDescendantProp(row: any, column: IpiTableColumn): any {\n    if (!column.value || column.value === null) {\n      return column.label;\n    }\n\n    // Case only on preprocessing - returns any numbers that have been passed in the column.value string\n    if (isFinite(Number(column.value))) {\n      return parseFloat(column.value);\n    }\n\n    if (column.type === this.TableColumnType.NumberMath) {\n      return row[column.value];\n    }\n\n    return column.value.split('.')\n      .reduce((prev: any, curr: string) => {\n        if (prev && curr in prev) {\n          return prev[curr];\n        } else {\n          return undefined;\n        }\n      }, row);\n  }\n\n  public getChipLabel(row: any, column: IpiTableColumn): string {\n    if (!column.chipLabel) {\n      return column.label ? column.label : this.getDescendantProp(row, column);\n    }\n\n    return column.chipLabel[this.getDescendantProp(row, column)];\n  }\n\n  public getCheckboxState(row: any, column: IpiTableColumn): boolean {\n    let state = this.getDescendantProp(row, column);\n\n    if (typeof state !== 'boolean') {\n      return false;\n    }\n\n    return state;\n  }\n\n  public handleActionShow(action: Action, row: any, column?: IpiTableColumn): boolean {\n    if (!action.showOn || action.showOn.length === 0) {\n        return true;\n    }\n\n    return action.showOn.every((condition) => {\n      const rowValue = this.getDescendantProp(row, { value: condition.property });\n\n      const ifValueExists = !!rowValue;\n  \n      if (condition.exists != null && condition.exists === ifValueExists) {\n        return ifValueExists;\n      }\n\n      return condition.values.includes(rowValue);\n    });\n  }\n\n  public sortColumn(column: any, changeSortDirection = true): void {\n    if (!this.sortable) {\n      return;\n    }\n\n    if (!column.value) {\n      return;\n    }\n\n    if (changeSortDirection) {\n\n      if (this.sortIndex == this.columns.indexOf(column)) {\n        switch (this.sortDirection) {\n          case 'asc':\n            this.sortDirection = 'desc';\n            break;\n          case 'desc':\n            this.sortDirection = 'asc';\n            break;\n          default:\n            this.sortDirection = 'asc';\n            break;\n        }\n      } else {\n        this.sortDirection = 'asc';\n        this.sortIndex = this.columns.indexOf(column);\n      }\n\n    }\n\n    if (this.serverSide) {\n      this.currentPage = 0;\n\n      const start = this.currentPage * this.pageSize;\n      const end = Math.min(this._dataLength, start + this.pageSize);\n\n      this.tableChange.emit({ from: start, to: end, filter: this.filter, sort: { columnValue: this.columns[this.sortIndex].value, sortDirection: this.sortDirection } });\n    } else {\n      this.goToFirstPage();\n\n      this.sortData(this.filteredData, column);\n    }\n\n    if (this.currentActiveRow) {\n      this.currentActiveRow.isDropdown = false;\n    }\n\n    this.changeDetectorRef.detectChanges();\n  }\n\n  public async toggleActionDropdown(row: any, event: any): Promise<void> {\n    // Prevent the event to be processed by the Hostlistener\n    event.stopPropagation();\n\n    let actionPos!: DOMRect;\n\n    if (this.currentActiveRow) {\n      this.currentActiveRow.isDropdown = false;\n    }\n\n    row.isDropdown = !row.isDropdown;\n\n    this.currentActiveRow = row;\n\n    this.changeDetectorRef.detectChanges();\n\n    for (let i of this.moreActionsList) {\n      if (i.nativeElement.classList.contains('opened')) {\n        actionPos = i.nativeElement.getBoundingClientRect();\n      }\n    }\n\n    if(this.DropdownElement) {\n      if (this.osService.mobileOS === MobileOS.iOS) {\n        actionPos.y += window.visualViewport!.offsetTop;\n        actionPos.x += window.visualViewport!.offsetLeft;\n      }\n\n      const dropdownWidth = this.DropdownElement.nativeElement.offsetWidth;\n\n      const left = actionPos.x + dropdownWidth / 2 < window.innerWidth - 10 ? actionPos.x : window.innerWidth - 10 - dropdownWidth;\n\n      this.DropdownElement.nativeElement.style.transform = left === actionPos.x ? 'translateX(-50%)' : '';\n      this.DropdownElement.nativeElement.style.left = left + 'px';\n      this.DropdownElement.nativeElement.style.top = `${ actionPos.y + actionPos.height }px`;\n    }\n  }\n\n  private preprocessData(): void {\n    if (!this.data || this.data.length === 0) {\n      return;\n    }\n\n    this.columns.forEach(column => {\n      if (!column.value || column.type !== this.TableColumnType.NumberMath) {\n        return;\n      }\n\n      this.data.forEach(row => {\n        const result = this.calculateNumberMathCell(row, column);\n        row[column.value as any] = result;\n      });\n    });\n  }\n\n  private calculateNumberMathCell(row: any, column: any): any {\n    const expression = column.value.replace(\n      /([a-zA-Z_][a-zA-Z0-9_.]*|\\d*\\.?\\d+)/g,\n      (match: any) => {\n        let value = this.getDescendantProp(row, { value: match });\n\n        return (typeof value === 'number') ? value : parseFloat(value) || 0;\n      }\n    );\n\n    let fn = new Function(`return ${expression};`);\n    let result = fn();\n\n    if (Number.isFinite(result)) {\n      return result;\n    }\n\n    return this.getDescendantProp(row, column);\n  }\n\n  private filterData(): any[] {\n    if (!this.data || this.data.length === 0) {\n      return [];\n    }\n\n    let arrayToReturn: any[] = [ ];\n\n    for (let row of this.data) {\n      for (let column of this.columns) {\n        if (!column.value) { continue; }\n\n        let access = row[column.value];\n\n        if (column.value.indexOf('.') !== -1 && column.type !== this.TableColumnType.NumberMath) {\n          access = this.getAccessIfColumnValueIsObject(row, column);\n        }\n\n        if (access === undefined) {\n          break;\n        }\n\n        const rowPropAsString = JSON.stringify(access).toLowerCase();\n\n        if (rowPropAsString.includes(this.filter.toLowerCase())) {\n          arrayToReturn.push(row);\n\n          break;\n        }\n      }\n    }\n\n    return arrayToReturn;\n  }\n\n  private sortData(data: any[], column: IpiTableColumn): any[] {\n    if (!data || data.length === 0 || !Array.isArray(data)) {\n      return [];\n    }\n\n    if (column) {\n      this.sortByProperty(data, column);\n    }\n\n    return data;\n  }\n\n  private sortByProperty(arr: any, column: any): number | void {\n    if (this.sortDirection === 'desc') {\n      this.sortReverse(arr, column);\n      return;\n    }\n\n    return arr.sort((a: any, b: any) => {\n      let valueA = a[column.value];\n      let valueB = b[column.value];\n\n      let access = column.value;\n\n      if (access.indexOf('.') !== -1 && column.type !== this.TableColumnType.NumberMath) {\n        valueA = this.getAccessIfColumnValueIsObject(a, column);\n        valueB = this.getAccessIfColumnValueIsObject(b, column);\n      } else {\n        if (typeof valueA === 'string' && valueB !== undefined) {\n          valueA = valueA.toLowerCase();\n          valueB = valueB.toLowerCase();\n        }\n      }\n\n      if (typeof valueA === 'number' && typeof valueB === 'number') {\n        return valueA - valueB;\n      }\n  \n      if (!valueA && valueB) return -1;\n      if (valueA && !valueB) return 1;\n\n      if (!valueA && !valueB) return 0;\n\n      if (valueA < valueB) return -1;\n      if (valueA > valueB) return 1;\n\n      return 0;\n    });\n  }\n\n  private sortReverse(arr: any, column: any) {\n    return arr.sort((a: any, b: any) => {\n      let valueA = a[column.value];\n      let valueB = b[column.value];\n\n      let access = column.value;\n\n      if (access.indexOf('.') !== -1 && column.type !== this.TableColumnType.NumberMath) {\n        valueA = this.getAccessIfColumnValueIsObject(a, column);\n        valueB = this.getAccessIfColumnValueIsObject(b, column);\n      } else {\n        if (typeof valueA === 'string' && valueB !== undefined) {\n          valueA = valueA.toLowerCase();\n          valueB = valueB.toLowerCase();\n        }\n      }\n\n      if (typeof valueA === 'number' && typeof valueB === 'number') {\n        return valueB - valueA;\n      }\n\n      if (!valueA && valueB) return 1;\n      if (valueA && !valueB) return -1;\n\n      if (!valueA && !valueB) return 0;\n\n      if (valueA < valueB) return 1;\n      if (valueA > valueB) return -1;\n\n      return 0;\n    });\n  }\n\n  private getAccessIfColumnValueIsObject(row: any, column: IpiTableColumn): any {\n    if (!column.value || column.value === null) {\n      return undefined;\n    }\n\n    const keys = column.value.split('.');\n\n    let access = row[keys[0]];\n\n    for (let i = 1; i < keys.length; i++) {\n      if (access && keys[i] in access) {\n        access = access[keys[i]];\n      } else {\n        return undefined;\n      }\n    }\n\n    return access;\n  }\n\n  private buildPaginationSelectDependecies(): void {\n    const formControls: PageFormControls = {\n      pageSize: this.formBuilder.control({ label: this.pageSize.toString(), value: this.pageSize }, { nonNullable: true, validators: [ Validators.required ] })\n    };\n\n    this.formGroup = this.formBuilder.group(formControls);\n\n    const selectData = this.pageSizeOptions.map(item => ({\n      label: item.toString(),\n      value: item\n    }));\n\n    this.pageSizeSelectOptions = {\n      label: '',\n      data: selectData,\n      formGroup: this.formGroup,\n      formControlName: 'pageSize'\n    };\n\n    this.subscribeToFormValueChanges();\n  }\n\n  private subscribeToFormValueChanges(): void {\n    this.formGroup.controls.pageSize.valueChanges.subscribe((value) => {\n      if (this.pageSize === value.value) {\n        return;\n      }\n\n      const currentPageFirstRowIndex = this.currentPage * this.pageSize;\n      this.pageSize = value.value;\n\n      this.currentPage = Math.floor(currentPageFirstRowIndex / this.pageSize);\n\n      const start = this.currentPage * this.pageSize;\n      const end = Math.min(this._dataLength, start + this.pageSize);\n\n      if (this.serverSide) {\n        this.tableChange.emit({ from: start, to: end, filter: this.filter, sort: { columnValue: this.columns[this.sortIndex].value, sortDirection: this.sortDirection } });\n      }\n\n      this.calculateTotalPages();\n      this.updateVisibleRange(start, end);\n\n      setTimeout(() => {\n        this.changeDetectorRef.detectChanges();\n      });\n    });\n  }\n\n  private calculatePages(): void {\n    const start = this.currentPage * this.pageSize;\n    const end = Math.min(this._dataLength, start + this.pageSize);\n\n    if (!this.serverSide) {\n      this.updateVisibleRange(start, end);\n    } else {\n      this.tableChange.emit({ from: start, to: end, filter: this.filter, sort: { columnValue: this.columns[this.sortIndex].value, sortDirection: this.sortDirection } });\n    }\n\n    this.changeDetectorRef.detectChanges();\n  }\n}\n","<div class=\"container\">\n    <table>\n        <thead>\n          <tr>\n            @for (column of columns; track $index) {\n                <th [ngStyle]=\"{ width: column.width ? column.width : '' }\">\n                        <div class=\"cell\">\n                            <span>{{ column.label }}</span>\n    \n                            @if (column.type !== TableColumnType.Actions && sortable) {\n                                <div class=\"arranger\" (click)=\"sortColumn(column)\">\n                                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 12 12\" fill=\"none\">\n                                        <path d=\"M3.11445 5.50005H8.88795C9.31895 5.50005 9.54795 4.99005 9.26145 4.66755L6.37495 1.42005C6.32813 1.3672 6.27063 1.32489 6.20624 1.29591C6.14186 1.26694 6.07205 1.25195 6.00145 1.25195C5.93084 1.25195 5.86104 1.26694 5.79666 1.29591C5.73227 1.32489 5.67477 1.3672 5.62795 1.42005L2.74045 4.66755C2.45395 4.99005 2.68295 5.50005 3.11445 5.50005ZM5.62745 10.5795C5.67427 10.6324 5.73177 10.6747 5.79616 10.7037C5.86054 10.7327 5.93034 10.7476 6.00095 10.7476C6.07155 10.7476 6.14136 10.7327 6.20574 10.7037C6.27013 10.6747 6.32763 10.6324 6.37445 10.5795L9.26095 7.33205C9.54795 7.01005 9.31895 6.50005 8.88745 6.50005H3.11445C2.68345 6.50005 2.45445 7.01005 2.74095 7.33255L5.62745 10.5795Z\" fill=\"#C6C6C6\"/>\n                                    </svg>\n                                </div>\n                            }\n                        </div>\n                </th>\n            }\n          </tr>\n        </thead>\n\n        <tbody [ngClass]=\"{ 'is-loading': this.isLoading }\">\n            @for (row of getPageData(); track $index) { \n                <tr>\n                    @for (column of columns; track $index) {\n                        <td tabindex=\"-1\">\n                            @switch (column.type) {\n                                @case (undefined) {\n                                    <ng-container *ngTemplateOutlet=\"textCell; context: { row, column, $index }\"></ng-container>\n                                }\n\n                                @case (TableColumnType.Number) {\n                                    <ng-container *ngTemplateOutlet=\"numberCell; context: { row, column }\"></ng-container>\n                                }\n\n                                @case (TableColumnType.Currency) {\n                                    <ng-container *ngTemplateOutlet=\"currencyCell; context: { row, column }\"></ng-container>\n                                }\n\n                                @case (TableColumnType.NumberMath) {\n                                    <ng-container *ngTemplateOutlet=\"numberMathCell; context: { row, column }\"></ng-container>\n                                }\n\n                                @case (TableColumnType.Date) {\n                                    <ng-container *ngTemplateOutlet=\"dateCell; context: { row, column }\"></ng-container>\n                                }\n\n                                @case (TableColumnType.Chip) {\n                                    <ng-container *ngTemplateOutlet=\"chipCell; context: { row, column }\"></ng-container>\n                                }\n\n                                @case (TableColumnType.Checkbox) {\n                                    <ng-container *ngTemplateOutlet=\"checkboxCell; context: { row, column }\"></ng-container>\n                                }\n\n                                @case (TableColumnType.Actions) {\n                                    <ng-container *ngTemplateOutlet=\"actionCell; context: { row, column }\"></ng-container>\n                                }\n                            }\n                        </td>\n                    }\n                </tr>\n            }\n        </tbody>\n    </table>\n\n    @if (filter && filteredData && filteredData.length === 0) {\n        <div class=\"row no-data\">\n            <span>No data matching the filter:</span>\n\n            <span>\"{{ filter }}\"</span>\n        </div>\n    }\n\n    @if (!filter && data && data.length === 0) {\n        <div class=\"row no-data\">No data available.</div>\n    }\n\n    @if (pageable && getPageData().length !== 0) {\n        <div class=\"paging\">\n            <div class=\"visible-range\">{{ visibleRange }}</div>\n\n            <ng-container *ngTemplateOutlet=\"pagePicker; context: { totalPages: totalPages }\"></ng-container>\n\n            <div class=\"page-size-option-picker\">\n                <span>Items per page:</span>\n\n                <ipi-select class=\"table\" [options]=\"pageSizeSelectOptions\"></ipi-select>\n            </div>\n        </div>\n    }\n</div>\n\n<ng-template #textCell let-row=\"row\" let-column=\"column\" let-index=\"$index\">\n    <div class=\"cell\"\n        [ngClass]=\"getClass(row, column)\"\n        [attr.contenteditable]=\"column.editable\"\n        (keyup)=\"cellEdit($event, column.value, index)\">\n\n            {{ column.prefix ? column.prefix : '' }}{{ getDescendantProp(row, column) }}{{ column.suffix ? column.suffix : '' }}\n    </div>\n</ng-template>\n\n<ng-template #dateCell let-row=\"row\" let-column=\"column\">\n    <div class=\"cell\"\n        [ngClass]=\"getClass(row, column)\">\n        {{ formatDate(getDescendantProp(row, column), column.dateFormat) }}\n    </div>\n</ng-template>\n\n<ng-template #currencyCell let-row=\"row\" let-column=\"column\">\n    <div class=\"cell\"\n        [ngClass]=\"getClass(row, column)\"\n        [ngStyle]=\"{ width: column.width ? column.width : '' }\">\n\n        @if (getDescendantProp(row, column) !== undefined) {\n            {{ column.prefix ? column.prefix : '' }}{{ (getDescendantProp(row, column) / 100) | number }}\n        }\n    </div>\n</ng-template>\n\n<ng-template #numberCell let-row=\"row\" let-column=\"column\" let-index=\"i\">\n    <div class=\"cell\"\n        [ngClass]=\"getClass(row, column)\"\n        [attr.contenteditable]=\"column.editable\"\n        (keyup)=\"cellEdit($event, column.value, index)\">\n\n            {{ column.prefix ? column.prefix : '' }}{{ getDescendantProp(row, column) | number}}{{ column.suffix ? column.suffix : '' }}\n    </div>\n</ng-template>\n\n<ng-template #numberMathCell let-row=\"row\" let-column=\"column\" let-index=\"i\">\n    <div class=\"cell\"\n        [ngClass]=\"getClass(row, column)\"\n        [attr.contenteditable]=\"column.editable\"\n        (keyup)=\"cellEdit($event, column.value, index)\">\n\n            {{ column.prefix ? column.prefix : '' }}{{ getDescendantProp(row, column) | number}}{{ column.suffix ? column.suffix : '' }}\n    </div>\n</ng-template>\n\n<ng-template #actionCell let-row=\"row\" let-column=\"column\">\n    <div class=\"cell actions\">\n\n        @for (action of column.singleActions; track $index) {\n            @if (handleActionShow(action, row, column)) {\n                <div IpiTooltip (click)=\"action.execute && action.execute(row)\" [ipiTooltip]=\"action.label\" [tooltipPosition]=\"tooltipPosition.Above\" class=\"action-icon-wrapper\" [ngClass]=\"{ 'disabled': action.disabled }\">\n                    <ipi-img [src]=\" 'assets/img/' + action.icon\" [ngClass]=\"action.class\" [ariaLabel]=\"'Action icon for ' + action.label\"></ipi-img>\n                </div>\n            }\n        }\n\n        @if (column.multipleActions) {\n            <div class=\"action-icon-wrapper\" #moreActionsList [ngClass]=\"{ 'opened': row.isDropdown }\" (click)=\"toggleActionDropdown(row, $event)\">\n                <svg class=\"multiple-action-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\">\n                    <path d=\"M10.3047 8C10.3047 8.34612 10.2021 8.68446 10.0098 8.97225C9.81747 9.26004 9.54416 9.48434 9.22438 9.61679C8.90461 9.74924 8.55275 9.7839 8.21328 9.71638C7.87381 9.64885 7.56199 9.48218 7.31725 9.23744C7.07251 8.9927 6.90584 8.68088 6.83831 8.34141C6.77079 8.00194 6.80545 7.65008 6.9379 7.33031C7.07035 7.01053 7.29465 6.73722 7.58244 6.54493C7.87023 6.35264 8.20857 6.25 8.55469 6.25C9.01868 6.25046 9.46353 6.43498 9.79162 6.76307C10.1197 7.09116 10.3042 7.53601 10.3047 8ZM8.55469 4.75C8.90081 4.75 9.23915 4.64737 9.52694 4.45507C9.81472 4.26278 10.039 3.98947 10.1715 3.6697C10.3039 3.34993 10.3386 2.99806 10.2711 2.65859C10.2035 2.31913 10.0369 2.00731 9.79213 1.76256C9.54738 1.51782 9.23556 1.35115 8.8961 1.28363C8.55663 1.2161 8.20476 1.25076 7.88499 1.38321C7.56522 1.51566 7.29191 1.73997 7.09962 2.02775C6.90732 2.31554 6.80469 2.65388 6.80469 3C6.80515 3.46399 6.98967 3.90884 7.31776 4.23693C7.64585 4.56502 8.0907 4.74954 8.55469 4.75ZM8.55469 11.25C8.20857 11.25 7.87023 11.3526 7.58244 11.5449C7.29465 11.7372 7.07035 12.0105 6.9379 12.3303C6.80545 12.6501 6.77079 13.0019 6.83831 13.3414C6.90584 13.6809 7.07251 13.9927 7.31725 14.2374C7.56199 14.4822 7.87381 14.6489 8.21328 14.7164C8.55275 14.7839 8.90461 14.7492 9.22438 14.6168C9.54416 14.4843 9.81747 14.26 10.0098 13.9722C10.2021 13.6845 10.3047 13.3461 10.3047 13C10.3042 12.536 10.1197 12.0912 9.79162 11.7631C9.46353 11.435 9.01868 11.2505 8.55469 11.25Z\" fill=\"#5D6068\"/>\n                </svg>\n            </div>\n        }\n\n    </div>\n\n    @if (row.isDropdown) {\n        <ng-container class=\"dropdown-element\" *ngTemplateOutlet=\"multipleActionsDropdown; context: { row, column }\"></ng-container>\n    }\n</ng-template>\n\n<ng-template #chipCell let-row=\"row\" let-column=\"column\">\n    <div class=\"cell chip\">\n        @if (getChipLabel(row, column)) {\n            <ipi-chip [ngClass]=\"getClass(row, column)\"> {{ getChipLabel(row, column) }}</ipi-chip>\n        }\n    </div>\n</ng-template>\n\n<ng-template #checkboxCell let-row=\"row\" let-column=\"column\">\n    <div class=\"cell checkbox\">\n        <ipi-checkbox [checked]=\"getCheckboxState(row, column)\" [disabled]=\"true\"></ipi-checkbox>\n    </div>\n</ng-template>\n\n<ng-template #multipleActionsDropdown let-row=\"row\" let-column=\"column\">\n    <div #multipleActionsDropdownElement #dropdownElement class=\"more-actions-dropdown\">\n        @for (action of column.multipleActions; track $index) {\n\n            @if (handleActionShow(action, row, column)) {\n                <div class=\"dropdown-row\" (click)=\"action.execute && action.execute(row)\">\n                    <ipi-img [src]=\"'assets/img/' + action.icon\" [ngClass]=\"action.class\" [ariaLabel]=\"'Action icon for ' + action.label\"></ipi-img>\n\n                    <span>{{ action.label }}</span>\n                </div>\n            }\n\n        }\n    </div>\n</ng-template>\n\n<ng-template #pagePicker let-totalPages=\"totalPages\">\n    <div class=\"page-picker\">\n        <!-- If page one should be visible -->\n        @if (currentPage + 1 >= 3) {\n            <span (click)=\"goToPage(0)\">1</span>\n            <span class=\"style-excluded\">...</span>\n        }\n\n        <!-- Middle part of the page-picker -->\n        <ng-container *ngTemplateOutlet=\"page; context: { page: currentPage - 1 } \"></ng-container>\n        <ng-container *ngTemplateOutlet=\"page; context: { page: currentPage, class: 'highlighted' } \"></ng-container>\n        <ng-container *ngTemplateOutlet=\"page; context: { page: currentPage + 1 } \"></ng-container>\n\n        <!-- If last page should be visible -->\n        @if (currentPage + 1 <= totalPages - 2) {\n            <span class=\"style-excluded\">...</span>\n            <span (click)=\"goToPage(totalPages - 1)\">{{ totalPages }}</span>\n        }\n\n    </div>\n</ng-template>\n\n<ng-template #page let-page=\"page\" let-class=\"class\">\n    @if (page >= 0 && page < totalPages) {\n        <span [ngClass]=\"class\" (click)=\"goToPage(page)\">{{ page + 1 }}</span>\n    }\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;IA4BY;AAAZ,CAAA,UAAY,kBAAkB,EAAA;AAC5B,IAAA,kBAAA,CAAA,kBAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAI;AACJ,IAAA,kBAAA,CAAA,kBAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAI;AACJ,IAAA,kBAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAQ;AACR,IAAA,kBAAA,CAAA,kBAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAI;AACJ,IAAA,kBAAA,CAAA,kBAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM;AACN,IAAA,kBAAA,CAAA,kBAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,GAAA,YAAU;AACV,IAAA,kBAAA,CAAA,kBAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAO;AACP,IAAA,kBAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAQ;AACV,CAAC,EATW,kBAAkB,KAAlB,kBAAkB,GAS7B,EAAA,CAAA,CAAA;MAgDY,iBAAiB,CAAA;AAE5B,IAAA,WAAA,CACU,SAAoB,EACpB,WAAwB,EACxB,iBAAoC,EAAA;QAFpC,IAAS,CAAA,SAAA,GAAT,SAAS;QACT,IAAW,CAAA,WAAA,GAAX,WAAW;QACX,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;QAIG,IAAe,CAAA,eAAA,GAA2B,IAAI;QAYnE,IAAS,CAAA,SAAA,GAAG,CAAC;QACb,IAAQ,CAAA,QAAA,GAAG,IAAI;QACf,IAAa,CAAA,aAAA,GAAmB,KAAK;QAErC,IAAQ,CAAA,QAAA,GAAG,EAAE;QACb,IAAW,CAAA,WAAA,GAAG,CAAC;QACf,IAAQ,CAAA,QAAA,GAAG,KAAK;AAChB,QAAA,IAAA,CAAA,eAAe,GAAG,CAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAE;AAE1C,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAkB;QAEnD,IAAe,CAAA,eAAA,GAAG,eAAe;QAEjC,IAAe,CAAA,eAAA,GAAG,kBAAkB;QAUpC,IAAU,CAAA,UAAA,GAAY,KAAK;QAtC9B,iBAAiB,CAAC,MAAM,EAAE;;AA6CvB,IAAA,OAAO,CAAC,KAAU,EAAA;;AAEvB,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,eAAe,EAAE,aAAa,IAAI,KAAK,CAAC,MAAM,EAAE;AACxE,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,GAAG,KAAK;;AAG1C,YAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;;;IAKnC,QAAQ,GAAA;AAEb,QAAA,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE;AACrC,YAAA,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE;gBAC3E,IAAI,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE;gBAE1D,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,GAAG,EAAE;oBAC5C,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,cAAe,CAAC,SAAS;;AAGjD,gBAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,CAAI,EAAA,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,MAAO,IAAI;gBAEtF;;;;IAMC,QAAQ,GAAA;AAEb,QAAA,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE;AACrC,YAAA,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE;gBAC3E,IAAI,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE;gBAE1D,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,GAAG,EAAE;oBAC5C,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,cAAe,CAAC,UAAU;;gBAGlD,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,WAAW;AAEpE,gBAAA,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,GAAG,EAAE,GAAG,aAAa;gBAE5H,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,GAAG,kBAAkB,GAAG,EAAE;AACnG,gBAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAI,IAAI;gBAE5D;;;;IAKC,eAAe,GAAA;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ;AAC7C,QAAA,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ;QAE/B,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACjC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;;AAGnI,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,CAAC,gCAAgC,EAAE;;;AAIpC,IAAA,WAAW,CAAC,OAAsB,EAAA;AACvC,QAAA,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,YAAY,KAAK,KAAK,EAAE;AACvE,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;;;AAIvC,QAAA,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE;AACnD,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI;gBAE7B,IAAI,CAAC,cAAc,EAAE;;iBAChB;AACL,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,IAAI;gBAE/D,IAAI,CAAC,cAAc,EAAE;gBAErB,UAAU,CAAC,MAAK;AACd,oBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;AACtD,iBAAC,CAAC;;YAGJ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM;;AAGjF,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;;AAEvD,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE;gBACrC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM;gBAE3C,UAAU,CAAC,MAAK;oBACd,IAAI,CAAC,aAAa,EAAE;AACtB,iBAAC,CAAC;;iBAEG;gBACL,UAAU,CAAC,MAAK;AACd,oBAAA,IAAI,CAAC,WAAW,GAAG,CAAC;oBAEpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;AAC9K,iBAAC,CAAC;;;AAKN,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,YAAY,KAAK,SAAS,EAAE;YACzE,IAAI,CAAC,gCAAgC,EAAE;;QAGzC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ;AAC7C,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE3D,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC;AAEjC,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;;IAGjC,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,OAAO,EAAE;;AAGX,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,OAAO,IAAI,CAAC,YAAY;;AAG1B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ;AAC9C,YAAA,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,QAAQ;YAEjC,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;;QAG5C,OAAO,IAAI,CAAC,YAAY;;IAGnB,kBAAkB,CAAC,KAAa,EAAE,GAAW,EAAA;AAClD,QAAA,IAAI,CAAC,YAAY,GAAG,CAAA,QAAA,EAAY,KAAK,GAAG,CAAE,CAAO,IAAA,EAAA,GAAG,CAAO,IAAA,EAAA,IAAI,CAAC,WAAW,UAAU;AAErF,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;;IAGjC,mBAAmB,GAAA;AACxB,QAAA,IAAI,CAAC,UAAU,GAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;;AAGzD,IAAA,QAAQ,CAAC,IAAY,EAAA;AAC1B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACvB,IAAI,CAAC,cAAc,EAAE;;IAGhB,gBAAgB,GAAA;QACrB,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,cAAc,EAAE;;IAGhB,YAAY,GAAA;QACjB,IAAI,CAAC,WAAW,EAAE;QAClB,IAAI,CAAC,cAAc,EAAE;;IAGhB,aAAa,GAAA;AAClB,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;QACpB,IAAI,CAAC,cAAc,EAAE;;IAGhB,YAAY,GAAA;QACjB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC;QACtC,IAAI,CAAC,cAAc,EAAE;;AAGhB,IAAA,QAAQ,CAAC,KAAoB,EAAE,MAAc,EAAE,mBAA2B,EAAA;AAC/E,QAAA,MAAM,SAAS,GAAG,mBAAmB,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE1E,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;AAC9B,YAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAAI,KAAK,CAAC,MAAyB,CAAC,SAAS;;AAC5E,aAAA;YACL,IAAI,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;AAElC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACxC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3B,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;;qBACnB;AACL,oBAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAI,KAAK,CAAC,MAAyB,CAAC,SAAS;;;;;AAM/D,IAAA,UAAU,CAAC,YAAoB,EAAE,iBAA0C,GAAA,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAA;AAC7I,QAAA,OAAO,UAAU,CAAC,YAAY,EAAE,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC;;IAG1G,QAAQ,CAAC,GAAQ,EAAE,MAAsB,EAAA;AAC9C,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACjB,YAAA,OAAO,EAAE;;AAGX,QAAA,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE;YACpC,OAAO,MAAM,CAAC,KAAK;;QAGrB,OAAO;AACL,YAAA,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG;SACtD;;IAGI,iBAAiB,CAAC,GAAQ,EAAE,MAAsB,EAAA;QACvD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;YAC1C,OAAO,MAAM,CAAC,KAAK;;;QAIrB,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AAClC,YAAA,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;;QAGjC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;AACnD,YAAA,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;;AAG1B,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG;AAC1B,aAAA,MAAM,CAAC,CAAC,IAAS,EAAE,IAAY,KAAI;AAClC,YAAA,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AACxB,gBAAA,OAAO,IAAI,CAAC,IAAI,CAAC;;iBACZ;AACL,gBAAA,OAAO,SAAS;;SAEnB,EAAE,GAAG,CAAC;;IAGJ,YAAY,CAAC,GAAQ,EAAE,MAAsB,EAAA;AAClD,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YACrB,OAAO,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC;;AAG1E,QAAA,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;;IAGvD,gBAAgB,CAAC,GAAQ,EAAE,MAAsB,EAAA;QACtD,IAAI,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC;AAE/C,QAAA,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;AAC9B,YAAA,OAAO,KAAK;;AAGd,QAAA,OAAO,KAAK;;AAGP,IAAA,gBAAgB,CAAC,MAAc,EAAE,GAAQ,EAAE,MAAuB,EAAA;AACvE,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9C,YAAA,OAAO,IAAI;;QAGf,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,KAAI;AACvC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC;AAE3E,YAAA,MAAM,aAAa,GAAG,CAAC,CAAC,QAAQ;AAEhC,YAAA,IAAI,SAAS,CAAC,MAAM,IAAI,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,aAAa,EAAE;AAClE,gBAAA,OAAO,aAAa;;YAGtB,OAAO,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC5C,SAAC,CAAC;;AAGG,IAAA,UAAU,CAAC,MAAW,EAAE,mBAAmB,GAAG,IAAI,EAAA;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB;;AAGF,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACjB;;QAGF,IAAI,mBAAmB,EAAE;AAEvB,YAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAClD,gBAAA,QAAQ,IAAI,CAAC,aAAa;AACxB,oBAAA,KAAK,KAAK;AACR,wBAAA,IAAI,CAAC,aAAa,GAAG,MAAM;wBAC3B;AACF,oBAAA,KAAK,MAAM;AACT,wBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;wBAC1B;AACF,oBAAA;AACE,wBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;wBAC1B;;;iBAEC;AACL,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;gBAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;;;AAKjD,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,WAAW,GAAG,CAAC;YAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ;AAC9C,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;YAE7D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;;aAC7J;YACL,IAAI,CAAC,aAAa,EAAE;YAEpB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC;;AAG1C,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,GAAG,KAAK;;AAG1C,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;;AAGjC,IAAA,MAAM,oBAAoB,CAAC,GAAQ,EAAE,KAAU,EAAA;;QAEpD,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,IAAI,SAAmB;AAEvB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,GAAG,KAAK;;AAG1C,QAAA,GAAG,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,UAAU;AAEhC,QAAA,IAAI,CAAC,gBAAgB,GAAG,GAAG;AAE3B,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;AAEtC,QAAA,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE;YAClC,IAAI,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AAChD,gBAAA,SAAS,GAAG,CAAC,CAAC,aAAa,CAAC,qBAAqB,EAAE;;;AAIvD,QAAA,IAAG,IAAI,CAAC,eAAe,EAAE;YACvB,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,GAAG,EAAE;gBAC5C,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,cAAe,CAAC,SAAS;gBAC/C,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,cAAe,CAAC,UAAU;;YAGlD,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,WAAW;AAEpE,YAAA,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,GAAG,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,GAAG,EAAE,GAAG,aAAa;YAE5H,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,GAAG,kBAAkB,GAAG,EAAE;AACnG,YAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI;AAC3D,YAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,CAAI,EAAA,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,MAAO,IAAI;;;IAIlF,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACxC;;AAGF,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,IAAG;AAC5B,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;gBACpE;;AAGF,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAG;gBACtB,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC;AACxD,gBAAA,GAAG,CAAC,MAAM,CAAC,KAAY,CAAC,GAAG,MAAM;AACnC,aAAC,CAAC;AACJ,SAAC,CAAC;;IAGI,uBAAuB,CAAC,GAAQ,EAAE,MAAW,EAAA;AACnD,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CACrC,sCAAsC,EACtC,CAAC,KAAU,KAAI;AACb,YAAA,IAAI,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAEzD,YAAA,OAAO,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;AACrE,SAAC,CACF;QAED,IAAI,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAU,OAAA,EAAA,UAAU,CAAG,CAAA,CAAA,CAAC;AAC9C,QAAA,IAAI,MAAM,GAAG,EAAE,EAAE;AAEjB,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC3B,YAAA,OAAO,MAAM;;QAGf,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC;;IAGpC,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACxC,YAAA,OAAO,EAAE;;QAGX,IAAI,aAAa,GAAU,EAAG;AAE9B,QAAA,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;AACzB,YAAA,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;AAC/B,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;oBAAE;;gBAErB,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;gBAE9B,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;oBACvF,MAAM,GAAG,IAAI,CAAC,8BAA8B,CAAC,GAAG,EAAE,MAAM,CAAC;;AAG3D,gBAAA,IAAI,MAAM,KAAK,SAAS,EAAE;oBACxB;;gBAGF,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;AAE5D,gBAAA,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE;AACvD,oBAAA,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;oBAEvB;;;;AAKN,QAAA,OAAO,aAAa;;IAGd,QAAQ,CAAC,IAAW,EAAE,MAAsB,EAAA;AAClD,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACtD,YAAA,OAAO,EAAE;;QAGX,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC;;AAGnC,QAAA,OAAO,IAAI;;IAGL,cAAc,CAAC,GAAQ,EAAE,MAAW,EAAA;AAC1C,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,MAAM,EAAE;AACjC,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC;YAC7B;;QAGF,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,KAAI;YACjC,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC5B,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AAE5B,YAAA,IAAI,MAAM,GAAG,MAAM,CAAC,KAAK;YAEzB,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;gBACjF,MAAM,GAAG,IAAI,CAAC,8BAA8B,CAAC,CAAC,EAAE,MAAM,CAAC;gBACvD,MAAM,GAAG,IAAI,CAAC,8BAA8B,CAAC,CAAC,EAAE,MAAM,CAAC;;iBAClD;gBACL,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,EAAE;AACtD,oBAAA,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE;AAC7B,oBAAA,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE;;;YAIjC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;gBAC5D,OAAO,MAAM,GAAG,MAAM;;YAGxB,IAAI,CAAC,MAAM,IAAI,MAAM;gBAAE,OAAO,CAAC,CAAC;YAChC,IAAI,MAAM,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,CAAC;AAE/B,YAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,CAAC;YAEhC,IAAI,MAAM,GAAG,MAAM;gBAAE,OAAO,CAAC,CAAC;YAC9B,IAAI,MAAM,GAAG,MAAM;AAAE,gBAAA,OAAO,CAAC;AAE7B,YAAA,OAAO,CAAC;AACV,SAAC,CAAC;;IAGI,WAAW,CAAC,GAAQ,EAAE,MAAW,EAAA;QACvC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,KAAI;YACjC,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC5B,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AAE5B,YAAA,IAAI,MAAM,GAAG,MAAM,CAAC,KAAK;YAEzB,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;gBACjF,MAAM,GAAG,IAAI,CAAC,8BAA8B,CAAC,CAAC,EAAE,MAAM,CAAC;gBACvD,MAAM,GAAG,IAAI,CAAC,8BAA8B,CAAC,CAAC,EAAE,MAAM,CAAC;;iBAClD;gBACL,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,EAAE;AACtD,oBAAA,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE;AAC7B,oBAAA,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE;;;YAIjC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;gBAC5D,OAAO,MAAM,GAAG,MAAM;;YAGxB,IAAI,CAAC,MAAM,IAAI,MAAM;AAAE,gBAAA,OAAO,CAAC;YAC/B,IAAI,MAAM,IAAI,CAAC,MAAM;gBAAE,OAAO,CAAC,CAAC;AAEhC,YAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,CAAC;YAEhC,IAAI,MAAM,GAAG,MAAM;AAAE,gBAAA,OAAO,CAAC;YAC7B,IAAI,MAAM,GAAG,MAAM;gBAAE,OAAO,CAAC,CAAC;AAE9B,YAAA,OAAO,CAAC;AACV,SAAC,CAAC;;IAGI,8BAA8B,CAAC,GAAQ,EAAE,MAAsB,EAAA;QACrE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE;AAC1C,YAAA,OAAO,SAAS;;QAGlB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;QAEpC,IAAI,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEzB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE;gBAC/B,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;iBACnB;AACL,gBAAA,OAAO,SAAS;;;AAIpB,QAAA,OAAO,MAAM;;IAGP,gCAAgC,GAAA;AACtC,QAAA,MAAM,YAAY,GAAqB;AACrC,YAAA,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAE,UAAU,CAAC,QAAQ,CAAE,EAAE;SACzJ;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC;AAErD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,KAAK;AACnD,YAAA,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE;AACtB,YAAA,KAAK,EAAE;AACR,SAAA,CAAC,CAAC;QAEH,IAAI,CAAC,qBAAqB,GAAG;AAC3B,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,YAAA,eAAe,EAAE;SAClB;QAED,IAAI,CAAC,2BAA2B,EAAE;;IAG5B,2BAA2B,GAAA;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;YAChE,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,KAAK,EAAE;gBACjC;;YAGF,MAAM,wBAAwB,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ;AACjE,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK;AAE3B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,GAAG,IAAI,CAAC,QAAQ,CAAC;YAEvE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ;AAC9C,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;AAE7D,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;;YAGpK,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC;YAEnC,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;AACxC,aAAC,CAAC;AACJ,SAAC,CAAC;;IAGI,cAAc,GAAA;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ;AAC9C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;AAE7D,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,YAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC;;aAC9B;YACL,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;;AAGpK,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;;8GAtoB7B,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,yxBCrF9B,2lXAiOA,EAAA,MAAA,EAAA,CAAA,g1JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDxJI,OAAO,EACP,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,OAAO,+EACP,WAAW,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,gBAAgB,EAChB,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,gBAAgB,sGAChB,iBAAiB,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,kBAAkB,EAClB,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,mBAAmB,oGACnB,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAIX,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAlB7B,SAAS;iCACI,IAAI,EAAA,QAAA,EACN,WAAW,EAGZ,OAAA,EAAA;wBACP,OAAO;wBACP,OAAO;wBACP,WAAW;wBACX,gBAAgB;wBAChB,gBAAgB;wBAChB,iBAAiB;wBACjB,kBAAkB;wBAClB,mBAAmB;wBACnB,oBAAoB;AACrB,qBAAA,EAAA,QAAA,EAAA,2lXAAA,EAAA,MAAA,EAAA,CAAA,g1JAAA,CAAA,EAAA;wIAY6B,eAAe,EAAA,CAAA;sBAA5C,SAAS;uBAAC,iBAAiB;gBAEK,eAAe,EAAA,CAAA;sBAA/C,YAAY;uBAAC,iBAAiB;gBAEtB,IAAI,EAAA,CAAA;sBAAZ;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBAEQ,MAAM,EAAA,CAAA;sBAAd;gBAEQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,aAAa,EAAA,CAAA;sBAArB;gBAEQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,QAAQ,EAAA,CAAA;sBAAhB;gBACQ,eAAe,EAAA,CAAA;sBAAvB;gBAES,WAAW,EAAA,CAAA;sBAApB;gBAqBM,OAAO,EAAA,CAAA;sBADb,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;gBAanC,QAAQ,EAAA,CAAA;sBADd,YAAY;uBAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC;gBAmBpC,QAAQ,EAAA,CAAA;sBADd,YAAY;uBAAC,eAAe;;;AErK/B;;AAEG;;;;"}