{"version":3,"file":"index-1c9c659b.js","sources":["../../../../src/scripts/coveo/modules/shingle-result-listing/swiper-image.tsx","../../../../src/scripts/coveo/modules/shingle-result-listing/shingle-swiper-inline.tsx","../../../../src/scripts/coveo/modules/shingle-result-listing/card.tsx","../../../../src/scripts/coveo/modules/shingle-result-listing/templates.tsx","../../../../src/scripts/coveo/modules/shingle-result-listing/compare-tray.tsx","../../../../src/scripts/coveo/modules/shingle-result-listing/index.tsx"],"sourcesContent":["import React, { useState } from 'react';\n\ntype imageType = {\n  media_url: string;\n  hover_media_url?: string;\n  alt_text: string;\n  color_name?: string;\n  color_id?: string;\n  handleSelected: (id: string) => void;\n};\n\nexport const ShingleSwiperImage = ({\n  media_url,\n  hover_media_url,\n  alt_text,\n  color_name,\n  color_id,\n  handleSelected\n}: imageType) => {\n  const [hover, setHover] = useState(false);\n  return (\n    <div className=\"color-swiper__card color-swiper__img--inline\">\n      <div className=\"color-swiper__img-wrapper\">\n        <img\n          className=\"color-swiper__img \"\n          src={hover ? hover_media_url : media_url}\n          alt={alt_text}\n          height=\"135\"\n          width=\"135\"\n          loading=\"lazy\"\n        />\n      </div>\n      <button\n        className=\"color-swiper__label link\"\n        onClick={() => {\n          handleSelected(color_id as string);\n        }}\n        onMouseEnter={() => {\n          if (hover_media_url) {\n            setHover(true);\n          }\n        }}\n        onMouseLeave={() => setHover(false)}\n      >\n        <span>{color_name}</span>\n      </button>\n    </div>\n  );\n};\n\nexport default ShingleSwiperImage;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Swiper as SwiperModule } from 'swiper/react';\nimport Swiper, { Navigation } from 'swiper';\nimport { SwiperSlide } from 'swiper/react';\nimport SwiperImage from './swiper-image';\nimport 'swiper/css';\nimport 'swiper/css/navigation';\nimport { useDebounce } from '../../../helpers/debounce';\nimport {\n  DataLayerObject,\n  ExtendedWindowType\n} from '../../../helpers/global-types';\n\ntype imageType = {\n  media_url: string;\n  alt_text: string;\n  color_name?: string;\n  color_id?: string;\n  hover_media_url?: string;\n};\n\ntype ShingleSwiperInlineProps = {\n  images: imageType[];\n  productId: string;\n  nextLabel: string;\n  prevLabel: string;\n  link: string;\n};\n\nexport const ShingleSwiperInline = ({\n  images,\n  nextLabel,\n  prevLabel,\n  productId,\n  link\n}: ShingleSwiperInlineProps) => {\n  const [swiper, setSwiper] = useState<Swiper | undefined>();\n  const [swiperWidth, setSwiperWidth] = useState(0);\n  const [touch, setTouch] = useState(false);\n  const [shouldPushLayer, setShouldPushLayer] = useState<Swiper | null>(null);\n  const [padding, setPadding] = useState(\n    window.matchMedia('(max-width: 700px)').matches ? 40 : 64\n  );\n  const nextButton = useRef(null);\n  const backButton = useRef(null);\n\n  const handleSelected = (id: string) => {\n    sessionStorage.setItem('selectedColor', id);\n\n    window.location.href = link;\n  };\n\n  useEffect(() => {\n    if (shouldPushLayer) {\n      const interactLayer = `{\"event\":\"carousel_interaction\",\"event_action\":\"${\n        touch ? 'swipe' : 'arrow click'\n      }\",\"event_category\":\"content_interaction\",\"event_label\":\"${(\n        shouldPushLayer.activeIndex + 1\n      ).toString()} of ${shouldPushLayer.slides.length}\"}`;\n      (window as ExtendedWindowType).dataLayer.push(\n        JSON.parse(interactLayer) as DataLayerObject\n      );\n      setShouldPushLayer(null);\n    }\n  }, [shouldPushLayer, touch]);\n\n  useEffect(() => {\n    setSwiperWidth(\n      (document.querySelector('.shingle-listing__results') as HTMLElement)\n        ?.offsetWidth\n    );\n\n    if (swiper) {\n      (swiper as Swiper).updateSize();\n    }\n  }, [swiper]);\n\n  const handleSwiperLayerEvent = (swiper: Swiper) => {\n    setShouldPushLayer(swiper);\n  };\n\n  const handleResize = useDebounce(() => {\n    setSwiperWidth(\n      (document.querySelector('.shingle-listing__results') as HTMLElement)\n        ?.offsetWidth\n    );\n\n    setPadding(window.matchMedia('(max-width: 700px)').matches ? 40 : 64);\n    if (swiper) {\n      swiper?.updateSize();\n    }\n  }, 1000);\n\n  useEffect(() => {\n    window.addEventListener('resize', () => handleResize());\n\n    return () => {\n      window.removeEventListener('resize', () => handleResize());\n    };\n  }, []);\n  return (\n    <>\n      <div\n        className=\"color-swiper color-swiper--inline\"\n        style={{\n          inlineSize: `${swiperWidth - padding}px`,\n          position: 'relative'\n        }}\n      >\n        <SwiperModule\n          id={`color-swiper-${productId}`}\n          slidesPerView={2}\n          spaceBetween={20}\n          slidesOffsetBefore={20}\n          slidesOffsetAfter={0}\n          breakpoints={{\n            300: {\n              slidesPerView: 2.2,\n              slidesOffsetBefore: 24,\n              spaceBetween: 12\n            },\n            768: {\n              slidesPerView: 4,\n              slidesOffsetBefore: 0,\n              spaceBetween: 0\n            },\n            1440: {\n              slidesPerView: 4,\n              slidesOffsetBefore: 0,\n              slidesOffsetAfter: 30,\n              spaceBetween: 20\n            },\n            1920: {\n              slidesPerView: 6,\n              slidesOffsetBefore: 0,\n              spaceBetween: 20\n            }\n          }}\n          navigation={{\n            nextEl: nextButton.current,\n            prevEl: backButton.current\n          }}\n          modules={[Navigation]}\n          onSwiper={swiper => setSwiper(swiper)}\n          onSlideChange={swiper => handleSwiperLayerEvent(swiper)}\n          onTouchEnd={() => setTouch(true)}\n          onMouseUp={() => setTouch(false)}\n        >\n          {images.map(image => (\n            <SwiperSlide key={`${image.color_id}-${productId}`}>\n              <SwiperImage\n                key={`${image.color_id}-${productId}`}\n                {...image}\n                handleSelected={handleSelected}\n              />\n            </SwiperSlide>\n          ))}\n        </SwiperModule>\n        <button\n          ref={backButton}\n          className=\"swiper-button-prev\"\n          aria-label={prevLabel || 'previous slide'}\n          title={prevLabel || 'previous slide'}\n        ></button>\n        <button\n          ref={nextButton}\n          className=\"swiper-button-next\"\n          aria-label={nextLabel || 'next slide'}\n          title={nextLabel || 'next slide'}\n        ></button>\n      </div>\n    </>\n  );\n};\n\nexport default ShingleSwiperInline;\n","import React, { useMemo } from 'react';\nimport { ShingleSwiperInline } from './shingle-swiper-inline';\nimport { CardType } from './types';\nimport { Result } from '@coveo/headless';\nimport { fieldsObject } from '../../controllers/controller';\nimport { ResultLink } from '../../components/interactive-result';\n\ntype ShingleImageType = {\n  media_url: string;\n  hover_media_url: string;\n  alt_text: string;\n  color_name?: string;\n  color_id?: string;\n};\ntype ShingleCardProps = {\n  nextLabel: string;\n  prevLabel: string;\n  shinglePageUrl: string;\n  shingleHeading: string;\n  shingleProductId: string;\n  shingleCopy: string;\n  compareLabel: string;\n  bazaarReview: string;\n  compareCards: CardType[];\n  setCompareCards: React.Dispatch<React.SetStateAction<CardType[]>>;\n  setModalFull: React.Dispatch<React.SetStateAction<boolean>>;\n  shingleChildren?: Result[];\n  result: Result;\n};\n\nfunction ShingleCard({\n  nextLabel,\n  prevLabel,\n  shinglePageUrl,\n  shingleHeading,\n  shingleProductId,\n  shingleCopy,\n  bazaarReview,\n  compareLabel,\n  compareCards,\n  setCompareCards,\n  setModalFull,\n  shingleChildren,\n  result\n}: ShingleCardProps) {\n  const handleChangeCompare = (productId: string) => {\n    const cardIndex = compareCards.findIndex(\n      card => card.product_id === productId\n    );\n    if (cardIndex === -1) {\n      if (compareCards.length === 4) {\n        setModalFull(true);\n      } else {\n        if (_shingleImages && _shingleImages.length > 0) {\n          setCompareCards([\n            ...compareCards,\n            {\n              product_id: productId,\n              media_url: _shingleImages[0].media_url,\n              alt_text: _shingleImages[0].alt_text,\n              product_name: shingleHeading\n            }\n          ]);\n        }\n      }\n    } else {\n      setCompareCards(prev => {\n        prev.splice(cardIndex, 1);\n        return [...prev];\n      });\n    }\n  };\n\n  const _shingleImages = useMemo(\n    () =>\n      shingleChildren?.reduce((shingleImageArray, child) => {\n        const shingleImage: ShingleImageType = {\n          media_url: child.raw[fieldsObject.childImage] as string,\n          alt_text: child.raw[fieldsObject.childImageAlt] as string,\n          color_name: child.raw[fieldsObject.childTitle] as string,\n          color_id: child.raw[fieldsObject.childProductId] as string,\n          hover_media_url: child.raw[fieldsObject.childImageHover] as string\n        };\n\n        if (shingleImage.color_id) {\n          shingleImageArray.push(shingleImage);\n        }\n        return shingleImageArray;\n      }, [] as ShingleImageType[]),\n    [shingleChildren]\n  );\n\n  return (\n    <article className=\"shingle-card\">\n      <div className=\"shingle-card__top-wrapper\">\n        <div className=\"shingle-card__top-flex\">\n          <ResultLink className=\"link\" link={shinglePageUrl} result={result}>\n            <span>\n              <h3 className=\"shingle-card__heading\">{shingleHeading}</h3>\n            </span>\n          </ResultLink>\n          <div className=\"field field--checkbox shingle-card__compare--desktop\">\n            <input\n              className=\"field__checkbox-input\"\n              type=\"checkbox\"\n              name=\"checkbox\"\n              id=\"checkbox\"\n              onChange={() => handleChangeCompare(shingleProductId)}\n              checked={\n                compareCards.findIndex(\n                  object => object.product_id === shingleProductId\n                ) !== -1\n              }\n            />\n            <div className=\"field__checkbox-label-wrapper\">\n              <label className=\"field__checkbox-label\" htmlFor=\"checkbox\">\n                {compareLabel}\n              </label>\n            </div>\n          </div>\n        </div>\n\n        <div\n          className=\"shingle-card__bazaar-review\"\n          dangerouslySetInnerHTML={{\n            __html: bazaarReview?.replace('{prod}', shingleProductId)\n          }}\n        ></div>\n\n        <p className=\"shingle-card__description\">{shingleCopy}</p>\n\n        <div className=\"field field--checkbox shingle-card__compare--mobile\">\n          <input\n            className=\"field__checkbox-input\"\n            type=\"checkbox\"\n            name=\"checkbox\"\n            id=\"checkbox\"\n            onChange={() => handleChangeCompare(shingleProductId)}\n            checked={\n              compareCards.findIndex(\n                object => object.product_id === shingleProductId\n              ) !== -1\n            }\n          />\n          <div className=\"field__checkbox-label-wrapper\">\n            <label className=\"field__checkbox-label\" htmlFor=\"checkbox\">\n              {compareLabel}\n            </label>\n          </div>\n        </div>\n      </div>\n      {_shingleImages && _shingleImages.length > 0 && (\n        <ShingleSwiperInline\n          images={_shingleImages}\n          productId={shingleProductId}\n          nextLabel={nextLabel}\n          prevLabel={prevLabel}\n          link={shinglePageUrl}\n        />\n      )}\n    </article>\n  );\n}\n\nexport default ShingleCard;\n","import React from 'react';\nimport {\n  buildResultTemplatesManager,\n  ResultTemplate,\n  Result,\n  SearchEngine\n} from '@coveo/headless';\nimport { headlessEngine } from '../../engine';\nimport {\n  fieldsToInclude,\n  labelsObj,\n  fieldsObject\n} from '../../controllers/controller';\nimport ShingleCard from './card';\nimport { CardType } from './types';\n\ntype ShingleListingResultProps = Result & {\n  title: string;\n  description: string;\n  image: string;\n  imageAlt: string;\n  childResults: Result[];\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  additionalSettings: { [key: string]: any };\n};\n\nexport const resultTemplatesManager = buildResultTemplatesManager(\n  headlessEngine as SearchEngine\n);\n\nconst ShingleListingResultTemplate: ResultTemplate = {\n  conditions: [],\n  fields: ['UniqueId', 'Uri', ...fieldsToInclude],\n\n  content: (result: ShingleListingResultProps) => (\n    <li key={result.uniqueId}>\n      {result.childResults.length > 0 && (\n        <ShingleCard\n          nextLabel={labelsObj.nextLabel}\n          prevLabel={labelsObj.prevLabel}\n          compareLabel={labelsObj.compareLabel}\n          shinglePageUrl={result.raw[fieldsObject.link] as string}\n          shingleHeading={result.raw[fieldsObject.title] as string}\n          shingleProductId={result.raw[fieldsObject.productId] as string}\n          shingleCopy={result.raw[fieldsObject.description] as string}\n          bazaarReview={result.additionalSettings.bazaarReview as string}\n          shingleChildren={result.childResults}\n          compareCards={result.additionalSettings.compareCards as CardType[]}\n          setCompareCards={\n            result.additionalSettings.setCards as React.Dispatch<\n              React.SetStateAction<CardType[]>\n            >\n          }\n          setModalFull={result.additionalSettings.setModalFull}\n          result={result}\n        />\n      )}\n    </li>\n  )\n};\n\nresultTemplatesManager.registerTemplates(ShingleListingResultTemplate);\n","import React, { useRef, useState, useEffect, useId } from 'react';\nimport { FocusTrap, createFocusTrap } from 'focus-trap';\nimport {\n  disableBodyScroll,\n  clearAllBodyScrollLocks,\n  BodyScrollOptions\n} from 'body-scroll-lock';\n\nimport { CardType } from './types';\n\ntype CompareTrayProps = {\n  compareLabels: string;\n  compareCards: CardType[];\n  setCompareCards: React.Dispatch<React.SetStateAction<CardType[]>>;\n  expanded: boolean;\n  setExpanded: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nfunction CompareTray({\n  compareLabels,\n  compareCards,\n  setCompareCards,\n  expanded,\n  setExpanded\n}: CompareTrayProps) {\n  const [focusTrap, setFocusTrap] = useState<FocusTrap | null>(null);\n  const accordionRef = useRef<HTMLDivElement | null>(null);\n  const accordionId = useId();\n  const {\n    compareTrigger,\n    expand,\n    collapse,\n    compareTitle,\n    compareDescription,\n    compareButton,\n    compareUrl,\n    clearAll,\n    deselectLabel\n  } = JSON.parse(compareLabels);\n\n  useEffect(() => {\n    if (accordionRef.current) {\n      const options = {\n        reserveScrollBarGap: true,\n        allowTouchMove: (el: HTMLElement) => {\n          return el.closest('.mobile-filters__accordion') !== null;\n        }\n      } as BodyScrollOptions;\n\n      const trap = createFocusTrap(accordionRef.current, {\n        clickOutsideDeactivates: true,\n        returnFocusOnDeactivate: true,\n        onActivate() {\n          disableBodyScroll(document.body, options);\n        },\n        onDeactivate() {\n          clearAllBodyScrollLocks();\n        }\n      });\n\n      setFocusTrap(trap);\n    }\n\n    document.body.classList.toggle('compare-tray--fixed', true);\n    return () => {\n      clearAllBodyScrollLocks();\n      document.body.classList.toggle('compare-tray--fixed', false);\n    };\n  }, []);\n\n  useEffect(() => {\n    document.body.style.setProperty(\n      '--compare-block-size',\n      accordionRef.current?.offsetHeight + 'px'\n    );\n  }, [accordionRef.current]);\n\n  const handleDeselect = (productId: string) => {\n    const cardIndex = (compareCards as CardType[]).findIndex(\n      card => card.product_id === productId\n    );\n    if (cardIndex !== -1) {\n      setCompareCards(prev => {\n        prev.splice(cardIndex, 1);\n        return [...prev];\n      });\n    }\n  };\n\n  const handleRedirect = () => {\n    window.location.href = `${\n      window.location.origin\n    }${compareUrl}?ids=${compareCards.map(card => card.product_id).join(',')}`;\n  };\n\n  const handleExpanded = () => {\n    setExpanded(!expanded);\n    if (focusTrap) {\n      if (expanded) {\n        focusTrap.deactivate();\n      } else {\n        focusTrap.activate();\n      }\n    }\n  };\n\n  return (\n    <div\n      ref={accordionRef}\n      className={`compare-tray${expanded ? ' compare-tray--expanded' : ''}`}\n    >\n      <button\n        aria-expanded={expanded}\n        id={`trigger-${accordionId}`}\n        aria-controls={`panel-${accordionId}`}\n        onClick={() => handleExpanded()}\n        className=\"compare-tray__trigger\"\n      >\n        {expanded\n          ? compareTitle.replace('{number}', compareCards.length)\n          : compareTrigger.replace('{number}', compareCards.length)}\n        <span className=\"sr-only\">{expanded ? expand : collapse}</span>\n      </button>\n      <div\n        className=\"compare-tray__content container\"\n        aria-labelledby={`trigger-${accordionId}`}\n        id={`panel-${accordionId}`}\n        role=\"region\"\n      >\n        <div className=\"row\">\n          <div className=\"compare-tray__left-col\">\n            <p className=\"compare-tray__description\"> {compareDescription}</p>\n            <div className=\"compare-tray__cta-wrapper compare-tray__cta-wrapper--desktop\">\n              <button\n                onClick={() => handleRedirect()}\n                className=\"btn btn--primary\"\n              >\n                {compareButton}\n              </button>\n              <button\n                onClick={() => setCompareCards([])}\n                className=\"btn btn--secondary\"\n              >\n                {clearAll}\n              </button>\n            </div>\n          </div>\n          <div className=\"compare-tray__right-col\">\n            <div className=\"compare-tray__cards-grid\">\n              {compareCards.map(card => (\n                <div\n                  key={card.product_id}\n                  className=\"compare-tray__card-wrapper\"\n                >\n                  <img\n                    className=\"compare-tray__card-img\"\n                    src={card.media_url}\n                    alt={card.alt_text}\n                    height=\"135\"\n                    width=\"135\"\n                    loading=\"lazy\"\n                  />\n                  <span className=\"compare-tray__card-heading\">\n                    {card.product_name}\n                  </span>\n\n                  <button\n                    className=\"compare-tray__card-cancel\"\n                    title={deselectLabel}\n                    aria-label={deselectLabel}\n                    onClick={() => {\n                      handleDeselect(card.product_id as string);\n                    }}\n                  ></button>\n                </div>\n              ))}\n            </div>\n          </div>\n\n          <div className=\"compare-tray__cta-wrapper compare-tray__cta-wrapper--mobile\">\n            <button\n              className=\"btn btn--primary\"\n              onClick={() => handleRedirect()}\n            >\n              {compareButton}\n            </button>\n            <button\n              className=\"btn btn--secondary\"\n              onClick={() => setCompareCards([])}\n            >\n              {clearAll}\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default CompareTray;\n","import React, { useRef, useEffect, useState } from 'react';\nimport ResultList from '../../components/result-list';\nimport { resultTemplatesManager } from './templates';\nimport { resultList, defaultQuery, facets } from '../../controllers/controller';\nimport {\n  SearchEngine,\n  ResultList as ResultListType,\n  buildFacet,\n  buildNumericFacet,\n  buildNumericRange,\n  loadAdvancedSearchQueryActions,\n  loadSearchActions,\n  loadSearchAnalyticsActions,\n  Facet as FacetType,\n  ContextPayload,\n  Result\n} from '@coveo/headless';\nimport { headlessEngine } from '../../engine';\nimport { bindUrlManager } from '../../components/url-manager';\nimport MobileFilters from '../../components/mobile-filters';\nimport Facet from '../../components/facet';\nimport FacetBreadcrumbs from '../../components/facet-breadcrumbs';\nimport CompareTray from './compare-tray';\nimport { ShingleListingProps, CardType } from './types';\nimport Autocomplete from '../../../react-components/shingle-detail-masthead/autocomplete';\nimport {\n  getStoredGeolocationData,\n  getLocationByIpAddress\n} from '../../../helpers/geolocation';\nimport { CoveoContext } from '../../components/context';\nimport { ExtendedWindowType } from '../../../helpers/global-types';\nimport { shingleDetailContent } from '../../../helpers/personalize';\n\nconst facetsObj = facets.map(facet => ({\n  title: facet.title,\n  isWarrantiesLabel: facet.isWarrantiesLabel,\n  isColor: facet.isColor,\n  isPrice: facet.isPrice,\n  range: facet.isPrice,\n  rangeLabels:\n    facet.sortCriteria === 'ascending'\n      ? facet.rangeLabels\n      : facet.rangeLabels?.reverse(),\n  colors: facet.colors,\n  controller: facet.isPrice\n    ? buildNumericFacet(headlessEngine as SearchEngine, {\n        options: {\n          field: facet.field,\n          generateAutomaticRanges: false,\n          sortCriteria: facet.sortCriteria ? facet.sortCriteria : 'descending',\n          numberOfValues: 999,\n          currentValues: facet.rangeValues?.map(range =>\n            buildNumericRange({ start: range.start, end: range.end })\n          )\n        }\n      })\n    : buildFacet(headlessEngine as SearchEngine, {\n        options: {\n          field: facet.field,\n          filterFacetCount: true,\n          numberOfValues: 999\n        }\n      }),\n  customOrder: facet.customOrder\n}));\n\ntype ResultWithChildren = Result & {\n  childResults: Result[];\n};\n\nfunction ShingleResultListing({\n  labels,\n  compareAppLabels,\n  bazaarReview,\n  searchLabels,\n  searchFields,\n  summaryText,\n  summaryTextAddress,\n  endpointColors,\n  coveoContext,\n  filterColor\n}: ShingleListingProps) {\n  const [advancedQuery, setAdvancedQuery] = useState('');\n  const labelsObj = JSON.parse(labels);\n  const searchLabelsObj = JSON.parse(searchLabels);\n  const searchFieldsObj = JSON.parse(searchFields);\n  const containerRef = useRef<HTMLDivElement | null>(null);\n  const fullModal = useRef<HTMLDialogElement | null>(null);\n  const [searchValue, setSearchValue] = useState({\n    address: '',\n    zip: '',\n    country: ''\n  });\n  const [expanded, setExpanded] = useState(false);\n  const [ready, setReady] = useState(false);\n  const [modalFull, setModalFull] = useState(false);\n  const [compareCards, setCompareCards] = useState<CardType[]>([]);\n  const [colorAvailable, setColorAvailable] = useState<object | undefined>(\n    undefined\n  );\n  const [addressError, setAddressError] = useState(false);\n  const [promoCards, setPromoCards] = useState('');\n\n  const handleDefaultGeolocation = async () => {\n    let geolocation = { address: '', zip: '', country: '' };\n    const storedData = getStoredGeolocationData();\n    if (storedData) {\n      geolocation = {\n        address: storedData.address || '',\n        zip: storedData.zip,\n        country: storedData.country\n      };\n      (window as ExtendedWindowType).dataLayer.push({\n        event_attributes: {\n          zip_code: storedData.zip,\n          zip_code_country: storedData.country\n        },\n        event: 'zip_code',\n        event_category: 'geo info',\n        event_action: 'zip code automatically detected'\n      });\n    } else {\n      const maxmindData = await getLocationByIpAddress();\n      if (maxmindData) {\n        geolocation = {\n          address: '',\n          zip: maxmindData.zip,\n          country: maxmindData.country\n        };\n      }\n    }\n\n    setSearchValue({\n      address: geolocation.address || '',\n      zip: geolocation.zip || '',\n      country: geolocation.country || ''\n    });\n\n    setReady(true);\n  };\n\n  useEffect(() => {\n    if (searchValue.zip !== '') {\n      shingleDetailContent(searchValue.zip);\n    }\n  }, [searchValue]);\n\n  useEffect(() => {\n    const context = CoveoContext();\n    if (coveoContext) {\n      context?.set(JSON.parse(coveoContext) as ContextPayload);\n    }\n    handleDefaultGeolocation();\n\n    let observer: MutationObserver;\n\n    const targetNode = document.querySelector('.coveo-listing__promo-cards');\n\n    if (targetNode) {\n      const targetInnerHtml = targetNode.innerHTML;\n\n      setPromoCards(targetInnerHtml);\n\n      const config = { attributes: true, childList: true, subtree: true };\n\n      const callback = (mutationList: MutationRecord[]) => {\n        for (const mutation of mutationList) {\n          if (mutation.type === 'childList') {\n            setPromoCards(targetNode.innerHTML);\n          }\n        }\n      };\n\n      observer = new MutationObserver(callback);\n      observer.observe(targetNode, config);\n    }\n\n    return () => {\n      if (observer) observer.disconnect();\n    };\n  }, []);\n\n  useEffect(() => {\n    if (ready) {\n      if (searchValue.zip !== '') {\n        let _country = searchValue.country;\n        if (_country.toUpperCase() === 'US') {\n          _country = 'USA';\n        } else if (_country.toUpperCase() === 'CA') {\n          _country = 'CAN';\n        }\n\n        fetch(\n          endpointColors\n            .replace('{zipCode}', searchValue.zip.replace(' ', ''))\n            .replace('{countryCode}', _country),\n          {\n            method: 'GET'\n          }\n        )\n          .then(response => {\n            return response.json();\n          })\n          .then(data => {\n            setColorAvailable(data.availableColors);\n          })\n          .catch(error => {\n            console.error('Error:', error);\n          });\n      } else {\n        setColorAvailable([]);\n      }\n    }\n  }, [ready, searchValue.zip]);\n\n  useEffect(() => {\n    if (colorAvailable !== undefined) {\n      if (headlessEngine) {\n        bindUrlManager(headlessEngine);\n\n        let advancedQuery = '';\n\n        const listOfColProd = Object.entries(colorAvailable).reduce(\n          (accProdCol, product) => {\n            const _product = product[0];\n            const colProduct = product[1].map(\n              (color: string) => `${_product}_${color}`\n            );\n            return [...accProdCol, ...colProduct];\n          },\n          [] as string[]\n        );\n\n        if (listOfColProd.length > 0) {\n          advancedQuery = `@${filterColor}==(${listOfColProd\n            .map(color => `\"${color}\"`)\n            .join(',')})`;\n        }\n\n        if (defaultQuery) {\n          advancedQuery = `${advancedQuery} ${defaultQuery}`;\n        }\n\n        setAdvancedQuery(advancedQuery);\n\n        const advancedQuerySearchActionCreator =\n          loadAdvancedSearchQueryActions(headlessEngine);\n\n        headlessEngine?.dispatch(\n          advancedQuerySearchActionCreator.registerAdvancedSearchQueries({\n            aq: advancedQuery\n          })\n        );\n        const { logInterfaceLoad } = loadSearchAnalyticsActions(headlessEngine);\n        const { executeSearch } = loadSearchActions(headlessEngine);\n\n        headlessEngine.dispatch(executeSearch(logInterfaceLoad()));\n        return;\n      }\n    }\n  }, [colorAvailable]);\n\n  const filterResults = (results: Result[]) => {\n    const newResults = results.map(_result => {\n      const result = _result as ResultWithChildren;\n\n      if (result.childResults.length > 0) {\n        const childResults = result.childResults.filter(childResult => {\n          if (advancedQuery.includes(searchFieldsObj.productColorId)) {\n            return advancedQuery.includes(\n              childResult.raw[searchFieldsObj.productColorId] as string\n            );\n          } else {\n            return true;\n          }\n        });\n\n        return {\n          ...result,\n          childResults\n        };\n      } else {\n        return result;\n      }\n    });\n\n    return newResults;\n  };\n\n  const renderFilters = (isMobile?: boolean) => {\n    return (\n      <div\n        className={`shingle-listing__facets ${\n          isMobile\n            ? 'shingle-listing__facets--mobile'\n            : 'shingle-listing__facets--desktop'\n        }`}\n      >\n        {facetsObj.map(facet => {\n          if (facet.isColor) {\n            return (\n              <Facet\n                key={facet.title}\n                controller={facet.controller as FacetType}\n                title={facet.title}\n                defaultExpanded={isMobile ? false : true}\n                colors={facet.colors}\n              />\n            );\n          }\n\n          return (\n            <Facet\n              key={facet.title}\n              controller={facet.controller as FacetType}\n              title={facet.title}\n              customOrder={facet.customOrder}\n              warranties={facet.isWarrantiesLabel ? true : false}\n              isPrice={facet.isPrice}\n              rangeLabels={facet.rangeLabels}\n              certificationsLabel={\n                facet.isWarrantiesLabel ? facet.isWarrantiesLabel : ''\n              }\n              defaultExpanded={isMobile ? false : true}\n            />\n          );\n        })}\n      </div>\n    );\n  };\n\n  useEffect(() => {\n    if (modalFull) {\n      fullModal.current?.showModal();\n    } else {\n      fullModal.current?.close();\n    }\n  }, [modalFull]);\n\n  return (\n    <div ref={containerRef} className=\"shingle-listing__wrapper row\">\n      <div className=\"shingle-listing__filters\">\n        <div className=\"searchbox\">\n          <h2 className=\"searchbox__heading\">\n            {searchLabelsObj.searchHeading}\n          </h2>\n          {searchLabelsObj.searchCopy && (\n            <p className=\"searchbox__copy\">{searchLabelsObj.searchCopy}</p>\n          )}\n          <Autocomplete\n            label={searchLabelsObj.searchLabel}\n            name={searchLabelsObj.searchName}\n            placeholder={searchLabelsObj.searchPlaceholder}\n            tooltip={searchLabelsObj.searchTooltip}\n            errorLabel={searchLabelsObj.errorLabel}\n            clearLabel={searchLabelsObj.clearLabel}\n            type=\"text\"\n            error={addressError}\n            setError={setAddressError}\n            value={searchValue.address}\n            setValue={setSearchValue}\n            countries={['us', 'ca']}\n          />\n        </div>\n        <MobileFilters\n          label={labelsObj.mobileFilterBy}\n          containerRef={containerRef}\n          refinementLayer={true}\n        >\n          {renderFilters(true)}\n        </MobileFilters>\n        {renderFilters()}\n        <div\n          className=\"shingle-listing__promo-cards shingle-listing__promo-cards--desktop\"\n          dangerouslySetInnerHTML={{ __html: promoCards }}\n        />\n      </div>\n      <div className=\"shingle-listing__main\">\n        <div className=\"shingle-listing__main-filters\">\n          <div className=\"shingle-listing__summary\">\n            <div\n              className=\"query-summary\"\n              dangerouslySetInnerHTML={{\n                __html:\n                  searchValue.zip !== ''\n                    ? summaryTextAddress.replace('{zip}', searchValue.zip)\n                    : summaryText\n              }}\n            />\n            <FacetBreadcrumbs\n              clearLabel={labelsObj.clearAll}\n              extraClasses=\"shingle-listing__breadcrumbs\"\n            />\n          </div>\n        </div>\n        <ResultList\n          resultsCustomizer={filterResults}\n          controller={resultList as ResultListType}\n          additionalSettings={{\n            bazaarReview: bazaarReview,\n            setCards: setCompareCards,\n            setModalFull: setModalFull,\n            compareCards: compareCards,\n            endpointColors\n          }}\n          className=\"shingle-listing__results\"\n          resultTemplatesManager={resultTemplatesManager}\n          preventFirstCall={true}\n        />\n        <div\n          className=\"shingle-listing__promo-cards shingle-listing__promo-cards--mobile\"\n          dangerouslySetInnerHTML={{ __html: promoCards }}\n        />\n      </div>\n      {modalFull && (\n        <div onClick={() => setModalFull(false)}>\n          <dialog\n            id=\"compare-tray-is-full\"\n            className=\"modal container--no-margin\"\n            ref={fullModal}\n          >\n            {JSON.parse(compareAppLabels).errorMessage}\n            <button\n              className=\"modal__close-button\"\n              title={JSON.parse(compareAppLabels).closeModal}\n              aria-label={JSON.parse(compareAppLabels).closeModal}\n              onClick={() => setModalFull(false)}\n            ></button>\n          </dialog>\n        </div>\n      )}\n      {compareCards && compareCards.length > 0 && (\n        <CompareTray\n          compareLabels={compareAppLabels}\n          compareCards={compareCards}\n          setCompareCards={setCompareCards}\n          expanded={expanded}\n          setExpanded={setExpanded}\n        />\n      )}\n    </div>\n  );\n}\n\nexport default ShingleResultListing;\n"],"names":["ShingleSwiperImage","media_url","hover_media_url","alt_text","color_name","color_id","handleSelected","hover","setHover","useState","React","ShingleSwiperInline","images","nextLabel","prevLabel","productId","link","swiper","setSwiper","swiperWidth","setSwiperWidth","touch","setTouch","shouldPushLayer","setShouldPushLayer","padding","setPadding","nextButton","useRef","backButton","id","useEffect","interactLayer","_a","handleSwiperLayerEvent","handleResize","useDebounce","SwiperModule","Navigation","image","SwiperSlide","SwiperImage","ShingleCard","shinglePageUrl","shingleHeading","shingleProductId","shingleCopy","bazaarReview","compareLabel","compareCards","setCompareCards","setModalFull","shingleChildren","result","handleChangeCompare","cardIndex","card","_shingleImages","prev","useMemo","shingleImageArray","child","shingleImage","fieldsObject","ResultLink","object","resultTemplatesManager","buildResultTemplatesManager","headlessEngine","ShingleListingResultTemplate","fieldsToInclude","labelsObj","CompareTray","compareLabels","expanded","setExpanded","focusTrap","setFocusTrap","accordionRef","accordionId","useId","compareTrigger","expand","collapse","compareTitle","compareDescription","compareButton","compareUrl","clearAll","deselectLabel","options","el","trap","createFocusTrap","disableBodyScroll","clearAllBodyScrollLocks","handleDeselect","handleRedirect","handleExpanded","facetsObj","facets","facet","buildNumericFacet","_b","range","buildNumericRange","buildFacet","ShingleResultListing","labels","compareAppLabels","searchLabels","searchFields","summaryText","summaryTextAddress","endpointColors","coveoContext","filterColor","advancedQuery","setAdvancedQuery","searchLabelsObj","searchFieldsObj","containerRef","fullModal","searchValue","setSearchValue","ready","setReady","modalFull","colorAvailable","setColorAvailable","addressError","setAddressError","promoCards","setPromoCards","handleDefaultGeolocation","geolocation","storedData","getStoredGeolocationData","maxmindData","getLocationByIpAddress","shingleDetailContent","context","CoveoContext","observer","targetNode","targetInnerHtml","config","callback","mutationList","mutation","_country","response","data","error","bindUrlManager","listOfColProd","accProdCol","product","_product","colProduct","color","defaultQuery","advancedQuerySearchActionCreator","loadAdvancedSearchQueryActions","logInterfaceLoad","loadSearchAnalyticsActions","executeSearch","loadSearchActions","filterResults","results","_result","childResults","childResult","renderFilters","isMobile","Facet","Autocomplete","MobileFilters","FacetBreadcrumbs","ResultList","resultList"],"mappings":"slCAWO,MAAMA,GAAqB,CAAC,CACjC,UAAAC,EACA,gBAAAC,EACA,SAAAC,EACA,WAAAC,EACA,SAAAC,EACA,eAAAC,CACF,IAAiB,CACf,KAAM,CAACC,EAAOC,CAAQ,EAAIC,WAAS,EAAK,EACxC,uBACG,MAAI,CAAA,UAAU,gDACZC,EAAA,cAAA,MAAA,CAAI,UAAU,2BACb,EAAAA,EAAA,cAAC,MAAA,CACC,UAAU,qBACV,IAAKH,EAAQL,EAAkBD,EAC/B,IAAKE,EACL,OAAO,MACP,MAAM,MACN,QAAQ,MAAA,CAAA,CAEZ,EACAO,EAAA,cAAC,SAAA,CACC,UAAU,2BACV,QAAS,IAAM,CACbJ,EAAeD,CAAkB,CACnC,EACA,aAAc,IAAM,CACdH,GACFM,EAAS,EAAI,CAEjB,EACA,aAAc,IAAMA,EAAS,EAAK,CAAA,EAElCE,EAAA,cAAC,YAAMN,CAAW,CAAA,CAEtB,CAEJ,ECnBaO,GAAsB,CAAC,CAClC,OAAAC,EACA,UAAAC,EACA,UAAAC,EACA,UAAAC,EACA,KAAAC,CACF,IAAgC,CAC9B,KAAM,CAACC,EAAQC,CAAS,EAAIT,EAA6B,SAAA,EACnD,CAACU,EAAaC,CAAc,EAAIX,WAAS,CAAC,EAC1C,CAACY,EAAOC,CAAQ,EAAIb,WAAS,EAAK,EAClC,CAACc,EAAiBC,CAAkB,EAAIf,WAAwB,IAAI,EACpE,CAACgB,EAASC,CAAU,EAAIjB,EAAA,SAC5B,OAAO,WAAW,oBAAoB,EAAE,QAAU,GAAK,EAAA,EAEnDkB,EAAaC,SAAO,IAAI,EACxBC,EAAaD,SAAO,IAAI,EAExBtB,EAAkBwB,GAAe,CACtB,eAAA,QAAQ,gBAAiBA,CAAE,EAE1C,OAAO,SAAS,KAAOd,CAAA,EAGzBe,EAAAA,UAAU,IAAM,CACd,GAAIR,EAAiB,CACb,MAAAS,EAAgB,mDACpBX,EAAQ,QAAU,yEAElBE,EAAgB,YAAc,GAC9B,SAAA,QAAiBA,EAAgB,OAAO,WACzC,OAA8B,UAAU,KACvC,KAAK,MAAMS,CAAa,CAAA,EAE1BR,EAAmB,IAAI,EACzB,EACC,CAACD,EAAiBF,CAAK,CAAC,EAE3BU,EAAAA,UAAU,IAAM,OACdX,GACGa,EAAA,SAAS,cAAc,2BAA2B,IAAlD,YAAAA,EACG,WAAA,EAGFhB,GACDA,EAAkB,WAAW,CAChC,EACC,CAACA,CAAM,CAAC,EAEL,MAAAiB,EAA0BjB,GAAmB,CACjDO,EAAmBP,CAAM,CAAA,EAGrBkB,EAAeC,GAAY,IAAM,OACrChB,GACGa,EAAA,SAAS,cAAc,2BAA2B,IAAlD,YAAAA,EACG,WAAA,EAGNP,EAAW,OAAO,WAAW,oBAAoB,EAAE,QAAU,GAAK,EAAE,EAChET,IACFA,GAAA,MAAAA,EAAQ,eAET,GAAI,EAEPc,OAAAA,EAAAA,UAAU,KACR,OAAO,iBAAiB,SAAU,IAAMI,EAAc,CAAA,EAE/C,IAAM,CACX,OAAO,oBAAoB,SAAU,IAAMA,EAAc,CAAA,CAAA,GAE1D,CAAE,CAAA,EAGDzB,EAAA,cAAAA,EAAA,SAAA,KAAAA,EAAA,cAAC,MAAA,CACC,UAAU,oCACV,MAAO,CACL,WAAY,GAAGS,EAAcM,MAC7B,SAAU,UACZ,CAAA,EAEAf,EAAA,cAAC2B,GAAA,CACC,GAAI,gBAAgBtB,IACpB,cAAe,EACf,aAAc,GACd,mBAAoB,GACpB,kBAAmB,EACnB,YAAa,CACX,IAAK,CACH,cAAe,IACf,mBAAoB,GACpB,aAAc,EAChB,EACA,IAAK,CACH,cAAe,EACf,mBAAoB,EACpB,aAAc,CAChB,EACA,KAAM,CACJ,cAAe,EACf,mBAAoB,EACpB,kBAAmB,GACnB,aAAc,EAChB,EACA,KAAM,CACJ,cAAe,EACf,mBAAoB,EACpB,aAAc,EAChB,CACF,EACA,WAAY,CACV,OAAQY,EAAW,QACnB,OAAQE,EAAW,OACrB,EACA,QAAS,CAACS,EAAU,EACpB,SAAUrB,GAAUC,EAAUD,CAAM,EACpC,cAAeA,GAAUiB,EAAuBjB,CAAM,EACtD,WAAY,IAAMK,EAAS,EAAI,EAC/B,UAAW,IAAMA,EAAS,EAAK,CAAA,EAE9BV,EAAO,IACN2B,GAAA7B,EAAA,cAAC8B,IAAY,IAAK,GAAGD,EAAM,YAAYxB,GACrC,EAAAL,EAAA,cAAC+B,GAAA,CACC,IAAK,GAAGF,EAAM,YAAYxB,IACzB,GAAGwB,EACJ,eAAAjC,CAAA,CAAA,CAEJ,CACD,CACH,EACAI,EAAA,cAAC,SAAA,CACC,IAAKmB,EACL,UAAU,qBACV,aAAYf,GAAa,iBACzB,MAAOA,GAAa,gBAAA,CACrB,EACDJ,EAAA,cAAC,SAAA,CACC,IAAKiB,EACL,UAAU,qBACV,aAAYd,GAAa,aACzB,MAAOA,GAAa,YAAA,CACrB,CAAA,CAEL,CAEJ,EC/IA,SAAS6B,GAAY,CACnB,UAAA7B,EACA,UAAAC,EACA,eAAA6B,EACA,eAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,aAAAC,EACA,aAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,aAAAC,EACA,gBAAAC,EACA,OAAAC,CACF,EAAqB,CACb,MAAAC,EAAuBvC,GAAsB,CACjD,MAAMwC,EAAYN,EAAa,UAC7BO,GAAQA,EAAK,aAAezC,CAAA,EAE1BwC,IAAc,GACZN,EAAa,SAAW,EAC1BE,EAAa,EAAI,EAEbM,GAAkBA,EAAe,OAAS,GAC5BP,EAAA,CACd,GAAGD,EACH,CACE,WAAYlC,EACZ,UAAW0C,EAAe,CAAC,EAAE,UAC7B,SAAUA,EAAe,CAAC,EAAE,SAC5B,aAAcb,CAChB,CAAA,CACD,EAILM,EAAwBQ,IACjBA,EAAA,OAAOH,EAAW,CAAC,EACjB,CAAC,GAAGG,CAAI,EAChB,CACH,EAGID,EAAiBE,EAAA,QACrB,IACEP,GAAA,YAAAA,EAAiB,OAAO,CAACQ,EAAmBC,IAAU,CACpD,MAAMC,EAAiC,CACrC,UAAWD,EAAM,IAAIE,EAAa,UAAU,EAC5C,SAAUF,EAAM,IAAIE,EAAa,aAAa,EAC9C,WAAYF,EAAM,IAAIE,EAAa,UAAU,EAC7C,SAAUF,EAAM,IAAIE,EAAa,cAAc,EAC/C,gBAAiBF,EAAM,IAAIE,EAAa,eAAe,CAAA,EAGzD,OAAID,EAAa,UACfF,EAAkB,KAAKE,CAAY,EAE9BF,CACT,EAAG,IACL,CAACR,CAAe,CAAA,EAGlB,OACG1C,EAAA,cAAA,UAAA,CAAQ,UAAU,cAAA,kBAChB,MAAI,CAAA,UAAU,2BACb,EAAAA,EAAA,cAAC,MAAI,CAAA,UAAU,wBACb,EAAAA,EAAA,cAACsD,IAAW,UAAU,OAAO,KAAMrB,EAAgB,OAAAU,GACjD3C,EAAA,cAAC,OACC,KAAAA,EAAA,cAAC,MAAG,UAAU,uBAAA,EAAyBkC,CAAe,CACxD,CACF,EACClC,EAAA,cAAA,MAAA,CAAI,UAAU,sDACb,EAAAA,EAAA,cAAC,QAAA,CACC,UAAU,wBACV,KAAK,WACL,KAAK,WACL,GAAG,WACH,SAAU,IAAM4C,EAAoBT,CAAgB,EACpD,QACEI,EAAa,UACXgB,GAAUA,EAAO,aAAepB,CAC5B,IAAA,EAAA,CAAA,EAGVnC,EAAA,cAAC,MAAI,CAAA,UAAU,iCACZA,EAAA,cAAA,QAAA,CAAM,UAAU,wBAAwB,QAAQ,UAC9C,EAAAsC,CACH,CACF,CACF,CACF,EAEAtC,EAAA,cAAC,MAAA,CACC,UAAU,8BACV,wBAAyB,CACvB,OAAQqC,GAAA,YAAAA,EAAc,QAAQ,SAAUF,EAC1C,CAAA,CAAA,EAGDnC,EAAA,cAAA,IAAA,CAAE,UAAU,2BAAA,EAA6BoC,CAAY,EAEtDpC,EAAA,cAAC,MAAI,CAAA,UAAU,qDACb,EAAAA,EAAA,cAAC,QAAA,CACC,UAAU,wBACV,KAAK,WACL,KAAK,WACL,GAAG,WACH,SAAU,IAAM4C,EAAoBT,CAAgB,EACpD,QACEI,EAAa,UACXgB,GAAUA,EAAO,aAAepB,CAC5B,IAAA,EAAA,GAGTnC,EAAA,cAAA,MAAA,CAAI,UAAU,+BACb,EAAAA,EAAA,cAAC,SAAM,UAAU,wBAAwB,QAAQ,UAC9C,EAAAsC,CACH,CACF,CACF,CACF,EACCS,GAAkBA,EAAe,OAAS,GACzC/C,EAAA,cAACC,GAAA,CACC,OAAQ8C,EACR,UAAWZ,EACX,UAAAhC,EACA,UAAAC,EACA,KAAM6B,CAAA,CAAA,CAGZ,CAEJ,CCxIO,MAAMuB,EAAyBC,GACpCC,CACF,EAEMC,GAA+C,CACnD,WAAY,CAAC,EACb,OAAQ,CAAC,WAAY,MAAO,GAAGC,EAAe,EAE9C,QAAUjB,GACP3C,EAAA,cAAA,KAAA,CAAG,IAAK2C,EAAO,QACb,EAAAA,EAAO,aAAa,OAAS,GAC5B3C,EAAA,cAACgC,GAAA,CACC,UAAW6B,EAAU,UACrB,UAAWA,EAAU,UACrB,aAAcA,EAAU,aACxB,eAAgBlB,EAAO,IAAIU,EAAa,IAAI,EAC5C,eAAgBV,EAAO,IAAIU,EAAa,KAAK,EAC7C,iBAAkBV,EAAO,IAAIU,EAAa,SAAS,EACnD,YAAaV,EAAO,IAAIU,EAAa,WAAW,EAChD,aAAcV,EAAO,mBAAmB,aACxC,gBAAiBA,EAAO,aACxB,aAAcA,EAAO,mBAAmB,aACxC,gBACEA,EAAO,mBAAmB,SAI5B,aAAcA,EAAO,mBAAmB,aACxC,OAAAA,CAAA,CAAA,CAGN,CAEJ,EAEAa,EAAuB,kBAAkBG,EAA4B,EC3CrE,SAASG,GAAY,CACnB,cAAAC,EACA,aAAAxB,EACA,gBAAAC,EACA,SAAAwB,EACA,YAAAC,CACF,EAAqB,CACnB,KAAM,CAACC,EAAWC,CAAY,EAAIpE,WAA2B,IAAI,EAC3DqE,EAAelD,SAA8B,IAAI,EACjDmD,EAAcC,EAAAA,QACd,CACJ,eAAAC,EACA,OAAAC,EACA,SAAAC,EACA,aAAAC,EACA,mBAAAC,EACA,cAAAC,EACA,WAAAC,EACA,SAAAC,EACA,cAAAC,CAAA,EACE,KAAK,MAAMhB,CAAa,EAE5B1C,EAAAA,UAAU,IAAM,CACd,GAAI+C,EAAa,QAAS,CACxB,MAAMY,EAAU,CACd,oBAAqB,GACrB,eAAiBC,GACRA,EAAG,QAAQ,4BAA4B,IAAM,IACtD,EAGIC,EAAOC,GAAgBf,EAAa,QAAS,CACjD,wBAAyB,GACzB,wBAAyB,GACzB,YAAa,CACOgB,GAAA,SAAS,KAAMJ,CAAO,CAC1C,EACA,cAAe,CACWK,GAC1B,CAAA,CACD,EAEDlB,EAAae,CAAI,EAGnB,gBAAS,KAAK,UAAU,OAAO,sBAAuB,EAAI,EACnD,IAAM,CACaG,IACxB,SAAS,KAAK,UAAU,OAAO,sBAAuB,EAAK,CAAA,CAE/D,EAAG,CAAE,CAAA,EAELhE,EAAAA,UAAU,IAAM,OACd,SAAS,KAAK,MAAM,YAClB,yBACAE,EAAA6C,EAAa,UAAb,YAAA7C,EAAsB,cAAe,IAAA,CACvC,EACC,CAAC6C,EAAa,OAAO,CAAC,EAEnB,MAAAkB,EAAkBjF,GAAsB,CAC5C,MAAMwC,EAAaN,EAA4B,UAC7CO,GAAQA,EAAK,aAAezC,CAAA,EAE1BwC,IAAc,IAChBL,EAAwBQ,IACjBA,EAAA,OAAOH,EAAW,CAAC,EACjB,CAAC,GAAGG,CAAI,EAChB,CACH,EAGIuC,EAAiB,IAAM,CAC3B,OAAO,SAAS,KAAO,GACrB,OAAO,SAAS,SACfV,SAAkBtC,EAAa,IAAYO,GAAAA,EAAK,UAAU,EAAE,KAAK,GAAG,GAAA,EAGnE0C,EAAiB,IAAM,CAC3BvB,EAAY,CAACD,CAAQ,EACjBE,IACEF,EACFE,EAAU,WAAW,EAErBA,EAAU,SAAS,EAEvB,EAIA,OAAAlE,EAAA,cAAC,MAAA,CACC,IAAKoE,EACL,UAAW,eAAeJ,EAAW,0BAA4B,IAAA,EAEjEhE,EAAA,cAAC,SAAA,CACC,gBAAegE,EACf,GAAI,WAAWK,IACf,gBAAe,SAASA,IACxB,QAAS,IAAMmB,EAAe,EAC9B,UAAU,uBAAA,EAETxB,EACGU,EAAa,QAAQ,WAAYnC,EAAa,MAAM,EACpDgC,EAAe,QAAQ,WAAYhC,EAAa,MAAM,kBACzD,OAAK,CAAA,UAAU,WAAWyB,EAAWQ,EAASC,CAAS,CAC1D,EACAzE,EAAA,cAAC,MAAA,CACC,UAAU,kCACV,kBAAiB,WAAWqE,IAC5B,GAAI,SAASA,IACb,KAAK,QAAA,kBAEJ,MAAI,CAAA,UAAU,OACZrE,EAAA,cAAA,MAAA,CAAI,UAAU,wBACb,EAAAA,EAAA,cAAC,IAAE,CAAA,UAAU,6BAA4B,IAAE2E,CAAmB,EAC7D3E,EAAA,cAAA,MAAA,CAAI,UAAU,8DACb,EAAAA,EAAA,cAAC,SAAA,CACC,QAAS,IAAMuF,EAAe,EAC9B,UAAU,kBAAA,EAETX,CAEH,EAAA5E,EAAA,cAAC,SAAA,CACC,QAAS,IAAMwC,EAAgB,EAAE,EACjC,UAAU,oBAAA,EAETsC,CAAA,CAEL,CACF,EACA9E,EAAA,cAAC,MAAI,CAAA,UAAU,yBACb,EAAAA,EAAA,cAAC,MAAI,CAAA,UAAU,4BACZuC,EAAa,IACZO,GAAA9C,EAAA,cAAC,MAAA,CACC,IAAK8C,EAAK,WACV,UAAU,4BAAA,EAEV9C,EAAA,cAAC,MAAA,CACC,UAAU,yBACV,IAAK8C,EAAK,UACV,IAAKA,EAAK,SACV,OAAO,MACP,MAAM,MACN,QAAQ,MAAA,CACV,EACC9C,EAAA,cAAA,OAAA,CAAK,UAAU,4BAAA,EACb8C,EAAK,YACR,EAEA9C,EAAA,cAAC,SAAA,CACC,UAAU,4BACV,MAAO+E,EACP,aAAYA,EACZ,QAAS,IAAM,CACbO,EAAexC,EAAK,UAAoB,CAC1C,CAAA,CACD,CAAA,CAEJ,CACH,CACF,EAEC9C,EAAA,cAAA,MAAA,CAAI,UAAU,+DACbA,EAAA,cAAC,SAAA,CACC,UAAU,mBACV,QAAS,IAAMuF,EAAe,CAAA,EAE7BX,CAEH,EAAA5E,EAAA,cAAC,SAAA,CACC,UAAU,qBACV,QAAS,IAAMwC,EAAgB,EAAE,CAAA,EAEhCsC,CAAA,CAEL,CACF,CACF,CAAA,CAGN,CCpKA,MAAMW,GAAYC,GAAO,IAAcC,GAAA,SAAA,OACrC,MAAOA,EAAM,MACb,kBAAmBA,EAAM,kBACzB,QAASA,EAAM,QACf,QAASA,EAAM,QACf,MAAOA,EAAM,QACb,YACEA,EAAM,eAAiB,YACnBA,EAAM,aACNpE,EAAAoE,EAAM,cAAN,YAAApE,EAAmB,UACzB,OAAQoE,EAAM,OACd,WAAYA,EAAM,QACdC,GAAkBlC,EAAgC,CAChD,QAAS,CACP,MAAOiC,EAAM,MACb,wBAAyB,GACzB,aAAcA,EAAM,aAAeA,EAAM,aAAe,aACxD,eAAgB,IAChB,eAAeE,EAAAF,EAAM,cAAN,YAAAE,EAAmB,IAAIC,GACpCC,GAAkB,CAAE,MAAOD,EAAM,MAAO,IAAKA,EAAM,IAAK,EAE5D,CAAA,CACD,EACDE,GAAWtC,EAAgC,CACzC,QAAS,CACP,MAAOiC,EAAM,MACb,iBAAkB,GAClB,eAAgB,GAClB,CAAA,CACD,EACL,YAAaA,EAAM,WACrB,EAAE,EAMF,SAASM,GAAqB,CAC5B,OAAAC,EACA,iBAAAC,EACA,aAAA9D,EACA,aAAA+D,EACA,aAAAC,EACA,YAAAC,EACA,mBAAAC,EACA,eAAAC,EACA,aAAAC,EACA,YAAAC,CACF,EAAwB,CACtB,KAAM,CAACC,EAAeC,CAAgB,EAAI7G,WAAS,EAAE,EAC/C8D,EAAY,KAAK,MAAMqC,CAAM,EAC7BW,EAAkB,KAAK,MAAMT,CAAY,EACzCU,EAAkB,KAAK,MAAMT,CAAY,EACzCU,EAAe7F,SAA8B,IAAI,EACjD8F,EAAY9F,SAAiC,IAAI,EACjD,CAAC+F,EAAaC,CAAc,EAAInH,WAAS,CAC7C,QAAS,GACT,IAAK,GACL,QAAS,EAAA,CACV,EACK,CAACiE,EAAUC,CAAW,EAAIlE,WAAS,EAAK,EACxC,CAACoH,EAAOC,CAAQ,EAAIrH,WAAS,EAAK,EAClC,CAACsH,EAAW5E,CAAY,EAAI1C,WAAS,EAAK,EAC1C,CAACwC,EAAcC,CAAe,EAAIzC,EAAA,SAAqB,CAAE,CAAA,EACzD,CAACuH,EAAgBC,CAAiB,EAAIxH,EAAA,SAC1C,MAAA,EAEI,CAACyH,EAAcC,CAAe,EAAI1H,WAAS,EAAK,EAChD,CAAC2H,EAAYC,CAAa,EAAI5H,WAAS,EAAE,EAEzC6H,EAA2B,SAAY,CAC3C,IAAIC,EAAc,CAAE,QAAS,GAAI,IAAK,GAAI,QAAS,IACnD,MAAMC,EAAaC,KACnB,GAAID,EACYD,EAAA,CACZ,QAASC,EAAW,SAAW,GAC/B,IAAKA,EAAW,IAChB,QAASA,EAAW,OAAA,EAErB,OAA8B,UAAU,KAAK,CAC5C,iBAAkB,CAChB,SAAUA,EAAW,IACrB,iBAAkBA,EAAW,OAC/B,EACA,MAAO,WACP,eAAgB,WAChB,aAAc,iCAAA,CACf,MACI,CACC,MAAAE,EAAc,MAAMC,KACtBD,IACYH,EAAA,CACZ,QAAS,GACT,IAAKG,EAAY,IACjB,QAASA,EAAY,OAAA,GAKZd,EAAA,CACb,QAASW,EAAY,SAAW,GAChC,IAAKA,EAAY,KAAO,GACxB,QAASA,EAAY,SAAW,EAAA,CACjC,EAEDT,EAAS,EAAI,CAAA,EAGf/F,EAAAA,UAAU,IAAM,CACV4F,EAAY,MAAQ,IACtBiB,GAAqBjB,EAAY,GAAG,CACtC,EACC,CAACA,CAAW,CAAC,EAEhB5F,EAAAA,UAAU,IAAM,CACd,MAAM8G,EAAUC,KACZ3B,IACF0B,GAAA,MAAAA,EAAS,IAAI,KAAK,MAAM1B,CAAY,IAEbmB,IAErB,IAAAS,EAEE,MAAAC,EAAa,SAAS,cAAc,6BAA6B,EAEvE,GAAIA,EAAY,CACd,MAAMC,EAAkBD,EAAW,UAEnCX,EAAcY,CAAe,EAE7B,MAAMC,EAAS,CAAE,WAAY,GAAM,UAAW,GAAM,QAAS,IAEvDC,EAAYC,GAAmC,CACnD,UAAWC,KAAYD,EACjBC,EAAS,OAAS,aACpBhB,EAAcW,EAAW,SAAS,CAEtC,EAGSD,EAAA,IAAI,iBAAiBI,CAAQ,EAC/BJ,EAAA,QAAQC,EAAYE,CAAM,EAGrC,MAAO,IAAM,CACPH,GAAUA,EAAS,WAAW,CAAA,CAEtC,EAAG,CAAE,CAAA,EAELhH,EAAAA,UAAU,IAAM,CACd,GAAI8F,EACE,GAAAF,EAAY,MAAQ,GAAI,CAC1B,IAAI2B,EAAW3B,EAAY,QACvB2B,EAAS,YAAY,IAAM,KAClBA,EAAA,MACFA,EAAS,YAAY,IAAM,OACzBA,EAAA,OAGb,MACEpC,EACG,QAAQ,YAAaS,EAAY,IAAI,QAAQ,IAAK,EAAE,CAAC,EACrD,QAAQ,gBAAiB2B,CAAQ,EACpC,CACE,OAAQ,KACV,CAAA,EAEC,KAAiBC,GACTA,EAAS,MACjB,EACA,KAAaC,GAAA,CACZvB,EAAkBuB,EAAK,eAAe,CAAA,CACvC,EACA,MAAeC,GAAA,CACN,QAAA,MAAM,SAAUA,CAAK,CAAA,CAC9B,OAEHxB,EAAkB,CAAE,CAAA,CAGvB,EAAA,CAACJ,EAAOF,EAAY,GAAG,CAAC,EAE3B5F,EAAAA,UAAU,IAAM,OACd,GAAIiG,IAAmB,QACjB5D,EAAgB,CAClBsF,GAAetF,CAAc,EAE7B,IAAIiD,EAAgB,GAEpB,MAAMsC,EAAgB,OAAO,QAAQ3B,CAAc,EAAE,OACnD,CAAC4B,EAAYC,IAAY,CACjB,MAAAC,EAAWD,EAAQ,CAAC,EACpBE,GAAaF,EAAQ,CAAC,EAAE,IAC3BG,IAAkB,GAAGF,KAAYE,IAAA,EAEpC,MAAO,CAAC,GAAGJ,EAAY,GAAGG,EAAU,CACtC,EACA,CAAC,CAAA,EAGCJ,EAAc,OAAS,IACzBtC,EAAgB,IAAID,OAAiBuC,EAClC,OAAa,IAAIK,IAAQ,EACzB,KAAK,GAAG,MAGTC,IACF5C,EAAgB,GAAGA,KAAiB4C,KAGtC3C,EAAiBD,CAAa,EAExB,MAAA6C,EACJC,GAA+B/F,CAAc,GAE/BnC,EAAAmC,IAAA,MAAAnC,EAAA,SACdiI,EAAiC,8BAA8B,CAC7D,GAAI7C,CAAA,CACL,GAEH,KAAM,CAAE,iBAAA+C,CAAA,EAAqBC,GAA2BjG,CAAc,EAChE,CAAE,cAAAkG,CAAA,EAAkBC,GAAkBnG,CAAc,EAE1DA,EAAe,SAASkG,EAAcF,EAAiB,CAAC,CAAC,EACzD,OAEJ,EACC,CAACpC,CAAc,CAAC,EAEb,MAAAwC,EAAiBC,GACFA,EAAQ,IAAeC,GAAA,CACxC,MAAMrH,EAASqH,EAEX,GAAArH,EAAO,aAAa,OAAS,EAAG,CAClC,MAAMsH,EAAetH,EAAO,aAAa,OAAsBuH,GACzDvD,EAAc,SAASG,EAAgB,cAAc,EAChDH,EAAc,SACnBuD,EAAY,IAAIpD,EAAgB,cAAc,CAAA,EAGzC,EAEV,EAEM,MAAA,CACL,GAAGnE,EACH,aAAAsH,CAAA,MAGK,QAAAtH,CACT,CACD,EAKGwH,EAAiBC,GAEnBpK,EAAA,cAAC,MAAA,CACC,UAAW,2BACToK,EACI,kCACA,oCAAA,EAGL3E,GAAU,IAAaE,GAClBA,EAAM,QAEN3F,EAAA,cAACqK,EAAA,CACC,IAAK1E,EAAM,MACX,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,gBAAiB,CAAAyE,EACjB,OAAQzE,EAAM,MAAA,CAAA,EAMlB3F,EAAA,cAACqK,EAAA,CACC,IAAK1E,EAAM,MACX,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,YAAaA,EAAM,YACnB,WAAY,EAAAA,EAAM,kBAClB,QAASA,EAAM,QACf,YAAaA,EAAM,YACnB,oBACEA,EAAM,kBAAoBA,EAAM,kBAAoB,GAEtD,gBAAiB,CAAAyE,CAAmB,CAAA,CAGzC,CAAA,EAKP/I,OAAAA,EAAAA,UAAU,IAAM,SACVgG,GACF9F,EAAAyF,EAAU,UAAV,MAAAzF,EAAmB,aAEnBsE,EAAAmB,EAAU,UAAV,MAAAnB,EAAmB,OACrB,EACC,CAACwB,CAAS,CAAC,EAGXrH,EAAA,cAAA,MAAA,CAAI,IAAK+G,EAAc,UAAU,8BAAA,EAC/B/G,EAAA,cAAA,MAAA,CAAI,UAAU,0BAAA,EACZA,EAAA,cAAA,MAAA,CAAI,UAAU,WAAA,EACZA,EAAA,cAAA,KAAA,CAAG,UAAU,oBAAA,EACX6G,EAAgB,aACnB,EACCA,EAAgB,YACf7G,EAAA,cAAC,IAAE,CAAA,UAAU,iBAAmB,EAAA6G,EAAgB,UAAW,EAE7D7G,EAAA,cAACsK,GAAA,CACC,MAAOzD,EAAgB,YACvB,KAAMA,EAAgB,WACtB,YAAaA,EAAgB,kBAC7B,QAASA,EAAgB,cACzB,WAAYA,EAAgB,WAC5B,WAAYA,EAAgB,WAC5B,KAAK,OACL,MAAOW,EACP,SAAUC,EACV,MAAOR,EAAY,QACnB,SAAUC,EACV,UAAW,CAAC,KAAM,IAAI,CAAA,CAAA,CAE1B,EACAlH,EAAA,cAACuK,GAAA,CACC,MAAO1G,EAAU,eACjB,aAAAkD,EACA,gBAAiB,EAAA,EAEhBoD,EAAc,EAAI,CAAA,EAEpBA,IACDnK,EAAA,cAAC,MAAA,CACC,UAAU,qEACV,wBAAyB,CAAE,OAAQ0H,CAAW,CAAA,CAAA,CAElD,EACC1H,EAAA,cAAA,MAAA,CAAI,UAAU,uBAAA,EACZA,EAAA,cAAA,MAAA,CAAI,UAAU,+BAAA,EACZA,EAAA,cAAA,MAAA,CAAI,UAAU,4BACbA,EAAA,cAAC,MAAA,CACC,UAAU,gBACV,wBAAyB,CACvB,OACEiH,EAAY,MAAQ,GAChBV,EAAmB,QAAQ,QAASU,EAAY,GAAG,EACnDX,CACR,CAAA,CAEF,EAAAtG,EAAA,cAACwK,GAAA,CACC,WAAY3G,EAAU,SACtB,aAAa,8BAAA,CAAA,CAEjB,CACF,EACA7D,EAAA,cAACyK,GAAA,CACC,kBAAmBX,EACnB,WAAYY,GACZ,mBAAoB,CAClB,aAAArI,EACA,SAAUG,EACV,aAAAC,EACA,aAAAF,EACA,eAAAiE,CACF,EACA,UAAU,2BACV,uBAAAhD,EACA,iBAAkB,EAAA,CAEpB,EAAAxD,EAAA,cAAC,MAAA,CACC,UAAU,oEACV,wBAAyB,CAAE,OAAQ0H,CAAW,CAAA,CAElD,CAAA,EACCL,GACCrH,EAAA,cAAC,OAAI,QAAS,IAAMyC,EAAa,EAAK,CACpC,EAAAzC,EAAA,cAAC,SAAA,CACC,GAAG,uBACH,UAAU,6BACV,IAAKgH,CAAA,EAEJ,KAAK,MAAMb,CAAgB,EAAE,aAC9BnG,EAAA,cAAC,SAAA,CACC,UAAU,sBACV,MAAO,KAAK,MAAMmG,CAAgB,EAAE,WACpC,aAAY,KAAK,MAAMA,CAAgB,EAAE,WACzC,QAAS,IAAM1D,EAAa,EAAK,CAAA,CAClC,CAAA,CAEL,EAEDF,GAAgBA,EAAa,OAAS,GACrCvC,EAAA,cAAC8D,GAAA,CACC,cAAeqC,EACf,aAAA5D,EACA,gBAAAC,EACA,SAAAwB,EACA,YAAAC,CAAA,CAAA,CAGN,CAEJ"}