{"version":3,"file":"toast.cjs","names":["#entries","#listeners","#eventListeners","#disposed","#max","#setEntries","#emit","#entry","#update","#scheduleTimer","#clearTimer"],"sources":["../src/feedback/toast/toast.ts"],"sourcesContent":["import '../alert/alert';\nimport { uuid } from '@vielzeug/arsenal/random';\nimport { createPanGesture, type PanGesture } from '@vielzeug/gesture';\nimport { define, getHost, html, onCleanup, onMounted, prop, ref, useEmit } from '@vielzeug/ore';\nimport { computed, signal, watch } from '@vielzeug/ripple';\nimport { warn } from '../../_dev';\nimport { reducedMotionMixin } from '../../styles';\nimport type { ComponentSize, RoundedSize, ThemeColor } from '../../types';\nimport componentStyles from './toast.css?inline';\n\n/** Must match toast.css's default opacity transition duration. */\nconst TOAST_EXIT_MS = 300;\n\nexport type OreToastEvents = {\n  add: { id: string };\n  dismiss: { id: string };\n};\n\nexport type OreToastProps = {\n  max?: number;\n  position?: 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\n};\n\n/** Individual toast notification. */\nexport type ToastItem = {\n  actions?: Array<{\n    color?: ThemeColor;\n    label: string;\n    onClick?: () => void;\n    variant?: 'solid' | 'flat' | 'bordered';\n  }>;\n  color?: ThemeColor;\n  dismissible?: boolean;\n  /** Auto-dismiss delay in ms. Set to 0 for persistent toasts (default: 5000). */\n  duration?: number;\n  heading?: string;\n  /** Show message and actions side-by-side (horizontal layout). */\n  horizontal?: boolean;\n  /** Auto-generated when omitted. */\n  id?: string;\n  message: string;\n  /** Metadata text (for example, a timestamp) shown in the alert meta slot. */\n  meta?: string;\n  /** Called after the toast is fully dismissed and removed. */\n  onDismiss?: () => void;\n  rounded?: RoundedSize | '';\n  size?: ComponentSize;\n  /**\n   * Screen-reader announcement urgency. Error-coloured toasts are assertive by\n   * default; all other toasts are polite.\n   */\n  urgency?: 'polite' | 'assertive';\n  variant?: 'solid' | 'flat' | 'bordered';\n};\n\ntype ToastPhase = 'entering' | 'active' | 'exiting';\n\ntype ToastTimer = {\n  remaining: number;\n  startedAt: number;\n  timeoutId: ReturnType<typeof setTimeout>;\n};\n\ntype ToastEntry = Required<Pick<ToastItem, 'dismissible' | 'duration' | 'id'>> &\n  Omit<ToastItem, 'dismissible' | 'duration' | 'id'> & {\n    exitTimeoutId: ReturnType<typeof setTimeout> | null;\n    id: string;\n    phase: ToastPhase;\n    timer: ToastTimer | null;\n  };\n\ntype ToastStoreEvent = {\n  id: string;\n  type: 'add' | 'dismiss';\n};\n\n/**\n * Owns notification data and every timer. Renderers only subscribe to this\n * store; they never expose imperative mutation methods themselves.\n */\nclass ToastStore {\n  readonly #entries = signal<ToastEntry[]>([]);\n  readonly #listeners = new Set<(entries: ToastEntry[]) => void>();\n  readonly #eventListeners = new Set<(event: ToastStoreEvent) => void>();\n  #disposed = false;\n  #max = 5;\n\n  add(item: ToastItem): string {\n    if (this.#disposed) return item.id ?? uuid();\n\n    const id = item.id ?? uuid();\n    const active = this.#entries.value.filter((entry) => entry.phase !== 'exiting');\n    const overflow = active.length - (this.#max - 1);\n\n    if (overflow > 0) {\n      for (const entry of active.slice(0, overflow)) this.dismiss(entry.id);\n    }\n\n    const entry: ToastEntry = {\n      dismissible: true,\n      duration: 5000,\n      ...item,\n      exitTimeoutId: null,\n      id,\n      phase: 'entering',\n      timer: null,\n    };\n\n    this.#setEntries([...this.#entries.value, entry]);\n    this.#emit({ id, type: 'add' });\n\n    requestAnimationFrame(() => {\n      if (this.#entry(id)?.phase === 'entering') this.#update(id, { phase: 'active' });\n    });\n\n    if (entry.duration > 0) this.#scheduleTimer(id, entry.duration);\n\n    return id;\n  }\n\n  clear(): void {\n    for (const entry of this.#entries.value) {\n      if (entry.phase !== 'exiting') this.dismiss(entry.id);\n    }\n  }\n\n  dispose(): void {\n    if (this.#disposed) return;\n\n    this.#disposed = true;\n\n    for (const entry of this.#entries.value) {\n      if (entry.timer) clearTimeout(entry.timer.timeoutId);\n\n      if (entry.exitTimeoutId) clearTimeout(entry.exitTimeoutId);\n    }\n\n    this.#setEntries([]);\n    this.#listeners.clear();\n    this.#eventListeners.clear();\n  }\n\n  dismiss(id: string): void {\n    const entry = this.#entry(id);\n\n    if (!entry || entry.phase === 'exiting' || this.#disposed) return;\n\n    this.#update(id, { ...this.#clearTimer(entry), phase: 'exiting' });\n    this.scheduleFinalization(id, TOAST_EXIT_MS + 50);\n  }\n\n  finalize(id: string): void {\n    const entry = this.#entry(id);\n\n    if (!entry || this.#disposed) return;\n\n    if (entry.timer) clearTimeout(entry.timer.timeoutId);\n\n    if (entry.exitTimeoutId) clearTimeout(entry.exitTimeoutId);\n\n    this.#setEntries(this.#entries.value.filter((candidate) => candidate.id !== id));\n    entry.onDismiss?.();\n    this.#emit({ id, type: 'dismiss' });\n  }\n\n  pauseTimers(): void {\n    if (this.#disposed) return;\n\n    this.#setEntries(\n      this.#entries.value.map((entry) => {\n        if (!entry.timer) return entry;\n\n        clearTimeout(entry.timer.timeoutId);\n\n        return {\n          ...entry,\n          timer: {\n            ...entry.timer,\n            remaining: Math.max(0, entry.timer.remaining - (Date.now() - entry.timer.startedAt)),\n          },\n        };\n      }),\n    );\n  }\n\n  resumeTimers(): void {\n    if (this.#disposed) return;\n\n    for (const entry of this.#entries.value) {\n      if (entry.phase === 'active' && entry.timer && entry.timer.remaining > 0) {\n        this.#scheduleTimer(entry.id, entry.timer.remaining);\n      }\n    }\n  }\n\n  scheduleFinalization(id: string, delay: number): void {\n    const entry = this.#entry(id);\n\n    if (entry?.phase !== 'exiting' || this.#disposed) return;\n\n    if (entry.exitTimeoutId) clearTimeout(entry.exitTimeoutId);\n\n    const exitTimeoutId = setTimeout(() => this.finalize(id), delay);\n\n    this.#update(id, { exitTimeoutId });\n  }\n\n  setMax(max: number | undefined): void {\n    if (max != null) this.#max = Math.max(1, max);\n  }\n\n  subscribe(listener: (entries: ToastEntry[]) => void): () => void {\n    listener(this.#entries.value);\n    this.#listeners.add(listener);\n\n    return () => this.#listeners.delete(listener);\n  }\n\n  subscribeEvents(listener: (event: ToastStoreEvent) => void): () => void {\n    this.#eventListeners.add(listener);\n\n    return () => this.#eventListeners.delete(listener);\n  }\n\n  update(id: string, updates: Partial<ToastItem>): void {\n    const entry = this.#entry(id);\n\n    if (!entry || this.#disposed) return;\n\n    const cleared = updates.duration !== undefined ? this.#clearTimer(entry) : entry;\n\n    this.#update(id, { ...cleared, ...updates, id });\n\n    if (updates.duration !== undefined && updates.duration > 0) this.#scheduleTimer(id, updates.duration);\n  }\n\n  #clearTimer(entry: ToastEntry): ToastEntry {\n    if (entry.timer) clearTimeout(entry.timer.timeoutId);\n\n    return { ...entry, timer: null };\n  }\n\n  #emit(event: ToastStoreEvent): void {\n    for (const listener of this.#eventListeners) listener(event);\n  }\n\n  #entry(id: string): ToastEntry | undefined {\n    return this.#entries.value.find((entry) => entry.id === id);\n  }\n\n  #scheduleTimer(id: string, remaining: number): void {\n    if (remaining <= 0 || this.#disposed) return;\n\n    const timeoutId = setTimeout(() => this.dismiss(id), remaining);\n\n    this.#update(id, { timer: { remaining, startedAt: Date.now(), timeoutId } });\n  }\n\n  #setEntries(entries: ToastEntry[]): void {\n    this.#entries.value = entries;\n    for (const listener of this.#listeners) listener(entries);\n  }\n\n  #update(id: string, patch: Partial<ToastEntry>): void {\n    this.#setEntries(this.#entries.value.map((entry) => (entry.id === id ? { ...entry, ...patch } : entry)));\n  }\n}\n\ntype ToastHostBinding = {\n  bind: (store: ToastStore) => void;\n  unbind: () => void;\n};\n\nconst hostBindings = new WeakMap<HTMLElement, ToastHostBinding>();\nconst hostStores = new WeakMap<HTMLElement, ToastStore>();\n\nconst bindToastHost = (host: HTMLElement, store: ToastStore): void => {\n  hostStores.set(host, store);\n  hostBindings.get(host)?.bind(store);\n};\n\n/** Renders the action buttons for a toast entry. */\nfunction renderToastActions(entry: ToastEntry, dismiss: () => void) {\n  if (!entry.actions?.length) return '';\n\n  return html`\n    <div slot=\"actions\" class=\"toast-actions\">\n      ${entry.actions.map(\n        (action) => html`\n          <ore-button\n            size=\"sm\"\n            color=${action.color || entry.color || 'primary'}\n            variant=${action.variant || 'solid'}\n            @click=${() => {\n              action.onClick?.();\n              dismiss();\n            }}>\n            ${action.label}\n          </ore-button>\n        `,\n      )}\n    </div>\n  `;\n}\n\nexport const TOAST_TAG = 'ore-toast' as const;\n\n/**\n * Declarative toast host. It subscribes to the service for its scope and\n * renders notifications, but has no imperative mutation API of its own.\n *\n * @element ore-toast\n *\n * @attr {string} position - Stack placement.\n * @attr {number} max - Maximum live notifications for the scoped service.\n */\ndefine<OreToastProps>(TOAST_TAG, {\n  props: {\n    max: prop.number(5),\n    position: prop.oneOf(\n      ['top-left', 'top-center', 'top-right', 'bottom-left', 'bottom-center', 'bottom-right'] as const,\n      'bottom-right',\n    ),\n  },\n  setup() {\n    const el = getHost() as HTMLElement;\n    const emit = useEmit<OreToastEvents>();\n    const containerRef = ref<HTMLDivElement>();\n    const entries = signal<ToastEntry[]>([]);\n    const hoverPaused = signal(false);\n    const focusPaused = signal(false);\n    const paused = computed(() => hoverPaused.value || focusPaused.value);\n    const swipeControls = new Map<string, { element: HTMLElement; gesture: PanGesture }>();\n    const exiting = new Map<string, () => void>();\n    const swiping = new Set<string>();\n    let pendingSyncFrame: number | undefined;\n    let store: ToastStore | null = null;\n    let unsubscribeEntries = () => {};\n    let unsubscribeEvents = () => {};\n\n    const getInner = (wrapper: HTMLElement): HTMLElement | null => {\n      return wrapper.querySelector<HTMLElement>('.toast-inner');\n    };\n\n    const clearExitListener = (id: string): void => {\n      exiting.get(id)?.();\n      exiting.delete(id);\n    };\n\n    const finalizeSwipe = (id: string): void => {\n      swiping.delete(id);\n      store?.finalize(id);\n    };\n\n    const createToastSwipe = (id: string, wrapper: HTMLElement): PanGesture => {\n      const isDismissible = (): boolean => entries.value.find((entry) => entry.id === id)?.dismissible ?? true;\n      const reset = (): void => {\n        const inner = getInner(wrapper);\n\n        if (!inner) return;\n\n        inner.style.transition = '';\n        inner.style.transform = '';\n        inner.style.opacity = '';\n      };\n\n      return createPanGesture(wrapper, {\n        axis: 'x',\n        disabled: () => !isDismissible(),\n        onEnd: ({ distance, reason }) => {\n          if (reason !== 'release' || Math.abs(distance) < 48) {\n            reset();\n\n            return;\n          }\n\n          const inner = getInner(wrapper);\n\n          if (!inner || !store) return;\n\n          swiping.add(id);\n\n          store.dismiss(id);\n\n          const finish = () => finalizeSwipe(id);\n\n          if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n            inner.style.opacity = '0';\n            finish();\n\n            return;\n          }\n\n          const direction = distance >= 0 ? 1 : -1;\n\n          inner.style.transition = 'transform 0.22s ease-out, opacity 0.22s ease-out';\n          void inner.offsetWidth;\n          inner.style.transform = `translateX(${direction * 120}%)`;\n          inner.style.opacity = '0';\n\n          const onTransitionEnd = (transition: TransitionEvent) => {\n            if (transition.target !== inner || transition.propertyName !== 'transform') return;\n\n            inner.removeEventListener('transitionend', onTransitionEnd);\n            finish();\n          };\n\n          inner.addEventListener('transitionend', onTransitionEnd);\n          store.scheduleFinalization(id, 300);\n        },\n        onMove: ({ distance }) => {\n          const inner = getInner(wrapper);\n\n          if (!inner) return;\n\n          inner.style.transition = 'none';\n          inner.style.transform = `translateX(${distance}px)`;\n          inner.style.opacity = String(Math.max(0, 1 - Math.abs(distance) / 200));\n        },\n        pointerCapture: false,\n        shouldStart: (event) =>\n          !event\n            .composedPath()\n            .some((node) => node instanceof Element && node.matches('button, a, input, select, textarea, ore-button')),\n      });\n    };\n\n    const beginExit = (id: string): void => {\n      if (!store || exiting.has(id) || swiping.has(id)) return;\n\n      requestAnimationFrame(() => {\n        if (!store || exiting.has(id) || swiping.has(id)) return;\n\n        const inner = containerRef.value?.querySelector<HTMLElement>(`[data-toast-id=\"${id}\"] .toast-inner`);\n\n        if (!inner) {\n          store.scheduleFinalization(id, TOAST_EXIT_MS);\n\n          return;\n        }\n\n        void inner.offsetHeight;\n\n        const duration = parseFloat(getComputedStyle(inner).transitionDuration) * 1000;\n        const exitMs = Number.isFinite(duration) && duration > 0 ? duration : TOAST_EXIT_MS;\n        const onTransitionEnd = (event: TransitionEvent) => {\n          const wrapper = (event.target as HTMLElement | null)?.closest?.(`[data-toast-id=\"${id}\"]`);\n\n          if (!wrapper) return;\n\n          clearExitListener(id);\n          store?.finalize(id);\n        };\n        const remove = () => containerRef.value?.removeEventListener('transitionend', onTransitionEnd);\n\n        exiting.set(id, remove);\n        containerRef.value?.addEventListener('transitionend', onTransitionEnd);\n        store.scheduleFinalization(id, exitMs + 50);\n      });\n    };\n\n    const syncControls = (): void => {\n      const currentIds = new Set(entries.value.map((entry) => entry.id));\n\n      for (const [id, control] of swipeControls) {\n        if (!currentIds.has(id)) {\n          control.gesture.dispose();\n\n          swipeControls.delete(id);\n          clearExitListener(id);\n          swiping.delete(id);\n        }\n      }\n\n      for (const entry of entries.value) {\n        const wrapper = containerRef.value?.querySelector<HTMLElement>(`[data-toast-id=\"${entry.id}\"]`);\n        const control = swipeControls.get(entry.id);\n\n        if (wrapper && control?.element !== wrapper) {\n          control?.gesture.dispose();\n          swipeControls.set(entry.id, { element: wrapper, gesture: createToastSwipe(entry.id, wrapper) });\n        }\n\n        if (entry.phase === 'exiting') beginExit(entry.id);\n      }\n    };\n\n    const scheduleSyncControls = (): void => {\n      syncControls();\n\n      if (pendingSyncFrame !== undefined) cancelAnimationFrame(pendingSyncFrame);\n\n      pendingSyncFrame = requestAnimationFrame(() => {\n        pendingSyncFrame = undefined;\n        syncControls();\n      });\n    };\n\n    watch(entries, scheduleSyncControls);\n    watch(paused, (isPaused) => {\n      if (isPaused) store?.pauseTimers();\n      else store?.resumeTimers();\n    });\n\n    const bind = (nextStore: ToastStore): void => {\n      if (store === nextStore) return;\n\n      unsubscribeEntries();\n\n      unsubscribeEvents();\n      store = nextStore;\n      unsubscribeEntries = store.subscribe((nextEntries) => {\n        entries.value = nextEntries;\n      });\n      unsubscribeEvents = store.subscribeEvents((event) => emit(event.type, { id: event.id }));\n\n      if (paused.value) store.pauseTimers();\n    };\n\n    const renderEntry = (entry: ToastEntry) => {\n      const dismiss = () => store?.dismiss(entry.id);\n\n      return html`\n        <div\n          class=\"toast-wrapper\"\n          data-toast-id=${entry.id}\n          part=\"toast-wrapper\">\n          <div class=\"${() => `toast-inner${entry.phase !== 'active' ? ` ${entry.phase}` : ''}`}\" part=\"toast-inner\">\n            <ore-alert\n              color=${entry.color || (entry.urgency === 'assertive' ? 'error' : 'primary')}\n              variant=${entry.variant || 'solid'}\n              size=${entry.size || 'md'}\n              rounded=${entry.rounded || 'md'}\n              ?horizontal=${entry.horizontal}\n              heading=${entry.heading || ''}\n              ?dismissible=${entry.dismissible}\n              @dismiss=${dismiss}>\n              ${\n                entry.meta\n                  ? html`\n                      <span slot=\"meta\">${entry.meta}</span>\n                    `\n                  : ''\n              }\n              ${entry.message} ${renderToastActions(entry, dismiss)}\n            </ore-alert>\n          </div>\n        </div>\n      `;\n    };\n\n    onMounted(() => {\n      hostBindings.set(el, {\n        bind,\n        unbind() {\n          unsubscribeEntries();\n          unsubscribeEvents();\n          store = null;\n          entries.value = [];\n        },\n      });\n\n      const boundStore = hostStores.get(el);\n\n      if (boundStore) bind(boundStore);\n    });\n\n    onCleanup(() => {\n      hostBindings.get(el)?.unbind();\n\n      hostBindings.delete(el);\n\n      if (pendingSyncFrame !== undefined) cancelAnimationFrame(pendingSyncFrame);\n\n      for (const control of swipeControls.values()) control.gesture.dispose();\n      swipeControls.clear();\n      for (const id of exiting.keys()) clearExitListener(id);\n    });\n\n    const urgencyOf = (entry: ToastEntry) => entry.urgency ?? (entry.color === 'error' ? 'assertive' : 'polite');\n    const politeEntries = computed(() => entries.value.filter((entry) => urgencyOf(entry) === 'polite'));\n    const assertiveEntries = computed(() => entries.value.filter((entry) => urgencyOf(entry) === 'assertive'));\n\n    return html`\n      <div\n        class=\"toast-container\"\n        ref=${containerRef}\n        @pointerenter=${() => {\n          hoverPaused.value = true;\n          el.classList.add('hovered');\n        }}\n        @pointerleave=${() => {\n          hoverPaused.value = false;\n          el.classList.remove('hovered');\n        }}\n        @focusin=${() => {\n          focusPaused.value = true;\n        }}\n        @focusout=${() => {\n          focusPaused.value = false;\n        }}\n        part=\"container\">\n        <div\n          role=\"region\"\n          aria-live=\"polite\"\n          aria-relevant=\"additions removals\"\n          aria-atomic=\"false\"\n          aria-label=\"Notifications\"\n          class=\"toast-live-region\">\n          ${() => politeEntries.value.map(renderEntry)}\n        </div>\n        <div\n          role=\"region\"\n          aria-live=\"assertive\"\n          aria-relevant=\"additions removals\"\n          aria-atomic=\"false\"\n          aria-label=\"Critical notifications\"\n          class=\"toast-live-region\">\n          ${() => assertiveEntries.value.map(renderEntry)}\n        </div>\n        <slot></slot>\n      </div>\n    `;\n  },\n  styles: [reducedMotionMixin, componentStyles],\n});\n\nexport type ToastServiceConfig = OreToastProps;\n\nexport interface ToastService {\n  add(item: ToastItem): string;\n  clear(): void;\n  configure(config: ToastServiceConfig): void;\n  dismiss(id: string): void;\n  readonly disposalSignal: AbortSignal;\n  dispose(): void;\n  readonly disposed: boolean;\n  error(message: string, opts?: Partial<ToastItem>): string;\n  info(message: string, opts?: Partial<ToastItem>): string;\n  promise<T>(\n    promise: Promise<T>,\n    messages: {\n      error: string | ((err: unknown) => string);\n      loading: string;\n      success: string | ((data: T) => string);\n    },\n  ): Promise<T>;\n  success(message: string, opts?: Partial<ToastItem>): string;\n  update(id: string, updates: Partial<ToastItem>): void;\n  warning(message: string, opts?: Partial<ToastItem>): string;\n  [Symbol.dispose](): void;\n}\n\nconst services = new WeakMap<ParentNode, ToastService>();\n\n/**\n * Creates a scoped toast service. The service owns its notification store and\n * binds it to the declarative `<ore-toast>` host inside `root`, creating that\n * host lazily when notifications are first requested.\n */\nexport function createToastService(root: ParentNode = document.body): ToastService {\n  const existing = services.get(root);\n\n  if (existing) return existing;\n\n  const store = new ToastStore();\n  const disposalController = new AbortController();\n  let disposed = false;\n  let configured = false;\n  let pendingConfig: ToastServiceConfig | null = null;\n  let host: HTMLElement | null = null;\n\n  const assertActive = (): boolean => !disposed;\n  const rootNode = root as Element | Document | ShadowRoot;\n  const getHost = (): HTMLElement | null => {\n    if (!assertActive()) return null;\n\n    if (host?.isConnected) return host;\n\n    host = rootNode.querySelector<HTMLElement>(TOAST_TAG);\n\n    if (!host) {\n      host = document.createElement(TOAST_TAG);\n\n      if (pendingConfig?.position) host.setAttribute('position', pendingConfig.position);\n\n      if (pendingConfig?.max != null) host.setAttribute('max', String(pendingConfig.max));\n\n      rootNode.appendChild(host);\n    }\n\n    if (pendingConfig?.max != null) store.setMax(pendingConfig.max);\n    else {\n      const max = Number(host.getAttribute('max'));\n\n      if (Number.isFinite(max) && max > 0) store.setMax(max);\n    }\n\n    pendingConfig = null;\n    configured = true;\n    bindToastHost(host, store);\n\n    return host;\n  };\n  const ensureHost = (): boolean => Boolean(getHost());\n\n  const service: ToastService = {\n    add(item) {\n      if (!ensureHost()) return item.id ?? uuid();\n\n      return store.add(item);\n    },\n\n    clear() {\n      if (ensureHost()) store.clear();\n    },\n\n    configure(config) {\n      if (configured) {\n        warn('toast.configure() called after the container was already created; options ignored.');\n\n        return;\n      }\n\n      pendingConfig = { ...pendingConfig, ...config };\n    },\n\n    dismiss(id) {\n      if (ensureHost()) store.dismiss(id);\n    },\n\n    get disposalSignal() {\n      return disposalController.signal;\n    },\n\n    dispose() {\n      if (disposed) return;\n\n      disposed = true;\n\n      disposalController.abort();\n\n      store.dispose();\n\n      if (services.get(root) === service) services.delete(root);\n    },\n\n    get disposed() {\n      return disposed;\n    },\n\n    error(message, opts) {\n      return service.add({ color: 'error', ...opts, message });\n    },\n\n    info(message, opts) {\n      return service.add({ color: 'info', ...opts, message });\n    },\n\n    async promise(promise, messages) {\n      const id = service.add({ color: 'primary', dismissible: false, duration: 0, message: messages.loading });\n\n      try {\n        const data = await promise;\n\n        service.update(id, {\n          color: 'success',\n          dismissible: true,\n          duration: 5000,\n          message: typeof messages.success === 'function' ? messages.success(data) : messages.success,\n        });\n\n        return data;\n      } catch (err) {\n        service.update(id, {\n          color: 'error',\n          dismissible: true,\n          duration: 5000,\n          message: typeof messages.error === 'function' ? messages.error(err) : messages.error,\n        });\n        throw err;\n      }\n    },\n\n    success(message, opts) {\n      return service.add({ color: 'success', ...opts, message });\n    },\n\n    [Symbol.dispose]() {\n      service.dispose();\n    },\n\n    update(id, updates) {\n      if (ensureHost()) store.update(id, updates);\n    },\n\n    warning(message, opts) {\n      return service.add({ color: 'warning', ...opts, message });\n    },\n  };\n\n  services.set(root, service);\n\n  return service;\n}\n\n/** Singleton service backed by a lazily created host in `document.body`. */\nexport const toast: ToastService = createToastService();\n"],"mappings":"sUAWA,IAAM,EAAgB,IAqEhB,EAAN,KAAiB,CACf,IAAA,EAAoB,EAAA,OAAA,CAAqB,CAAC,CAAC,EAC3C,GAAsB,IAAI,IAC1B,GAA2B,IAAI,IAC/B,GAAY,GACZ,GAAO,EAEP,IAAI,EAAyB,CAC3B,GAAI,KAAKG,GAAW,OAAO,EAAK,KAAA,EAAM,EAAA,KAAA,CAAK,EAE3C,IAAM,EAAK,EAAK,KAAA,EAAM,EAAA,KAAA,CAAK,EACrB,EAAS,KAAKH,GAAS,MAAM,OAAQ,GAAU,EAAM,QAAU,SAAS,EACxE,EAAW,EAAO,QAAU,KAAKI,GAAO,GAE9C,GAAI,EAAW,EACb,IAAK,IAAM,KAAS,EAAO,MAAM,EAAG,CAAQ,EAAG,KAAK,QAAQ,EAAM,EAAE,EAGtE,IAAM,EAAoB,CACxB,YAAa,GACb,SAAU,IACV,GAAG,EACH,cAAe,KACf,KACA,MAAO,WACP,MAAO,IACT,EAWA,OATA,KAAKC,GAAY,CAAC,GAAG,KAAKL,GAAS,MAAO,CAAK,CAAC,EAChD,KAAKM,GAAM,CAAE,KAAI,KAAM,KAAM,CAAC,EAE9B,0BAA4B,CACtB,KAAKC,GAAO,CAAE,CAAC,EAAE,QAAU,YAAY,KAAKC,GAAQ,EAAI,CAAE,MAAO,QAAS,CAAC,CACjF,CAAC,EAEG,EAAM,SAAW,GAAG,KAAKC,GAAe,EAAI,EAAM,QAAQ,EAEvD,CACT,CAEA,OAAc,CACZ,IAAK,IAAM,KAAS,KAAKT,GAAS,MAC5B,EAAM,QAAU,WAAW,KAAK,QAAQ,EAAM,EAAE,CAExD,CAEA,SAAgB,CACV,SAAKG,GAET,MAAKA,GAAY,GAEjB,IAAK,IAAM,KAAS,KAAKH,GAAS,MAC5B,EAAM,OAAO,aAAa,EAAM,MAAM,SAAS,EAE/C,EAAM,eAAe,aAAa,EAAM,aAAa,EAG3D,KAAKK,GAAY,CAAC,CAAC,EACnB,KAAKJ,GAAW,MAAM,EACtB,KAAKC,GAAgB,MAAM,CAVV,CAWnB,CAEA,QAAQ,EAAkB,CACxB,IAAM,EAAQ,KAAKK,GAAO,CAAE,EAExB,CAAC,GAAS,EAAM,QAAU,WAAa,KAAKJ,KAEhD,KAAKK,GAAQ,EAAI,CAAE,GAAG,KAAKE,GAAY,CAAK,EAAG,MAAO,SAAU,CAAC,EACjE,KAAK,qBAAqB,EAAI,GAAkB,EAClD,CAEA,SAAS,EAAkB,CACzB,IAAM,EAAQ,KAAKH,GAAO,CAAE,EAExB,CAAC,GAAS,KAAKJ,KAEf,EAAM,OAAO,aAAa,EAAM,MAAM,SAAS,EAE/C,EAAM,eAAe,aAAa,EAAM,aAAa,EAEzD,KAAKE,GAAY,KAAKL,GAAS,MAAM,OAAQ,GAAc,EAAU,KAAO,CAAE,CAAC,EAC/E,EAAM,YAAY,EAClB,KAAKM,GAAM,CAAE,KAAI,KAAM,SAAU,CAAC,EACpC,CAEA,aAAoB,CACd,KAAKH,IAET,KAAKE,GACH,KAAKL,GAAS,MAAM,IAAK,GAClB,EAAM,OAEX,aAAa,EAAM,MAAM,SAAS,EAE3B,CACL,GAAG,EACH,MAAO,CACL,GAAG,EAAM,MACT,UAAW,KAAK,IAAI,EAAG,EAAM,MAAM,WAAa,KAAK,IAAI,EAAI,EAAM,MAAM,UAAU,CACrF,CACF,GAVyB,CAW1B,CACH,CACF,CAEA,cAAqB,CACf,SAAKG,GAET,IAAK,IAAM,KAAS,KAAKH,GAAS,MAC5B,EAAM,QAAU,UAAY,EAAM,OAAS,EAAM,MAAM,UAAY,GACrE,KAAKS,GAAe,EAAM,GAAI,EAAM,MAAM,SAAS,CAGzD,CAEA,qBAAqB,EAAY,EAAqB,CACpD,IAAM,EAAQ,KAAKF,GAAO,CAAE,EAE5B,GAAI,GAAO,QAAU,WAAa,KAAKJ,GAAW,OAE9C,EAAM,eAAe,aAAa,EAAM,aAAa,EAEzD,IAAM,EAAgB,eAAiB,KAAK,SAAS,CAAE,EAAG,CAAK,EAE/D,KAAKK,GAAQ,EAAI,CAAE,eAAc,CAAC,CACpC,CAEA,OAAO,EAA+B,CAChC,GAAO,OAAM,KAAKJ,GAAO,KAAK,IAAI,EAAG,CAAG,EAC9C,CAEA,UAAU,EAAuD,CAI/D,OAHA,EAAS,KAAKJ,GAAS,KAAK,EAC5B,KAAKC,GAAW,IAAI,CAAQ,MAEf,KAAKA,GAAW,OAAO,CAAQ,CAC9C,CAEA,gBAAgB,EAAwD,CAGtE,OAFA,KAAKC,GAAgB,IAAI,CAAQ,MAEpB,KAAKA,GAAgB,OAAO,CAAQ,CACnD,CAEA,OAAO,EAAY,EAAmC,CACpD,IAAM,EAAQ,KAAKK,GAAO,CAAE,EAE5B,GAAI,CAAC,GAAS,KAAKJ,GAAW,OAE9B,IAAM,EAAU,EAAQ,WAAa,IAAA,GAAsC,EAA1B,KAAKO,GAAY,CAAK,EAEvE,KAAKF,GAAQ,EAAI,CAAE,GAAG,EAAS,GAAG,EAAS,IAAG,CAAC,EAE3C,EAAQ,WAAa,IAAA,IAAa,EAAQ,SAAW,GAAG,KAAKC,GAAe,EAAI,EAAQ,QAAQ,CACtG,CAEA,GAAY,EAA+B,CAGzC,OAFI,EAAM,OAAO,aAAa,EAAM,MAAM,SAAS,EAE5C,CAAE,GAAG,EAAO,MAAO,IAAK,CACjC,CAEA,GAAM,EAA8B,CAClC,IAAK,IAAM,KAAY,KAAKP,GAAiB,EAAS,CAAK,CAC7D,CAEA,GAAO,EAAoC,CACzC,OAAO,KAAKF,GAAS,MAAM,KAAM,GAAU,EAAM,KAAO,CAAE,CAC5D,CAEA,GAAe,EAAY,EAAyB,CAClD,GAAI,GAAa,GAAK,KAAKG,GAAW,OAEtC,IAAM,EAAY,eAAiB,KAAK,QAAQ,CAAE,EAAG,CAAS,EAE9D,KAAKK,GAAQ,EAAI,CAAE,MAAO,CAAE,YAAW,UAAW,KAAK,IAAI,EAAG,WAAU,CAAE,CAAC,CAC7E,CAEA,GAAY,EAA6B,CACvC,KAAKR,GAAS,MAAQ,EACtB,IAAK,IAAM,KAAY,KAAKC,GAAY,EAAS,CAAO,CAC1D,CAEA,GAAQ,EAAY,EAAkC,CACpD,KAAKI,GAAY,KAAKL,GAAS,MAAM,IAAK,GAAW,EAAM,KAAO,EAAK,CAAE,GAAG,EAAO,GAAG,CAAM,EAAI,CAAM,CAAC,CACzG,CACF,EAOM,EAAe,IAAI,QACnB,EAAa,IAAI,QAEjB,GAAiB,EAAmB,IAA4B,CACpE,EAAW,IAAI,EAAM,CAAK,EAC1B,EAAa,IAAI,CAAI,CAAC,EAAE,KAAK,CAAK,CACpC,EAGA,SAAS,EAAmB,EAAmB,EAAqB,CAGlE,OAFK,EAAM,SAAS,OAEb,EAAA,IAAI;;QAEL,EAAM,QAAQ,IACb,GAAW,EAAA,IAAI;;;oBAGJ,EAAO,OAAS,EAAM,OAAS,UAAU;sBACvC,EAAO,SAAW,QAAQ;yBACrB,CACb,EAAO,UAAU,EACjB,EAAQ,CACV,EAAE;cACA,EAAO,MAAM;;SAGrB,EAAE;;IAjB6B,EAoBrC,CAEA,IAAa,EAAY,aAWzB,EAAA,EAAA,OAAA,CAAsB,EAAW,CAC/B,MAAO,CACL,IAAK,EAAA,KAAK,OAAO,CAAC,EAClB,SAAU,EAAA,KAAK,MACb,CAAC,WAAY,aAAc,YAAa,cAAe,gBAAiB,cAAc,EACtF,cACF,CACF,EACA,OAAQ,CACN,IAAM,GAAA,EAAK,EAAA,QAAA,CAAQ,EACb,GAAA,EAAO,EAAA,QAAA,CAAwB,EAC/B,GAAA,EAAe,EAAA,IAAA,CAAoB,EACnC,GAAA,EAAU,EAAA,OAAA,CAAqB,CAAC,CAAC,EACjC,GAAA,EAAc,EAAA,OAAA,CAAO,EAAK,EAC1B,GAAA,EAAc,EAAA,OAAA,CAAO,EAAK,EAC1B,GAAA,EAAS,EAAA,SAAA,KAAe,EAAY,OAAS,EAAY,KAAK,EAC9D,EAAgB,IAAI,IACpB,EAAU,IAAI,IACd,EAAU,IAAI,IAChB,EACA,EAA2B,KAC3B,MAA2B,CAAC,EAC5B,MAA0B,CAAC,EAEzB,EAAY,GACT,EAAQ,cAA2B,cAAc,EAGpD,EAAqB,GAAqB,CAC9C,EAAQ,IAAI,CAAE,CAAC,GAAG,EAClB,EAAQ,OAAO,CAAE,CACnB,EAEM,EAAiB,GAAqB,CAC1C,EAAQ,OAAO,CAAE,EACjB,GAAO,SAAS,CAAE,CACpB,EAEM,GAAoB,EAAY,IAAqC,CACzE,IAAM,MAA+B,EAAQ,MAAM,KAAM,GAAU,EAAM,KAAO,CAAE,CAAC,EAAE,aAAe,GAC9F,MAAoB,CACxB,IAAM,EAAQ,EAAS,CAAO,EAEzB,IAEL,EAAM,MAAM,WAAa,GACzB,EAAM,MAAM,UAAY,GACxB,EAAM,MAAM,QAAU,GACxB,EAEA,OAAA,EAAO,EAAA,iBAAA,CAAiB,EAAS,CAC/B,KAAM,IACN,aAAgB,CAAC,EAAc,EAC/B,OAAQ,CAAE,WAAU,YAAa,CAC/B,GAAI,IAAW,WAAa,KAAK,IAAI,CAAQ,EAAI,GAAI,CACnD,EAAM,EAEN,MACF,CAEA,IAAM,EAAQ,EAAS,CAAO,EAE9B,GAAI,CAAC,GAAS,CAAC,EAAO,OAEtB,EAAQ,IAAI,CAAE,EAEd,EAAM,QAAQ,CAAE,EAEhB,IAAM,MAAe,EAAc,CAAE,EAErC,GAAI,OAAO,WAAW,kCAAkC,CAAC,CAAC,QAAS,CACjE,EAAM,MAAM,QAAU,IACtB,EAAO,EAEP,MACF,CAEA,IAAM,EAAY,GAAY,EAAI,EAAI,GAEtC,EAAM,MAAM,WAAa,mDACzB,EAAW,YACX,EAAM,MAAM,UAAY,cAAc,EAAY,IAAI,IACtD,EAAM,MAAM,QAAU,IAEtB,IAAM,EAAmB,GAAgC,CACnD,EAAW,SAAW,GAAS,EAAW,eAAiB,cAE/D,EAAM,oBAAoB,gBAAiB,CAAe,EAC1D,EAAO,EACT,EAEA,EAAM,iBAAiB,gBAAiB,CAAe,EACvD,EAAM,qBAAqB,EAAI,GAAG,CACpC,EACA,QAAS,CAAE,cAAe,CACxB,IAAM,EAAQ,EAAS,CAAO,EAEzB,IAEL,EAAM,MAAM,WAAa,OACzB,EAAM,MAAM,UAAY,cAAc,EAAS,KAC/C,EAAM,MAAM,QAAU,OAAO,KAAK,IAAI,EAAG,EAAI,KAAK,IAAI,CAAQ,EAAI,GAAG,CAAC,EACxE,EACA,eAAgB,GAChB,YAAc,GACZ,CAAC,EACE,aAAa,CAAC,CACd,KAAM,GAAS,aAAgB,SAAW,EAAK,QAAQ,gDAAgD,CAAC,CAC/G,CAAC,CACH,EAEM,EAAa,GAAqB,CAClC,CAAC,GAAS,EAAQ,IAAI,CAAE,GAAK,EAAQ,IAAI,CAAE,GAE/C,0BAA4B,CAC1B,GAAI,CAAC,GAAS,EAAQ,IAAI,CAAE,GAAK,EAAQ,IAAI,CAAE,EAAG,OAElD,IAAM,EAAQ,EAAa,OAAO,cAA2B,mBAAmB,EAAG,gBAAgB,EAEnG,GAAI,CAAC,EAAO,CACV,EAAM,qBAAqB,EAAI,CAAa,EAE5C,MACF,CAEA,EAAW,aAEX,IAAM,EAAW,WAAW,iBAAiB,CAAK,CAAC,CAAC,kBAAkB,EAAI,IACpE,EAAS,OAAO,SAAS,CAAQ,GAAK,EAAW,EAAI,EAAW,EAChE,EAAmB,GAA2B,CACjC,EAAM,QAA+B,UAAU,mBAAmB,EAAG,GAAG,IAIzF,EAAkB,CAAE,EACpB,GAAO,SAAS,CAAE,EACpB,EAGA,EAAQ,IAAI,MAFS,EAAa,OAAO,oBAAoB,gBAAiB,CAAe,CAEvE,EACtB,EAAa,OAAO,iBAAiB,gBAAiB,CAAe,EACrE,EAAM,qBAAqB,EAAI,EAAS,EAAE,CAC5C,CAAC,CACH,EAEM,MAA2B,CAC/B,IAAM,EAAa,IAAI,IAAI,EAAQ,MAAM,IAAK,GAAU,EAAM,EAAE,CAAC,EAEjE,IAAK,GAAM,CAAC,EAAI,KAAY,EACrB,EAAW,IAAI,CAAE,IACpB,EAAQ,QAAQ,QAAQ,EAExB,EAAc,OAAO,CAAE,EACvB,EAAkB,CAAE,EACpB,EAAQ,OAAO,CAAE,GAIrB,IAAK,IAAM,KAAS,EAAQ,MAAO,CACjC,IAAM,EAAU,EAAa,OAAO,cAA2B,mBAAmB,EAAM,GAAG,GAAG,EACxF,EAAU,EAAc,IAAI,EAAM,EAAE,EAEtC,GAAW,GAAS,UAAY,IAClC,GAAS,QAAQ,QAAQ,EACzB,EAAc,IAAI,EAAM,GAAI,CAAE,QAAS,EAAS,QAAS,EAAiB,EAAM,GAAI,CAAO,CAAE,CAAC,GAG5F,EAAM,QAAU,WAAW,EAAU,EAAM,EAAE,CACnD,CACF,GAaA,EAAA,EAAA,MAAA,CAAM,MAXmC,CACvC,EAAa,EAET,IAAqB,IAAA,IAAW,qBAAqB,CAAgB,EAEzE,EAAmB,0BAA4B,CAC7C,EAAmB,IAAA,GACnB,EAAa,CACf,CAAC,CACH,CAEmC,GACnC,EAAA,EAAA,MAAA,CAAM,EAAS,GAAa,CACtB,EAAU,GAAO,YAAY,EAC5B,GAAO,aAAa,CAC3B,CAAC,EAED,IAAM,EAAQ,GAAgC,CACxC,IAAU,IAEd,EAAmB,EAEnB,EAAkB,EAClB,EAAQ,EACR,EAAqB,EAAM,UAAW,GAAgB,CACpD,EAAQ,MAAQ,CAClB,CAAC,EACD,EAAoB,EAAM,gBAAiB,GAAU,EAAK,EAAM,KAAM,CAAE,GAAI,EAAM,EAAG,CAAC,CAAC,EAEnF,EAAO,OAAO,EAAM,YAAY,EACtC,EAEM,EAAe,GAAsB,CACzC,IAAM,MAAgB,GAAO,QAAQ,EAAM,EAAE,EAE7C,MAAO,GAAA,IAAI;;;0BAGS,EAAM,GAAG;;4BAEL,cAAc,EAAM,QAAU,SAA+B,GAApB,IAAI,EAAM,UAAe;;sBAE1E,EAAM,QAAU,EAAM,UAAY,YAAc,QAAU,WAAW;wBACnE,EAAM,SAAW,QAAQ;qBAC5B,EAAM,MAAQ,KAAK;wBAChB,EAAM,SAAW,KAAK;4BAClB,EAAM,WAAW;wBACrB,EAAM,SAAW,GAAG;6BACf,EAAM,YAAY;yBACtB,EAAQ;gBAEjB,EAAM,KACF,EAAA,IAAI;0CACkB,EAAM,KAAK;sBAEjC,GACL;gBACC,EAAM,QAAQ,GAAG,EAAmB,EAAO,CAAO,EAAE;;;;OAKhE,GAEA,EAAA,EAAA,UAAA,KAAgB,CACd,EAAa,IAAI,EAAI,CACnB,OACA,QAAS,CACP,EAAmB,EACnB,EAAkB,EAClB,EAAQ,KACR,EAAQ,MAAQ,CAAC,CACnB,CACF,CAAC,EAED,IAAM,EAAa,EAAW,IAAI,CAAE,EAEhC,GAAY,EAAK,CAAU,CACjC,CAAC,GAED,EAAA,EAAA,UAAA,KAAgB,CACd,EAAa,IAAI,CAAE,CAAC,EAAE,OAAO,EAE7B,EAAa,OAAO,CAAE,EAElB,IAAqB,IAAA,IAAW,qBAAqB,CAAgB,EAEzE,IAAK,IAAM,KAAW,EAAc,OAAO,EAAG,EAAQ,QAAQ,QAAQ,EACtE,EAAc,MAAM,EACpB,IAAK,IAAM,KAAM,EAAQ,KAAK,EAAG,EAAkB,CAAE,CACvD,CAAC,EAED,IAAM,EAAa,GAAsB,EAAM,UAAY,EAAM,QAAU,QAAU,YAAc,UAC7F,GAAA,EAAgB,EAAA,SAAA,KAAe,EAAQ,MAAM,OAAQ,GAAU,EAAU,CAAK,IAAM,QAAQ,CAAC,EAC7F,GAAA,EAAmB,EAAA,SAAA,KAAe,EAAQ,MAAM,OAAQ,GAAU,EAAU,CAAK,IAAM,WAAW,CAAC,EAEzG,MAAO,GAAA,IAAI;;;cAGD,EAAa;4BACG,CACpB,EAAY,MAAQ,GACpB,EAAG,UAAU,IAAI,SAAS,CAC5B,EAAE;4BACoB,CACpB,EAAY,MAAQ,GACpB,EAAG,UAAU,OAAO,SAAS,CAC/B,EAAE;uBACe,CACf,EAAY,MAAQ,EACtB,EAAE;wBACgB,CAChB,EAAY,MAAQ,EACtB,EAAE;;;;;;;;;gBASQ,EAAc,MAAM,IAAI,CAAW,EAAE;;;;;;;;;gBASrC,EAAiB,MAAM,IAAI,CAAW,EAAE;;;;KAKxD,EACA,OAAQ,CAAC,EAAA,mBAAoB,EAAA,OAAe,CAC9C,CAAC,EA4BD,IAAM,EAAW,IAAI,QAOrB,SAAgB,EAAmB,EAAmB,SAAS,KAAoB,CACjF,IAAM,EAAW,EAAS,IAAI,CAAI,EAElC,GAAI,EAAU,OAAO,EAErB,IAAM,EAAQ,IAAI,EACZ,EAAqB,IAAI,gBAC3B,EAAW,GACX,EAAa,GACb,EAA2C,KAC3C,EAA2B,KAEzB,MAA8B,CAAC,EAC/B,EAAW,EACX,MAAoC,CACxC,GAAI,CAAC,EAAa,EAAG,OAAO,KAE5B,GAAI,GAAM,YAAa,OAAO,EAc9B,GAZA,EAAO,EAAS,cAA2B,CAAS,EAE/C,IACH,EAAO,SAAS,cAAc,CAAS,EAEnC,GAAe,UAAU,EAAK,aAAa,WAAY,EAAc,QAAQ,EAE7E,GAAe,KAAO,MAAM,EAAK,aAAa,MAAO,OAAO,EAAc,GAAG,CAAC,EAElF,EAAS,YAAY,CAAI,GAGvB,GAAe,KAAO,KAAM,EAAM,OAAO,EAAc,GAAG,MACzD,CACH,IAAM,EAAM,OAAO,EAAK,aAAa,KAAK,CAAC,EAEvC,OAAO,SAAS,CAAG,GAAK,EAAM,GAAG,EAAM,OAAO,CAAG,CACvD,CAMA,MAJA,GAAgB,KAChB,EAAa,GACb,EAAc,EAAM,CAAK,EAElB,CACT,EACM,MAA4B,EAAQ,EAAQ,EAE5C,EAAwB,CAC5B,IAAI,EAAM,CAGR,OAFK,EAAW,EAET,EAAM,IAAI,CAAI,EAFK,EAAK,KAAA,EAAM,EAAA,KAAA,CAAK,CAG5C,EAEA,OAAQ,CACF,EAAW,GAAG,EAAM,MAAM,CAChC,EAEA,UAAU,EAAQ,CACZ,IAMJ,EAAgB,CAAE,GAAG,EAAe,GAAG,CAAO,EAChD,EAEA,QAAQ,EAAI,CACN,EAAW,GAAG,EAAM,QAAQ,CAAE,CACpC,EAEA,IAAI,gBAAiB,CACnB,OAAO,EAAmB,MAC5B,EAEA,SAAU,CACJ,IAEJ,EAAW,GAEX,EAAmB,MAAM,EAEzB,EAAM,QAAQ,EAEV,EAAS,IAAI,CAAI,IAAM,GAAS,EAAS,OAAO,CAAI,EAC1D,EAEA,IAAI,UAAW,CACb,OAAO,CACT,EAEA,MAAM,EAAS,EAAM,CACnB,OAAO,EAAQ,IAAI,CAAE,MAAO,QAAS,GAAG,EAAM,SAAQ,CAAC,CACzD,EAEA,KAAK,EAAS,EAAM,CAClB,OAAO,EAAQ,IAAI,CAAE,MAAO,OAAQ,GAAG,EAAM,SAAQ,CAAC,CACxD,EAEA,MAAM,QAAQ,EAAS,EAAU,CAC/B,IAAM,EAAK,EAAQ,IAAI,CAAE,MAAO,UAAW,YAAa,GAAO,SAAU,EAAG,QAAS,EAAS,OAAQ,CAAC,EAEvG,GAAI,CACF,IAAM,EAAO,MAAM,EASnB,OAPA,EAAQ,OAAO,EAAI,CACjB,MAAO,UACP,YAAa,GACb,SAAU,IACV,QAAS,OAAO,EAAS,SAAY,WAAa,EAAS,QAAQ,CAAI,EAAI,EAAS,OACtF,CAAC,EAEM,CACT,OAAS,EAAK,CAOZ,MANA,EAAQ,OAAO,EAAI,CACjB,MAAO,QACP,YAAa,GACb,SAAU,IACV,QAAS,OAAO,EAAS,OAAU,WAAa,EAAS,MAAM,CAAG,EAAI,EAAS,KACjF,CAAC,EACK,CACR,CACF,EAEA,QAAQ,EAAS,EAAM,CACrB,OAAO,EAAQ,IAAI,CAAE,MAAO,UAAW,GAAG,EAAM,SAAQ,CAAC,CAC3D,EAEA,CAAC,OAAO,UAAW,CACjB,EAAQ,QAAQ,CAClB,EAEA,OAAO,EAAI,EAAS,CACd,EAAW,GAAG,EAAM,OAAO,EAAI,CAAO,CAC5C,EAEA,QAAQ,EAAS,EAAM,CACrB,OAAO,EAAQ,IAAI,CAAE,MAAO,UAAW,GAAG,EAAM,SAAQ,CAAC,CAC3D,CACF,EAIA,OAFA,EAAS,IAAI,EAAM,CAAO,EAEnB,CACT,CAGA,IAAa,EAAsB,EAAmB"}