{"version":3,"file":"sebgroup-green-angular-src-v-angular-drag-drop.mjs","sources":["../../../../libs/angular/src/v-angular/drag-drop/drag-drop.utils.ts","../../../../libs/angular/src/v-angular/drag-drop/drag-drop.pipes.ts","../../../../libs/angular/src/v-angular/drag-drop/drag-drop.component.ts","../../../../libs/angular/src/v-angular/drag-drop/drag-drop.component.html","../../../../libs/angular/src/v-angular/drag-drop/drag-drop.module.ts","../../../../libs/angular/src/v-angular/drag-drop/sebgroup-green-angular-src-v-angular-drag-drop.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { Observable, throwError, timer } from 'rxjs'\nimport { finalize, mergeMap } from 'rxjs/operators'\n\nimport { APIFile, LocalFile } from './drag-drop.models'\n\n/**\n * Helper to extend the base file with {@link APIFile} defaults\n * @param file file base that will be extended with {@link APIFile} defaults\n * @param data extra data to override defaults\n */\nexport const extendFile = (\n  file: File | undefined,\n  ...data: Array<Partial<Omit<LocalFile, 'raw'> & APIFile>>\n): LocalFile & APIFile => {\n  return Object.assign(\n    {\n      id: file ? btoa(file.name) : '',\n      fileName: file ? file.name : 'na',\n      status: '',\n      statusReasonInformation: null,\n      principal: '',\n      uploadDate: (file\n        ? new Date(file.lastModified)\n        : new Date()\n      ).toISOString(),\n      registrarId: '',\n      registrarName: '',\n      progress: 0,\n      uploadState: 'local',\n      uploadRequests: undefined,\n      raw: file,\n    } as LocalFile & APIFile,\n    ...data,\n  )\n}\n\n/**\n * Checks if file matches allowed mime types\n * @param type file mime type\n * @param accept allowed mime types\n */\nexport const verifyAccept = (type: string, accept?: string) => {\n  if (!accept) return true\n  const regex = new RegExp(accept.replace(/\\*/g, '.*').replace(/\\s*,\\s*/g, '|'))\n  return regex.test(type)\n}\n\n/**\n * Determines if browser supports drag and drop\n */\nexport const isDragDropAvailable = () => {\n  const div = document.createElement('div')\n  return (\n    ('draggable' in div || ('ondragstart' in div && 'ondrop' in div)) &&\n    'FormData' in window &&\n    'FileReader' in window\n  )\n}\n\n/**\n * Pick only specified keys from a given object\n * @param keys keys to pick from a given object\n * @param object to extract keys from\n */\nexport const pick = <T, K extends keyof T>(\n  object: T,\n  ...keys: K[]\n): Pick<T, K> => {\n  const copy: any = {}\n  keys.forEach((key) => {\n    copy[key] = object[key]\n  })\n  return copy\n}\n\n/**\n * Will retry running the observable when an error occurs to a maximum limit, increasing delay between executions.\n * @param options specifies number of retries, scaling duration and statuses to exclude\n */\nexport const retryStrategy =\n  ({\n    maxRetryAttempts = 3,\n    scalingDuration = 1000,\n    excludedStatusCodes = [],\n  }: {\n    maxRetryAttempts?: number\n    scalingDuration?: number\n    excludedStatusCodes?: number[]\n  } = {}) =>\n  (attempts: Observable<any>) => {\n    return attempts.pipe(\n      mergeMap((error, i) => {\n        const retryAttempt = i + 1\n        // if maximum number of retries have been met\n        // or response is a status code we don't wish to retry, throw error\n        if (\n          retryAttempt > maxRetryAttempts ||\n          excludedStatusCodes.find((e) => e === error.status)\n        ) {\n          return throwError(() => error)\n        }\n        console.warn(\n          `Attempt ${retryAttempt}: retrying in ${retryAttempt * scalingDuration}ms`,\n        )\n        return timer(retryAttempt * scalingDuration)\n      }),\n      finalize(() =>\n        console.warn(\n          `Failed after ${maxRetryAttempts} retry attempts, standing down.`,\n        ),\n      ),\n    )\n  }\n","import {\n  inject,\n  KeyValueChangeRecord,\n  KeyValueChanges,\n  KeyValueDiffer,\n  KeyValueDiffers,\n  Pipe,\n  PipeTransform,\n} from '@angular/core'\n\n@Pipe({\n    name: 'value', pure: false,\n    standalone: false\n})\nexport class ValuePipe implements PipeTransform {\n  constructor(private readonly differs: KeyValueDiffers) {}\n\n  private differ!: KeyValueDiffer<any, any>\n  private values: Array<any> = []\n\n  transform<K, V>(input: null): null\n  transform<V>(input: { [key: string]: V } | Map<string, V>): Array<V>\n  transform<V>(\n    input: { [key: string]: V } | Map<string, V> | null,\n  ): Array<V> | null\n  transform<K, V>(input: Map<K, V>): Array<V>\n  transform<K, V>(input: Map<K, V> | null): Array<V> | null\n  transform<K, V>(\n    input: null | { [key: string]: V; [key: number]: V } | Map<K, V>,\n  ): Array<V> | null {\n    if (!input || (!(input instanceof Map) && typeof input !== 'object')) {\n      return null\n    }\n\n    if (!this.differ) {\n      // make a differ for whatever type we've been passed in\n      this.differ = this.differs.find(input).create()\n    }\n\n    const differChanges: KeyValueChanges<K, V> | null = this.differ.diff(\n      input as any,\n    )\n\n    if (differChanges) {\n      this.values = []\n      differChanges.forEachItem((r: KeyValueChangeRecord<K, V>) => {\n        this.values.push(r.currentValue)\n      })\n    }\n    return this.values\n  }\n}\n\n/**\n * Stand-alone version of existing value pipe.\n *\n * Impure flag needed due to keep track of changes in complex values (such as objects or arrays).\n */\n@Pipe({\n  name: 'valueImpure',\n  pure: false,\n  standalone: true,\n})\nexport class ValueImpurePipe implements PipeTransform {\n  private readonly differs = inject(KeyValueDiffers)\n\n  private differ!: KeyValueDiffer<any, any>\n  private values: Array<any> = []\n\n  transform<K, V>(input: null): null\n  transform<V>(input: { [key: string]: V } | Map<string, V>): Array<V>\n  transform<V>(\n    input: { [key: string]: V } | Map<string, V> | null,\n  ): Array<V> | null\n  transform<K, V>(input: Map<K, V>): Array<V>\n  transform<K, V>(input: Map<K, V> | null): Array<V> | null\n  transform<K, V>(\n    input: null | { [key: string]: V; [key: number]: V } | Map<K, V>,\n  ): Array<V> | null {\n    if (!input || (!(input instanceof Map) && typeof input !== 'object')) {\n      return null\n    }\n\n    if (!this.differ) {\n      // make a differ for whatever type we've been passed in\n      this.differ = this.differs.find(input).create()\n    }\n\n    const differChanges: KeyValueChanges<K, V> | null = this.differ.diff(\n      input as any,\n    )\n\n    if (differChanges) {\n      this.values = []\n      differChanges.forEachItem(\n        ({ currentValue }: KeyValueChangeRecord<K, V>) => {\n          this.values.push(currentValue)\n        },\n      )\n    }\n    return this.values\n  }\n}\n","/* eslint-disable no-console */\nimport { HttpEventType } from '@angular/common/http'\nimport {\n  Component,\n  EventEmitter,\n  HostBinding,\n  HostListener,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  ViewChild,\n} from '@angular/core'\nimport { timer } from 'rxjs'\nimport { filter, retryWhen, switchMap, take, tap } from 'rxjs/operators'\n\nimport {\n  DialogEvent,\n  NggvDialogComponent,\n} from '@sebgroup/green-angular/src/v-angular/modal'\nimport {\n  extendFile,\n  isDragDropAvailable,\n  pick,\n  retryStrategy,\n  verifyAccept,\n} from './drag-drop.utils'\n\nimport type {\n  APIFile,\n  EventStateChange,\n  FileService,\n  LocalFile,\n  StateMap,\n  UploadState,\n} from './drag-drop.models'\n\nimport '@sebgroup/green-core/components/icon/icons/cloud-upload.js'\nimport '@sebgroup/green-core/components/icon/icons/cross-small.js'\nimport '@sebgroup/green-core/components/icon/icons/checkmark.js'\n\nexport type DragDropState = 'normal' | 'over' | 'uploading' | 'done'\n\n@Component({\n    selector: 'nggv-drag-drop',\n    templateUrl: './drag-drop.component.html',\n    styleUrls: ['./drag-drop.component.scss'],\n    standalone: false\n})\nexport class NggvDragDropComponent implements OnInit, OnDestroy {\n  /** @internal */\n  @ViewChild('deleteModalRef') deleteModalRef!: NggvDialogComponent\n\n  /** Special property used for selecting DOM elements during automated UI testing. */\n  @HostBinding('attr.data-thook') @Input() thook: string | null | undefined =\n    'drag-drop'\n\n  /** Allowing selecting or dropping multiple files. */\n  @Input() service: FileService | undefined\n\n  /** Mime types allowed. */\n  @Input() accept?: string\n\n  /** Disables deletion or cancellation during defined states [local | uploading | aborted | uploaded | validating | error | deleted | done]. */\n  @Input() disableRemove: UploadState[] = []\n\n  /** File size limit in mega bytes. */\n  @Input() fileLimit: number = 250 * 1024 * 1024\n\n  /** Allowing selecting or dropping multiple files. */\n  @Input() multiple = true\n\n  /** Determines if list should be shown under upload, disabling list disables multiple upload. */\n  @Input() list = true\n\n  /** Frequency of requests which to send to the API requesting status updates. */\n  @Input() throttle = 5000\n\n  /** Maximum number of attempts to request a status update from the API if service is unreachable. */\n  @Input() retryAttempts = 5\n\n  /** If selection of multiple file should be possible with a checkbox.\n   * @experimental work in progress and should not yet be used.\n   * @internal\n   */\n  @Input() selectable = false\n\n  /** Allows multiple values from `apiFile.status` to be mapped to a single file upload state. */\n  @Input() stateMap: StateMap = {\n    local: 'local',\n    uploading: 'uploading',\n    aborted: 'aborted',\n    uploaded: 'uploaded',\n    validating: 'validating',\n    error: 'error',\n    deleted: 'deleted',\n    done: 'done',\n  }\n\n  /** Statuses allowed to be fetch during the initial load. Used to hide \"done\" states from list. */\n  @Input() fetchStatuses: string[] = []\n\n  /** Statuses allowed be shown when status is \"rejected\". Will fallback to generic message. `null` allows all. */\n  @Input() errorCodes: string[] | null = null\n\n  /** Event triggered on initialization and every time the \"uploadState\" for a file changes. */\n  @Output() stateChange = new EventEmitter<EventStateChange>()\n\n  /** Event triggered when view details is clicked. */\n  @Output() detailsClick = new EventEmitter<LocalFile & APIFile>()\n\n  /** @internal */\n  isDragDropAvailable = isDragDropAvailable()\n  /** @internal */\n  componentState: DragDropState = 'normal'\n  /** @internal */\n  files: Map<string, LocalFile & APIFile> = new Map()\n  /** @internal */\n  lastFile: (LocalFile & APIFile) | undefined\n  /** @internal */\n  selected: string[] = []\n  /** @internal */\n  loading = false\n  /** @internal */\n  markedForDeletion: APIFile | undefined\n\n  /**\n   * Initialize the component and warn if service is not defined. Will also fetch files for the list if enabled.\n   */\n  ngOnInit() {\n    if (!this.service) {\n      return console.error(\n        'Drag and drop component will not work without the [service] property defined!',\n      )\n    }\n\n    if (this.list) {\n      this.service.fetchFiles(this.fetchStatuses).subscribe((apiFiles) => {\n        for (const apiFile of apiFiles) {\n          const extendedFile = extendFile(undefined, apiFile, {\n            progress: 100,\n            uploadState: this.determineUploadState(apiFile.status),\n            internalStatusReasonCode: this.fallbackError(\n              apiFile.internalStatusReasonCode,\n            ),\n          })\n          this.files.set(extendedFile.id, extendedFile)\n          this.stateChange.emit(\n            pick(\n              extendedFile,\n              'uploadState',\n              'fileName',\n              'id',\n              'status',\n              'internalStatusReasonCode',\n              'statusReasonInformation',\n            ),\n          )\n\n          // Check if validation is required, then start polling\n          if (\n            extendedFile.uploadState === 'uploaded' ||\n            extendedFile.uploadState === 'validating'\n          ) {\n            this.checkValidity(extendedFile, this.throttle)\n          }\n        }\n      })\n    }\n  }\n\n  /** Destroy all event listeners and polling running */\n  ngOnDestroy() {\n    this.files.forEach((file) => {\n      file.uploadRequests?.unsubscribe()\n      if (file.uploadState === 'uploading') {\n        file.uploadState = 'aborted'\n        file.internalStatusReasonCode = 'MFEFHM004'\n        this.stateChange.emit(\n          pick(\n            file,\n            'uploadState',\n            'fileName',\n            'status',\n            'internalStatusReasonCode',\n          ),\n        )\n      }\n    })\n  }\n\n  /** @internal Warn user trying to leave page before all uploads are done. Custom message only works in older browsers. */\n  @HostListener('window:beforeunload', ['$event'])\n  onBeforeUnload(event: Event) {\n    if (!this.allUploadingDone(this.files)) {\n      const confirmationMessage = `You still have files uploading, are you sure you want to leave this page?`\n      ;((event as any) || (window.event as any)).returnValue =\n        confirmationMessage\n      return confirmationMessage\n    }\n    return\n  }\n\n  /* Drag & Drop Events */\n\n  /** @internal Event handler for when a file is held over the drop area */\n  onDragEnter(event: DragEvent): void {\n    if (!this.service) return\n    event.preventDefault()\n    // Update the visual state\n    this.componentState = 'over'\n  }\n\n  /** @internal Event handler for when a file leaves the drop area */\n  onDragLeave(event: DragEvent): void {\n    if (!this.service) return\n    event.preventDefault()\n    this.componentState = 'normal'\n  }\n\n  /** @internal Event handler for when a file is dropped on the drop area or when `input` files are selected */\n  onDrop(event: DragEvent | Event): void {\n    if (!this.service) return\n    event.preventDefault()\n    this.componentState = 'normal'\n\n    let files: FileList | undefined\n\n    // Determine if files are from the drop event or input element\n    if (event instanceof DragEvent && event.dataTransfer) {\n      files = event.dataTransfer.files\n    } else if (\n      event.target &&\n      event.target instanceof HTMLInputElement &&\n      event.target.files\n    ) {\n      files = event.target.files\n    }\n\n    if (files) {\n      const extendedFiles = Array.from(files, (file) => {\n        let abort = false\n        let statusCode: string | null = null\n        // Check if file size is larger than limit\n        if (file.size > this.fileLimit) {\n          abort = true\n          statusCode = 'MFEFHM003'\n        }\n        // Check if file type is not acceptable\n        if (!verifyAccept(file.type, this.accept)) {\n          abort = true\n          statusCode = 'MFEFHM002'\n        }\n        // Add default values expected by the API\n        const extendedFile = extendFile(file, {\n          internalStatusReasonCode: statusCode,\n          uploadState: (abort ? 'aborted' : 'local') as UploadState,\n        })\n\n        // Emit initial local upload event\n        this.stateChange.emit({\n          uploadState: 'local',\n          fileName: extendedFile.fileName,\n        })\n\n        if (abort) {\n          // Emit aborted upload event\n          this.stateChange.emit({\n            uploadState: 'aborted',\n            fileName: extendedFile.fileName,\n            status: 'aborted',\n            internalStatusReasonCode: statusCode,\n          })\n        }\n\n        return extendedFile\n      })\n\n      // Append to previous files\n      let i = 0\n      for (const file of extendedFiles) {\n        // If multiple or list is false append only file then break loop\n        if ((!this.multiple || !this.list) && i >= 1) break\n        this.lastFile = file\n        this.files.set(file.id, file)\n        i++\n      }\n\n      // Clear file input so that same file can be uploaded\n      if (\n        event.target &&\n        event.target instanceof HTMLInputElement &&\n        event.target.files\n      ) {\n        event.target.value = ''\n      }\n\n      this.onSubmit()\n    }\n  }\n\n  /** @internal Event trigger for when delete button is pressed */\n  onRemove(id: string, state: UploadState): void {\n    // Only allow removal in certain states\n    if (!this.service || this.disableRemove.includes(state)) return\n    const file = this.files.get(id)\n    if (!file) return\n    // Skip confirmation for aborted and deleted files\n    if (\n      file.uploadState === 'error' ||\n      file.uploadState === 'aborted' ||\n      file.uploadState === 'deleted'\n    ) {\n      this.onConfirmRemove({ original: undefined, payload: file })\n    } else {\n      this.markedForDeletion = file\n      this.deleteModalRef.open()\n    }\n  }\n\n  /** @internal */\n  onConfirmRemove(event: DialogEvent<LocalFile & APIFile>) {\n    const { payload: file } = event\n    if (!file || !this.service) return\n\n    // Abort upload and set local state to aborted to inform user\n    switch (file.uploadState) {\n      case 'local':\n      case 'uploading':\n        file.uploadRequests?.unsubscribe()\n        file.uploadState = 'aborted'\n        file.internalStatusReasonCode = 'MFEFHM004'\n        this.stateChange.emit(\n          pick(\n            file,\n            'uploadState',\n            'fileName',\n            'status',\n            'internalStatusReasonCode',\n          ),\n        )\n        break\n\n      // Remove file from service then set local state to aborted to inform user\n      case 'uploaded':\n      case 'validating':\n        this.service\n          .removeFile(file.id)\n          .subscribe({\n            error: console.warn,\n          })\n          .add(() => {\n            // Abort regardless of response from server\n            file.uploadRequests?.unsubscribe()\n            file.uploadState = 'aborted'\n            file.internalStatusReasonCode = 'MFEFHM005'\n            this.stateChange.emit(\n              pick(\n                file,\n                'uploadState',\n                'fileName',\n                'status',\n                'internalStatusReasonCode',\n              ),\n            )\n          })\n        break\n\n      // Remove file from service then locally for \"completed\" states\n      case 'error':\n      case 'done':\n        ;(this.service.removeFileFor\n          ? this.service.removeFileFor(file)\n          : this.service.removeFile(file.id)\n        )\n          .subscribe({\n            error: console.warn,\n          })\n          .add(() => {\n            // Remove regardless of response from server\n            this.files.delete(file.id)\n            const event = pick(\n              file,\n              'uploadState',\n              'fileName',\n              'id',\n              'status',\n              'internalStatusReasonCode',\n              'statusReasonInformation',\n            )\n            event.uploadState = 'deleted'\n            this.stateChange.emit(event)\n          })\n        break\n\n      // Just remove the file locally to clean up\n      case 'aborted':\n      case 'deleted':\n      default:\n        this.files.delete(file.id)\n        this.stateChange.emit({\n          ...pick(\n            file,\n            'uploadState',\n            'fileName',\n            'id',\n            'status',\n            'internalStatusReasonCode',\n            'statusReasonInformation',\n          ),\n          uploadState: 'deleted',\n        })\n        break\n    }\n  }\n\n  /** @internal Event handler for when the files should be uploaded */\n  onSubmit() {\n    if (!this.files || !this.service) return\n    // If list is not enabled update the component state to show progress\n    if (!this.list) this.componentState = 'uploading'\n    this.loading = true\n    this.files.forEach((file) => {\n      // Filter out all files that aren't currently considered local\n      if (!file.raw || file.uploadState !== 'local') return\n      file.uploadRequests = this.service!.uploadFile(file.raw!).subscribe({\n        next: (event) => {\n          switch (event.type) {\n            case HttpEventType.UploadProgress:\n              // Update upload progress\n              if (file.uploadState !== 'uploading') {\n                file.uploadState = 'uploading'\n                this.stateChange.emit(pick(file, 'uploadState', 'fileName'))\n              }\n              file.progress = Math.round(\n                (100 * event.loaded) / (event.total || 100),\n              )\n              file.uploadState = 'uploading'\n              break\n\n            case HttpEventType.Response:\n              if (event.body?.id) {\n                // Remove old file id\n                this.files.delete(file.id)\n                // Update file with information from the API\n                Object.assign(file, event.body)\n                file.progress = 100\n                file.uploadState = this.determineUploadState(file.status)\n                // Update with new file id\n                this.files.set(file.id, file)\n              }\n\n              this.stateChange.emit(\n                pick(\n                  file,\n                  'uploadState',\n                  'fileName',\n                  'id',\n                  'status',\n                  'statusReasonInformation',\n                ),\n              )\n\n              // Check if validation is required, then start polling\n              if (\n                file.uploadState === 'uploaded' ||\n                file.uploadState === 'validating'\n              ) {\n                this.checkValidity(file, this.throttle)\n              } else this.setComponentStateDone()\n              this.loading = false\n              break\n          }\n        },\n        error: (error) => {\n          console.warn(error)\n          file.uploadState = 'aborted'\n          file.status = 'aborted'\n          // todo: wrong\n          file.statusReasonInformation = [\n            { originatorId: 'local', reason: 'dragDrop.error.MFEFHM001' },\n          ]\n          this.stateChange.emit(\n            pick(\n              file,\n              'uploadState',\n              'fileName',\n              'id',\n              'status',\n              'statusReasonInformation',\n            ),\n          )\n          this.loading = false\n        },\n      })\n    })\n  }\n\n  /**\n   * @internal\n   * Using the state map convert `apiFile.state` to one of {@link UploadState}\n   * @param apiState the state given by the file to be used for mapping\n   */\n  determineUploadState(apiState: string): UploadState {\n    // Reverse so that later states override earlier\n    const stateEntries = Object.entries(this.stateMap).reverse()\n    for (const [uploadState, apiStates] of stateEntries) {\n      if (this.uploadStateIsArray(apiStates)) {\n        if (apiStates.includes(apiState)) return uploadState as any\n      } else {\n        if (apiStates === apiState) return uploadState as any\n      }\n    }\n    return 'error'\n  }\n\n  /** @internal */\n  uploadStateIsArray(state: string | string[]): state is string[] {\n    return Array.isArray(state)\n  }\n\n  /** @internal used for translation templating parameters */\n  translateParams(file: LocalFile & APIFile) {\n    return { ...file, fileLimit: (this.fileLimit / 1024 / 1024).toFixed(3) }\n  }\n\n  /**\n   * Poll the status endpoint to determine when file is valid\n   * @param file file used to check state and update\n   * @param delay how long each interval should wait before sending a request\n   */\n  private checkValidity(file: LocalFile & APIFile, delay: number) {\n    if (!this.service) return\n    file.uploadRequests = timer(0, delay)\n      .pipe(\n        switchMap(() => {\n          const asyncFetchStatus =\n            this.service && this.service.fetchStatusFor\n              ? this.service.fetchStatusFor(file)\n              : this.service!.fetchStatus(file.id)\n          return asyncFetchStatus\n        }),\n        retryWhen(\n          retryStrategy({\n            maxRetryAttempts: this.retryAttempts,\n          }),\n        ),\n        tap((fileStatus) => {\n          // Continuously update file state to show step progress\n          if (fileStatus) {\n            // Emit event when status changes\n            if (file.status !== fileStatus.status) {\n              file.status = fileStatus.status\n              file.internalStatusReasonCode = this.fallbackError(\n                fileStatus.internalStatusReasonCode,\n              )\n              file.statusReasonInformation = fileStatus.statusReasonInformation\n              file.uploadState = this.determineUploadState(fileStatus.status)\n              this.stateChange.emit(\n                pick(\n                  file,\n                  'uploadState',\n                  'fileName',\n                  'id',\n                  'status',\n                  'internalStatusReasonCode',\n                  'statusReasonInformation',\n                ),\n              )\n            }\n          }\n        }),\n        // Remove validation state\n        filter(\n          (apiFile) =>\n            !!apiFile &&\n            this.determineUploadState(apiFile.status) !== 'uploaded' &&\n            this.determineUploadState(apiFile.status) !== 'validating',\n        ),\n        // Take first state after validation\n        take(1),\n      )\n      .subscribe({\n        next: () => {\n          if (this.allValidationDone(this.files)) {\n            this.setComponentStateDone()\n          }\n        },\n        error: (err) => {\n          console.warn(err)\n          file.uploadState = 'aborted'\n          file.status = 'aborted'\n          file.internalStatusReasonCode = 'MFEFHM001'\n          this.stateChange.emit(\n            pick(\n              file,\n              'uploadState',\n              'fileName',\n              'id',\n              'status',\n              'internalStatusReasonCode',\n            ),\n          )\n          this.setComponentStateDone()\n        },\n      })\n  }\n\n  private fallbackError(code: string | null | undefined): string | null {\n    if (this.errorCodes == null || (code && this.errorCodes.includes(code))) {\n      return code ?? null\n    } else {\n      return 'MFEFHM001'\n    }\n  }\n\n  /**\n   * Check so that no files are still validating\n   */\n  private allValidationDone(files: Map<string, LocalFile>) {\n    return Array.from(files.values()).every(\n      (file) => file.uploadState !== 'validating',\n    )\n  }\n\n  /**\n   * Check so that no files are still uploading\n   */\n  private allUploadingDone(files: Map<string, LocalFile>) {\n    return Array.from(files.values()).every(\n      (file) => file.uploadState !== 'uploading',\n    )\n  }\n\n  /**\n   * Helper to update the component state to done and then back to normal\n   */\n  private setComponentStateDone() {\n    if (!this.list) this.componentState = 'done'\n    setTimeout(() => {\n      if (this.componentState === 'done') this.componentState = 'normal'\n    }, 3000)\n  }\n}\n","<ng-container *transloco=\"let t\">\n  <form enctype=\"multipart/form-data\" #dragDropForm>\n    <div class=\"gds-drag-drop\">\n      <input\n        class=\"gds-drag-drop__input\"\n        id=\"drag-drop\"\n        type=\"file\"\n        [accept]=\"accept\"\n        [multiple]=\"multiple && list\"\n        (change)=\"onDrop($event)\"\n      />\n      <label\n        [ngClass]=\"{\n          'gds-drag-drop__label': true,\n          'gds-drag-drop__label--above': componentState === 'over',\n        }\"\n        for=\"drag-drop\"\n        [attr.data-thook]=\"thook + '-picker'\"\n        [attr.aria-busy]=\"loading\"\n        (dragenter)=\"onDragEnter($event)\"\n        (dragover)=\"onDragEnter($event)\"\n        (dragleave)=\"onDragLeave($event)\"\n        (dragend)=\"onDragLeave($event)\"\n        (drop)=\"onDrop($event)\"\n        [ngSwitch]=\"componentState\"\n      >\n        <!-- COMPONENT STATE NORMAL -->\n        <ng-template [ngSwitchCase]=\"'normal'\">\n          <gds-icon-cloud-upload *nggCoreElement></gds-icon-cloud-upload\n          ><em>{{ t('dragDrop.label.fileChoose') }}</em>\n          <ng-template [ngIf]=\"isDragDropAvailable\">\n            {{ t('dragDrop.label.fileDrag') }}</ng-template\n          >\n        </ng-template>\n\n        <!-- COMPONENT STATE OVER -->\n        <ng-template [ngSwitchCase]=\"'over'\">\n          <gds-icon-cloud-upload *nggCoreElement></gds-icon-cloud-upload\n          >{{ t('dragDrop.label.fileDrop') }}\n        </ng-template>\n\n        <!-- COMPONENT STATE UPLOADING -->\n        <ng-template [ngSwitchCase]=\"'uploading'\">\n          <strong class=\"filename\">{{ lastFile?.fileName }}</strong>\n\n          <!-- UPLOADING STATE -->\n          <ng-template [ngIf]=\"lastFile?.uploadState === 'uploading'\">\n            <ng-template\n              [ngTemplateOutlet]=\"progressTemplate\"\n              [ngTemplateOutletContext]=\"{\n                file: lastFile,\n              }\"\n            ></ng-template>\n          </ng-template>\n\n          <!-- UPLOADED STATE -->\n          <ng-template [ngIf]=\"lastFile?.uploadState === 'uploaded'\">\n            <ng-template\n              [ngTemplateOutlet]=\"progressTemplate\"\n              [ngTemplateOutletContext]=\"{\n                file: lastFile,\n                text: t('dragDrop.text.fileStateUploaded'),\n              }\"\n            ></ng-template>\n          </ng-template>\n\n          <!-- VALIDATING STATE -->\n          <ng-template [ngIf]=\"lastFile?.uploadState === 'validating'\">\n            <ng-template\n              [ngTemplateOutlet]=\"progressTemplate\"\n              [ngTemplateOutletContext]=\"{\n                file: lastFile,\n                text: t('dragDrop.text.fileStateValidating'),\n              }\"\n            ></ng-template>\n          </ng-template>\n        </ng-template>\n\n        <!-- COMPONENT STATE DONE -->\n        <ng-template [ngSwitchCase]=\"'done'\">\n          {{ t('dragDrop.label.fileUploaded', { filename: lastFile?.fileName })\n          }}<gds-icon-checkmark *nggCoreElement></gds-icon-checkmark>\n        </ng-template>\n      </label>\n\n      <!-- LIST -->\n      <table\n        class=\"gds-table file-list\"\n        [attr.data-thook]=\"thook + '-file-list'\"\n        *ngIf=\"list\"\n      >\n        <thead>\n          <tr>\n            <th *ngIf=\"selectable\">\n              <div class=\"gds-field-checkbox-wrap\">\n                <input\n                  type=\"checkbox\"\n                  aria-label=\"Field label\"\n                  id=\"select-all\"\n                />\n                <label for=\"select-all\"></label>\n              </div>\n            </th>\n            <th class=\"gds-table__primary-col col-name\">\n              {{ t('dragDrop.label.fileName') }}\n            </th>\n            <th class=\"col-status\">\n              {{ t('dragDrop.label.fileStatus') }}\n            </th>\n            <th class=\"col-actions\"></th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr\n            [attr.data-thook]=\"thook + '-file'\"\n            *ngFor=\"let file of files | value\"\n          >\n            <td *ngIf=\"selectable\">\n              <div class=\"gds-field-checkbox-wrap\">\n                <input\n                  type=\"checkbox\"\n                  aria-label=\"Field label\"\n                  [id]=\"'file-checkbox-' + file.id\"\n                />\n                <label [for]=\"'file-checkbox-' + file.id\"></label>\n              </div>\n            </td>\n            <td\n              class=\"gds-table__primary-col\"\n              [attr.data-thook]=\"thook + '-file-name'\"\n            >\n              {{ file.fileName }}\n            </td>\n            <td\n              [attr.data-thook]=\"thook + '-file-status'\"\n              [ngSwitch]=\"file.uploadState\"\n            >\n              <!-- UPLOADING STATE -->\n              <ng-template [ngSwitchCase]=\"'uploading'\">\n                <ng-template\n                  [ngTemplateOutlet]=\"progressTemplate\"\n                  [ngTemplateOutletContext]=\"{\n                    file: file,\n                  }\"\n                ></ng-template>\n              </ng-template>\n\n              <!-- UPLOADED STATE -->\n              <ng-template [ngSwitchCase]=\"'uploaded'\">\n                <ng-template\n                  [ngTemplateOutlet]=\"progressTemplate\"\n                  [ngTemplateOutletContext]=\"{\n                    file: file,\n                    text: t('dragDrop.text.fileStateUploaded'),\n                  }\"\n                ></ng-template>\n              </ng-template>\n\n              <!-- VALIDATING STATE -->\n              <ng-template [ngSwitchCase]=\"'validating'\">\n                <ng-template\n                  [ngTemplateOutlet]=\"progressTemplate\"\n                  [ngTemplateOutletContext]=\"{\n                    file: file,\n                    text: t('dragDrop.text.fileStateValidating'),\n                  }\"\n                ></ng-template>\n              </ng-template>\n\n              <!-- ABORTED STATE -->\n              <ng-template [ngSwitchCase]=\"'aborted'\">\n                <span\n                  class=\"error-text\"\n                  [transloco]=\"\n                    'dragDrop.error.' + file.internalStatusReasonCode\n                  \"\n                  [translocoParams]=\"translateParams(file)\"\n                  *ngIf=\"file.internalStatusReasonCode\"\n                ></span>\n              </ng-template>\n\n              <!-- ERROR STATE -->\n              <ng-template [ngSwitchCase]=\"'error'\">\n                <span\n                  class=\"error-text\"\n                  [transloco]=\"\n                    'dragDrop.error.' + file.internalStatusReasonCode\n                  \"\n                  [translocoParams]=\"translateParams(file)\"\n                  *ngIf=\"file.internalStatusReasonCode\"\n                ></span>\n                <br />\n                <a\n                  (click)=\"detailsClick.emit(file)\"\n                  style=\"cursor: pointer\"\n                  *ngIf=\"\n                    file.statusReasonInformation &&\n                    file.statusReasonInformation.length\n                  \"\n                >\n                  {{ t('dragDrop.link.viewDetails') }}\n                </a>\n              </ng-template>\n\n              <!-- DONE STATE -->\n              <ng-template [ngSwitchCase]=\"'done'\">\n                <span class=\"success-text\">{{\n                  t('dragDrop.text.fileStateDone')\n                }}</span>\n              </ng-template>\n            </td>\n\n            <td class=\"gds-table__numeric-col\">\n              <a\n                class=\"remove\"\n                tabindex=\"0\"\n                (click)=\"onRemove(file.id, file.uploadState)\"\n                *ngIf=\"!disableRemove.includes(file.uploadState)\"\n              >\n                <gds-icon-cross-small *nggCoreElement></gds-icon-cross-small>\n              </a>\n            </td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n  </form>\n\n  <nggv-dialog\n    #deleteModalRef\n    [title]=\"t('dragDrop.text.fileCancelModalTitle')\"\n    [content]=\"\n      t('dragDrop.text.fileCancelModalContent', {\n        name: markedForDeletion?.fileName,\n      })\n    \"\n    [payload]=\"markedForDeletion\"\n    [buttons]=\"{\n      negative: 'dragDrop.text.fileCancelConfirm',\n      positive: 'dragDrop.text.fileCancelDeny',\n    }\"\n    (nggvNegativeEvent)=\"onConfirmRemove($any($event))\"\n  ></nggv-dialog>\n\n  <!-- PROGRESS TEMPLATE -->\n\n  <ng-template\n    #progressTemplate\n    let-file=\"\n    file\"\n    let-text=\"text\"\n  >\n    <div class=\"progress-wrapper\">\n      <progress\n        class=\"gds-progress-bar progress\"\n        max=\"100\"\n        [value]=\"file.progress\"\n      >\n        {{\n          t('dragDrop.text.fileStateUploading', {\n            uploaded:\n              (file.raw?.size * (file.progress / 100)) / 1024 | number: '0.0-0',\n            size: file.raw?.size / 1024 | number: '0.0-0',\n            progress: file.progress,\n            unit: 'kB',\n          })\n        }}\n      </progress>\n      <ng-template [ngIf]=\"stateMap.validating.length\">\n        <div\n          class=\"gds-progress-indicator indicator\"\n          *ngIf=\"uploadStateIsArray(stateMap.validating); else singleValidation\"\n        >\n          <div\n            class=\"gds-progress-indicator__step\"\n            [class.-done]=\"i <= stateMap.validating.indexOf(file.status)\"\n            *ngFor=\"let state of stateMap.validating; let i = index\"\n          ></div>\n        </div>\n      </ng-template>\n      <ng-template #singleValidation>\n        <div class=\"gds-progress-indicator indicator\">\n          <!-- eslint-disable @angular-eslint/template/eqeqeq -->\n          <div\n            class=\"gds-progress-indicator__step\"\n            [class.-done]=\"file.status == stateMap.validating\"\n          ></div>\n          <!-- eslint-enable @angular-eslint/template/eqeqeq -->\n        </div>\n      </ng-template>\n    </div>\n    <span class=\"progress-text\">\n      {{\n        text ||\n          t('dragDrop.text.fileStateUploading', {\n            uploaded:\n              (file.raw?.size * (file.progress / 100)) / 1024 | number: '0.0-0',\n            size: file.raw?.size / 1024 | number: '0.0-0',\n            progress: file.progress,\n            unit: 'kB',\n          })\n      }}\n    </span>\n  </ng-template>\n</ng-container>\n","import { CommonModule } from '@angular/common'\nimport { HttpClientModule } from '@angular/common/http'\nimport { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'\nimport { TRANSLOCO_SCOPE, TranslocoModule } from '@jsverse/transloco'\n\nimport { NggCoreWrapperModule } from '@sebgroup/green-angular/src/lib/shared'\nimport { NggvModalModule } from '@sebgroup/green-angular/src/v-angular/modal'\nimport { NggvDragDropComponent } from './drag-drop.component'\nimport { ValuePipe } from './drag-drop.pipes'\n\n@NgModule({\n  imports: [\n    HttpClientModule,\n    TranslocoModule,\n    NggvModalModule,\n    NggCoreWrapperModule,\n    CommonModule,\n  ],\n  declarations: [ValuePipe, NggvDragDropComponent],\n  providers: [\n    {\n      provide: TRANSLOCO_SCOPE,\n      useValue: 'dragDrop',\n    },\n  ],\n  exports: [NggvDragDropComponent],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class NggvDragDropModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i5.ValuePipe"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAMA;;;;AAIG;AACI,MAAM,UAAU,GAAG,CACxB,IAAsB,EACtB,GAAG,IAAsD,KAClC;IACvB,OAAO,MAAM,CAAC,MAAM,CAClB;AACE,QAAA,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QAC/B,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI;AACjC,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,uBAAuB,EAAE,IAAI;AAC7B,QAAA,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,CAAC;AACX,cAAE,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY;AAC5B,cAAE,IAAI,IAAI,EAAE,EACZ,WAAW,EAAE;AACf,QAAA,WAAW,EAAE,EAAE;AACf,QAAA,aAAa,EAAE,EAAE;AACjB,QAAA,QAAQ,EAAE,CAAC;AACX,QAAA,WAAW,EAAE,OAAO;AACpB,QAAA,cAAc,EAAE,SAAS;AACzB,QAAA,GAAG,EAAE,IAAI;KACa,EACxB,GAAG,IAAI,CACR;AACH,CAAC;AAED;;;;AAIG;AACI,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,MAAe,KAAI;AAC5D,IAAA,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,IAAI;IACxB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAC9E,IAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AACzB,CAAC;AAED;;AAEG;AACI,MAAM,mBAAmB,GAAG,MAAK;IACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AACzC,IAAA,QACE,CAAC,WAAW,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,IAAI,QAAQ,IAAI,GAAG,CAAC;AAChE,QAAA,UAAU,IAAI,MAAM;QACpB,YAAY,IAAI,MAAM;AAE1B,CAAC;AAED;;;;AAIG;AACI,MAAM,IAAI,GAAG,CAClB,MAAS,EACT,GAAG,IAAS,KACE;IACd,MAAM,IAAI,GAAQ,EAAE;AACpB,IAAA,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;QACnB,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;AACzB,IAAA,CAAC,CAAC;AACF,IAAA,OAAO,IAAI;AACb,CAAC;AAED;;;AAGG;AACI,MAAM,aAAa,GACxB,CAAC,EACC,gBAAgB,GAAG,CAAC,EACpB,eAAe,GAAG,IAAI,EACtB,mBAAmB,GAAG,EAAE,GAAA,GAKtB,EAAE,KACN,CAAC,QAAyB,KAAI;IAC5B,OAAO,QAAQ,CAAC,IAAI,CAClB,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;AACpB,QAAA,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC;;;QAG1B,IACE,YAAY,GAAG,gBAAgB;AAC/B,YAAA,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,EACnD;AACA,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC;QACA,OAAO,CAAC,IAAI,CACV,CAAA,QAAA,EAAW,YAAY,CAAA,cAAA,EAAiB,YAAY,GAAG,eAAe,CAAA,EAAA,CAAI,CAC3E;AACD,QAAA,OAAO,KAAK,CAAC,YAAY,GAAG,eAAe,CAAC;AAC9C,IAAA,CAAC,CAAC,EACF,QAAQ,CAAC,MACP,OAAO,CAAC,IAAI,CACV,CAAA,aAAA,EAAgB,gBAAgB,iCAAiC,CAClE,CACF,CACF;AACH,CAAC;;MCnGU,SAAS,CAAA;AACpB,IAAA,WAAA,CAA6B,OAAwB,EAAA;QAAxB,IAAA,CAAA,OAAO,GAAP,OAAO;QAG5B,IAAA,CAAA,MAAM,GAAe,EAAE;IAHyB;AAYxD,IAAA,SAAS,CACP,KAAgE,EAAA;AAEhE,QAAA,IAAI,CAAC,KAAK,KAAK,EAAE,KAAK,YAAY,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,EAAE;AACpE,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;;AAEhB,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE;QACjD;QAEA,MAAM,aAAa,GAAiC,IAAI,CAAC,MAAM,CAAC,IAAI,CAClE,KAAY,CACb;QAED,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE;AAChB,YAAA,aAAa,CAAC,WAAW,CAAC,CAAC,CAA6B,KAAI;gBAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;AAClC,YAAA,CAAC,CAAC;QACJ;QACA,OAAO,IAAI,CAAC,MAAM;IACpB;+GApCW,SAAS,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAT,SAAS,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EAAA,KAAA,EAAA,CAAA,CAAA;;4FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBAJrB,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACF,oBAAA,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK;AAC1B,oBAAA,UAAU,EAAE;AACf,iBAAA;;AAwCD;;;;AAIG;MAMU,eAAe,CAAA;AAL5B,IAAA,WAAA,GAAA;AAMmB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC;QAG1C,IAAA,CAAA,MAAM,GAAe,EAAE;AAmChC,IAAA;AA1BC,IAAA,SAAS,CACP,KAAgE,EAAA;AAEhE,QAAA,IAAI,CAAC,KAAK,KAAK,EAAE,KAAK,YAAY,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,EAAE;AACpE,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;;AAEhB,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE;QACjD;QAEA,MAAM,aAAa,GAAiC,IAAI,CAAC,MAAM,CAAC,IAAI,CAClE,KAAY,CACb;QAED,IAAI,aAAa,EAAE;AACjB,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE;YAChB,aAAa,CAAC,WAAW,CACvB,CAAC,EAAE,YAAY,EAA8B,KAAI;AAC/C,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAChC,YAAA,CAAC,CACF;QACH;QACA,OAAO,IAAI,CAAC,MAAM;IACpB;+GAtCW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;6GAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,aAAA,EAAA,IAAA,EAAA,KAAA,EAAA,CAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAL3B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,IAAI,EAAE,KAAK;AACX,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;AC9DD;MAiDa,qBAAqB,CAAA;AANlC,IAAA,WAAA,GAAA;;QAW2C,IAAA,CAAA,KAAK,GAC5C,WAAW;;QASJ,IAAA,CAAA,aAAa,GAAkB,EAAE;;AAGjC,QAAA,IAAA,CAAA,SAAS,GAAW,GAAG,GAAG,IAAI,GAAG,IAAI;;QAGrC,IAAA,CAAA,QAAQ,GAAG,IAAI;;QAGf,IAAA,CAAA,IAAI,GAAG,IAAI;;QAGX,IAAA,CAAA,QAAQ,GAAG,IAAI;;QAGf,IAAA,CAAA,aAAa,GAAG,CAAC;AAE1B;;;AAGG;QACM,IAAA,CAAA,UAAU,GAAG,KAAK;;AAGlB,QAAA,IAAA,CAAA,QAAQ,GAAa;AAC5B,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,SAAS,EAAE,WAAW;AACtB,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,UAAU,EAAE,YAAY;AACxB,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,OAAO,EAAE,SAAS;AAClB,YAAA,IAAI,EAAE,MAAM;SACb;;QAGQ,IAAA,CAAA,aAAa,GAAa,EAAE;;QAG5B,IAAA,CAAA,UAAU,GAAoB,IAAI;;AAGjC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,YAAY,EAAoB;;AAGlD,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,YAAY,EAAuB;;QAGhE,IAAA,CAAA,mBAAmB,GAAG,mBAAmB,EAAE;;QAE3C,IAAA,CAAA,cAAc,GAAkB,QAAQ;;AAExC,QAAA,IAAA,CAAA,KAAK,GAAqC,IAAI,GAAG,EAAE;;QAInD,IAAA,CAAA,QAAQ,GAAa,EAAE;;QAEvB,IAAA,CAAA,OAAO,GAAG,KAAK;AAygBhB,IAAA;AArgBC;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,OAAO,OAAO,CAAC,KAAK,CAClB,+EAA+E,CAChF;QACH;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,YAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,KAAI;AACjE,gBAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,oBAAA,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE;AAClD,wBAAA,QAAQ,EAAE,GAAG;wBACb,WAAW,EAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC;wBACtD,wBAAwB,EAAE,IAAI,CAAC,aAAa,CAC1C,OAAO,CAAC,wBAAwB,CACjC;AACF,qBAAA,CAAC;oBACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC;oBAC7C,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,IAAI,CACF,YAAY,EACZ,aAAa,EACb,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,0BAA0B,EAC1B,yBAAyB,CAC1B,CACF;;AAGD,oBAAA,IACE,YAAY,CAAC,WAAW,KAAK,UAAU;AACvC,wBAAA,YAAY,CAAC,WAAW,KAAK,YAAY,EACzC;wBACA,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC;oBACjD;gBACF;AACF,YAAA,CAAC,CAAC;QACJ;IACF;;IAGA,WAAW,GAAA;QACT,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC1B,YAAA,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE;AAClC,YAAA,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,EAAE;AACpC,gBAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,gBAAA,IAAI,CAAC,wBAAwB,GAAG,WAAW;AAC3C,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,IAAI,CACF,IAAI,EACJ,aAAa,EACb,UAAU,EACV,QAAQ,EACR,0BAA0B,CAC3B,CACF;YACH;AACF,QAAA,CAAC,CAAC;IACJ;;AAIA,IAAA,cAAc,CAAC,KAAY,EAAA;QACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACtC,MAAM,mBAAmB,GAAG,CAAA,yEAAA,CAA2E;AACtG,YAAA,CAAE,KAAa,IAAK,MAAM,CAAC,KAAa,EAAE,WAAW;AACpD,gBAAA,mBAAmB;AACrB,YAAA,OAAO,mBAAmB;QAC5B;QACA;IACF;;;AAKA,IAAA,WAAW,CAAC,KAAgB,EAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QACnB,KAAK,CAAC,cAAc,EAAE;;AAEtB,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM;IAC9B;;AAGA,IAAA,WAAW,CAAC,KAAgB,EAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QACnB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,cAAc,GAAG,QAAQ;IAChC;;AAGA,IAAA,MAAM,CAAC,KAAwB,EAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QACnB,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,cAAc,GAAG,QAAQ;AAE9B,QAAA,IAAI,KAA2B;;QAG/B,IAAI,KAAK,YAAY,SAAS,IAAI,KAAK,CAAC,YAAY,EAAE;AACpD,YAAA,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK;QAClC;aAAO,IACL,KAAK,CAAC,MAAM;YACZ,KAAK,CAAC,MAAM,YAAY,gBAAgB;AACxC,YAAA,KAAK,CAAC,MAAM,CAAC,KAAK,EAClB;AACA,YAAA,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK;QAC5B;QAEA,IAAI,KAAK,EAAE;YACT,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,KAAI;gBAC/C,IAAI,KAAK,GAAG,KAAK;gBACjB,IAAI,UAAU,GAAkB,IAAI;;gBAEpC,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE;oBAC9B,KAAK,GAAG,IAAI;oBACZ,UAAU,GAAG,WAAW;gBAC1B;;AAEA,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;oBACzC,KAAK,GAAG,IAAI;oBACZ,UAAU,GAAG,WAAW;gBAC1B;;AAEA,gBAAA,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,EAAE;AACpC,oBAAA,wBAAwB,EAAE,UAAU;oBACpC,WAAW,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAAgB;AAC1D,iBAAA,CAAC;;AAGF,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,oBAAA,WAAW,EAAE,OAAO;oBACpB,QAAQ,EAAE,YAAY,CAAC,QAAQ;AAChC,iBAAA,CAAC;gBAEF,IAAI,KAAK,EAAE;;AAET,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,wBAAA,WAAW,EAAE,SAAS;wBACtB,QAAQ,EAAE,YAAY,CAAC,QAAQ;AAC/B,wBAAA,MAAM,EAAE,SAAS;AACjB,wBAAA,wBAAwB,EAAE,UAAU;AACrC,qBAAA,CAAC;gBACJ;AAEA,gBAAA,OAAO,YAAY;AACrB,YAAA,CAAC,CAAC;;YAGF,IAAI,CAAC,GAAG,CAAC;AACT,YAAA,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE;;AAEhC,gBAAA,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;oBAAE;AAC9C,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;gBACpB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;AAC7B,gBAAA,CAAC,EAAE;YACL;;YAGA,IACE,KAAK,CAAC,MAAM;gBACZ,KAAK,CAAC,MAAM,YAAY,gBAAgB;AACxC,gBAAA,KAAK,CAAC,MAAM,CAAC,KAAK,EAClB;AACA,gBAAA,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE;YACzB;YAEA,IAAI,CAAC,QAAQ,EAAE;QACjB;IACF;;IAGA,QAAQ,CAAC,EAAU,EAAE,KAAkB,EAAA;;AAErC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,IAAI;YAAE;;AAEX,QAAA,IACE,IAAI,CAAC,WAAW,KAAK,OAAO;YAC5B,IAAI,CAAC,WAAW,KAAK,SAAS;AAC9B,YAAA,IAAI,CAAC,WAAW,KAAK,SAAS,EAC9B;AACA,YAAA,IAAI,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9D;aAAO;AACL,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAC7B,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;QAC5B;IACF;;AAGA,IAAA,eAAe,CAAC,KAAuC,EAAA;AACrD,QAAA,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;;AAG5B,QAAA,QAAQ,IAAI,CAAC,WAAW;AACtB,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,WAAW;AACd,gBAAA,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE;AAClC,gBAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,gBAAA,IAAI,CAAC,wBAAwB,GAAG,WAAW;AAC3C,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,IAAI,CACF,IAAI,EACJ,aAAa,EACb,UAAU,EACV,QAAQ,EACR,0BAA0B,CAC3B,CACF;gBACD;;AAGF,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,YAAY;AACf,gBAAA,IAAI,CAAC;AACF,qBAAA,UAAU,CAAC,IAAI,CAAC,EAAE;AAClB,qBAAA,SAAS,CAAC;oBACT,KAAK,EAAE,OAAO,CAAC,IAAI;iBACpB;qBACA,GAAG,CAAC,MAAK;;AAER,oBAAA,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE;AAClC,oBAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,oBAAA,IAAI,CAAC,wBAAwB,GAAG,WAAW;AAC3C,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,IAAI,CACF,IAAI,EACJ,aAAa,EACb,UAAU,EACV,QAAQ,EACR,0BAA0B,CAC3B,CACF;AACH,gBAAA,CAAC,CAAC;gBACJ;;AAGF,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,MAAM;gBACT;AAAC,gBAAA,CAAC,IAAI,CAAC,OAAO,CAAC;sBACX,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI;sBAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AAEjC,qBAAA,SAAS,CAAC;oBACT,KAAK,EAAE,OAAO,CAAC,IAAI;iBACpB;qBACA,GAAG,CAAC,MAAK;;oBAER,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1B,oBAAA,MAAM,KAAK,GAAG,IAAI,CAChB,IAAI,EACJ,aAAa,EACb,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,0BAA0B,EAC1B,yBAAyB,CAC1B;AACD,oBAAA,KAAK,CAAC,WAAW,GAAG,SAAS;AAC7B,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AAC9B,gBAAA,CAAC,CAAC;gBACJ;;AAGF,YAAA,KAAK,SAAS;AACd,YAAA,KAAK,SAAS;AACd,YAAA;gBACE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1B,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACpB,oBAAA,GAAG,IAAI,CACL,IAAI,EACJ,aAAa,EACb,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,0BAA0B,EAC1B,yBAAyB,CAC1B;AACD,oBAAA,WAAW,EAAE,SAAS;AACvB,iBAAA,CAAC;gBACF;;IAEN;;IAGA,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;;QAElC,IAAI,CAAC,IAAI,CAAC,IAAI;AAAE,YAAA,IAAI,CAAC,cAAc,GAAG,WAAW;AACjD,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;;YAE1B,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,WAAW,KAAK,OAAO;gBAAE;AAC/C,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,GAAI,CAAC,CAAC,SAAS,CAAC;AAClE,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;AACd,oBAAA,QAAQ,KAAK,CAAC,IAAI;wBAChB,KAAK,aAAa,CAAC,cAAc;;AAE/B,4BAAA,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,EAAE;AACpC,gCAAA,IAAI,CAAC,WAAW,GAAG,WAAW;AAC9B,gCAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;4BAC9D;4BACA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CACxB,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,CAC5C;AACD,4BAAA,IAAI,CAAC,WAAW,GAAG,WAAW;4BAC9B;wBAEF,KAAK,aAAa,CAAC,QAAQ;AACzB,4BAAA,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE;;gCAElB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;;gCAE1B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;AAC/B,gCAAA,IAAI,CAAC,QAAQ,GAAG,GAAG;gCACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC;;gCAEzD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;4BAC/B;4BAEA,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,IAAI,CACF,IAAI,EACJ,aAAa,EACb,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,yBAAyB,CAC1B,CACF;;AAGD,4BAAA,IACE,IAAI,CAAC,WAAW,KAAK,UAAU;AAC/B,gCAAA,IAAI,CAAC,WAAW,KAAK,YAAY,EACjC;gCACA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;4BACzC;;gCAAO,IAAI,CAAC,qBAAqB,EAAE;AACnC,4BAAA,IAAI,CAAC,OAAO,GAAG,KAAK;4BACpB;;gBAEN,CAAC;AACD,gBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,oBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AACnB,oBAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,oBAAA,IAAI,CAAC,MAAM,GAAG,SAAS;;oBAEvB,IAAI,CAAC,uBAAuB,GAAG;AAC7B,wBAAA,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,0BAA0B,EAAE;qBAC9D;oBACD,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,IAAI,CACF,IAAI,EACJ,aAAa,EACb,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,yBAAyB,CAC1B,CACF;AACD,oBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;gBACtB,CAAC;AACF,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEA;;;;AAIG;AACH,IAAA,oBAAoB,CAAC,QAAgB,EAAA;;AAEnC,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;QAC5D,KAAK,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,YAAY,EAAE;AACnD,YAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE;AACtC,gBAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAAE,oBAAA,OAAO,WAAkB;YAC7D;iBAAO;gBACL,IAAI,SAAS,KAAK,QAAQ;AAAE,oBAAA,OAAO,WAAkB;YACvD;QACF;AACA,QAAA,OAAO,OAAO;IAChB;;AAGA,IAAA,kBAAkB,CAAC,KAAwB,EAAA;AACzC,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7B;;AAGA,IAAA,eAAe,CAAC,IAAyB,EAAA;QACvC,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;IAC1E;AAEA;;;;AAIG;IACK,aAAa,CAAC,IAAyB,EAAE,KAAa,EAAA;QAC5D,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QACnB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK;AACjC,aAAA,IAAI,CACH,SAAS,CAAC,MAAK;YACb,MAAM,gBAAgB,GACpB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;kBACzB,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI;kBAChC,IAAI,CAAC,OAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;AACxC,YAAA,OAAO,gBAAgB;AACzB,QAAA,CAAC,CAAC,EACF,SAAS,CACP,aAAa,CAAC;YACZ,gBAAgB,EAAE,IAAI,CAAC,aAAa;AACrC,SAAA,CAAC,CACH,EACD,GAAG,CAAC,CAAC,UAAU,KAAI;;YAEjB,IAAI,UAAU,EAAE;;gBAEd,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE;AACrC,oBAAA,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;oBAC/B,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,aAAa,CAChD,UAAU,CAAC,wBAAwB,CACpC;AACD,oBAAA,IAAI,CAAC,uBAAuB,GAAG,UAAU,CAAC,uBAAuB;oBACjE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,MAAM,CAAC;oBAC/D,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,IAAI,CACF,IAAI,EACJ,aAAa,EACb,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,0BAA0B,EAC1B,yBAAyB,CAC1B,CACF;gBACH;YACF;AACF,QAAA,CAAC,CAAC;;QAEF,MAAM,CACJ,CAAC,OAAO,KACN,CAAC,CAAC,OAAO;YACT,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,UAAU;YACxD,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,YAAY,CAC7D;;QAED,IAAI,CAAC,CAAC,CAAC;AAER,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAK;gBACT,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;oBACtC,IAAI,CAAC,qBAAqB,EAAE;gBAC9B;YACF,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AACjB,gBAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,gBAAA,IAAI,CAAC,MAAM,GAAG,SAAS;AACvB,gBAAA,IAAI,CAAC,wBAAwB,GAAG,WAAW;gBAC3C,IAAI,CAAC,WAAW,CAAC,IAAI,CACnB,IAAI,CACF,IAAI,EACJ,aAAa,EACb,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,0BAA0B,CAC3B,CACF;gBACD,IAAI,CAAC,qBAAqB,EAAE;YAC9B,CAAC;AACF,SAAA,CAAC;IACN;AAEQ,IAAA,aAAa,CAAC,IAA+B,EAAA;AACnD,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE;YACvE,OAAO,IAAI,IAAI,IAAI;QACrB;aAAO;AACL,YAAA,OAAO,WAAW;QACpB;IACF;AAEA;;AAEG;AACK,IAAA,iBAAiB,CAAC,KAA6B,EAAA;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CACrC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,KAAK,YAAY,CAC5C;IACH;AAEA;;AAEG;AACK,IAAA,gBAAgB,CAAC,KAA6B,EAAA;QACpD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CACrC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,KAAK,WAAW,CAC3C;IACH;AAEA;;AAEG;IACK,qBAAqB,GAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI;AAAE,YAAA,IAAI,CAAC,cAAc,GAAG,MAAM;QAC5C,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,IAAI,CAAC,cAAc,KAAK,MAAM;AAAE,gBAAA,IAAI,CAAC,cAAc,GAAG,QAAQ;QACpE,CAAC,EAAE,IAAI,CAAC;IACV;+GAjlBW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,6rBCjDlC,g2UAiTA,EAAA,MAAA,EAAA,CAAA,ozSAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,eAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FDhQa,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,cAGd,KAAK,EAAA,QAAA,EAAA,g2UAAA,EAAA,MAAA,EAAA,CAAA,ozSAAA,CAAA,EAAA;8BAIU,cAAc,EAAA,CAAA;sBAA1C,SAAS;uBAAC,gBAAgB;gBAGc,KAAK,EAAA,CAAA;sBAA7C,WAAW;uBAAC,iBAAiB;;sBAAG;gBAIxB,OAAO,EAAA,CAAA;sBAAf;gBAGQ,MAAM,EAAA,CAAA;sBAAd;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAGQ,SAAS,EAAA,CAAA;sBAAjB;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,IAAI,EAAA,CAAA;sBAAZ;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAGQ,aAAa,EAAA,CAAA;sBAArB;gBAMQ,UAAU,EAAA,CAAA;sBAAlB;gBAGQ,QAAQ,EAAA,CAAA;sBAAhB;gBAYQ,aAAa,EAAA,CAAA;sBAArB;gBAGQ,UAAU,EAAA,CAAA;sBAAlB;gBAGS,WAAW,EAAA,CAAA;sBAApB;gBAGS,YAAY,EAAA,CAAA;sBAArB;gBAoFD,cAAc,EAAA,CAAA;sBADb,YAAY;uBAAC,qBAAqB,EAAE,CAAC,QAAQ,CAAC;;;MEpKpC,kBAAkB,CAAA;+GAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,CAVd,SAAS,EAAE,qBAAqB,aAN7C,gBAAgB;YAChB,eAAe;YACf,eAAe;YACf,oBAAoB;AACpB,YAAA,YAAY,aASJ,qBAAqB,CAAA,EAAA,CAAA,CAAA;AAGpB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,SAAA,EATlB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,eAAe;AACxB,gBAAA,QAAQ,EAAE,UAAU;AACrB,aAAA;AACF,SAAA,EAAA,OAAA,EAAA,CAZC,gBAAgB;YAChB,eAAe;YACf,eAAe;YACf,oBAAoB;YACpB,YAAY,CAAA,EAAA,CAAA,CAAA;;4FAYH,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAlB9B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,gBAAgB;wBAChB,eAAe;wBACf,eAAe;wBACf,oBAAoB;wBACpB,YAAY;AACb,qBAAA;AACD,oBAAA,YAAY,EAAE,CAAC,SAAS,EAAE,qBAAqB,CAAC;AAChD,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,eAAe;AACxB,4BAAA,QAAQ,EAAE,UAAU;AACrB,yBAAA;AACF,qBAAA;oBACD,OAAO,EAAE,CAAC,qBAAqB,CAAC;oBAChC,OAAO,EAAE,CAAC,sBAAsB,CAAC;AAClC,iBAAA;;;AC3BD;;AAEG;;;;"}