{"version":3,"file":"ipi-soft-ng-components-listbox.mjs","sources":["../../../../projects/ipi-soft/ng-components/listbox/src/listbox.component.ts","../../../../projects/ipi-soft/ng-components/listbox/src/listbox.component.html","../../../../projects/ipi-soft/ng-components/listbox/ipi-soft-ng-components-listbox.ts"],"sourcesContent":["import { Component, SimpleChanges, ViewChild, ElementRef, ChangeDetectorRef, Input, Output, EventEmitter, HostListener } from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { FormGroup, AbstractControl } from '@angular/forms';\n\nimport { Subscription, debounceTime, fromEvent, tap } from 'rxjs';\n\nimport { IpiSelectData } from '@ipi-soft/ng-components/select';\nimport { IpiTooltipDirective, TooltipPosition } from '@ipi-soft/ng-components/tooltip';\nimport { IpiControlErrors } from '@ipi-soft/ng-components/input';\n\nexport interface IpiListBoxOptions {\n  data: IpiSelectData[];\n  label?: string;\n  tooltip?: string;\n  formGroup?: FormGroup;\n  formControlName?: string;\n  errors?: IpiControlErrors;\n}\n\nenum MouseDirection {\n  Up,\n  Down\n}\n\ninterface MouseCustomData {\n  hoverItemIndex: number;\n  targetItemIndex: number;\n  mouseDirection: MouseDirection;\n}\n\n@Component({\n  selector: 'ipi-listbox',\n  templateUrl: './listbox.component.html',\n  styleUrls: ['./listbox.component.css'],\n  imports: [\n    NgClass,\n    IpiTooltipDirective,\n  ]\n})\n\nexport class IpiListboxComponent {\n\n  constructor (\n    private elementRef: ElementRef,\n    private changeDetectorRef: ChangeDetectorRef) {\n      this.changeDetectorRef.detach();\n  }\n\n  @ViewChild('listbox') listbox: ElementRef<HTMLDivElement> | null = null;\n\n  @Input() options!: IpiListBoxOptions;\n\n  @Output() selectChange = new EventEmitter<IpiSelectData[]>();\n\n  public tooltipPosition = TooltipPosition;\n\n  public controlError!: string;\n  public controlInvalid = false;\n  public control: AbstractControl | null = null;  \n  public controlSubscription: Subscription | null = null;\n\n  private documentKeyupValue = '';\n  private documentKeyupValueResetTime = 1000;\n  private documentKeyDownSubscription!: Subscription;\n\n  private isMetaHold = false;\n  private isShiftHold = false;\n\n  private lastSelectedItemIndex = 0;\n  private lastSelectedItemIndexOnShiftHold = 0;\n\n  private selectedItems!: (IpiSelectData | null)[];\n\n  public ngOnInit(): void {\n    this.control = this.getControl();\n  \n    this.selectedItems = new Array(this.options.data.length).fill(null);\n\n    this.changeDetectorRef.detectChanges();\n  }\n\n  public ngAfterViewInit(): void {\n    this.documentKeyDownSubscription = fromEvent<KeyboardEvent>(this.elementRef.nativeElement, 'keydown')\n      .pipe(\n        tap(event => { this.keydown(event) }),\n        debounceTime(this.documentKeyupValueResetTime))\n      .subscribe(() => { this.documentKeyupValue = '' });\n  }\n\n  public ngOnDestroy(): void {\n    this.documentKeyDownSubscription.unsubscribe();\n\n    if (this.controlSubscription) {\n      this.controlSubscription?.unsubscribe();\n    }\n  }\n\n  public ngOnChanges(changes: SimpleChanges): void {\n    if (changes['options'] && changes['options'].currentValue['data'] && this.selectedItems) {\n      this.selectedItems.length = 0;\n\n      this.changeDetectorRef.detectChanges();\n    }\n  }\n\n  public mousedown(targetItem: HTMLDivElement): void {\n    const items = this.listbox!.nativeElement.children[0].children;\n\n    if (this.isShiftHold) {\n      const itemValue = parseInt(targetItem.getAttribute('value')!);\n      const max = Math.max(itemValue, this.lastSelectedItemIndexOnShiftHold);\n      const min = Math.min(itemValue, this.lastSelectedItemIndexOnShiftHold);\n\n      const itemsToAdd = [];\n      const itemsToRemove = [];\n\n      for (let i = 0; i < items.length; i++) {\n        const item = items[i] as HTMLDivElement;\n\n        if (i >= min && i <= max) {\n          item.classList.add('selected');\n          itemsToAdd.push(parseInt(item.getAttribute('value')!));\n        } else {\n          item.classList.remove('selected');\n          itemsToRemove.push(parseInt(item.getAttribute('value')!));\n        }\n      }\n\n      this.removeSelectedItems(itemsToRemove);\n      this.addSelectedItems(itemsToAdd);\n\n      return;\n    }\n\n    if (this.isMetaHold) {\n      const isSelected = targetItem.classList.contains('selected');\n\n      if (isSelected) {\n        targetItem.classList.remove('selected');\n        this.removeSelectedItems(parseInt(targetItem.getAttribute('value')!));\n      } else {\n        targetItem.classList.add('selected');\n        this.addSelectedItems(parseInt(targetItem.getAttribute('value')!));\n      }\n\n      return;\n    }\n\n    const mouseCustomData: MouseCustomData = {\n      hoverItemIndex: 0,\n      targetItemIndex: 0,\n      mouseDirection: MouseDirection.Up\n    };\n\n    const itemsToRemove = [];\n\n    for (let i = 0; i < items.length; i++) {\n      const item = items[i] as HTMLDivElement;\n\n      item.classList.remove('selected');\n      itemsToRemove.push(parseInt(item.getAttribute('value')!));\n\n      if (targetItem === item) {\n        mouseCustomData.hoverItemIndex = i;\n        mouseCustomData.targetItemIndex = i;\n      }\n\n      item.onmouseover = () => {\n        this.mouseover(i, items, mouseCustomData);\n      };\n    }\n\n    targetItem.classList.add('selected');\n    this.removeSelectedItems(itemsToRemove);\n    this.addSelectedItems(parseInt(targetItem.getAttribute('value')!));\n  }\n\n  @HostListener('document:mouseup', ['$event'])\n  public mouseup(): void {\n    const items = this.listbox!.nativeElement.children[0].children;\n\n    for (let i = 0; i < items.length; i++) {\n      (items[i] as HTMLDivElement).onmouseover = null;\n    }\n  }\n\n  @HostListener('keyup', ['$event'])\n  public keyup(event: KeyboardEvent): void {\n    if (event.code.toLowerCase().includes('shift')) {\n      this.isShiftHold = false;\n\n      return;\n    }\n\n    if (event.code.toLowerCase().includes('meta') || event.code.toLowerCase().includes('control')) {\n      this.isMetaHold = false;\n    }\n  }\n\n  private mouseover(i: number, items: HTMLCollection, mouseCustomData: MouseCustomData): void {\n    if (i > mouseCustomData.targetItemIndex) {\n      mouseCustomData.mouseDirection = MouseDirection.Down;\n    }\n\n    if (i < mouseCustomData.targetItemIndex) {\n      mouseCustomData.mouseDirection = MouseDirection.Up;\n    }\n\n    if (mouseCustomData.mouseDirection === MouseDirection.Down) {\n      if (i >= mouseCustomData.hoverItemIndex) {\n        this.lastSelectedItemIndex = parseInt(items[i].getAttribute('value')!);\n\n        items[i].classList.add('selected');\n        this.addSelectedItems(parseInt(items[i].getAttribute('value')!));\n      } else {\n        items[i + 1].classList.remove('selected');\n        this.removeSelectedItems(parseInt(items[i + 1].getAttribute('value')!));\n      }\n    } else {\n      if (i <= mouseCustomData.hoverItemIndex) {\n        this.lastSelectedItemIndex = parseInt(items[i].getAttribute('value')!);\n\n        items[i].classList.add('selected');\n        this.addSelectedItems(parseInt(items[i].getAttribute('value')!));\n      } else {\n        items[i - 1].classList.remove('selected');\n        this.removeSelectedItems(parseInt(items[i - 1].getAttribute('value')!));\n      }\n    }\n\n    mouseCustomData.hoverItemIndex = i;\n  }\n\n  private keydown(event: KeyboardEvent): void {\n    if ((document.activeElement !== this.listbox?.nativeElement) && (document.activeElement !== this.listbox?.nativeElement.childNodes[0])) {\n      return;\n    }\n\n    if (event.code.toLowerCase().includes('shift')) {\n      this.isShiftHold = true;\n      this.lastSelectedItemIndexOnShiftHold = this.lastSelectedItemIndex;\n    }\n\n    if (event.code.toLowerCase().includes('meta') || event.code.toLowerCase().includes('control')) {\n      this.isMetaHold = true;\n    }\n\n    if (event.code.toLowerCase().includes('arrowdown')) {\n      event.preventDefault();\n\n      this.documentArrowsKeyup(true);\n\n      return;\n    }\n\n    if (event.code.toLowerCase().includes('arrowup')) {\n      event.preventDefault();\n\n      this.documentArrowsKeyup(false);\n\n      return;\n    }\n\n    this.documentKeyup(event)\n  }\n\n  private documentArrowsKeyup(isDownArrow: boolean): void {\n    const dataLength = this.options.data.length;\n\n    let newIndex = isDownArrow ? this.lastSelectedItemIndex + 1 : this.lastSelectedItemIndex - 1;\n\n    const items = this.listbox!.nativeElement.children[0].children;\n\n    if (this.isShiftHold) {\n      if (newIndex < 0 || newIndex === dataLength) {\n        return;\n      }\n\n      const isSelected = items[newIndex].classList.contains('selected');\n\n      if (isSelected) {\n        const indexForDeselect = isDownArrow ? newIndex - 1 : newIndex + 1;\n\n        items[indexForDeselect].classList.remove('selected');\n        this.removeSelectedItems(parseInt(items[indexForDeselect].getAttribute('value')!));\n      } else {\n        items[newIndex].classList.add('selected');\n        this.addSelectedItems(parseInt(items[newIndex].getAttribute('value')!));\n      }\n\n      this.lastSelectedItemIndex = newIndex;\n      items[newIndex].scrollIntoView({ block: 'nearest' });\n\n      return;\n    }\n\n    const itemsToRemove = [];\n\n    for (let i = 0; i < items.length; i++) {\n      items[i].classList.remove('selected');\n      itemsToRemove.push(parseInt(items[i].getAttribute('value')!));\n    }\n\n    this.removeSelectedItems(itemsToRemove);\n\n    newIndex = newIndex < 0 ? 0 : newIndex;\n    newIndex = newIndex >= dataLength ? dataLength - 1 : newIndex;\n\n    items[newIndex].classList.add('selected');\n    items[newIndex].scrollIntoView({ block: 'nearest' });\n    this.addSelectedItems(parseInt(items[newIndex].getAttribute('value')!));\n  }\n\n  private documentKeyup(event: KeyboardEvent): void {\n    if (this.isMetaHold && event.key.toLowerCase() === 'a') {\n      event.preventDefault();\n\n      const items = this.listbox!.nativeElement.children[0].children;\n\n      const itemsToAdd = [];\n\n      for (let i = 0; i < items.length; i++) {2\n        items[i].classList.add('selected');\n        itemsToAdd.push(parseInt(items[i].getAttribute('value')!));\n      }\n\n      this.addSelectedItems(itemsToAdd);\n\n      return;\n    }\n\n    this.documentKeyupValue = this.documentKeyupValue + event.key.toLowerCase();\n\n    let newIndex: number | null = null;\n\n    for (let i = 0; i < this.options.data.length; i++) {\n      const subLabel = this.options.data[i].label.substring(0, this.documentKeyupValue.length).toLowerCase();\n\n      if (subLabel === this.documentKeyupValue) {\n        newIndex = i;\n\n        break;\n      }\n    }\n\n    if (newIndex !== null) {\n      const items = this.listbox!.nativeElement.children[0].children;\n\n      const itemsToRemove = [];\n\n      for (let i = 0; i < items.length; i++) {\n        items[i].classList.remove('selected');\n        itemsToRemove.push(parseInt(items[i].getAttribute('value')!));\n      }\n\n      this.removeSelectedItems(itemsToRemove);\n\n      items[newIndex].classList.add('selected');\n      items[newIndex].scrollIntoView({ block: 'center' });\n      this.addSelectedItems(parseInt(items[newIndex].getAttribute('value')!));\n    }\n  }\n\n  private addSelectedItems(index: number | number[]) {\n    const isIndexNumber = typeof index === 'number';\n\n    this.lastSelectedItemIndex = isIndexNumber ? index : index.slice(-1)[0];\n\n    if (isIndexNumber) {\n      this.selectedItems[index] = this.options.data[index];\n    } else {\n      for (let i of index) {\n        this.selectedItems[i] = this.options.data[i];\n      }\n    }\n\n    if (this.control) {\n      this.control.setValue(this.selectedItems.filter(value => value !== null));\n    }\n\n    this.selectChange.emit(this.selectedItems.filter(Boolean) as IpiSelectData[]);\n\n    this.changeDetectorRef.detectChanges();\n  }\n\n  private removeSelectedItems(index: number | number[]) {\n    const isIndexNumber = typeof index === 'number';\n\n    if (isIndexNumber) {\n      this.selectedItems[index] = null;\n    } else {\n      for (let i of index) {\n        this.selectedItems[i] = null;\n      }\n    }\n\n    if (this.control) {\n      this.control?.setValue(this.selectedItems.filter(value => value !== null));\n    }\n\n    this.selectChange.emit(this.selectedItems.filter(Boolean) as IpiSelectData[]);\n\n    this.changeDetectorRef.detectChanges();\n  }\n\n  private getControl(): AbstractControl | null {\n    if (this.options.formGroup && this.options.formControlName) {\n      this.controlSubscription = this.options.formGroup.controls[this.options.formControlName].valueChanges.subscribe(() => {\n        if (!this.control) {\n          return;\n        }\n  \n        this.checkIfControlInvalid(this.control);\n\n        this.getControlError(this.control);\n      });\n\n      return this.options.formGroup.get(this.options.formControlName);\n    }\n  \n    return null;\n  }\n\n  private checkIfControlInvalid(control: AbstractControl): void {\n    this.controlInvalid = control.invalid;\n  }\n\n  private getControlError(control: AbstractControl): void {\n    this.controlError = '';\n\n    const options = this.options!;\n\n    if (options.errors && this.controlInvalid) {\n      for (const error in options.errors) {\n        if (control.hasError(error)) {\n          this.controlError = options.errors[error];\n\n          return;\n        }\n      }\n\n    }\n  }\n\n}\n","@if (options) {\n    <div class=\"listbox-header\">\n        @if (options.label) {\n            <label>{{ options.label }}</label>\n        }\n\n        @if (options.tooltip) {\n            <svg class=\"tooltip-icon\" [ipiTooltip]=\"options.tooltip\" [tooltipPosition]=\"tooltipPosition.Above\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <g>\n                    <path d=\"M8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M7.5 7.5H8V11h.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n                    <path d=\"M8.25 5.25a.25.25 0 1 1-.5 0 .25.25 0 0 1 .5 0z\" fill=\"#fff\"/>\n                </g>\n            </svg>\n        }\n    </div>\n\n    <div #listbox tabindex=\"0\" class=\"container\" [ngClass]=\"{ 'error': controlInvalid }\">\n        <div class=\"container-inner\">\n            @for (data of options.data; track data.value) {\n                <div #item [attr.value]=\"$index\" class=\"item\" (mousedown)=\"mousedown(item)\">\n                    {{ data.label }}\n                </div>\n            }\n        </div>\n    </div>\n\n    <div class=\"footer\" [ngClass]=\"{ 'error': controlInvalid }\">\n        {{ controlError }}\n    </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAmBA,IAAK,cAGJ;AAHD,CAAA,UAAK,cAAc,EAAA;AACjB,IAAA,cAAA,CAAA,cAAA,CAAA,IAAA,CAAA,GAAA,CAAA,CAAA,GAAA,IAAE;AACF,IAAA,cAAA,CAAA,cAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAI;AACN,CAAC,EAHI,cAAc,KAAd,cAAc,GAGlB,EAAA,CAAA,CAAA;MAkBY,mBAAmB,CAAA;IAE9B,WACU,CAAA,UAAsB,EACtB,iBAAoC,EAAA;QADpC,IAAU,CAAA,UAAA,GAAV,UAAU;QACV,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;QAIL,IAAO,CAAA,OAAA,GAAsC,IAAI;AAI7D,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAmB;QAErD,IAAe,CAAA,eAAA,GAAG,eAAe;QAGjC,IAAc,CAAA,cAAA,GAAG,KAAK;QACtB,IAAO,CAAA,OAAA,GAA2B,IAAI;QACtC,IAAmB,CAAA,mBAAA,GAAwB,IAAI;QAE9C,IAAkB,CAAA,kBAAA,GAAG,EAAE;QACvB,IAA2B,CAAA,2BAAA,GAAG,IAAI;QAGlC,IAAU,CAAA,UAAA,GAAG,KAAK;QAClB,IAAW,CAAA,WAAA,GAAG,KAAK;QAEnB,IAAqB,CAAA,qBAAA,GAAG,CAAC;QACzB,IAAgC,CAAA,gCAAA,GAAG,CAAC;AAxBxC,QAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE;;IA4B5B,QAAQ,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AAEhC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAEnE,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;;IAGjC,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC,2BAA2B,GAAG,SAAS,CAAgB,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,SAAS;aACjG,IAAI,CACH,GAAG,CAAC,KAAK,IAAM,EAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA,EAAE,CAAC,EACrC,YAAY,CAAC,IAAI,CAAC,2BAA2B,CAAC;AAC/C,aAAA,SAAS,CAAC,MAAK,EAAG,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAA,EAAE,CAAC;;IAG/C,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,2BAA2B,CAAC,WAAW,EAAE;AAE9C,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,IAAI,CAAC,mBAAmB,EAAE,WAAW,EAAE;;;AAIpC,IAAA,WAAW,CAAC,OAAsB,EAAA;AACvC,QAAA,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;AACvF,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;AAE7B,YAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;;;AAInC,IAAA,SAAS,CAAC,UAA0B,EAAA;AACzC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;AAE9D,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC;AAC7D,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,gCAAgC,CAAC;AACtE,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,gCAAgC,CAAC;YAEtE,MAAM,UAAU,GAAG,EAAE;YACrB,MAAM,aAAa,GAAG,EAAE;AAExB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,gBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAmB;gBAEvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE;AACxB,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AAC9B,oBAAA,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;qBACjD;AACL,oBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AACjC,oBAAA,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;;AAI7D,YAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC;AACvC,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;YAEjC;;AAGF,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;YAE5D,IAAI,UAAU,EAAE;AACd,gBAAA,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AACvC,gBAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;iBAChE;AACL,gBAAA,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,gBAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;YAGpE;;AAGF,QAAA,MAAM,eAAe,GAAoB;AACvC,YAAA,cAAc,EAAE,CAAC;AACjB,YAAA,eAAe,EAAE,CAAC;YAClB,cAAc,EAAE,cAAc,CAAC;SAChC;QAED,MAAM,aAAa,GAAG,EAAE;AAExB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAmB;AAEvC,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AACjC,YAAA,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;AAEzD,YAAA,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,gBAAA,eAAe,CAAC,cAAc,GAAG,CAAC;AAClC,gBAAA,eAAe,CAAC,eAAe,GAAG,CAAC;;AAGrC,YAAA,IAAI,CAAC,WAAW,GAAG,MAAK;gBACtB,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC;AAC3C,aAAC;;AAGH,QAAA,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,QAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC;AACvC,QAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;IAI7D,OAAO,GAAA;AACZ,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;AAE9D,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,KAAK,CAAC,CAAC,CAAoB,CAAC,WAAW,GAAG,IAAI;;;AAK5C,IAAA,KAAK,CAAC,KAAoB,EAAA;AAC/B,QAAA,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC9C,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;YAExB;;QAGF,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AAC7F,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;;;AAInB,IAAA,SAAS,CAAC,CAAS,EAAE,KAAqB,EAAE,eAAgC,EAAA;AAClF,QAAA,IAAI,CAAC,GAAG,eAAe,CAAC,eAAe,EAAE;AACvC,YAAA,eAAe,CAAC,cAAc,GAAG,cAAc,CAAC,IAAI;;AAGtD,QAAA,IAAI,CAAC,GAAG,eAAe,CAAC,eAAe,EAAE;AACvC,YAAA,eAAe,CAAC,cAAc,GAAG,cAAc,CAAC,EAAE;;QAGpD,IAAI,eAAe,CAAC,cAAc,KAAK,cAAc,CAAC,IAAI,EAAE;AAC1D,YAAA,IAAI,CAAC,IAAI,eAAe,CAAC,cAAc,EAAE;AACvC,gBAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC;gBAEtE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AAClC,gBAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;iBAC3D;AACL,gBAAA,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AACzC,gBAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;;aAEpE;AACL,YAAA,IAAI,CAAC,IAAI,eAAe,CAAC,cAAc,EAAE;AACvC,gBAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC;gBAEtE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AAClC,gBAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;iBAC3D;AACL,gBAAA,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AACzC,gBAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;;AAI3E,QAAA,eAAe,CAAC,cAAc,GAAG,CAAC;;AAG5B,IAAA,OAAO,CAAC,KAAoB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,OAAO,EAAE,aAAa,MAAM,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;YACtI;;AAGF,QAAA,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC9C,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,YAAA,IAAI,CAAC,gCAAgC,GAAG,IAAI,CAAC,qBAAqB;;QAGpE,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AAC7F,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;;AAGxB,QAAA,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;YAClD,KAAK,CAAC,cAAc,EAAE;AAEtB,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAE9B;;AAGF,QAAA,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAChD,KAAK,CAAC,cAAc,EAAE;AAEtB,YAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;YAE/B;;AAGF,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;;AAGnB,IAAA,mBAAmB,CAAC,WAAoB,EAAA;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM;AAE3C,QAAA,IAAI,QAAQ,GAAG,WAAW,GAAG,IAAI,CAAC,qBAAqB,GAAG,CAAC,GAAG,IAAI,CAAC,qBAAqB,GAAG,CAAC;AAE5F,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;AAE9D,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,KAAK,UAAU,EAAE;gBAC3C;;AAGF,YAAA,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;YAEjE,IAAI,UAAU,EAAE;AACd,gBAAA,MAAM,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC;gBAElE,KAAK,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AACpD,gBAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;iBAC7E;gBACL,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AACzC,gBAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;AAGzE,YAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ;AACrC,YAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAEpD;;QAGF,MAAM,aAAa,GAAG,EAAE;AAExB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AACrC,YAAA,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;AAG/D,QAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC;AAEvC,QAAA,QAAQ,GAAG,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ;AACtC,QAAA,QAAQ,GAAG,QAAQ,IAAI,UAAU,GAAG,UAAU,GAAG,CAAC,GAAG,QAAQ;QAE7D,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AACzC,QAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACpD,QAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;AAGjE,IAAA,aAAa,CAAC,KAAoB,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE;YACtD,KAAK,CAAC,cAAc,EAAE;AAEtB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;YAE9D,MAAM,UAAU,GAAG,EAAE;AAErB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAAC,gBAAA,CAAC;gBACvC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AAClC,gBAAA,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;AAG5D,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;YAEjC;;AAGF,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE;QAE3E,IAAI,QAAQ,GAAkB,IAAI;AAElC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;AAEtG,YAAA,IAAI,QAAQ,KAAK,IAAI,CAAC,kBAAkB,EAAE;gBACxC,QAAQ,GAAG,CAAC;gBAEZ;;;AAIJ,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;AACrB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;YAE9D,MAAM,aAAa,GAAG,EAAE;AAExB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACrC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AACrC,gBAAA,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;AAG/D,YAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC;YAEvC,KAAK,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;AACzC,YAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACnD,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,OAAO,CAAE,CAAC,CAAC;;;AAInE,IAAA,gBAAgB,CAAC,KAAwB,EAAA;AAC/C,QAAA,MAAM,aAAa,GAAG,OAAO,KAAK,KAAK,QAAQ;QAE/C,IAAI,CAAC,qBAAqB,GAAG,aAAa,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvE,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;;aAC/C;AACL,YAAA,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE;AACnB,gBAAA,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;;AAIhD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC;;AAG3E,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAoB,CAAC;AAE7E,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;;AAGhC,IAAA,mBAAmB,CAAC,KAAwB,EAAA;AAClD,QAAA,MAAM,aAAa,GAAG,OAAO,KAAK,KAAK,QAAQ;QAE/C,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,IAAI;;aAC3B;AACL,YAAA,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE;AACnB,gBAAA,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI;;;AAIhC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC;;AAG5E,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAoB,CAAC;AAE7E,QAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;;IAGhC,UAAU,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;YAC1D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,MAAK;AACnH,gBAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;oBACjB;;AAGF,gBAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;AAExC,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;AACpC,aAAC,CAAC;AAEF,YAAA,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;;AAGjE,QAAA,OAAO,IAAI;;AAGL,IAAA,qBAAqB,CAAC,OAAwB,EAAA;AACpD,QAAA,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO;;AAG/B,IAAA,eAAe,CAAC,OAAwB,EAAA;AAC9C,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AAEtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAQ;QAE7B,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE;AACzC,YAAA,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE;AAClC,gBAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;oBAC3B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;oBAEzC;;;;;8GA7YG,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,ECxChC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,owCA8BA,EDKI,MAAA,EAAA,CAAA,67CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,OAAO,oFACP,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;2FAIV,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAV/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAGd,OAAA,EAAA;wBACP,OAAO;wBACP,mBAAmB;AACpB,qBAAA,EAAA,QAAA,EAAA,owCAAA,EAAA,MAAA,EAAA,CAAA,67CAAA,CAAA,EAAA;+GAWqB,OAAO,EAAA,CAAA;sBAA5B,SAAS;uBAAC,SAAS;gBAEX,OAAO,EAAA,CAAA;sBAAf;gBAES,YAAY,EAAA,CAAA;sBAArB;gBA8HM,OAAO,EAAA,CAAA;sBADb,YAAY;uBAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;gBAUrC,KAAK,EAAA,CAAA;sBADX,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;;AE1LnC;;AAEG;;;;"}