{"version":3,"file":"c8y-ngx-components-widgets-implementations-markdown.mjs","sources":["../../widgets/implementations/markdown/markdown-widget.service.ts","../../widgets/implementations/markdown/markdown-widget-view/markdown-widget-view.component.ts","../../widgets/implementations/markdown/markdown-widget-view/markdown-widget-view.component.html","../../widgets/implementations/markdown/markdown-widget-config/markdown-widget-config.component.ts","../../widgets/implementations/markdown/markdown-widget-config/markdown-widget-config.component.html","../../widgets/implementations/markdown/markdown-widget.module.ts","../../widgets/implementations/markdown/c8y-ngx-components-widgets-implementations-markdown.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { IManagedObjectBinary, InventoryBinaryService, InventoryService } from '@c8y/client';\nimport { FilesService, gettext, AlertService } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable({ providedIn: 'root' })\nexport class MarkdownWidgetService {\n  constructor(\n    private fileService: FilesService,\n    private inventory: InventoryService,\n    private binary: InventoryBinaryService,\n    private alert: AlertService,\n    private translate: TranslateService\n  ) {}\n\n  async getFile(markdownBinaryId: string | null): Promise<File> {\n    if (!markdownBinaryId) {\n      return null;\n    }\n\n    try {\n      const { data: markdownBinaryMo } = await this.inventory.detail(markdownBinaryId);\n      const file = await this.fileService.getFile(markdownBinaryMo as IManagedObjectBinary);\n      return file;\n    } catch (e) {\n      const text = this.translate.instant(\n        gettext('Unable to retrieve binary with ID: {{ markdownBinaryId }}'),\n        { markdownBinaryId }\n      );\n      this.alert.danger(text, e?.data);\n    }\n\n    return null;\n  }\n\n  async uploadFile(file: File): Promise<string> {\n    const { data: mo } = await this.binary.create(file);\n    return mo.id;\n  }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { IFetchOptions, FetchClient, IFetchResponse } from '@c8y/client';\nimport { AppStateService, MarkdownToHtmlPipe } from '@c8y/ngx-components';\nimport { MarkdownWidgetConfig } from '../markdown-widget.model';\nimport { MarkdownWidgetService } from '../markdown-widget.service';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n  selector: 'c8y-markdown-widget-view',\n  templateUrl: './markdown-widget-view.component.html',\n  standalone: true,\n  imports: [MarkdownToHtmlPipe, AsyncPipe]\n})\nexport class MarkdownWidgetViewComponent implements OnInit {\n  @Input() config: MarkdownWidgetConfig;\n  loading: boolean;\n  markdown: string;\n  contextPath: string;\n  private readonly headers: any = { 'Content-Type': 'text/markdown', responseType: 'blob' };\n\n  constructor(\n    private appState: AppStateService,\n    private client: FetchClient,\n    private markdownWidgetService: MarkdownWidgetService\n  ) {}\n\n  async ngOnInit() {\n    this.contextPath = this.appState.getCurrentContextPath();\n    if (this.config.markdownBinaryId) {\n      const readmeContent = await (\n        await this.markdownWidgetService.getFile(this.config.markdownBinaryId)\n      ).text();\n      this.markdown = readmeContent;\n    } else if (this.config.contentUrl?.toLowerCase() === '/readme.md') {\n      this.markdown = await this.getReadmeFileContent();\n    } else {\n      this.setContentFromUrl(this.config.contentUrl);\n    }\n  }\n\n  setContentFromUrl(url: string) {\n    const req = new XMLHttpRequest();\n\n    req.onreadystatechange = () => this.render(req);\n    req.addEventListener('load', () => this.render(req));\n    req.open('GET', url);\n    req.responseType = 'text';\n    req.setRequestHeader('Accept', 'text/html');\n    req.send();\n  }\n\n  private async render(req: XMLHttpRequest) {\n    if (req.readyState === 4 && req.status === 200) {\n      this.markdown = req.response;\n    }\n  }\n\n  private async getReadmeFileContent(): Promise<string> {\n    const readmeFile = await this.getReadmeFile();\n\n    if (readmeFile.status === 200) {\n      return await readmeFile.text();\n    }\n    return '';\n  }\n\n  private async getReadmeFile(): Promise<IFetchResponse> {\n    const options: IFetchOptions = {\n      method: 'GET',\n      headers: this.headers\n    };\n    const result: IFetchResponse = await this.client.fetch(\n      `/apps/${this.contextPath}${this.config.contentUrl}`,\n      options\n    );\n    return result;\n  }\n}\n","<div id=\"helpContent\" class=\"p-16 p-t-0 markdown-content\" [innerHTML]=\"markdown | markdownToHtml | async\"></div>\n","import { Component, Input, OnInit } from '@angular/core';\nimport {\n  AlertService,\n  C8yValidators,\n  CoreModule,\n  gettext,\n  OnBeforeSave\n} from '@c8y/ngx-components';\nimport {\n  AbstractControl,\n  FormBuilder,\n  FormGroup,\n  NgForm,\n  ReactiveFormsModule,\n  ValidationErrors,\n  ValidatorFn,\n  Validators\n} from '@angular/forms';\nimport { MarkdownWidgetConfig } from '../markdown-widget.model';\nimport { MarkdownWidgetService } from '../markdown-widget.service';\n\n@Component({\n  selector: 'c8y-markdown-widget-config',\n  templateUrl: './markdown-widget-config.component.html',\n  standalone: true,\n  imports: [CoreModule, ReactiveFormsModule]\n})\nexport class MarkdownWidgetConfigComponent implements OnInit, OnBeforeSave {\n  @Input() config: MarkdownWidgetConfig;\n  formGroup: FormGroup;\n  fileFromConfig: File;\n  uploadChoice: 'uploadBinary' | 'uploadUrl' = 'uploadUrl';\n  loading = false;\n\n  constructor(\n    private formBuilder: FormBuilder,\n    private form: NgForm,\n    private alert: AlertService,\n    private markdownService: MarkdownWidgetService\n  ) {}\n\n  async onBeforeSave(config?: MarkdownWidgetConfig): Promise<boolean> {\n    if (this.formGroup.invalid) {\n      return false;\n    }\n    if (this.uploadChoice === 'uploadUrl') {\n      Object.assign(config, {\n        contentUrl: this.formGroup.value.contentUrl,\n        markdownBinaryId: null\n      });\n      return true;\n    }\n    const fileFromForm = this.getFileFromFormValue(this.formGroup.value);\n    if (fileFromForm && fileFromForm !== this.fileFromConfig) {\n      try {\n        const markdownBinaryId = await this.markdownService.uploadFile(fileFromForm);\n        Object.assign(config, { markdownBinaryId, contentUrl: null });\n        return true;\n      } catch (e) {\n        this.alert.danger(gettext('Unable to upload Markdown file.'), e?.data);\n        return false;\n      }\n    }\n    if (!fileFromForm) {\n      Object.assign(config, { contentUrl: '/readme.md', markdownBinaryId: null });\n    }\n    return true;\n  }\n\n  async ngOnInit() {\n    this.initForm();\n    if (this.config.markdownBinaryId) {\n      this.uploadChoice = 'uploadBinary';\n      this.fileFromConfig = await this.markdownService.getFile(this.config.markdownBinaryId);\n      this.formGroup.patchValue({\n        droppedFile: [{ file: this.fileFromConfig, name: this.fileFromConfig.name }]\n      });\n    }\n  }\n\n  onChange(value: 'uploadBinary' | 'uploadUrl') {\n    this.uploadChoice = value;\n    this.formGroup.controls['uploadChoice'].patchValue(value);\n  }\n\n  private getFileFromFormValue(formValue: any): File | null {\n    const binary: any[] = formValue?.droppedFile || [];\n    return binary[0]?.file || null;\n  }\n\n  private initForm(): void {\n    this.formGroup = this.formBuilder.group(\n      {\n        contentUrl: ['', [Validators.maxLength(2000)]],\n        droppedFile: [\n          null,\n          [\n            Validators.minLength(1),\n            Validators.maxLength(1),\n            C8yValidators.filesValidator({ maximumFileSizeInKb: 1000 })\n          ]\n        ],\n        uploadChoice: [this.config.markdownBinaryId ? 'uploadBinary' : 'uploadUrl', []]\n      },\n      { validators: this.requireEitherBinaryOrUrl() }\n    );\n    this.form.form.addControl('config', this.formGroup);\n    this.formGroup.patchValue(this.config);\n  }\n\n  private requireEitherBinaryOrUrl(): ValidatorFn {\n    return (control: AbstractControl): ValidationErrors | null => {\n      const url = control.get(`contentUrl`);\n      const uploadBinary = control.get(`droppedFile`);\n\n      const urlDefined = url && url.value !== undefined && url.value !== null;\n      const uploadBinaryDefined =\n        uploadBinary && uploadBinary.value !== undefined && uploadBinary.value !== null;\n\n      const errors = {};\n      if (this.uploadChoice === 'uploadBinary' && !uploadBinaryDefined) {\n        // sets error\n        const error = { required: true };\n        uploadBinary.setErrors(Object.assign({}, uploadBinary.errors || {}, error));\n        Object.assign(errors, error);\n      } else {\n        // remove previous error\n        this.removeErrors(uploadBinary, ['required']);\n      }\n\n      if (this.uploadChoice === 'uploadUrl' && (!urlDefined || url.value === '')) {\n        // sets error\n        const error = { required: true };\n        url.setErrors(Object.assign({}, url.errors || {}, error));\n        Object.assign(errors, error);\n      } else {\n        // remove previous error\n        this.removeErrors(url, ['required']);\n      }\n\n      return Object.keys(errors).length ? errors : null;\n    };\n  }\n\n  private removeErrors(control: AbstractControl, errors: string[]): boolean {\n    if (!control || !control.errors) {\n      return false;\n    }\n    let removedError = false;\n    for (const error of errors) {\n      if (control.errors[error]) {\n        removedError = true;\n        delete control.errors[error];\n      }\n    }\n    if (removedError) {\n      control.setErrors(\n        Object.keys(control.errors).length ? Object.assign({}, control.errors) : null\n      );\n    }\n    return removedError;\n  }\n}\n","<form [formGroup]=\"formGroup\" class=\"p-l-24 p-r-24 p-t-16\">\n  <div class=\"form-group\">\n    <label title=\"{{ 'Upload a binary' | translate }}\" class=\"c8y-radio radio-inline\">\n      <input\n        #radio\n        formControlName=\"uploadChoice\"\n        type=\"radio\"\n        value=\"uploadBinary\"\n        name=\"uploadChoice\"\n        (change)=\"onChange($event.target.value)\"\n      />\n      <span></span>\n      <span>{{ 'Upload a binary' | translate }}</span>\n    </label>\n    <label title=\"{{ 'Provide a file path' | translate }}\" class=\"c8y-radio radio-inline m-l-8\">\n      <input\n        #radio\n        formControlName=\"uploadChoice\"\n        type=\"radio\"\n        value=\"uploadUrl\"\n        name=\"uploadChoice\"\n        (change)=\"onChange($event.target.value)\"\n      />\n      <span></span>\n      <span>\n        {{ 'Provide a file path' | translate }}\n      </span>\n    </label>\n  </div>\n\n  <ng-container [ngSwitch]=\"uploadChoice\">\n    <div *ngSwitchCase=\"'uploadBinary'\">\n      <c8y-form-group class=\"m-0\">\n        <c8y-drop-area\n          formControlName=\"droppedFile\"\n          class=\"drop-area-sm\"\n          [title]=\"'Drop file or click to browse' | translate\"\n          [maxAllowedFiles]=\"1\"\n          [accept]=\"'md'\"\n        ></c8y-drop-area>\n      </c8y-form-group>\n    </div>\n    <div *ngSwitchCase=\"'uploadUrl'\">\n      <c8y-form-group class=\"m-0\">\n        <div class=\"m-b-4 p-b-8\">\n          <div class=\"input-group\">\n            <span class=\"input-group-addon\">\n              <i c8yIcon=\"globe\"></i>\n            </span>\n            <input\n              type=\"text\"\n              class=\"form-control\"\n              formControlName=\"contentUrl\"\n              placeholder=\"{{ 'e.g.' | translate }} http://example.com/binary.zip\"\n            />\n          </div>\n        </div>\n      </c8y-form-group>\n    </div>\n  </ng-container>\n</form>\n","import { NgModule } from '@angular/core';\nimport { MarkdownWidgetViewComponent } from './markdown-widget-view/markdown-widget-view.component';\nimport { MarkdownWidgetConfigComponent } from './markdown-widget-config/markdown-widget-config.component';\n\n/**\n * @deprecated\n */\n@NgModule({\n  imports: [MarkdownWidgetViewComponent, MarkdownWidgetConfigComponent]\n})\nexport class MarkdownWidgetModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3.MarkdownWidgetService"],"mappings":";;;;;;;;;;;MAMa,qBAAqB,CAAA;IAChC,WACU,CAAA,WAAyB,EACzB,SAA2B,EAC3B,MAA8B,EAC9B,KAAmB,EACnB,SAA2B,EAAA;QAJ3B,IAAW,CAAA,WAAA,GAAX,WAAW,CAAc;QACzB,IAAS,CAAA,SAAA,GAAT,SAAS,CAAkB;QAC3B,IAAM,CAAA,MAAA,GAAN,MAAM,CAAwB;QAC9B,IAAK,CAAA,KAAA,GAAL,KAAK,CAAc;QACnB,IAAS,CAAA,SAAA,GAAT,SAAS,CAAkB;KACjC;IAEJ,MAAM,OAAO,CAAC,gBAA+B,EAAA;QAC3C,IAAI,CAAC,gBAAgB,EAAE;AACrB,YAAA,OAAO,IAAI,CAAC;SACb;AAED,QAAA,IAAI;AACF,YAAA,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACjF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAwC,CAAC,CAAC;AACtF,YAAA,OAAO,IAAI,CAAC;SACb;QAAC,OAAO,CAAC,EAAE;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CACjC,OAAO,CAAC,2DAA2D,CAAC,EACpE,EAAE,gBAAgB,EAAE,CACrB,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;SAClC;AAED,QAAA,OAAO,IAAI,CAAC;KACb;IAED,MAAM,UAAU,CAAC,IAAU,EAAA;AACzB,QAAA,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpD,OAAO,EAAE,CAAC,EAAE,CAAC;KACd;+GAhCU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA,CAAA,EAAA;;4FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;MCQrB,2BAA2B,CAAA;AAOtC,IAAA,WAAA,CACU,QAAyB,EACzB,MAAmB,EACnB,qBAA4C,EAAA;QAF5C,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAiB;QACzB,IAAM,CAAA,MAAA,GAAN,MAAM,CAAa;QACnB,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAAuB;QALrC,IAAO,CAAA,OAAA,GAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;KAMtF;AAEJ,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;AACzD,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;YAChC,MAAM,aAAa,GAAG,MAAM,CAC1B,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EACtE,IAAI,EAAE,CAAC;AACT,YAAA,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC;SAC/B;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE;YACjE,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;SACnD;aAAM;YACL,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;SAChD;KACF;AAED,IAAA,iBAAiB,CAAC,GAAW,EAAA;AAC3B,QAAA,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;AAEjC,QAAA,GAAG,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAChD,QAAA,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,QAAA,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACrB,QAAA,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC;AAC1B,QAAA,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC5C,GAAG,CAAC,IAAI,EAAE,CAAC;KACZ;IAEO,MAAM,MAAM,CAAC,GAAmB,EAAA;AACtC,QAAA,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE;AAC9C,YAAA,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;SAC9B;KACF;AAEO,IAAA,MAAM,oBAAoB,GAAA;AAChC,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;AAE9C,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG,EAAE;AAC7B,YAAA,OAAO,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;SAChC;AACD,QAAA,OAAO,EAAE,CAAC;KACX;AAEO,IAAA,MAAM,aAAa,GAAA;AACzB,QAAA,MAAM,OAAO,GAAkB;AAC7B,YAAA,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;QACF,MAAM,MAAM,GAAmB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CACpD,CAAS,MAAA,EAAA,IAAI,CAAC,WAAW,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAE,CAAA,EACpD,OAAO,CACR,CAAC;AACF,QAAA,OAAO,MAAM,CAAC;KACf;+GA/DU,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,ECbxC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,0HACA,EDUY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,kBAAkB,kDAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAE5B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBANvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,cAExB,IAAI,EAAA,OAAA,EACP,CAAC,kBAAkB,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,0HAAA,EAAA,CAAA;iJAG/B,MAAM,EAAA,CAAA;sBAAd,KAAK;;;MEaK,6BAA6B,CAAA;AAOxC,IAAA,WAAA,CACU,WAAwB,EACxB,IAAY,EACZ,KAAmB,EACnB,eAAsC,EAAA;QAHtC,IAAW,CAAA,WAAA,GAAX,WAAW,CAAa;QACxB,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;QACZ,IAAK,CAAA,KAAA,GAAL,KAAK,CAAc;QACnB,IAAe,CAAA,eAAA,GAAf,eAAe,CAAuB;QAPhD,IAAY,CAAA,YAAA,GAAiC,WAAW,CAAC;QACzD,IAAO,CAAA,OAAA,GAAG,KAAK,CAAC;KAOZ;IAEJ,MAAM,YAAY,CAAC,MAA6B,EAAA;AAC9C,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AAC1B,YAAA,OAAO,KAAK,CAAC;SACd;AACD,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,WAAW,EAAE;AACrC,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;AACpB,gBAAA,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU;AAC3C,gBAAA,gBAAgB,EAAE,IAAI;AACvB,aAAA,CAAC,CAAC;AACH,YAAA,OAAO,IAAI,CAAC;SACb;AACD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACrE,IAAI,YAAY,IAAI,YAAY,KAAK,IAAI,CAAC,cAAc,EAAE;AACxD,YAAA,IAAI;gBACF,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAC7E,gBAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,gBAAA,OAAO,IAAI,CAAC;aACb;YAAC,OAAO,CAAC,EAAE;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AACvE,gBAAA,OAAO,KAAK,CAAC;aACd;SACF;QACD,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;SAC7E;AACD,QAAA,OAAO,IAAI,CAAC;KACb;AAED,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,CAAC,QAAQ,EAAE,CAAC;AAChB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;AAChC,YAAA,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC;AACnC,YAAA,IAAI,CAAC,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACvF,YAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AACxB,gBAAA,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;AAC7E,aAAA,CAAC,CAAC;SACJ;KACF;AAED,IAAA,QAAQ,CAAC,KAAmC,EAAA;AAC1C,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;KAC3D;AAEO,IAAA,oBAAoB,CAAC,SAAc,EAAA;AACzC,QAAA,MAAM,MAAM,GAAU,SAAS,EAAE,WAAW,IAAI,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;KAChC;IAEO,QAAQ,GAAA;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CACrC;AACE,YAAA,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9C,YAAA,WAAW,EAAE;gBACX,IAAI;AACJ,gBAAA;AACE,oBAAA,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AACvB,oBAAA,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;oBACvB,aAAa,CAAC,cAAc,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;AAC5D,iBAAA;AACF,aAAA;AACD,YAAA,YAAY,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,cAAc,GAAG,WAAW,EAAE,EAAE,CAAC;SAChF,EACD,EAAE,UAAU,EAAE,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAChD,CAAC;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACxC;IAEO,wBAAwB,GAAA;QAC9B,OAAO,CAAC,OAAwB,KAA6B;YAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA,UAAA,CAAY,CAAC,CAAC;YACtC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA,WAAA,CAAa,CAAC,CAAC;AAEhD,YAAA,MAAM,UAAU,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC;AACxE,YAAA,MAAM,mBAAmB,GACvB,YAAY,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS,IAAI,YAAY,CAAC,KAAK,KAAK,IAAI,CAAC;YAElF,MAAM,MAAM,GAAG,EAAE,CAAC;YAClB,IAAI,IAAI,CAAC,YAAY,KAAK,cAAc,IAAI,CAAC,mBAAmB,EAAE;;AAEhE,gBAAA,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACjC,gBAAA,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,MAAM,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAC5E,gBAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;aAC9B;iBAAM;;gBAEL,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;aAC/C;AAED,YAAA,IAAI,IAAI,CAAC,YAAY,KAAK,WAAW,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,EAAE;;AAE1E,gBAAA,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACjC,gBAAA,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAC1D,gBAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;aAC9B;iBAAM;;gBAEL,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;aACtC;AAED,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AACpD,SAAC,CAAC;KACH;IAEO,YAAY,CAAC,OAAwB,EAAE,MAAgB,EAAA;QAC7D,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AAC/B,YAAA,OAAO,KAAK,CAAC;SACd;QACD,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBACzB,YAAY,GAAG,IAAI,CAAC;AACpB,gBAAA,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAC9B;SACF;QACD,IAAI,YAAY,EAAE;AAChB,YAAA,OAAO,CAAC,SAAS,CACf,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAC9E,CAAC;SACH;AACD,QAAA,OAAO,YAAY,CAAC;KACrB;+GAtIU,6BAA6B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EC3B1C,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,g7DA6DA,EDpCY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,UAAU,0jEAAE,mBAAmB,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAE9B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBANzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,4BAA4B,cAE1B,IAAI,EAAA,OAAA,EACP,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,g7DAAA,EAAA,CAAA;iKAGjC,MAAM,EAAA,CAAA;sBAAd,KAAK;;;AExBR;;AAEG;MAIU,oBAAoB,CAAA;+GAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;gHAApB,oBAAoB,EAAA,OAAA,EAAA,CAFrB,2BAA2B,EAAE,6BAA6B,CAAA,EAAA,CAAA,CAAA,EAAA;AAEzD,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,oBAAoB,YAFQ,6BAA6B,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAEzD,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,2BAA2B,EAAE,6BAA6B,CAAC;AACtE,iBAAA,CAAA;;;ACTD;;AAEG;;;;"}