{"version":3,"file":"imagelightbox.jquery.umd.cjs","names":[],"sources":["../src/lib/query.ts","../src/lib/TransitionDirection.ts","../src/lib/history.ts","../src/lib/container.ts","../src/lib/activity-indicator.ts","../src/lib/arrows.ts","../src/lib/caption.ts","../src/lib/close-button.ts","../src/lib/fullscreen.ts","../src/lib/fullscreen-button.ts","../src/lib/ImageView.ts","../src/lib/keyboard-navigation.ts","../src/lib/navigation.ts","../src/lib/PreloadedVideo.ts","../src/lib/VideoCache.ts","../src/lib/State.ts","../src/lib/imagelightbox.ts","../src/lib/imagelightbox.jquery.ts"],"sourcesContent":["export function addQueryField(\n  query: string,\n  key: string,\n  value: string,\n): string {\n  const newField = `${key}=${value}`;\n  let newQuery = `?${newField}`;\n\n  if (query) {\n    const keyRegex = new RegExp(`([?&])${key}=[^&]*`);\n    if (keyRegex.exec(query) === null) {\n      newQuery = `${query}&${newField}`;\n    } else {\n      newQuery = query.replace(keyRegex, `$1${newField}`);\n    }\n  }\n  return newQuery;\n}\n\nexport function getQueryField(key: string): string | undefined {\n  const keyValuePair = new RegExp(`[?&]${key}(=([^&#]*)|&|#|$)`).exec(\n    document.location.search,\n  );\n  if (keyValuePair?.[2] === undefined) {\n    return undefined;\n  }\n  return decodeURIComponent(keyValuePair[2].replace(/\\+/g, \" \"));\n}\n\nexport function removeQueryField(query: string, key: string): string {\n  let newQuery = query;\n  if (newQuery) {\n    const keyRegex1 = new RegExp(`\\\\?${key}=[^&]*`);\n    const keyRegex2 = new RegExp(`&${key}=[^&]*`);\n    newQuery = newQuery.replace(keyRegex1, \"?\");\n    newQuery = newQuery.replace(keyRegex2, \"\");\n  }\n  return newQuery;\n}\n","export const enum TransitionDirection {\n  Right = -1,\n  None = 0,\n  Left = 1,\n}\n","import { addQueryField, getQueryField, removeQueryField } from \"./query\";\nimport { TransitionDirection } from \"./TransitionDirection\";\n\ninterface HistoryState {\n  imageLightboxIndex?: string;\n  imageLightboxSet?: string;\n}\n\nexport function openHistory(\n  set: string | undefined,\n  images: Array<HTMLAnchorElement>,\n  open: (index: number, skipHistory?: boolean) => void,\n): void {\n  if (getQueryField(\"imageLightboxSet\") !== set) {\n    return;\n  }\n  const id = getQueryField(\"imageLightboxIndex\");\n  if (id === undefined) {\n    return;\n  }\n  let newIndex = images.findIndex((image) => image.dataset[\"ilb2Id\"] === id);\n  if (newIndex < 0) {\n    newIndex = parseInt(id, 10);\n  }\n  open(newIndex, true);\n}\n\nexport function popHistory(\n  event: PopStateEvent,\n  set: string | undefined,\n  images: Array<HTMLAnchorElement>,\n  currentIndex: number | null,\n  open: (index: number, skipHistory?: boolean) => void,\n  close: (skipHistory?: boolean) => void,\n  change: (\n    index: number,\n    transitionDirection: TransitionDirection,\n    skipHistory?: boolean,\n  ) => void,\n): void {\n  const historyState = event.state as\n    HistoryState | Record<string, never> | null | undefined;\n  // This needs to be before checking the set in order to close the lightbox when navigating to a non-imagelightbox state\n  if (!historyState || Object.keys(historyState).length === 0) {\n    close(true);\n    return;\n  }\n  if (historyState.imageLightboxSet !== set) {\n    return;\n  }\n  const newId = historyState.imageLightboxIndex;\n  if (newId === undefined) {\n    close(true);\n    return;\n  }\n  let newIndex = images.findIndex(\n    (e: HTMLElement) => e.dataset[\"ilb2Id\"] === newId,\n  );\n  if (newIndex < 0) {\n    newIndex = parseInt(newId, 10);\n  }\n  if (currentIndex === null) {\n    open(newIndex, true);\n    return;\n  }\n  change(\n    newIndex,\n    newIndex > currentIndex\n      ? TransitionDirection.Right\n      : TransitionDirection.Left,\n    true,\n  );\n}\n\nexport function pushQuitToHistory(): void {\n  let newQuery = removeQueryField(\n    document.location.search,\n    \"imageLightboxIndex\",\n  );\n  newQuery = removeQueryField(newQuery, \"imageLightboxSet\");\n  window.history.pushState({}, \"\", document.location.pathname + newQuery);\n}\n\nexport function pushToHistory(\n  index: number,\n  set: string | undefined,\n  images: Array<HTMLAnchorElement>,\n): void {\n  const newIndex = images[index].dataset[\"ilb2Id\"] ?? index.toString();\n  let newQuery = addQueryField(\n    document.location.search,\n    \"imageLightboxIndex\",\n    newIndex,\n  );\n  const newHistoryState: HistoryState = {\n    imageLightboxIndex: newIndex,\n    imageLightboxSet: \"\",\n  };\n  if (set !== undefined) {\n    newHistoryState.imageLightboxSet = set;\n    newQuery = addQueryField(newQuery, \"imageLightboxSet\", set);\n  }\n  window.history.pushState(\n    newHistoryState,\n    \"\",\n    document.location.pathname + newQuery,\n  );\n}\n","import \"./container.css\";\n\nconst container = document.createElement(\"dialog\");\ncontainer.setAttribute(\"id\", \"ilb-container\");\ndocument.body.appendChild(container);\n/*\n * A modal dialog is dismissed by the browser on escape, which would close the\n * lightbox behind its back and leave it thinking it is still open. Closing is\n * driven by the lightbox itself instead - on escape by the keyboard navigation,\n * if it is enabled.\n */\ncontainer.addEventListener(\"cancel\", (e) => {\n  e.preventDefault();\n});\n\nlet wrappedOnclick: ((e: Event) => void) | null = null;\n\nexport function addContainerToDOM(\n  animationSpeed: number,\n  attachOnclick: boolean,\n  onclick: () => void,\n): void {\n  container.classList.remove(\"ilb-overlay\");\n  document.body.classList.add(\"ilb-body\");\n  container.showModal();\n  if (attachOnclick) {\n    wrappedOnclick = (e): void => {\n      e.stopPropagation();\n      onclick();\n    };\n    container.addEventListener(\"click\", wrappedOnclick);\n    container.addEventListener(\"touchend\", wrappedOnclick);\n  }\n  container.style.transition = `opacity ${animationSpeed.toString()}ms ease`;\n  setTimeout(() => {\n    container.style.opacity = \"1\";\n  }, 50);\n}\n\nexport function darkenOverlay(): void {\n  container.classList.add(\"ilb-overlay\");\n}\n\nexport function getContainer(): HTMLDialogElement {\n  return container;\n}\n\nexport function removeContainerFromDOM(): void {\n  if (wrappedOnclick !== null) {\n    container.removeEventListener(\"click\", wrappedOnclick);\n    container.removeEventListener(\"touchend\", wrappedOnclick);\n  }\n  container.close();\n  container.textContent = \"\";\n  document.body.classList.remove(\"ilb-body\");\n}\n\nexport function transitionOutContainer(): void {\n  container.style.opacity = \"0\";\n}\n","import \"./activity-indicator.css\";\nimport { getContainer } from \"./container\";\n\nconst activityIndicator = document.createElement(\"div\");\nactivityIndicator.setAttribute(\"id\", \"ilb-activity-indicator\");\nactivityIndicator.appendChild(document.createElement(\"div\"));\n\nexport function addActivityIndicatorToDOM(): void {\n  getContainer().appendChild(activityIndicator);\n}\n\nexport function removeActivityIndicatorFromDOM(): void {\n  activityIndicator.remove();\n}\n","import \"./arrows.css\";\nimport \"./button.css\";\nimport { getContainer } from \"./container\";\n\nconst leftArrow = document.createElement(\"div\");\nleftArrow.classList.add(\"ilb-button\", \"ilb-arrow\");\nleftArrow.setAttribute(\"id\", \"ilb-arrow-left\");\nconst rightArrow = document.createElement(\"div\");\nrightArrow.classList.add(\"ilb-button\", \"ilb-arrow\");\nrightArrow.setAttribute(\"id\", \"ilb-arrow-right\");\n\nlet wrappedLeft: ((e: Event) => void) | null = null;\nlet wrappedRight: ((e: Event) => void) | null = null;\n\nexport function addArrowsToDOM(onleft: () => void, onright: () => void): void {\n  wrappedLeft = (e): void => {\n    e.stopPropagation();\n    onleft();\n  };\n  wrappedRight = (e): void => {\n    e.stopPropagation();\n    onright();\n  };\n  leftArrow.addEventListener(\"click\", wrappedLeft);\n  leftArrow.addEventListener(\"touchend\", wrappedLeft);\n  rightArrow.addEventListener(\"click\", wrappedRight);\n  rightArrow.addEventListener(\"touchend\", wrappedRight);\n  getContainer().append(leftArrow, rightArrow);\n}\n\nexport function removeArrowsFromDOM(): void {\n  leftArrow.remove();\n  if (wrappedLeft !== null) {\n    leftArrow.removeEventListener(\"click\", wrappedLeft);\n    leftArrow.removeEventListener(\"touchend\", wrappedLeft);\n  }\n  if (wrappedRight !== null) {\n    rightArrow.removeEventListener(\"click\", wrappedRight);\n    rightArrow.removeEventListener(\"touchend\", wrappedRight);\n  }\n  wrappedLeft = null;\n  wrappedRight = null;\n}\n","import \"./caption.css\";\nimport { getContainer } from \"./container\";\n\nconst caption = document.createElement(\"caption\");\ncaption.setAttribute(\"id\", \"ilb-caption\");\ncaption.textContent = \"&nbsp;\";\ncaption.addEventListener(\"click\", (e) => {\n  e.stopPropagation();\n});\n\nexport function setCaption(captionText: string, animationSpeed: number): void {\n  if (captionText === \"\") {\n    caption.style.opacity = \"0\";\n    setTimeout(() => {\n      caption.remove();\n    }, animationSpeed);\n  } else {\n    getContainer().appendChild(caption);\n    caption.style.transition = `opacity ${animationSpeed.toString()}ms ease`;\n    setTimeout(() => {\n      caption.style.opacity = \"1\";\n    }, 1);\n    caption.textContent = captionText;\n  }\n}\n","import \"./button.css\";\nimport \"./close-button.css\";\nimport { getContainer } from \"./container\";\n\nconst closeButton = document.createElement(\"button\");\ncloseButton.classList.add(\"ilb-button\");\ncloseButton.setAttribute(\"id\", \"ilb-close-button\");\n\nlet wrappedClose: ((e: Event) => void) | null = null;\n\nexport function addCloseButtonToDOM(onclick: () => void): void {\n  wrappedClose = (e): void => {\n    e.stopPropagation();\n    onclick();\n  };\n  closeButton.addEventListener(\"click\", wrappedClose);\n  getContainer().appendChild(closeButton);\n}\n\nexport function removeCloseButtonFromDOM(): void {\n  if (wrappedClose !== null) {\n    closeButton.removeEventListener(\"click\", wrappedClose);\n  }\n  closeButton.remove();\n}\n","import { getContainer } from \"./container\";\n\nexport const fullscreenEnabled: boolean =\n  // eslint-disable-next-line compat/compat -- The prefixed version fixes the incompatibility\n  document.fullscreenEnabled ||\n  ((document as LegacyDocument).webkitFullscreenEnabled ?? false);\n\nfunction fullscreenElement(): Element | null {\n  return (\n    // eslint-disable-next-line compat/compat -- The prefixed version fixes the incompatibility\n    document.fullscreenElement ??\n    (document as LegacyDocument).webkitFullscreenElement ??\n    null\n  );\n}\n\n/* eslint-disable compat/compat, @typescript-eslint/no-unnecessary-condition, @typescript-eslint/strict-boolean-expressions -- Polyfills for very old browsers */\nconst requestFullscreen = (element: HTMLElement): void => {\n  void (\n    element.requestFullscreen ||\n    (element as LegacyHTMLElement).webkitRequestFullScreen\n  ).call(element);\n};\n\nconst exitFullscreen = (): void => {\n  void (\n    document.exitFullscreen || (document as LegacyDocument).webkitExitFullscreen\n  ).call(document);\n};\n/* eslint-enable */\n\nexport function toggleFullscreen(): void {\n  if (fullscreenElement() === null) {\n    requestFullscreen(getContainer());\n  } else {\n    exitFullscreen();\n  }\n}\n","import \"./button.css\";\nimport { getContainer } from \"./container\";\nimport { toggleFullscreen } from \"./fullscreen\";\nimport \"./fullscreen-button.css\";\n\nconst fullscreenButton = document.createElement(\"button\");\nfullscreenButton.classList.add(\"ilb-button\");\nfullscreenButton.setAttribute(\"id\", \"ilb-fullscreen-button\");\nfullscreenButton.innerHTML = \"&#x26F6;\";\nfullscreenButton.addEventListener(\"click\", (e): void => {\n  e.stopPropagation();\n  toggleFullscreen();\n});\n\nexport function addFullscreenButtonToDOM(): void {\n  getContainer().appendChild(fullscreenButton);\n}\n\nexport function removeFullscreenButtonFromDOM(): void {\n  fullscreenButton.remove();\n}\n","import type { ILBOptions } from \"./interfaces/ILBOptions\";\nimport type { VideoCache } from \"./VideoCache\";\n\nimport { getContainer } from \"./container\";\nimport \"./ImageView.css\";\nimport { TransitionDirection } from \"./TransitionDirection\";\n\nexport interface ImageView {\n  addToDOM(\n    transitionDirection: TransitionDirection,\n    callback: () => void,\n  ): void;\n  removeFromDOM(): void;\n  startLoading(onload: () => void, onerror: () => void): void;\n  transitionIn(\n    callback: () => void,\n    previousImage: () => void,\n    nextImage: () => void,\n    closeLightbox: () => void,\n  ): void;\n  transitionOut(\n    transitionDirection: TransitionDirection,\n    callback: () => void,\n  ): void;\n}\n\nexport function ImageView(\n  image: HTMLAnchorElement,\n  options: ILBOptions,\n  videoCache: VideoCache,\n): ImageView {\n  let swipeStart = 0;\n  let swipeDiff = 0;\n  let imageElement: HTMLImageElement | HTMLVideoElement =\n    document.createElement(\"img\");\n  imageElement.addEventListener(\"error\", (e) => {\n    getContainer().dispatchEvent(\n      new CustomEvent(\"ilb:error\", {\n        bubbles: true,\n        detail: { target: e.target },\n      }),\n    );\n  });\n  imageElement.setAttribute(\"id\", \"ilb-image\");\n  imageElement.setAttribute(\"src\", image.getAttribute(\"href\") ?? \"\");\n  imageElement.setAttribute(\"srcset\", image.dataset[\"ilb2Srcset\"] ?? \"\");\n  imageElement.setAttribute(\"sizes\", image.dataset[\"ilb2Sizes\"] ?? \"\");\n  const containerElement = document.createElement(\"div\");\n  containerElement.classList.add(\"ilb-image-container\");\n  let isVideoPreloaded: boolean | undefined = undefined;\n\n  const videoId = image.dataset[\"ilb2VideoId\"];\n  let isVideo =\n    image.dataset[\"ilb2Video\"] !== undefined && videoId !== undefined;\n  if (isVideo) {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Checked by the if above\n    const preloadedVideo = videoCache.get(videoId!);\n    if (preloadedVideo === undefined) {\n      isVideo = false;\n    } else {\n      [imageElement, isVideoPreloaded] = preloadedVideo.element();\n    }\n  }\n  containerElement.appendChild(imageElement);\n\n  function onready(\n    callback: () => void,\n    previousImage: () => void,\n    nextImage: () => void,\n    closeLightbox: () => void,\n  ): void {\n    if (isVideo) {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Checked by the if in the constructor\n      const preloadedVideo = videoCache.get(videoId!);\n      if (preloadedVideo?.shouldAutoplay() === true) {\n        const [videoElement, isLoaded] = preloadedVideo.element();\n        if (isLoaded) {\n          void videoElement.play();\n        } else {\n          videoElement.autoplay = true;\n        }\n      }\n    } else {\n      (imageElement as HTMLImageElement).addEventListener(\"click\", (e) => {\n        e.stopPropagation();\n        if (options.quitOnImgClick) {\n          closeLightbox();\n          return;\n        }\n        const xPosRelativeToImage =\n          (e.pageX - imageElement.offsetLeft) / imageElement.width;\n        if (xPosRelativeToImage <= 1 / 3) {\n          previousImage();\n        } else {\n          nextImage();\n        }\n      });\n    }\n    imageElement.addEventListener(\"touchstart\", (e) => {\n      swipeStart = (e as TouchEvent).touches[0].pageX;\n      imageElement.style.transitionProperty = \"opacity\";\n    });\n    imageElement.addEventListener(\"touchmove\", (e) => {\n      swipeDiff = (e as TouchEvent).touches[0].pageX - swipeStart;\n      imageElement.style.left = `${swipeDiff.toString()}px`;\n    });\n    imageElement.addEventListener(\"touchend\", (e) => {\n      e.stopPropagation();\n      imageElement.style.transitionProperty = \"left, opacity\";\n      if (swipeDiff > 50) {\n        previousImage();\n      }\n      if (swipeDiff < -50) {\n        nextImage();\n      }\n      imageElement.style.left = \"0\";\n    });\n    imageElement.addEventListener(\"touchcancel\", (e) => {\n      e.stopPropagation();\n      imageElement.style.transitionProperty = \"left, opacity\";\n      imageElement.style.left = \"0\";\n    });\n    callback();\n  }\n\n  function addToDOM(\n    transitionDirection: TransitionDirection,\n    callback: () => void,\n  ): void {\n    getContainer().appendChild(containerElement);\n    const maxSize = Math.abs(100 - options.gutter);\n    imageElement.style.maxHeight = `${maxSize.toString()}%`;\n    imageElement.style.maxWidth = `${maxSize.toString()}%`;\n    imageElement.style.left = `${(-100 * transitionDirection).toString()}px`;\n    imageElement.style.transition = `all ease ${options.animationSpeed.toString()}ms`;\n    setTimeout(callback, 50);\n  }\n\n  function startLoading(onload: () => void, onerror: () => void): void {\n    imageElement.addEventListener(\"error\", onerror);\n    if (isVideoPreloaded === true) {\n      onload();\n    } else {\n      imageElement.addEventListener(\"load\", onload);\n      imageElement.addEventListener(\"loadedmetadata\", onload);\n    }\n  }\n\n  function transitionIn(\n    callback: () => void,\n    previousImage: () => void,\n    nextImage: () => void,\n    closeLightbox: () => void,\n  ): void {\n    imageElement.style.left = \"0\";\n    imageElement.style.opacity = \"1\";\n    setTimeout(() => {\n      onready(callback, previousImage, nextImage, closeLightbox);\n    }, options.animationSpeed);\n  }\n\n  function transitionOut(\n    transitionDirection: TransitionDirection,\n    callback: () => void,\n  ): void {\n    if (transitionDirection !== TransitionDirection.None) {\n      const currentLeft = parseInt(imageElement.style.left, 10) || 0;\n      imageElement.style.left = `${(currentLeft + 100 * transitionDirection).toString()}px`;\n    }\n    imageElement.style.opacity = \"0\";\n    setTimeout(() => {\n      callback();\n    }, options.animationSpeed);\n  }\n\n  function removeFromDOM(): void {\n    containerElement.remove();\n  }\n\n  return {\n    addToDOM,\n    removeFromDOM,\n    startLoading,\n    transitionIn,\n    transitionOut,\n  };\n}\n","import type { ILBOptions } from \"./interfaces/ILBOptions\";\nlet keyHandler: ((e: KeyboardEvent) => void) | null = null;\n\nexport function addKeyboardNavigation(\n  options: ILBOptions,\n  closeLightbox: () => void,\n  previousImage: () => void,\n  nextImage: () => void,\n): void {\n  if (!options.enableKeyboard) {\n    return;\n  }\n  keyHandler = (e): void => {\n    if (e.key === \"Escape\") {\n      e.preventDefault();\n      closeLightbox();\n    }\n    if (e.key === \"ArrowLeft\") {\n      e.preventDefault();\n      previousImage();\n    }\n    if (e.key === \"ArrowRight\") {\n      e.preventDefault();\n      nextImage();\n    }\n  };\n  document.addEventListener(\"keyup\", keyHandler);\n}\n\nexport function removeKeyboardNavigation(): void {\n  if (keyHandler !== null) {\n    document.removeEventListener(\"keyup\", keyHandler);\n  }\n}\n","import { getContainer } from \"./container\";\nimport \"./navigation.css\";\nimport { TransitionDirection } from \"./TransitionDirection\";\n\nconst navigation = document.createElement(\"div\");\nnavigation.classList.add(\"ilb-navigation\");\nnavigation.addEventListener(\"click\", (e) => {\n  e.stopPropagation();\n});\nnavigation.addEventListener(\"touchend\", (e) => {\n  e.stopPropagation();\n});\n\nexport function addNavigationItems(\n  images: Array<HTMLAnchorElement>,\n  currentIndexFn: () => number | null,\n  change: (index: number, transitionDirection: TransitionDirection) => void,\n  animationSpeed: number,\n): void {\n  // eslint-disable-next-line @typescript-eslint/prefer-for-of -- The result won't be used anyway\n  for (let i = 0; i < images.length; i++) {\n    const button = document.createElement(\"button\");\n    button.style.transition = `background-color ${animationSpeed.toString()}ms ease`;\n    const buttonClick = (): void => {\n      const currentIndex = currentIndexFn();\n      if (\n        button.classList.contains(\"ilb-navigation-active\") ||\n        currentIndex === null ||\n        button.parentNode === null\n      ) {\n        return;\n      }\n      const buttonIndex = Array.prototype.indexOf.call(\n        button.parentNode.childNodes,\n        button,\n      );\n      const loadDirection =\n        buttonIndex < currentIndex\n          ? TransitionDirection.Left\n          : TransitionDirection.Right;\n      change(buttonIndex, loadDirection);\n    };\n    button.addEventListener(\"click\", buttonClick);\n    button.addEventListener(\"touchend\", buttonClick);\n    navigation.appendChild(button);\n  }\n}\n\nexport function addNavigationToDOM(\n  images: Array<HTMLAnchorElement>,\n  currentIndexFn: () => number | null,\n  change: (index: number, transitionDirection: TransitionDirection) => void,\n  animationSpeed: number,\n): void {\n  navigation.textContent = \"\";\n  addNavigationItems(images, currentIndexFn, change, animationSpeed);\n  const currentIndex = currentIndexFn();\n  if (currentIndex !== null) {\n    changeNavigationCurrent(currentIndex);\n  }\n  getContainer().appendChild(navigation);\n}\n\nexport function changeNavigationCurrent(currentIndex: number): void {\n  for (let i = 0; i < navigation.children.length; i++) {\n    navigation.children.item(i)?.classList.remove(\"ilb-navigation-active\");\n  }\n  navigation.children\n    .item(currentIndex)\n    ?.classList.add(\"ilb-navigation-active\");\n}\n\nexport function removeNavigationFromDOM(): void {\n  navigation.remove();\n}\n","import type { VideoOptions } from \"./interfaces/VideoOptions\";\n\nexport interface PreloadedVideo {\n  element(): [HTMLVideoElement, boolean];\n  id(): string;\n  shouldAutoplay(): boolean;\n}\n\nexport function PreloadedVideo(\n  image: HTMLAnchorElement,\n  videoOptions: VideoOptions,\n): PreloadedVideo {\n  let tempId = image.dataset[\"ilb2Id\"];\n  // Random id\n  tempId ??= `a${(((1 + Math.random()) * 0x10000) | 0).toString(16)}`;\n  image.dataset[\"ilb2VideoId\"] = tempId;\n  const videoId = tempId;\n\n  const videoElement = document.createElement(\"video\");\n  videoElement.setAttribute(\"id\", \"ilb-image\");\n  videoElement.preload = \"metadata\";\n  videoElement.dataset[\"ilb2VideoId\"] = videoId;\n  let isLoaded = false;\n  let autoplay = false;\n\n  for (const [key, value] of Object.entries(videoOptions)) {\n    switch (key) {\n      case \"autoplay\":\n        // The value comes from untyped JSON, so an explicit negative must be honoured\n        autoplay = value !== false && value !== \"false\" && value !== \"\";\n        break;\n      case \"controls\":\n      case \"loop\":\n      case \"muted\":\n      case \"poster\":\n      case \"preload\":\n      case \"src\":\n        videoElement.setAttribute(key, (value as number | string).toString());\n        break;\n      default:\n    }\n  }\n  if (videoOptions.sources) {\n    for (const source of videoOptions.sources) {\n      const sourceElement = document.createElement(\"source\");\n      for (const [key, value] of Object.entries(source)) {\n        sourceElement.setAttribute(key, value as string);\n      }\n      videoElement.appendChild(sourceElement);\n    }\n  }\n  videoElement.addEventListener(\"loadedmetadata\", () => {\n    isLoaded = true;\n  });\n\n  function id(): string {\n    return videoId;\n  }\n\n  function element(): [HTMLVideoElement, boolean] {\n    return [videoElement, isLoaded];\n  }\n\n  function shouldAutoplay(): boolean {\n    return autoplay;\n  }\n\n  return {\n    element,\n    id,\n    shouldAutoplay,\n  };\n}\n","import type { VideoOptions } from \"./interfaces/VideoOptions\";\n\nimport { PreloadedVideo } from \"./PreloadedVideo\";\n\nexport interface VideoCache {\n  add(elements: Array<HTMLAnchorElement>): void;\n  get(videoId: string): PreloadedVideo | undefined;\n}\n\nexport function VideoCache(): VideoCache {\n  const videos: Array<PreloadedVideo> = [];\n\n  function add(elements: Array<HTMLAnchorElement>): void {\n    for (const image of elements) {\n      const videoOptions = image.dataset[\"ilb2Video\"];\n      if (videoOptions === undefined) {\n        continue;\n      }\n      videos.push(\n        PreloadedVideo(image, JSON.parse(videoOptions) as VideoOptions),\n      );\n    }\n  }\n\n  function get(videoId: string): PreloadedVideo | undefined {\n    return videos.find((x) => x.id() === videoId);\n  }\n\n  return {\n    add,\n    get,\n  };\n}\n","import type { ILBOptions } from \"./interfaces/ILBOptions\";\n\nimport {\n  addActivityIndicatorToDOM,\n  removeActivityIndicatorFromDOM,\n} from \"./activity-indicator\";\nimport { addArrowsToDOM, removeArrowsFromDOM } from \"./arrows\";\nimport { setCaption } from \"./caption\";\nimport { addCloseButtonToDOM, removeCloseButtonFromDOM } from \"./close-button\";\nimport {\n  addContainerToDOM,\n  darkenOverlay,\n  getContainer,\n  removeContainerFromDOM,\n  transitionOutContainer,\n} from \"./container\";\nimport { fullscreenEnabled } from \"./fullscreen\";\nimport {\n  addFullscreenButtonToDOM,\n  removeFullscreenButtonFromDOM,\n} from \"./fullscreen-button\";\nimport { popHistory, pushQuitToHistory, pushToHistory } from \"./history\";\nimport { ImageView } from \"./ImageView\";\nimport {\n  addKeyboardNavigation,\n  removeKeyboardNavigation,\n} from \"./keyboard-navigation\";\nimport {\n  addNavigationItems,\n  addNavigationToDOM,\n  changeNavigationCurrent,\n  removeNavigationFromDOM,\n} from \"./navigation\";\nimport { TransitionDirection } from \"./TransitionDirection\";\nimport { VideoCache } from \"./VideoCache\";\n\nexport interface State {\n  addImages(images: Array<HTMLAnchorElement>): void;\n  close(skipHistory?: boolean): void;\n  images(): Array<HTMLAnchorElement>;\n  next(): void;\n  open(index: number, skipHistory?: boolean): void;\n  openWithImage(image: HTMLAnchorElement): void;\n  previous(): void;\n  set(): string | undefined;\n}\n\nexport function State(\n  // The lightbox options\n  options: ILBOptions,\n  // The value of data-imagelightbox on the images\n  lightboxSet: string,\n  initialImages: Array<HTMLAnchorElement>,\n): State {\n  // The clickable images in the lightbox\n  const targetImages: Array<HTMLAnchorElement> = [];\n\n  // Cached preloaded videos\n  const videoCache: VideoCache = VideoCache();\n\n  // The index of the currently open image, or null if the lightbox is closed\n  let currentImage: number | null = null;\n\n  // The currently displayed image view\n  let currentImageView: ImageView | null = null;\n\n  // !!! State initialization is at the bottom!\n\n  function set(): string {\n    return lightboxSet;\n  }\n\n  function images(): Array<HTMLAnchorElement> {\n    return targetImages;\n  }\n\n  /**\n   * The lightbox transition functions.\n   *\n   * The most important part of the State is managing the transition lifecycle. When transitioning between images, the lifecycle takes the following steps:\n   *\n   * For transitioning out an old image:\n   *\n   * 1. Start visually transitioning the old image out (slide + fade out)\n   * 2. When the image is visually gone, actually remove it from the DOM\n   *\n   * For transitioning in a new image:\n   *\n   * 1. Start loading the new image in the background (startLoadingNewImage)\n   * 2. When the new image is loaded, add it to the DOM, but keep it invisible (addNewImage)\n   * 3. After adding the image to the DOM, transition it into place - slide + fade in (transitionInNewImage)\n   */\n\n  function removeOldImage(\n    transitionDirection: TransitionDirection,\n    callback?: () => void,\n  ): void {\n    if (currentImageView === null) {\n      return;\n    }\n    const oldImageView = currentImageView;\n    oldImageView.transitionOut(transitionDirection, () => {\n      oldImageView.removeFromDOM();\n      callback?.();\n    });\n  }\n\n  function transitionInNewImage(): void {\n    currentImageView?.transitionIn(\n      removeActivityIndicatorFromDOM,\n      previous,\n      next,\n      close,\n    );\n  }\n\n  function addNewImage(transitionDirection: TransitionDirection): void {\n    currentImageView?.addToDOM(transitionDirection, () => {\n      if (currentImage === null) {\n        return;\n      }\n      const image = targetImages[currentImage];\n      if (options.caption) {\n        setCaption(\n          image.dataset[\"ilb2Caption\"] ??\n            image.getElementsByTagName(\"img\").item(0)?.alt ??\n            \"\",\n          options.animationSpeed,\n        );\n      }\n      transitionInNewImage();\n      if (options.preloadNext && currentImage + 1 < targetImages.length) {\n        const nextImage = targetImages[currentImage + 1];\n        const nextImageElement = document.createElement(\"img\");\n        nextImageElement.setAttribute(\n          \"src\",\n          nextImage.getAttribute(\"href\") ?? \"\",\n        );\n        nextImageElement.setAttribute(\n          \"srcset\",\n          nextImage.dataset[\"ilb2Srcset\"] ?? \"\",\n        );\n        nextImageElement.setAttribute(\n          \"sizes\",\n          nextImage.dataset[\"ilb2Sizes\"] ?? \"\",\n        );\n      }\n      getContainer().dispatchEvent(new Event(\"ilb:loaded\", { bubbles: true }));\n    });\n  }\n\n  function startLoadingNewImage(\n    newIndex: number,\n    transitionDirection: TransitionDirection,\n  ): void {\n    const newImageView = ImageView(targetImages[newIndex], options, videoCache);\n    currentImage = newIndex;\n    currentImageView = newImageView;\n    newImageView.startLoading(\n      () => {\n        addNewImage(transitionDirection);\n      },\n      () => {\n        removeActivityIndicatorFromDOM();\n      },\n    );\n  }\n\n  // Public functions wrapping the state transition functions\n\n  function close(skipHistory = false): void {\n    if (currentImage === null) {\n      return;\n    }\n    if (options.activity) {\n      addActivityIndicatorToDOM();\n    }\n\n    removeKeyboardNavigation();\n\n    if (options.history && !skipHistory) {\n      pushQuitToHistory();\n    }\n\n    getContainer().dispatchEvent(new Event(\"ilb:quit\", { bubbles: true }));\n\n    transitionOutContainer();\n    removeOldImage(TransitionDirection.None, () => {\n      currentImage = null;\n      currentImageView = null;\n      removeArrowsFromDOM();\n      removeCloseButtonFromDOM();\n      removeFullscreenButtonFromDOM();\n      removeNavigationFromDOM();\n      removeContainerFromDOM();\n    });\n  }\n\n  function change(\n    index: number,\n    transitionDirection: TransitionDirection,\n    skipHistory = false,\n  ): void {\n    if (currentImage === null) {\n      return;\n    }\n\n    if (options.history && !skipHistory) {\n      pushToHistory(index, set(), images());\n    }\n\n    if (options.activity) {\n      addActivityIndicatorToDOM();\n    }\n    changeNavigationCurrent(index);\n\n    removeOldImage(transitionDirection);\n    startLoadingNewImage(index, transitionDirection);\n  }\n\n  function previous(): void {\n    if (currentImage === null) {\n      return;\n    }\n\n    let newIndex = currentImage - 1;\n    if (currentImage === 0) {\n      if (options.quitOnEnd) {\n        close();\n        return;\n      }\n      newIndex = targetImages.length - 1;\n    }\n    targetImages[newIndex].dispatchEvent(\n      new Event(\"ilb:previous\", { bubbles: true }),\n    );\n    change(newIndex, TransitionDirection.Left);\n  }\n\n  function next(): void {\n    if (currentImage === null) {\n      return;\n    }\n\n    let newIndex = currentImage + 1;\n    if (currentImage === targetImages.length - 1) {\n      if (options.quitOnEnd) {\n        close();\n        return;\n      }\n      newIndex = 0;\n    }\n    targetImages[newIndex].dispatchEvent(\n      new Event(\"ilb:next\", { bubbles: true }),\n    );\n    change(newIndex, TransitionDirection.Right);\n  }\n\n  function open(index: number, skipHistory = false): void {\n    if (currentImage !== null) {\n      return;\n    }\n    addContainerToDOM(options.animationSpeed, options.quitOnDocClick, close);\n    if (options.activity) {\n      addActivityIndicatorToDOM();\n    }\n    addKeyboardNavigation(options, close, previous, next);\n    if (options.arrows) {\n      addArrowsToDOM(previous, next);\n    }\n    if (options.button) {\n      addCloseButtonToDOM(close);\n    }\n    if (options.fullscreen && fullscreenEnabled) {\n      addFullscreenButtonToDOM();\n    }\n    if (options.overlay) {\n      darkenOverlay();\n    }\n\n    if (options.history && !skipHistory) {\n      pushToHistory(index, set(), images());\n    }\n\n    targetImages[index].dispatchEvent(\n      new Event(\"ilb:start\", { bubbles: true }),\n    );\n    startLoadingNewImage(index, TransitionDirection.None);\n\n    // Navigation needs to know current image, so it needs to be added after startLoadingNewImage\n    if (options.navigation) {\n      addNavigationToDOM(\n        images(),\n        () => currentImage,\n        change,\n        options.animationSpeed,\n      );\n    }\n  }\n\n  function openWithImage(image: HTMLAnchorElement): void {\n    const index = targetImages.indexOf(image);\n    if (index < 0) {\n      return;\n    }\n    open(index);\n  }\n\n  function addImages(newImages: Array<HTMLAnchorElement>): void {\n    const validImages = newImages\n      .filter((x) => !targetImages.includes(x))\n      .filter(\n        (element): boolean =>\n          element.tagName.toLowerCase() === \"a\" &&\n          (new RegExp(`.(${options.allowedTypes})$`, \"i\").test(element.href) ||\n            element.dataset[\"ilb2Srcset\"] !== undefined ||\n            element.dataset[\"ilb2Video\"] !== undefined),\n      );\n    videoCache.add(validImages);\n    targetImages.push(...validImages);\n    for (const image of validImages) {\n      image.addEventListener(\"click\", (e) => {\n        e.preventDefault();\n        e.stopPropagation();\n        openWithImage(image);\n      });\n    }\n    /*\n     * The navigation is a single shared element, so it may only be touched\n     * while this gallery is the open one. Otherwise it is built from scratch by\n     * addNavigationToDOM when the gallery is opened.\n     */\n    if (options.navigation && currentImage !== null) {\n      addNavigationItems(\n        validImages,\n        () => currentImage,\n        change,\n        options.animationSpeed,\n      );\n    }\n  }\n\n  // State initialization\n\n  addImages(initialImages);\n\n  if (options.history) {\n    window.addEventListener(\"popstate\", (e) => {\n      popHistory(e, set(), images(), currentImage, open, close, change);\n    });\n  }\n\n  return {\n    addImages,\n    close,\n    images,\n    next,\n    open,\n    openWithImage,\n    previous,\n    set,\n  };\n}\n","import type { ILBOptions } from \"./interfaces/ILBOptions\";\n\nimport { openHistory } from \"./history\";\nimport { State } from \"./State\";\n\ndeclare global {\n  interface Document {\n    addEventListener(\n      type: \"ilb:error\",\n      listener: (\n        this: Document,\n        ev: CustomEvent<{ target: HTMLImageElement }>,\n      ) => void,\n    ): void;\n  }\n}\n\nexport type { ILBOptions };\n\nexport class ImageLightbox {\n  private readonly s: State;\n\n  public constructor(\n    images:\n      | Array<HTMLAnchorElement>\n      | HTMLCollectionOf<HTMLAnchorElement>\n      | NodeListOf<HTMLAnchorElement>,\n    options?: Partial<ILBOptions>,\n  ) {\n    const opts: ILBOptions = {\n      activity: true,\n      allowedTypes: \"\",\n      animationSpeed: 250,\n      arrows: true,\n      button: true,\n      caption: false,\n      enableKeyboard: true,\n      fullscreen: true,\n      gutter: 10,\n      history: false,\n      navigation: false,\n      overlay: true,\n      preloadNext: true,\n      quitOnDocClick: true,\n      quitOnEnd: true,\n      quitOnImgClick: false,\n      ...options,\n    };\n    this.s = State(\n      opts,\n      images.length > 0 ? (images[0].dataset[\"imagelightbox\"] ?? \"\") : \"\",\n      Array.from(images),\n    );\n\n    if (opts.history) {\n      this.openHistory();\n    }\n  }\n\n  public addImages(\n    images:\n      | Array<HTMLAnchorElement>\n      | HTMLCollectionOf<HTMLAnchorElement>\n      | NodeListOf<HTMLAnchorElement>,\n  ): void {\n    this.s.addImages(Array.from(images));\n  }\n\n  public close(): void {\n    this.s.close();\n  }\n\n  public next(): void {\n    this.s.next();\n  }\n\n  public open(image?: HTMLAnchorElement): void {\n    if (image === undefined) {\n      this.s.open(0);\n    } else {\n      this.s.openWithImage(image);\n    }\n  }\n\n  public openHistory(): void {\n    openHistory(\n      this.s.set(),\n      this.s.images(),\n      (index: number, skipHistory?: boolean) => {\n        this.s.open(index, skipHistory);\n      },\n    );\n  }\n\n  public previous(): void {\n    this.s.previous();\n  }\n}\n","import $ from \"jquery\";\n\nimport type { ILBOptions } from \"./interfaces/ILBOptions\";\n\nimport { ImageLightbox } from \"./imagelightbox\";\n\ndeclare global {\n  interface JQuery {\n    addToImageLightbox(elements: JQuery<HTMLAnchorElement>): void;\n    imageLightbox(opts?: Partial<ILBOptions>): JQuery;\n    loadNextImage(): void;\n    loadPreviousImage(): void;\n    openHistory(): void;\n    quitImageLightbox(): void;\n    startImageLightbox(element?: JQuery<HTMLAnchorElement>): void;\n  }\n}\n\n$.fn.imageLightbox = function (opts?: Partial<ILBOptions>): JQuery {\n  const lightbox = new ImageLightbox(\n    this.get() as Array<HTMLAnchorElement>,\n    opts,\n  );\n\n  this.addToImageLightbox = (elements: JQuery<HTMLAnchorElement>): void => {\n    lightbox.addImages(elements.get());\n  };\n\n  this.openHistory = (): void => {\n    lightbox.openHistory();\n  };\n\n  this.loadPreviousImage = (): void => {\n    lightbox.previous();\n  };\n\n  this.loadNextImage = (): void => {\n    lightbox.next();\n  };\n\n  this.quitImageLightbox = function (): JQuery {\n    lightbox.close();\n    return this;\n  };\n\n  this.startImageLightbox = (image?: JQuery<HTMLAnchorElement>): void => {\n    lightbox.open(image?.get(0));\n  };\n\n  return this;\n};\n\nconst doc = $(document);\ndoc.on(\"ilb:start\", (e) => {\n  $(\"#ilb-container\").trigger(\"start.ilb2\", e.target);\n});\ndoc.on(\"ilb:quit\", () => {\n  $(\"#ilb-container\").trigger(\"quit.ilb2\");\n});\ndoc.on(\"ilb:loaded\", () => {\n  $(\"#ilb-container\").trigger(\"loaded.ilb2\");\n});\ndoc.on(\"ilb:previous\", (e) => {\n  $(\"#ilb-container\").trigger(\"previous.ilb2\", e.target);\n});\ndoc.on(\"ilb:next\", (e) => {\n  $(\"#ilb-container\").trigger(\"next.ilb2\", e.target);\n});\ndoc.on(\"ilb:error\", (e) => {\n  $(\"#ilb-container\").trigger(\"error.ilb2\", e.detail);\n});\n"],"mappings":"ktBAAA,SAAgB,EACd,EACA,EACA,EACQ,CACR,IAAM,EAAW,GAAG,EAAI,GAAG,IACvB,EAAW,IAAI,IAEnB,GAAI,EAAO,CACT,IAAM,EAAe,OAAO,SAAS,EAAI,OAAO,EAChD,AAGE,EAHE,EAAS,KAAK,CAAK,IAAM,KAChB,GAAG,EAAM,GAAG,IAEZ,EAAM,QAAQ,EAAU,KAAK,GAAU,CAEtD,CACA,OAAO,CACT,CAEA,SAAgB,EAAc,EAAiC,CAC7D,IAAM,EAAmB,OAAO,OAAO,EAAI,kBAAkB,CAAC,CAAC,KAC7D,SAAS,SAAS,MACpB,EACI,OAAe,KAAO,IAAA,GAG1B,OAAO,mBAAmB,EAAa,EAAE,CAAC,QAAQ,MAAO,GAAG,CAAC,CAC/D,CAEA,SAAgB,EAAiB,EAAe,EAAqB,CACnE,IAAI,EAAW,EACf,GAAI,EAAU,CACZ,IAAM,EAAgB,OAAO,MAAM,EAAI,OAAO,EACxC,EAAgB,OAAO,IAAI,EAAI,OAAO,EAC5C,EAAW,EAAS,QAAQ,EAAW,GAAG,EAC1C,EAAW,EAAS,QAAQ,EAAW,EAAE,CAC3C,CACA,OAAO,CACT,CCtCA,IAAkB,EAAX,SAAA,EAAA,OACL,GAAA,EAAA,MAAA,IAAA,QACA,EAAA,EAAA,KAAA,GAAA,OACA,EAAA,EAAA,KAAA,GAAA,QACF,EAAA,CAAA,CAAA,ECIA,SAAgB,EACd,EACA,EACA,EACM,CACN,GAAI,EAAc,kBAAkB,IAAM,EACxC,OAEF,IAAM,EAAK,EAAc,oBAAoB,EAC7C,GAAI,IAAO,IAAA,GACT,OAEF,IAAI,EAAW,EAAO,UAAW,GAAU,EAAM,QAAQ,SAAc,CAAE,EACrE,EAAW,IACb,EAAW,SAAS,EAAI,EAAE,GAE5B,EAAK,EAAU,EAAI,CACrB,CAEA,SAAgB,EACd,EACA,EACA,EACA,EACA,EACA,EACA,EAKM,CACN,IAAM,EAAe,EAAM,MAG3B,GAAI,CAAC,GAAgB,OAAO,KAAK,CAAY,CAAC,CAAC,SAAW,EAAG,CAC3D,EAAM,EAAI,EACV,MACF,CACA,GAAI,EAAa,mBAAqB,EACpC,OAEF,IAAM,EAAQ,EAAa,mBAC3B,GAAI,IAAU,IAAA,GAAW,CACvB,EAAM,EAAI,EACV,MACF,CACA,IAAI,EAAW,EAAO,UACnB,GAAmB,EAAE,QAAQ,SAAc,CAC9C,EAIA,GAHI,EAAW,IACb,EAAW,SAAS,EAAO,EAAE,GAE3B,IAAiB,KAAM,CACzB,EAAK,EAAU,EAAI,EACnB,MACF,CACA,EACE,EACA,EAAW,EACP,EAAoB,MACpB,EAAoB,KACxB,EACF,CACF,CAEA,SAAgB,GAA0B,CACxC,IAAI,EAAW,EACb,SAAS,SAAS,OAClB,oBACF,EACA,EAAW,EAAiB,EAAU,kBAAkB,EACxD,OAAO,QAAQ,UAAU,CAAC,EAAG,GAAI,SAAS,SAAS,SAAW,CAAQ,CACxE,CAEA,SAAgB,EACd,EACA,EACA,EACM,CACN,IAAM,EAAW,EAAO,EAAM,CAAC,QAAQ,QAAa,EAAM,SAAS,EAC/D,EAAW,EACb,SAAS,SAAS,OAClB,qBACA,CACF,EACM,EAAgC,CACpC,mBAAoB,EACpB,iBAAkB,EACpB,EACI,IAAQ,IAAA,KACV,EAAgB,iBAAmB,EACnC,EAAW,EAAc,EAAU,mBAAoB,CAAG,GAE5D,OAAO,QAAQ,UACb,EACA,GACA,SAAS,SAAS,SAAW,CAC/B,CACF,CCzGA,IAAM,EAAY,SAAS,cAAc,QAAQ,EACjD,EAAU,aAAa,KAAM,eAAe,EAC5C,SAAS,KAAK,YAAY,CAAS,EAOnC,EAAU,iBAAiB,SAAW,GAAM,CAC1C,EAAE,eAAe,CACnB,CAAC,EAED,IAAI,EAA8C,KAElD,SAAgB,EACd,EACA,EACA,EACM,CACN,EAAU,UAAU,OAAO,aAAa,EACxC,SAAS,KAAK,UAAU,IAAI,UAAU,EACtC,EAAU,UAAU,EAChB,IACF,EAAkB,GAAY,CAC5B,EAAE,gBAAgB,EAClB,EAAQ,CACV,EACA,EAAU,iBAAiB,QAAS,CAAc,EAClD,EAAU,iBAAiB,WAAY,CAAc,GAEvD,EAAU,MAAM,WAAa,WAAW,EAAe,SAAS,EAAE,SAClE,eAAiB,CACf,EAAU,MAAM,QAAU,GAC5B,EAAG,EAAE,CACP,CAEA,SAAgB,GAAsB,CACpC,EAAU,UAAU,IAAI,aAAa,CACvC,CAEA,SAAgB,GAAkC,CAChD,OAAO,CACT,CAEA,SAAgB,GAA+B,CACzC,IAAmB,OACrB,EAAU,oBAAoB,QAAS,CAAc,EACrD,EAAU,oBAAoB,WAAY,CAAc,GAE1D,EAAU,MAAM,EAChB,EAAU,YAAc,GACxB,SAAS,KAAK,UAAU,OAAO,UAAU,CAC3C,CAEA,SAAgB,GAA+B,CAC7C,EAAU,MAAM,QAAU,GAC5B,CCxDA,IAAM,EAAoB,SAAS,cAAc,KAAK,EACtD,EAAkB,aAAa,KAAM,wBAAwB,EAC7D,EAAkB,YAAY,SAAS,cAAc,KAAK,CAAC,EAE3D,SAAgB,GAAkC,CAChD,EAAa,CAAC,CAAC,YAAY,CAAiB,CAC9C,CAEA,SAAgB,GAAuC,CACrD,EAAkB,OAAO,CAC3B,CCTA,IAAM,EAAY,SAAS,cAAc,KAAK,EAC9C,EAAU,UAAU,IAAI,aAAc,WAAW,EACjD,EAAU,aAAa,KAAM,gBAAgB,EAC7C,IAAM,EAAa,SAAS,cAAc,KAAK,EAC/C,EAAW,UAAU,IAAI,aAAc,WAAW,EAClD,EAAW,aAAa,KAAM,iBAAiB,EAE/C,IAAI,EAA2C,KAC3C,EAA4C,KAEhD,SAAgB,EAAe,EAAoB,EAA2B,CAC5E,EAAe,GAAY,CACzB,EAAE,gBAAgB,EAClB,EAAO,CACT,EACA,EAAgB,GAAY,CAC1B,EAAE,gBAAgB,EAClB,EAAQ,CACV,EACA,EAAU,iBAAiB,QAAS,CAAW,EAC/C,EAAU,iBAAiB,WAAY,CAAW,EAClD,EAAW,iBAAiB,QAAS,CAAY,EACjD,EAAW,iBAAiB,WAAY,CAAY,EACpD,EAAa,CAAC,CAAC,OAAO,EAAW,CAAU,CAC7C,CAEA,SAAgB,GAA4B,CAC1C,EAAU,OAAO,EACb,IAAgB,OAClB,EAAU,oBAAoB,QAAS,CAAW,EAClD,EAAU,oBAAoB,WAAY,CAAW,GAEnD,IAAiB,OACnB,EAAW,oBAAoB,QAAS,CAAY,EACpD,EAAW,oBAAoB,WAAY,CAAY,GAEzD,EAAc,KACd,EAAe,IACjB,CCvCA,IAAM,EAAU,SAAS,cAAc,SAAS,EAChD,EAAQ,aAAa,KAAM,aAAa,EACxC,EAAQ,YAAc,SACtB,EAAQ,iBAAiB,QAAU,GAAM,CACvC,EAAE,gBAAgB,CACpB,CAAC,EAED,SAAgB,EAAW,EAAqB,EAA8B,CACxE,IAAgB,IAClB,EAAQ,MAAM,QAAU,IACxB,eAAiB,CACf,EAAQ,OAAO,CACjB,EAAG,CAAc,IAEjB,EAAa,CAAC,CAAC,YAAY,CAAO,EAClC,EAAQ,MAAM,WAAa,WAAW,EAAe,SAAS,EAAE,SAChE,eAAiB,CACf,EAAQ,MAAM,QAAU,GAC1B,EAAG,CAAC,EACJ,EAAQ,YAAc,EAE1B,CCpBA,IAAM,EAAc,SAAS,cAAc,QAAQ,EACnD,EAAY,UAAU,IAAI,YAAY,EACtC,EAAY,aAAa,KAAM,kBAAkB,EAEjD,IAAI,EAA4C,KAEhD,SAAgB,GAAoB,EAA2B,CAC7D,EAAgB,GAAY,CAC1B,EAAE,gBAAgB,EAClB,EAAQ,CACV,EACA,EAAY,iBAAiB,QAAS,CAAY,EAClD,EAAa,CAAC,CAAC,YAAY,CAAW,CACxC,CAEA,SAAgB,GAAiC,CAC3C,IAAiB,MACnB,EAAY,oBAAoB,QAAS,CAAY,EAEvD,EAAY,OAAO,CACrB,CCtBA,IAAa,EAEX,SAAS,oBACP,SAA4B,yBAA2B,IAE3D,SAAS,GAAoC,CAC3C,OAEE,SAAS,mBACR,SAA4B,yBAC7B,IAEJ,CAGA,IAAM,EAAqB,GAA+B,EAEtD,EAAQ,mBACP,EAA8B,wBAAA,CAC/B,KAAK,CAAO,CAChB,EAEM,MAA6B,EAE/B,SAAS,gBAAmB,SAA4B,qBAAA,CACxD,KAAK,QAAQ,CACjB,EAGA,SAAgB,GAAyB,CACnC,EAAkB,IAAM,KAC1B,EAAkB,EAAa,CAAC,EAEhC,EAAe,CAEnB,CChCA,IAAM,EAAmB,SAAS,cAAc,QAAQ,EACxD,EAAiB,UAAU,IAAI,YAAY,EAC3C,EAAiB,aAAa,KAAM,uBAAuB,EAC3D,EAAiB,UAAY,WAC7B,EAAiB,iBAAiB,QAAU,GAAY,CACtD,EAAE,gBAAgB,EAClB,EAAiB,CACnB,CAAC,EAED,SAAgB,GAAiC,CAC/C,EAAa,CAAC,CAAC,YAAY,CAAgB,CAC7C,CAEA,SAAgB,GAAsC,CACpD,EAAiB,OAAO,CAC1B,CCMA,SAAgB,EACd,EACA,EACA,EACW,CACX,IAAI,EAAa,EACb,EAAY,EACZ,EACF,SAAS,cAAc,KAAK,EAC9B,EAAa,iBAAiB,QAAU,GAAM,CAC5C,EAAa,CAAC,CAAC,cACb,IAAI,YAAY,YAAa,CAC3B,QAAS,GACT,OAAQ,CAAE,OAAQ,EAAE,MAAO,CAC7B,CAAC,CACH,CACF,CAAC,EACD,EAAa,aAAa,KAAM,WAAW,EAC3C,EAAa,aAAa,MAAO,EAAM,aAAa,MAAM,GAAK,EAAE,EACjE,EAAa,aAAa,SAAU,EAAM,QAAQ,YAAiB,EAAE,EACrE,EAAa,aAAa,QAAS,EAAM,QAAQ,WAAgB,EAAE,EACnE,IAAM,EAAmB,SAAS,cAAc,KAAK,EACrD,EAAiB,UAAU,IAAI,qBAAqB,EACpD,IAAI,EAEE,EAAU,EAAM,QAAQ,YAC1B,EACF,EAAM,QAAQ,YAAiB,IAAA,IAAa,IAAY,IAAA,GAC1D,GAAI,EAAS,CAEX,IAAM,EAAiB,EAAW,IAAI,CAAQ,EAC1C,IAAmB,IAAA,GACrB,EAAU,GAEV,CAAC,EAAc,GAAoB,EAAe,QAAQ,CAE9D,CACA,EAAiB,YAAY,CAAY,EAEzC,SAAS,EACP,EACA,EACA,EACA,EACM,CACN,GAAI,EAAS,CAEX,IAAM,EAAiB,EAAW,IAAI,CAAQ,EAC9C,GAAI,GAAgB,eAAe,IAAM,GAAM,CAC7C,GAAM,CAAC,EAAc,GAAY,EAAe,QAAQ,EACpD,EACF,EAAkB,KAAK,EAEvB,EAAa,SAAW,EAE5B,CACF,MACE,EAAmC,iBAAiB,QAAU,GAAM,CAElE,GADA,EAAE,gBAAgB,EACd,EAAQ,eAAgB,CAC1B,EAAc,EACd,MACF,EAEG,EAAE,MAAQ,EAAa,YAAc,EAAa,OAC1B,EAAI,EAC7B,EAAc,EAEd,EAAU,CAEd,CAAC,EAEH,EAAa,iBAAiB,aAAe,GAAM,CACjD,EAAc,EAAiB,QAAQ,EAAE,CAAC,MAC1C,EAAa,MAAM,mBAAqB,SAC1C,CAAC,EACD,EAAa,iBAAiB,YAAc,GAAM,CAChD,EAAa,EAAiB,QAAQ,EAAE,CAAC,MAAQ,EACjD,EAAa,MAAM,KAAO,GAAG,EAAU,SAAS,EAAE,GACpD,CAAC,EACD,EAAa,iBAAiB,WAAa,GAAM,CAC/C,EAAE,gBAAgB,EAClB,EAAa,MAAM,mBAAqB,gBACpC,EAAY,IACd,EAAc,EAEZ,EAAY,KACd,EAAU,EAEZ,EAAa,MAAM,KAAO,GAC5B,CAAC,EACD,EAAa,iBAAiB,cAAgB,GAAM,CAClD,EAAE,gBAAgB,EAClB,EAAa,MAAM,mBAAqB,gBACxC,EAAa,MAAM,KAAO,GAC5B,CAAC,EACD,EAAS,CACX,CAEA,SAAS,EACP,EACA,EACM,CACN,EAAa,CAAC,CAAC,YAAY,CAAgB,EAC3C,IAAM,EAAU,KAAK,IAAI,IAAM,EAAQ,MAAM,EAC7C,EAAa,MAAM,UAAY,GAAG,EAAQ,SAAS,EAAE,GACrD,EAAa,MAAM,SAAW,GAAG,EAAQ,SAAS,EAAE,GACpD,EAAa,MAAM,KAAO,IAAI,KAAO,EAAA,CAAqB,SAAS,EAAE,IACrE,EAAa,MAAM,WAAa,YAAY,EAAQ,eAAe,SAAS,EAAE,IAC9E,WAAW,EAAU,EAAE,CACzB,CAEA,SAAS,EAAa,EAAoB,EAA2B,CACnE,EAAa,iBAAiB,QAAS,CAAO,EAC1C,IAAqB,GACvB,EAAO,GAEP,EAAa,iBAAiB,OAAQ,CAAM,EAC5C,EAAa,iBAAiB,iBAAkB,CAAM,EAE1D,CAEA,SAAS,EACP,EACA,EACA,EACA,EACM,CACN,EAAa,MAAM,KAAO,IAC1B,EAAa,MAAM,QAAU,IAC7B,eAAiB,CACf,EAAQ,EAAU,EAAe,EAAW,CAAa,CAC3D,EAAG,EAAQ,cAAc,CAC3B,CAEA,SAAS,EACP,EACA,EACM,CACN,GAAI,IAAwB,EAAoB,KAAM,CACpD,IAAM,EAAc,SAAS,EAAa,MAAM,KAAM,EAAE,GAAK,EAC7D,EAAa,MAAM,KAAO,IAAI,EAAc,IAAM,EAAA,CAAqB,SAAS,EAAE,GACpF,CACA,EAAa,MAAM,QAAU,IAC7B,eAAiB,CACf,EAAS,CACX,EAAG,EAAQ,cAAc,CAC3B,CAEA,SAAS,GAAsB,CAC7B,EAAiB,OAAO,CAC1B,CAEA,MAAO,CACL,WACA,gBACA,eACA,eACA,eACF,CACF,CCzLA,IAAI,EAAkD,KAEtD,SAAgB,EACd,EACA,EACA,EACA,EACM,CACD,EAAQ,iBAGb,EAAc,GAAY,CACpB,EAAE,MAAQ,WACZ,EAAE,eAAe,EACjB,EAAc,GAEZ,EAAE,MAAQ,cACZ,EAAE,eAAe,EACjB,EAAc,GAEZ,EAAE,MAAQ,eACZ,EAAE,eAAe,EACjB,EAAU,EAEd,EACA,SAAS,iBAAiB,QAAS,CAAU,EAC/C,CAEA,SAAgB,GAAiC,CAC3C,IAAe,MACjB,SAAS,oBAAoB,QAAS,CAAU,CAEpD,CC7BA,IAAM,EAAa,SAAS,cAAc,KAAK,EAC/C,EAAW,UAAU,IAAI,gBAAgB,EACzC,EAAW,iBAAiB,QAAU,GAAM,CAC1C,EAAE,gBAAgB,CACpB,CAAC,EACD,EAAW,iBAAiB,WAAa,GAAM,CAC7C,EAAE,gBAAgB,CACpB,CAAC,EAED,SAAgB,EACd,EACA,EACA,EACA,EACM,CAEN,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IAAK,CACtC,IAAM,EAAS,SAAS,cAAc,QAAQ,EAC9C,EAAO,MAAM,WAAa,oBAAoB,EAAe,SAAS,EAAE,SACxE,IAAM,MAA0B,CAC9B,IAAM,EAAe,EAAe,EACpC,GACE,EAAO,UAAU,SAAS,uBAAuB,GACjD,IAAiB,MACjB,EAAO,aAAe,KAEtB,OAEF,IAAM,EAAc,MAAM,UAAU,QAAQ,KAC1C,EAAO,WAAW,WAClB,CACF,EAKA,EAAO,EAHL,EAAc,EACV,EAAoB,KACpB,EAAoB,KACO,CACnC,EACA,EAAO,iBAAiB,QAAS,CAAW,EAC5C,EAAO,iBAAiB,WAAY,CAAW,EAC/C,EAAW,YAAY,CAAM,CAC/B,CACF,CAEA,SAAgB,EACd,EACA,EACA,EACA,EACM,CACN,EAAW,YAAc,GACzB,EAAmB,EAAQ,EAAgB,EAAQ,CAAc,EACjE,IAAM,EAAe,EAAe,EAChC,IAAiB,MACnB,EAAwB,CAAY,EAEtC,EAAa,CAAC,CAAC,YAAY,CAAU,CACvC,CAEA,SAAgB,EAAwB,EAA4B,CAClE,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,SAAS,OAAQ,IAC9C,EAAW,SAAS,KAAK,CAAC,CAAC,EAAE,UAAU,OAAO,uBAAuB,EAEvE,EAAW,SACR,KAAK,CAAY,CAAC,EACjB,UAAU,IAAI,uBAAuB,CAC3C,CAEA,SAAgB,IAAgC,CAC9C,EAAW,OAAO,CACpB,CClEA,SAAgB,GACd,EACA,EACgB,CAChB,IAAI,EAAS,EAAM,QAAQ,OAE3B,IAAW,MAAO,EAAI,KAAK,OAAO,GAAK,MAAW,EAAA,CAAG,SAAS,EAAE,IAChE,EAAM,QAAQ,YAAiB,EAC/B,IAAM,EAAU,EAEV,EAAe,SAAS,cAAc,OAAO,EACnD,EAAa,aAAa,KAAM,WAAW,EAC3C,EAAa,QAAU,WACvB,EAAa,QAAQ,YAAiB,EACtC,IAAI,EAAW,GACX,EAAW,GAEf,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAY,EACpD,OAAQ,EAAR,CACE,IAAK,WAEH,EAAW,IAAU,IAAS,IAAU,SAAW,IAAU,GAC7D,MACF,IAAK,WACL,IAAK,OACL,IAAK,QACL,IAAK,SACL,IAAK,UACL,IAAK,MACH,EAAa,aAAa,EAAM,EAA0B,SAAS,CAAC,CAGxE,CAEF,GAAI,EAAa,QACf,IAAK,IAAM,KAAU,EAAa,QAAS,CACzC,IAAM,EAAgB,SAAS,cAAc,QAAQ,EACrD,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAM,EAC9C,EAAc,aAAa,EAAK,CAAe,EAEjD,EAAa,YAAY,CAAa,CACxC,CAEF,EAAa,iBAAiB,qBAAwB,CACpD,EAAW,EACb,CAAC,EAED,SAAS,GAAa,CACpB,OAAO,CACT,CAEA,SAAS,GAAuC,CAC9C,MAAO,CAAC,EAAc,CAAQ,CAChC,CAEA,SAAS,GAA0B,CACjC,OAAO,CACT,CAEA,MAAO,CACL,UACA,KACA,gBACF,CACF,CC/DA,SAAgB,IAAyB,CACvC,IAAM,EAAgC,CAAC,EAEvC,SAAS,EAAI,EAA0C,CACrD,IAAK,IAAM,KAAS,EAAU,CAC5B,IAAM,EAAe,EAAM,QAAQ,UAC/B,IAAiB,IAAA,IAGrB,EAAO,KACL,GAAe,EAAO,KAAK,MAAM,CAAY,CAAiB,CAChE,CACF,CACF,CAEA,SAAS,EAAI,EAA6C,CACxD,OAAO,EAAO,KAAM,GAAM,EAAE,GAAG,IAAM,CAAO,CAC9C,CAEA,MAAO,CACL,MACA,KACF,CACF,CCeA,SAAgB,GAEd,EAEA,EACA,EACO,CAEP,IAAM,EAAyC,CAAC,EAG1C,EAAyB,GAAW,EAGtC,EAA8B,KAG9B,EAAqC,KAIzC,SAAS,GAAc,CACrB,OAAO,CACT,CAEA,SAAS,GAAmC,CAC1C,OAAO,CACT,CAmBA,SAAS,EACP,EACA,EACM,CACN,GAAI,IAAqB,KACvB,OAEF,IAAM,EAAe,EACrB,EAAa,cAAc,MAA2B,CACpD,EAAa,cAAc,EAC3B,IAAW,CACb,CAAC,CACH,CAEA,SAAS,GAA6B,CACpC,GAAkB,aAChB,EACA,EACA,EACA,CACF,CACF,CAEA,SAAS,EAAY,EAAgD,CACnE,GAAkB,SAAS,MAA2B,CACpD,GAAI,IAAiB,KACnB,OAEF,IAAM,EAAQ,EAAa,GAU3B,GATI,EAAQ,SACV,EACE,EAAM,QAAQ,aACZ,EAAM,qBAAqB,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAC3C,GACF,EAAQ,cACV,EAEF,EAAqB,EACjB,EAAQ,aAAe,EAAe,EAAI,EAAa,OAAQ,CACjE,IAAM,EAAY,EAAa,EAAe,GACxC,EAAmB,SAAS,cAAc,KAAK,EACrD,EAAiB,aACf,MACA,EAAU,aAAa,MAAM,GAAK,EACpC,EACA,EAAiB,aACf,SACA,EAAU,QAAQ,YAAiB,EACrC,EACA,EAAiB,aACf,QACA,EAAU,QAAQ,WAAgB,EACpC,CACF,CACA,EAAa,CAAC,CAAC,cAAc,IAAI,MAAM,aAAc,CAAE,QAAS,EAAK,CAAC,CAAC,CACzE,CAAC,CACH,CAEA,SAAS,EACP,EACA,EACM,CACN,IAAM,EAAe,EAAU,EAAa,GAAW,EAAS,CAAU,EAC1E,EAAe,EACf,EAAmB,EACnB,EAAa,iBACL,CACJ,EAAY,CAAmB,CACjC,MACM,CACJ,EAA+B,CACjC,CACF,CACF,CAIA,SAAS,EAAM,EAAc,GAAa,CACpC,IAAiB,OAGjB,EAAQ,UACV,EAA0B,EAG5B,EAAyB,EAErB,EAAQ,SAAW,CAAC,GACtB,EAAkB,EAGpB,EAAa,CAAC,CAAC,cAAc,IAAI,MAAM,WAAY,CAAE,QAAS,EAAK,CAAC,CAAC,EAErE,EAAuB,EACvB,EAAe,EAAoB,SAAY,CAC7C,EAAe,KACf,EAAmB,KACnB,EAAoB,EACpB,EAAyB,EACzB,EAA8B,EAC9B,GAAwB,EACxB,EAAuB,CACzB,CAAC,EACH,CAEA,SAAS,EACP,EACA,EACA,EAAc,GACR,CACF,IAAiB,OAIjB,EAAQ,SAAW,CAAC,GACtB,EAAc,EAAO,EAAI,EAAG,EAAO,CAAC,EAGlC,EAAQ,UACV,EAA0B,EAE5B,EAAwB,CAAK,EAE7B,EAAe,CAAmB,EAClC,EAAqB,EAAO,CAAmB,EACjD,CAEA,SAAS,GAAiB,CACxB,GAAI,IAAiB,KACnB,OAGF,IAAI,EAAW,EAAe,EAC9B,GAAI,IAAiB,EAAG,CACtB,GAAI,EAAQ,UAAW,CACrB,EAAM,EACN,MACF,CACA,EAAW,EAAa,OAAS,CACnC,CACA,EAAa,EAAS,CAAC,cACrB,IAAI,MAAM,eAAgB,CAAE,QAAS,EAAK,CAAC,CAC7C,EACA,EAAO,EAAU,EAAoB,IAAI,CAC3C,CAEA,SAAS,GAAa,CACpB,GAAI,IAAiB,KACnB,OAGF,IAAI,EAAW,EAAe,EAC9B,GAAI,IAAiB,EAAa,OAAS,EAAG,CAC5C,GAAI,EAAQ,UAAW,CACrB,EAAM,EACN,MACF,CACA,EAAW,CACb,CACA,EAAa,EAAS,CAAC,cACrB,IAAI,MAAM,WAAY,CAAE,QAAS,EAAK,CAAC,CACzC,EACA,EAAO,EAAU,EAAoB,KAAK,CAC5C,CAEA,SAAS,EAAK,EAAe,EAAc,GAAa,CAClD,IAAiB,OAGrB,EAAkB,EAAQ,eAAgB,EAAQ,eAAgB,CAAK,EACnE,EAAQ,UACV,EAA0B,EAE5B,EAAsB,EAAS,EAAO,EAAU,CAAI,EAChD,EAAQ,QACV,EAAe,EAAU,CAAI,EAE3B,EAAQ,QACV,GAAoB,CAAK,EAEvB,EAAQ,YAAc,GACxB,EAAyB,EAEvB,EAAQ,SACV,EAAc,EAGZ,EAAQ,SAAW,CAAC,GACtB,EAAc,EAAO,EAAI,EAAG,EAAO,CAAC,EAGtC,EAAa,EAAM,CAAC,cAClB,IAAI,MAAM,YAAa,CAAE,QAAS,EAAK,CAAC,CAC1C,EACA,EAAqB,EAAO,EAAoB,IAAI,EAGhD,EAAQ,YACV,EACE,EAAO,MACD,EACN,EACA,EAAQ,cACV,EAEJ,CAEA,SAAS,EAAc,EAAgC,CACrD,IAAM,EAAQ,EAAa,QAAQ,CAAK,EACpC,EAAQ,GAGZ,EAAK,CAAK,CACZ,CAEA,SAAS,EAAU,EAA2C,CAC5D,IAAM,EAAc,EACjB,OAAQ,GAAM,CAAC,EAAa,SAAS,CAAC,CAAC,CAAC,CACxC,OACE,GACC,EAAQ,QAAQ,YAAY,IAAM,MAC7B,OAAO,KAAK,EAAQ,aAAa,IAAK,GAAG,CAAC,CAAC,KAAK,EAAQ,IAAI,GAC/D,EAAQ,QAAQ,aAAkB,IAAA,IAClC,EAAQ,QAAQ,YAAiB,IAAA,GACvC,EACF,EAAW,IAAI,CAAW,EAC1B,EAAa,KAAK,GAAG,CAAW,EAChC,IAAK,IAAM,KAAS,EAClB,EAAM,iBAAiB,QAAU,GAAM,CACrC,EAAE,eAAe,EACjB,EAAE,gBAAgB,EAClB,EAAc,CAAK,CACrB,CAAC,EAOC,EAAQ,YAAc,IAAiB,MACzC,EACE,MACM,EACN,EACA,EAAQ,cACV,CAEJ,CAYA,OARA,EAAU,CAAa,EAEnB,EAAQ,SACV,OAAO,iBAAiB,WAAa,GAAM,CACzC,EAAW,EAAG,EAAI,EAAG,EAAO,EAAG,EAAc,EAAM,EAAO,CAAM,CAClE,CAAC,EAGI,CACL,YACA,QACA,SACA,OACA,OACA,gBACA,WACA,KACF,CACF,CCvVA,IAAa,GAAb,KAA2B,CAGzB,YACE,EAIA,EACA,CACA,IAAM,EAAmB,CACvB,SAAU,GACV,aAAc,GACd,eAAgB,IAChB,OAAQ,GACR,OAAQ,GACR,QAAS,GACT,eAAgB,GAChB,WAAY,GACZ,OAAQ,GACR,QAAS,GACT,WAAY,GACZ,QAAS,GACT,YAAa,GACb,eAAgB,GAChB,UAAW,GACX,eAAgB,GAChB,GAAG,CACL,EACA,KAAK,EAAI,GACP,EACA,EAAO,OAAS,EAAK,EAAO,EAAE,CAAC,QAAQ,eAAoB,GAAM,GACjE,MAAM,KAAK,CAAM,CACnB,EAEI,EAAK,SACP,KAAK,YAAY,CAErB,CAEA,UACE,EAIM,CACN,KAAK,EAAE,UAAU,MAAM,KAAK,CAAM,CAAC,CACrC,CAEA,OAAqB,CACnB,KAAK,EAAE,MAAM,CACf,CAEA,MAAoB,CAClB,KAAK,EAAE,KAAK,CACd,CAEA,KAAY,EAAiC,CACvC,IAAU,IAAA,GACZ,KAAK,EAAE,KAAK,CAAC,EAEb,KAAK,EAAE,cAAc,CAAK,CAE9B,CAEA,aAA2B,CACzB,EACE,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,OAAO,GACb,EAAe,IAA0B,CACxC,KAAK,EAAE,KAAK,EAAO,CAAW,CAChC,CACF,CACF,CAEA,UAAwB,CACtB,KAAK,EAAE,SAAS,CAClB,CACF,EC/EA,EAAA,QAAE,GAAG,cAAgB,SAAU,EAAoC,CACjE,IAAM,EAAW,IAAI,GACnB,KAAK,IAAI,EACT,CACF,EA2BA,MAzBA,MAAK,mBAAsB,GAA8C,CACvE,EAAS,UAAU,EAAS,IAAI,CAAC,CACnC,EAEA,KAAK,gBAA0B,CAC7B,EAAS,YAAY,CACvB,EAEA,KAAK,sBAAgC,CACnC,EAAS,SAAS,CACpB,EAEA,KAAK,kBAA4B,CAC/B,EAAS,KAAK,CAChB,EAEA,KAAK,kBAAoB,UAAoB,CAE3C,OADA,EAAS,MAAM,EACR,IACT,EAEA,KAAK,mBAAsB,GAA4C,CACrE,EAAS,KAAK,GAAO,IAAI,CAAC,CAAC,CAC7B,EAEO,IACT,EAEA,IAAM,GAAA,EAAM,EAAA,QAAA,CAAE,QAAQ,EACtB,EAAI,GAAG,YAAc,GAAM,EACzB,EAAA,EAAA,QAAA,CAAE,gBAAgB,CAAC,CAAC,QAAQ,aAAc,EAAE,MAAM,CACpD,CAAC,EACD,EAAI,GAAG,eAAkB,EACvB,EAAA,EAAA,QAAA,CAAE,gBAAgB,CAAC,CAAC,QAAQ,WAAW,CACzC,CAAC,EACD,EAAI,GAAG,iBAAoB,EACzB,EAAA,EAAA,QAAA,CAAE,gBAAgB,CAAC,CAAC,QAAQ,aAAa,CAC3C,CAAC,EACD,EAAI,GAAG,eAAiB,GAAM,EAC5B,EAAA,EAAA,QAAA,CAAE,gBAAgB,CAAC,CAAC,QAAQ,gBAAiB,EAAE,MAAM,CACvD,CAAC,EACD,EAAI,GAAG,WAAa,GAAM,EACxB,EAAA,EAAA,QAAA,CAAE,gBAAgB,CAAC,CAAC,QAAQ,YAAa,EAAE,MAAM,CACnD,CAAC,EACD,EAAI,GAAG,YAAc,GAAM,EACzB,EAAA,EAAA,QAAA,CAAE,gBAAgB,CAAC,CAAC,QAAQ,aAAc,EAAE,MAAM,CACpD,CAAC"}