{"version":3,"file":"ngx-audio-wave.mjs","sources":["../../../projects/ngx-audio-wave/src/lib/waveform.utils.ts","../../../projects/ngx-audio-wave/src/lib/ngx-audio-wave.ts","../../../projects/ngx-audio-wave/src/lib/ngx-audio-wave.html","../../../projects/ngx-audio-wave/src/public-api.ts","../../../projects/ngx-audio-wave/src/ngx-audio-wave.ts"],"sourcesContent":["/**\n * Filters the AudioBuffer retrieved from an external source.\n */\nexport function filterAudioBufferData(\n  audioBuffer: AudioBuffer,\n  samples: number\n): number[] {\n  const rawData = audioBuffer.getChannelData(0);\n  const sampleCount = Math.max(1, Math.floor(samples));\n  const blockSize = Math.max(1, Math.floor(rawData.length / sampleCount));\n  const filteredData: number[] = [];\n\n  for (let i = 0; i < sampleCount; i++) {\n    const blockStart = blockSize * i;\n    let sum = 0;\n    let valuesInBlock = 0;\n\n    for (let j = 0; j < blockSize && blockStart + j < rawData.length; j++) {\n      sum += Math.abs(rawData[blockStart + j]);\n      valuesInBlock++;\n    }\n\n    filteredData.push(valuesInBlock > 0 ? sum / valuesInBlock : 0);\n  }\n\n  return filteredData;\n}\n\n/**\n * Normalizes audio data to the 0..1 range used by the SVG bars.\n */\nexport function normalizeAudioData(filteredData: number[]): number[] {\n  const maxValue = Math.max(...filteredData);\n  if (!Number.isFinite(maxValue) || maxValue <= 0) {\n    return filteredData.map(() => 0);\n  }\n\n  const multiplier = Math.pow(maxValue, -1);\n  return filteredData.map(n => n * multiplier);\n}\n","import {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  ElementRef,\n  effect,\n  inject,\n  input,\n  numberAttribute,\n  OnDestroy,\n  PLATFORM_ID,\n  SecurityContext,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\nimport { filterAudioBufferData, normalizeAudioData } from './waveform.utils';\n\nlet nextGradientId = 0;\n\n@Component({\n  selector: 'ngx-audio-wave',\n  templateUrl: './ngx-audio-wave.html',\n  styleUrls: ['./ngx-audio-wave.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxAudioWave implements OnDestroy {\n  // required inputs\n  readonly audioSrc = input.required<string | SafeUrl>();\n\n  // optional inputs\n  readonly color = input('#1e90ff');\n  readonly height = input(25, { transform: numberAttribute });\n  readonly gap = input(5, { transform: numberAttribute });\n  readonly rounded = input(true, { transform: booleanAttribute });\n  readonly hideBtn = input(false, { transform: booleanAttribute });\n  readonly skip = input(5, { transform: numberAttribute });\n  readonly volume = input(1, { transform: numberAttribute });\n  readonly playbackRate = input(1, { transform: numberAttribute });\n  readonly loop = input(false, { transform: booleanAttribute });\n  readonly samples = input(50, { transform: numberAttribute });\n\n  // accessibility inputs\n  readonly ariaLabel = input<string>('');\n  readonly playButtonLabel = input('Play audio');\n  readonly pauseButtonLabel = input('Pause audio');\n  readonly progressBarLabel = input('Audio progress bar');\n\n  // public state signals\n  readonly isPaused = signal(true);\n  readonly isLoading = signal(true);\n  readonly hasError = signal(false);\n  readonly currentVolume = signal(1);\n  readonly currentPlaybackRate = signal(1);\n  readonly isLooping = signal(false);\n  readonly progressText = computed(() => {\n    const current = this.exactCurrentTime();\n    const duration = this.exactDuration();\n    const percent = this.exactPlayedPercent();\n\n    if (duration === 0) {\n      return 'Audio not loaded';\n    }\n\n    const currentMinutes = Math.floor(current / 60);\n    const currentSeconds = Math.floor(current % 60);\n    const durationMinutes = Math.floor(duration / 60);\n    const durationSeconds = Math.floor(duration % 60);\n\n    return `${currentMinutes}:${currentSeconds.toString().padStart(2, '0')} of ${durationMinutes}:${durationSeconds.toString().padStart(2, '0')} (${Math.round(percent)}% played)`;\n  });\n  readonly statusText = computed(() => {\n    if (this.isLoading()) {\n      return 'Loading audio';\n    }\n\n    if (this.hasError()) {\n      return 'Error loading audio';\n    }\n\n    if (this.isPaused()) {\n      return 'Audio paused';\n    }\n\n    return 'Audio playing';\n  });\n\n  // public-exact\n  readonly exactPlayedPercent = computed(() => {\n    const percent = this.calculatePercent(\n      this.exactDuration(),\n      this.exactCurrentTime()\n    );\n    return percent < 100 ? percent : 100;\n  });\n  readonly exactCurrentTime = signal(0);\n  readonly exactDuration = signal(0);\n\n  // injecting\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly isPlatformBrowser = isPlatformBrowser(this.platformId);\n  private readonly domSanitizer = inject(DomSanitizer);\n  private readonly httpClient = inject(HttpClient);\n\n  // component internal signals\n  protected readonly gradientId = `ngx-audio-wave-gradient-${nextGradientId++}`;\n  protected readonly audioElementSrc = computed(\n    () => this.sanitizeAudioSrc(this.audioSrc()) ?? ''\n  );\n  protected readonly normalizedData = signal<number[]>([]);\n  protected readonly isHovering = signal(false);\n  protected readonly hoverOffset = signal(0);\n  protected readonly progressOffset = computed(\n    () => `${this.exactPlayedPercent()}%`\n  );\n  protected readonly visualHeight = computed(() => Math.max(1, this.height()));\n  protected readonly visualGap = computed(() => Math.max(1, this.gap()));\n  protected readonly visualSamples = computed(() =>\n    Math.max(1, Math.floor(this.samples()))\n  );\n  protected readonly width = computed(\n    () => this.visualSamples() * this.visualGap()\n  );\n\n  // view\n  private audioRef = viewChild<ElementRef<HTMLAudioElement>>('audioRef');\n  private audioFetchSubscription?: Subscription;\n  private audioLoadId = 0;\n  private animationFrameId: number | null = null;\n  private lastNonZeroVolume = 1;\n\n  constructor() {\n    effect(() => {\n      if (!this.isPlatformBrowser || !this.audioRef()) {\n        return;\n      }\n\n      this.fetchAudio(this.audioSrc(), this.visualSamples());\n    });\n\n    effect(() => {\n      const volume = this.clampVolume(this.volume());\n      const playbackRate = this.clampPlaybackRate(this.playbackRate());\n      const loop = this.loop();\n\n      this.currentVolume.set(volume);\n      this.currentPlaybackRate.set(playbackRate);\n      this.isLooping.set(loop);\n\n      if (volume > 0) {\n        this.lastNonZeroVolume = volume;\n      }\n\n      const audio = this.getAudioElement();\n      if (!this.isPlatformBrowser || !audio) {\n        return;\n      }\n\n      audio.volume = volume;\n      audio.playbackRate = playbackRate;\n      audio.loop = loop;\n    });\n  }\n\n  ngOnDestroy() {\n    this.audioFetchSubscription?.unsubscribe();\n    this.stopCurrentTimeSync();\n    this.stop();\n  }\n\n  // playback control\n  play(time?: number) {\n    if (!this.isPlatformBrowser) return;\n\n    const audio = this.getAudioElement();\n    if (!audio) return;\n\n    if (!this.audioElementSrc()) {\n      this.hasError.set(true);\n      return;\n    }\n\n    if (time !== undefined) {\n      this.seekTo(time);\n    }\n\n    void audio.play().catch(error => {\n      if (error instanceof DOMException && error.name === 'NotSupportedError') {\n        this.hasError.set(true);\n        return;\n      }\n\n      console.error(error);\n    });\n  }\n\n  pause() {\n    if (!this.isPlatformBrowser) return;\n\n    const audio = this.getAudioElement();\n    if (!audio) return;\n\n    audio.pause();\n  }\n\n  stop() {\n    if (!this.isPlatformBrowser) return;\n\n    const audio = this.getAudioElement();\n    if (!audio) return;\n\n    audio.currentTime = 0;\n    this.pause();\n  }\n\n  setVolume(volume: number) {\n    if (!this.isPlatformBrowser) return;\n\n    const audio = this.getAudioElement();\n    if (!audio) return;\n\n    const clampedVolume = this.clampVolume(volume);\n    audio.volume = clampedVolume;\n    this.currentVolume.set(clampedVolume);\n    if (clampedVolume > 0) {\n      this.lastNonZeroVolume = clampedVolume;\n    }\n  }\n\n  /** @deprecated Use setVolume(0) instead. */\n  mute() {\n    this.setVolume(0);\n  }\n\n  /** @deprecated Use setVolume(previousNonZeroVolume) with your own stored value instead. */\n  unmute() {\n    this.setVolume(this.lastNonZeroVolume);\n  }\n\n  /** @deprecated Use setVolume(currentVolume() === 0 ? value : 0) instead. */\n  toggleMute() {\n    if (this.currentVolume() === 0) {\n      this.unmute();\n    } else {\n      this.mute();\n    }\n  }\n\n  setPlaybackRate(rate: number) {\n    if (!this.isPlatformBrowser) return;\n\n    const audio = this.getAudioElement();\n    if (!audio) return;\n\n    const clampedRate = this.clampPlaybackRate(rate);\n    audio.playbackRate = clampedRate;\n    this.currentPlaybackRate.set(clampedRate);\n  }\n\n  /** @deprecated Use setPlaybackRate(1) instead. */\n  resetPlaybackRate() {\n    this.setPlaybackRate(1);\n  }\n\n  /** @deprecated Use setPlaybackRate(currentPlaybackRate() + 0.25) instead. */\n  increasePlaybackRate() {\n    const currentRate = this.currentPlaybackRate();\n    const newRate = Math.min(4, currentRate + 0.25);\n    this.setPlaybackRate(newRate);\n  }\n\n  /** @deprecated Use setPlaybackRate(currentPlaybackRate() - 0.25) instead. */\n  decreasePlaybackRate() {\n    const currentRate = this.currentPlaybackRate();\n    const newRate = Math.max(0.25, currentRate - 0.25);\n    this.setPlaybackRate(newRate);\n  }\n\n  setLoop(loop: boolean) {\n    if (!this.isPlatformBrowser) return;\n\n    const audio = this.getAudioElement();\n    if (!audio) return;\n\n    audio.loop = loop;\n    this.isLooping.set(loop);\n  }\n\n  /** @deprecated Use setLoop(true) instead. */\n  enableLoop() {\n    this.setLoop(true);\n  }\n\n  /** @deprecated Use setLoop(false) instead. */\n  disableLoop() {\n    this.setLoop(false);\n  }\n\n  /** @deprecated Use setLoop(!isLooping()) instead. */\n  toggleLoop() {\n    this.setLoop(!this.isLooping());\n  }\n\n  // user interaction\n  setTime(mouseEvent: MouseEvent) {\n    const pointer = this.getPointerPosition(mouseEvent);\n    const clickPercent = this.calculatePercent(pointer.width, pointer.offset);\n\n    const time = (clickPercent * this.exactDuration()) / 100;\n\n    this.seekTo(time);\n  }\n\n  protected setHoverPosition(mouseEvent: MouseEvent) {\n    this.isHovering.set(true);\n    this.hoverOffset.set(this.getPointerPosition(mouseEvent).offset);\n  }\n\n  protected clearHoverPosition() {\n    this.isHovering.set(false);\n  }\n\n  // private helpers\n  private calculatePercent(total: number, value: number) {\n    if (total <= 0) {\n      return 0;\n    }\n\n    const percent = (value / total) * 100;\n    return Number.isFinite(percent) ? percent : 0;\n  }\n\n  private clampVolume(volume: number) {\n    return Math.max(0, Math.min(1, volume));\n  }\n\n  private clampPlaybackRate(rate: number) {\n    return Math.max(0.25, Math.min(4, rate));\n  }\n\n  private getPointerPosition(event: MouseEvent) {\n    const target = event.currentTarget;\n    if (!(target instanceof HTMLElement)) {\n      return { offset: 0, width: this.width() };\n    }\n\n    const rect = target.getBoundingClientRect();\n    return {\n      offset: Math.max(0, Math.min(rect.width, event.clientX - rect.left)),\n      width: rect.width,\n    };\n  }\n\n  private clampTime(time: number) {\n    const duration = this.exactDuration();\n    if (!Number.isFinite(time)) {\n      return 0;\n    }\n\n    return Math.max(0, duration > 0 ? Math.min(duration, time) : time);\n  }\n\n  private seekTo(time: number) {\n    const audio = this.getAudioElement();\n    if (!audio) return;\n\n    const clampedTime = this.clampTime(time);\n    audio.currentTime = clampedTime;\n    this.exactCurrentTime.set(clampedTime);\n  }\n\n  private updateCurrentTime() {\n    const audio = this.getAudioElement();\n    if (!audio) return;\n\n    this.exactCurrentTime.set(audio.currentTime);\n  }\n\n  private getAudioElement() {\n    return this.audioRef()?.nativeElement ?? null;\n  }\n\n  private startCurrentTimeSync() {\n    if (this.animationFrameId !== null) {\n      return;\n    }\n\n    const sync = () => {\n      this.updateCurrentTime();\n      if (!this.isPaused()) {\n        this.animationFrameId = requestAnimationFrame(sync);\n      } else {\n        this.animationFrameId = null;\n      }\n    };\n\n    this.animationFrameId = requestAnimationFrame(sync);\n  }\n\n  private stopCurrentTimeSync() {\n    if (this.animationFrameId === null) {\n      return;\n    }\n\n    cancelAnimationFrame(this.animationFrameId);\n    this.animationFrameId = null;\n  }\n\n  private fetchAudio(audioSrc: string | SafeUrl, samples: number) {\n    this.audioFetchSubscription?.unsubscribe();\n    const loadId = ++this.audioLoadId;\n    this.isLoading.set(true);\n    this.hasError.set(false);\n    this.exactDuration.set(0);\n    this.exactCurrentTime.set(0);\n    this.normalizedData.set([]);\n\n    const src = this.sanitizeAudioSrc(audioSrc);\n    if (!src) {\n      console.error('Invalid SafeUrl: could not sanitize');\n      this.hasError.set(true);\n      this.isLoading.set(false);\n      return;\n    }\n\n    this.audioFetchSubscription = this.httpClient\n      .get(src, { responseType: 'arraybuffer' })\n      .subscribe({\n        next: arrayBuffer => {\n          void this.decodeAudio(arrayBuffer, samples, loadId);\n        },\n        error: error => {\n          if (loadId === this.audioLoadId) {\n            console.error(error);\n            this.hasError.set(true);\n            this.isLoading.set(false);\n          }\n        },\n      });\n  }\n\n  private async decodeAudio(\n    arrayBuffer: ArrayBuffer,\n    samples: number,\n    loadId: number\n  ) {\n    let audioContext: AudioContext | null = null;\n\n    try {\n      audioContext = new AudioContext();\n      const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\n      if (loadId !== this.audioLoadId) {\n        return;\n      }\n\n      this.exactDuration.set(audioBuffer.duration);\n\n      const filteredData = filterAudioBufferData(audioBuffer, samples);\n      this.normalizedData.set(normalizeAudioData(filteredData));\n    } catch (error) {\n      if (loadId === this.audioLoadId) {\n        console.error(error);\n        this.hasError.set(true);\n      }\n    } finally {\n      if (audioContext) {\n        await audioContext.close();\n      }\n\n      if (loadId === this.audioLoadId) {\n        this.isLoading.set(false);\n      }\n    }\n  }\n\n  private sanitizeAudioSrc(audioSrc: string | SafeUrl) {\n    return typeof audioSrc === 'object'\n      ? this.domSanitizer.sanitize(SecurityContext.URL, audioSrc)\n      : audioSrc;\n  }\n\n  protected pauseChange(event: Event) {\n    if (!(event.target instanceof HTMLAudioElement)) return;\n    this.isPaused.set(event.target.paused);\n    if (event.target.paused) {\n      this.stopCurrentTimeSync();\n      this.updateCurrentTime();\n    } else {\n      this.startCurrentTimeSync();\n    }\n  }\n\n  protected durationChange(event: Event) {\n    if (!(event.target instanceof HTMLAudioElement)) return;\n\n    const duration = event.target.duration;\n    if (Number.isFinite(duration) && duration > 0) {\n      this.exactDuration.set(duration);\n    }\n  }\n\n  protected timeChange(event: Event) {\n    if (!(event.target instanceof HTMLAudioElement)) return;\n\n    this.exactCurrentTime.set(event.target.currentTime);\n  }\n\n  // event handlers\n  protected onKeyDown(event: KeyboardEvent) {\n    if (!this.isPlatformBrowser) return;\n\n    const audio = this.getAudioElement();\n    if (!audio) return;\n\n    const duration = this.exactDuration();\n\n    switch (event.key) {\n      case ' ':\n      case 'Enter':\n        event.preventDefault();\n        if (this.isPaused()) {\n          this.play();\n        } else {\n          this.pause();\n        }\n        break;\n\n      case 'ArrowLeft':\n        event.preventDefault();\n        const leftTime = Math.max(0, audio.currentTime - this.skip());\n        this.seekTo(leftTime);\n        break;\n\n      case 'ArrowRight':\n        event.preventDefault();\n        const rightTime = Math.min(duration, audio.currentTime + this.skip());\n        this.seekTo(rightTime);\n        break;\n\n      case 'Home':\n        event.preventDefault();\n        this.seekTo(0);\n        break;\n\n      case 'End':\n        event.preventDefault();\n        this.seekTo(duration);\n        break;\n    }\n  }\n}\n","<audio\n  #audioRef\n  [src]=\"audioElementSrc()\"\n  (durationchange)=\"durationChange($event)\"\n  (loadedmetadata)=\"durationChange($event)\"\n  (pause)=\"pauseChange($event)\"\n  (play)=\"pauseChange($event)\"\n  (timeupdate)=\"timeChange($event)\"\n  hidden=\"hidden\"\n></audio>\n\n<div\n  class=\"ngx-audio-wave-wrapper\"\n  [attr.aria-label]=\"ariaLabel() || 'Audio player'\"\n  [style.--ngx-audio-wave-color]=\"color()\"\n  role=\"region\"\n>\n  @if (!hasError()) {\n    @if (!hideBtn()) {\n      @if (isPaused()) {\n        <button\n          class=\"ngx-audio-wave-btn\"\n          [attr.aria-label]=\"playButtonLabel()\"\n          [attr.aria-pressed]=\"false\"\n          (click)=\"play()\"\n          type=\"button\"\n        >\n          <svg\n            aria-hidden=\"true\"\n            height=\"16\"\n            viewBox=\"0 0 16 16\"\n            width=\"16\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n          >\n            <path\n              d=\"m11.596 8.697-6.363 3.692c-.54.313-1.233-.066-1.233-.697V4.308c0-.63.692-1.01 1.233-.696l6.363 3.692a.802.802 0 0 1 0 1.393z\"\n            />\n          </svg>\n        </button>\n      } @else {\n        <button\n          class=\"ngx-audio-wave-btn\"\n          [attr.aria-label]=\"pauseButtonLabel()\"\n          [attr.aria-pressed]=\"true\"\n          (click)=\"pause()\"\n          type=\"button\"\n        >\n          <svg\n            aria-hidden=\"true\"\n            height=\"16\"\n            viewBox=\"0 0 16 16\"\n            width=\"16\"\n            xmlns=\"http://www.w3.org/2000/svg\"\n          >\n            <path\n              d=\"M5.5 3.5A1.5 1.5 0 0 1 7 5v6a1.5 1.5 0 0 1-3 0V5a1.5 1.5 0 0 1 1.5-1.5zm5 0A1.5 1.5 0 0 1 12 5v6a1.5 1.5 0 0 1-3 0V5a1.5 1.5 0 0 1 1.5-1.5z\"\n            />\n          </svg>\n        </button>\n      }\n    }\n\n    <div\n      class=\"ngx-audio-wave\"\n      [attr.aria-label]=\"progressBarLabel()\"\n      [attr.aria-orientation]=\"'horizontal'\"\n      [attr.aria-valuemax]=\"100\"\n      [attr.aria-valuemin]=\"0\"\n      [attr.aria-valuenow]=\"exactPlayedPercent()\"\n      [attr.aria-valuetext]=\"progressText()\"\n      [style.height.px]=\"visualHeight()\"\n      [style.width.px]=\"width()\"\n      (click)=\"setTime($event)\"\n      (keydown)=\"onKeyDown($event)\"\n      (mouseleave)=\"clearHoverPosition()\"\n      (mousemove)=\"setHoverPosition($event)\"\n      role=\"slider\"\n      tabindex=\"0\"\n    >\n      @if (!isLoading()) {\n        <svg\n          class=\"ngx-audio-wave-svg\"\n          [attr.viewBox]=\"`0 0 ${width()} ${visualHeight()}`\"\n          aria-hidden=\"true\"\n        >\n          <defs>\n            <linearGradient\n              [attr.id]=\"gradientId\"\n              [attr.x2]=\"width()\"\n              gradientUnits=\"userSpaceOnUse\"\n              x1=\"0\"\n              y1=\"0\"\n              y2=\"0\"\n            >\n              <stop offset=\"0%\" stop-color=\"var(--ngx-audio-wave-color)\" />\n              <stop\n                [attr.offset]=\"progressOffset()\"\n                stop-color=\"var(--ngx-audio-wave-color)\"\n              />\n              <stop\n                [attr.offset]=\"progressOffset()\"\n                stop-color=\"var(--ngx-audio-wave-color)\"\n                stop-opacity=\"0.3\"\n              />\n              <stop\n                offset=\"100%\"\n                stop-color=\"var(--ngx-audio-wave-color)\"\n                stop-opacity=\"0.3\"\n              />\n            </linearGradient>\n          </defs>\n\n          @for (rect of normalizedData(); track index; let index = $index) {\n            <rect\n              [attr.fill]=\"`url(#${gradientId})`\"\n              [attr.height]=\"rect * visualHeight()\"\n              [attr.rx]=\"rounded() ? 1 : 0\"\n              [attr.ry]=\"rounded() ? 1 : 0\"\n              [attr.width]=\"2\"\n              [attr.x]=\"index * visualGap()\"\n              [attr.y]=\"visualHeight() - rect * visualHeight()\"\n            ></rect>\n          }\n        </svg>\n\n        @if (isHovering()) {\n          <span\n            class=\"ngx-audio-wave-hover-guide\"\n            [style.left.px]=\"hoverOffset()\"\n            aria-hidden=\"true\"\n          ></span>\n        }\n      } @else {\n        <div\n          class=\"ngx-audio-wave-loading\"\n          aria-label=\"Loading audio\"\n          role=\"status\"\n        >\n          <span></span>\n          <span></span>\n          <span></span>\n        </div>\n      }\n    </div>\n\n    <!-- Live region for screen readers -->\n    <div class=\"ngx-audio-wave-sr-only\" aria-atomic=\"true\" aria-live=\"polite\">\n      {{ statusText() }}\n    </div>\n  } @else {\n    <div aria-label=\"Audio loading error\" role=\"alert\">\n      Some errors occurred\n    </div>\n  }\n</div>\n","/*\n * Public API Surface of ngx-audio-wave\n */\n\nexport * from './lib/ngx-audio-wave';\nexport * from './lib/waveform.utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;AAAA;;AAEG;AACG,SAAU,qBAAqB,CACnC,WAAwB,EACxB,OAAe,EAAA;IAEf,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC;AAC7C,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACpD,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;IACvE,MAAM,YAAY,GAAa,EAAE;AAEjC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,QAAA,MAAM,UAAU,GAAG,SAAS,GAAG,CAAC;QAChC,IAAI,GAAG,GAAG,CAAC;QACX,IAAI,aAAa,GAAG,CAAC;QAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,IAAI,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrE,YAAA,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AACxC,YAAA,aAAa,EAAE;QACjB;AAEA,QAAA,YAAY,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,GAAG,GAAG,aAAa,GAAG,CAAC,CAAC;IAChE;AAEA,IAAA,OAAO,YAAY;AACrB;AAEA;;AAEG;AACG,SAAU,kBAAkB,CAAC,YAAsB,EAAA;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;AAC1C,IAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE;QAC/C,OAAO,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC;IAEA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACzC,IAAA,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;AAC9C;;ACjBA,IAAI,cAAc,GAAG,CAAC;MAQT,YAAY,CAAA;;IAEd,QAAQ,GAAG,KAAK,CAAC,QAAQ;iFAAoB;;IAG7C,KAAK,GAAG,KAAK,CAAC,SAAS;8EAAC;IACxB,MAAM,GAAG,KAAK,CAAC,EAAE,8EAAI,SAAS,EAAE,eAAe,EAAA,CAAG;IAClD,GAAG,GAAG,KAAK,CAAC,CAAC,2EAAI,SAAS,EAAE,eAAe,EAAA,CAAG;IAC9C,OAAO,GAAG,KAAK,CAAC,IAAI,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACtD,OAAO,GAAG,KAAK,CAAC,KAAK,+EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACvD,IAAI,GAAG,KAAK,CAAC,CAAC,4EAAI,SAAS,EAAE,eAAe,EAAA,CAAG;IAC/C,MAAM,GAAG,KAAK,CAAC,CAAC,8EAAI,SAAS,EAAE,eAAe,EAAA,CAAG;IACjD,YAAY,GAAG,KAAK,CAAC,CAAC,oFAAI,SAAS,EAAE,eAAe,EAAA,CAAG;IACvD,IAAI,GAAG,KAAK,CAAC,KAAK,4EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACpD,OAAO,GAAG,KAAK,CAAC,EAAE,+EAAI,SAAS,EAAE,eAAe,EAAA,CAAG;;IAGnD,SAAS,GAAG,KAAK,CAAS,EAAE;kFAAC;IAC7B,eAAe,GAAG,KAAK,CAAC,YAAY;wFAAC;IACrC,gBAAgB,GAAG,KAAK,CAAC,aAAa;yFAAC;IACvC,gBAAgB,GAAG,KAAK,CAAC,oBAAoB;yFAAC;;IAG9C,QAAQ,GAAG,MAAM,CAAC,IAAI;iFAAC;IACvB,SAAS,GAAG,MAAM,CAAC,IAAI;kFAAC;IACxB,QAAQ,GAAG,MAAM,CAAC,KAAK;iFAAC;IACxB,aAAa,GAAG,MAAM,CAAC,CAAC;sFAAC;IACzB,mBAAmB,GAAG,MAAM,CAAC,CAAC;4FAAC;IAC/B,SAAS,GAAG,MAAM,CAAC,KAAK;kFAAC;AACzB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACvC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAEzC,QAAA,IAAI,QAAQ,KAAK,CAAC,EAAE;AAClB,YAAA,OAAO,kBAAkB;QAC3B;QAEA,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;QAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;QAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;QACjD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;AAEjD,QAAA,OAAO,GAAG,cAAc,CAAA,CAAA,EAAI,cAAc,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,IAAA,EAAO,eAAe,CAAA,CAAA,EAAI,eAAe,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW;IAChL,CAAC;qFAAC;AACO,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,OAAO,eAAe;QACxB;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,OAAO,qBAAqB;QAC9B;AAEA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,OAAO,cAAc;QACvB;AAEA,QAAA,OAAO,eAAe;IACxB,CAAC;mFAAC;;AAGO,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AAC1C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CACnC,IAAI,CAAC,aAAa,EAAE,EACpB,IAAI,CAAC,gBAAgB,EAAE,CACxB;QACD,OAAO,OAAO,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG;IACtC,CAAC;2FAAC;IACO,gBAAgB,GAAG,MAAM,CAAC,CAAC;yFAAC;IAC5B,aAAa,GAAG,MAAM,CAAC,CAAC;sFAAC;;AAGjB,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;AACtD,IAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;AAG7B,IAAA,UAAU,GAAG,CAAA,wBAAA,EAA2B,cAAc,EAAE,EAAE;AAC1D,IAAA,eAAe,GAAG,QAAQ,CAC3C,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;wFACnD;IACkB,cAAc,GAAG,MAAM,CAAW,EAAE;uFAAC;IACrC,UAAU,GAAG,MAAM,CAAC,KAAK;mFAAC;IAC1B,WAAW,GAAG,MAAM,CAAC,CAAC;oFAAC;IACvB,cAAc,GAAG,QAAQ,CAC1C,MAAM,CAAA,EAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA,CAAA,CAAG;uFACtC;AACkB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;qFAAC;AACzD,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;kFAAC;IACnD,aAAa,GAAG,QAAQ,CAAC,MAC1C,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;sFACxC;AACkB,IAAA,KAAK,GAAG,QAAQ,CACjC,MAAM,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;8EAC9C;;IAGO,QAAQ,GAAG,SAAS,CAA+B,UAAU;iFAAC;AAC9D,IAAA,sBAAsB;IACtB,WAAW,GAAG,CAAC;IACf,gBAAgB,GAAkB,IAAI;IACtC,iBAAiB,GAAG,CAAC;AAE7B,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;gBAC/C;YACF;AAEA,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AACxD,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AAChE,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AAExB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;AAC9B,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC;AAC1C,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,YAAA,IAAI,MAAM,GAAG,CAAC,EAAE;AACd,gBAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM;YACjC;AAEA,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;YACpC,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,KAAK,EAAE;gBACrC;YACF;AAEA,YAAA,KAAK,CAAC,MAAM,GAAG,MAAM;AACrB,YAAA,KAAK,CAAC,YAAY,GAAG,YAAY;AACjC,YAAA,KAAK,CAAC,IAAI,GAAG,IAAI;AACnB,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,sBAAsB,EAAE,WAAW,EAAE;QAC1C,IAAI,CAAC,mBAAmB,EAAE;QAC1B,IAAI,CAAC,IAAI,EAAE;IACb;;AAGA,IAAA,IAAI,CAAC,IAAa,EAAA;QAChB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;AAE7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;AAC3B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB;QACF;AAEA,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACnB;QAEA,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,IAAG;YAC9B,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE;AACvE,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;gBACvB;YACF;AAEA,YAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACtB,QAAA,CAAC,CAAC;IACJ;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;AAE7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;YAAE;QAEZ,KAAK,CAAC,KAAK,EAAE;IACf;IAEA,IAAI,GAAA;QACF,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;AAE7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,KAAK,CAAC,WAAW,GAAG,CAAC;QACrB,IAAI,CAAC,KAAK,EAAE;IACd;AAEA,IAAA,SAAS,CAAC,MAAc,EAAA;QACtB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;AAE7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;YAAE;QAEZ,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AAC9C,QAAA,KAAK,CAAC,MAAM,GAAG,aAAa;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC;AACrC,QAAA,IAAI,aAAa,GAAG,CAAC,EAAE;AACrB,YAAA,IAAI,CAAC,iBAAiB,GAAG,aAAa;QACxC;IACF;;IAGA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACnB;;IAGA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACxC;;IAGA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,MAAM,EAAE;QACf;aAAO;YACL,IAAI,CAAC,IAAI,EAAE;QACb;IACF;AAEA,IAAA,eAAe,CAAC,IAAY,EAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;AAE7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;YAAE;QAEZ,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAChD,QAAA,KAAK,CAAC,YAAY,GAAG,WAAW;AAChC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC;IAC3C;;IAGA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACzB;;IAGA,oBAAoB,GAAA;AAClB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAC9C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;AAC/C,QAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;IAC/B;;IAGA,oBAAoB,GAAA;AAClB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAC9C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;AAClD,QAAA,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;IAC/B;AAEA,IAAA,OAAO,CAAC,IAAa,EAAA;QACnB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;AAE7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,KAAK,CAAC,IAAI,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1B;;IAGA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IACpB;;IAGA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IACrB;;IAGA,UAAU,GAAA;QACR,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACjC;;AAGA,IAAA,OAAO,CAAC,UAAsB,EAAA;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC;AACnD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;AAEzE,QAAA,MAAM,IAAI,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG;AAExD,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACnB;AAEU,IAAA,gBAAgB,CAAC,UAAsB,EAAA;AAC/C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IAClE;IAEU,kBAAkB,GAAA;AAC1B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;;IAGQ,gBAAgB,CAAC,KAAa,EAAE,KAAa,EAAA;AACnD,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,YAAA,OAAO,CAAC;QACV;QAEA,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG;AACrC,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,CAAC;IAC/C;AAEQ,IAAA,WAAW,CAAC,MAAc,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACzC;AAEQ,IAAA,iBAAiB,CAAC,IAAY,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1C;AAEQ,IAAA,kBAAkB,CAAC,KAAiB,EAAA;AAC1C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa;AAClC,QAAA,IAAI,EAAE,MAAM,YAAY,WAAW,CAAC,EAAE;AACpC,YAAA,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE;QAC3C;AAEA,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;QAC3C,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB;IACH;AAEQ,IAAA,SAAS,CAAC,IAAY,EAAA;AAC5B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;QACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC1B,YAAA,OAAO,CAAC;QACV;QAEA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;IACpE;AAEQ,IAAA,MAAM,CAAC,IAAY,EAAA;AACzB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;YAAE;QAEZ,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AACxC,QAAA,KAAK,CAAC,WAAW,GAAG,WAAW;AAC/B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC;IACxC;IAEQ,iBAAiB,GAAA;AACvB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;YAAE;QAEZ,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;IAC9C;IAEQ,eAAe,GAAA;QACrB,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,IAAI,IAAI;IAC/C;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE;YAClC;QACF;QAEA,MAAM,IAAI,GAAG,MAAK;YAChB,IAAI,CAAC,iBAAiB,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;AACpB,gBAAA,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC;YACrD;iBAAO;AACL,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;YAC9B;AACF,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC;IACrD;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE;YAClC;QACF;AAEA,QAAA,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC3C,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC9B;IAEQ,UAAU,CAAC,QAA0B,EAAE,OAAe,EAAA;AAC5D,QAAA,IAAI,CAAC,sBAAsB,EAAE,WAAW,EAAE;AAC1C,QAAA,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,WAAW;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAC3C,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC;AACpD,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB;QACF;AAEA,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;aAChC,GAAG,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,WAAW,IAAG;gBAClB,KAAK,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC;YACrD,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;AACb,gBAAA,IAAI,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE;AAC/B,oBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACpB,oBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC3B;YACF,CAAC;AACF,SAAA,CAAC;IACN;AAEQ,IAAA,MAAM,WAAW,CACvB,WAAwB,EACxB,OAAe,EACf,MAAc,EAAA;QAEd,IAAI,YAAY,GAAwB,IAAI;AAE5C,QAAA,IAAI;AACF,YAAA,YAAY,GAAG,IAAI,YAAY,EAAE;YACjC,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,WAAW,CAAC;AACnE,YAAA,IAAI,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE;gBAC/B;YACF;YAEA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC;YAE5C,MAAM,YAAY,GAAG,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC;YAChE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAC3D;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE;AAC/B,gBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACpB,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACzB;QACF;gBAAU;YACR,IAAI,YAAY,EAAE;AAChB,gBAAA,MAAM,YAAY,CAAC,KAAK,EAAE;YAC5B;AAEA,YAAA,IAAI,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE;AAC/B,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;QACF;IACF;AAEQ,IAAA,gBAAgB,CAAC,QAA0B,EAAA;QACjD,OAAO,OAAO,QAAQ,KAAK;AACzB,cAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE,QAAQ;cACxD,QAAQ;IACd;AAEU,IAAA,WAAW,CAAC,KAAY,EAAA;AAChC,QAAA,IAAI,EAAE,KAAK,CAAC,MAAM,YAAY,gBAAgB,CAAC;YAAE;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;AACtC,QAAA,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;YACvB,IAAI,CAAC,mBAAmB,EAAE;YAC1B,IAAI,CAAC,iBAAiB,EAAE;QAC1B;aAAO;YACL,IAAI,CAAC,oBAAoB,EAAE;QAC7B;IACF;AAEU,IAAA,cAAc,CAAC,KAAY,EAAA;AACnC,QAAA,IAAI,EAAE,KAAK,CAAC,MAAM,YAAY,gBAAgB,CAAC;YAAE;AAEjD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ;QACtC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE;AAC7C,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClC;IACF;AAEU,IAAA,UAAU,CAAC,KAAY,EAAA;AAC/B,QAAA,IAAI,EAAE,KAAK,CAAC,MAAM,YAAY,gBAAgB,CAAC;YAAE;QAEjD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC;IACrD;;AAGU,IAAA,SAAS,CAAC,KAAoB,EAAA;QACtC,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE;AAE7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;AAErC,QAAA,QAAQ,KAAK,CAAC,GAAG;AACf,YAAA,KAAK,GAAG;AACR,YAAA,KAAK,OAAO;gBACV,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;oBACnB,IAAI,CAAC,IAAI,EAAE;gBACb;qBAAO;oBACL,IAAI,CAAC,KAAK,EAAE;gBACd;gBACA;AAEF,YAAA,KAAK,WAAW;gBACd,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAC7D,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACrB;AAEF,YAAA,KAAK,YAAY;gBACf,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AACrE,gBAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;gBACtB;AAEF,YAAA,KAAK,MAAM;gBACT,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBACd;AAEF,YAAA,KAAK,KAAK;gBACR,KAAK,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACrB;;IAEN;uGA3gBW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,ymEC9BzB,wtJA2JA,EAAA,MAAA,EAAA,CAAA,osDAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FD7Ha,YAAY,EAAA,UAAA,EAAA,CAAA;kBANxB,SAAS;+BACE,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wtJAAA,EAAA,MAAA,EAAA,CAAA,osDAAA,CAAA,EAAA;ygDAqGY,UAAU,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEjIvE;;AAEG;;ACFH;;AAEG;;;;"}